@@ -3,6 +3,9 @@
3module Generate.Output
3module Generate.Output
5 , generateReplFile
5 , generateReplFile
@@ -12,6 +15,8 @@ import qualified Data.ByteString.Builder as B
12import qualified Data.List.NonEmpty as NonEmpty
15import qualified Data.List.NonEmpty as NonEmpty
13import qualified Data.Map as Map
16import qualified Data.Map as Map
14import Data.Monoid ((<>))
17import Data.Monoid ((<>))
18+import qualified System.Directory as Dir
19+import qualified System.FilePath as FP
15import System.FilePath ((</>))
20import System.FilePath ((</>))
17import qualified Elm.Compiler.Module as Module
22import qualified Elm.Compiler.Module as Module
@@ -19,7 +24,6 @@ import qualified Elm.Compiler.Objects as Obj
19import qualified Elm.Name as N
24import qualified Elm.Name as N
20import qualified Elm.Package as Pkg
25import qualified Elm.Package as Pkg
22−import qualified Elm.Project.Flags as Flags
23import qualified Elm.Project.Json as Project
27import qualified Elm.Project.Json as Project
24import qualified Elm.Project.Summary as Summary
28import qualified Elm.Project.Summary as Summary
25import qualified File.Args as Args
29import qualified File.Args as Args
@@ -28,13 +32,23 @@ import qualified File.IO as IO
28import qualified Generate.Functions as Functions
32import qualified Generate.Functions as Functions
29import qualified Reporting.Task as Task
33import qualified Reporting.Task as Task
30import qualified Stuff.Paths as Paths
34import qualified Stuff.Paths as Paths
35+import Terminal.Args (Parser(..), suggestFiles)
34-- GENERATE
39-- GENERATE
46+ , _target :: Obj.Target
47+ , _output :: Maybe Output
37−generate :: Flags.Options -> Summary.Summary -> Crawl.Result -> Task.Task ()
51+generate :: Options -> Summary.Summary -> Crawl.Result -> Task.Task ()
38generate options summary graph@(Crawl.Graph args _ _ _ _) =
52generate options summary graph@(Crawl.Graph args _ _ _ _) =
39 case args of
53 case args of
40 Args.Pkg _ ->
54 Args.Pkg _ ->
@@ -48,8 +62,8 @@ generate options summary graph@(Crawl.Graph args _ _ _ _) =
48-- GENERATE MONOLITH
62-- GENERATE MONOLITH
51−generateMonolith :: Flags.Options -> Summary.Summary -> Crawl.Result -> [Module.Raw] -> Task.Task ()
65+generateMonolith :: Options -> Summary.Summary -> Crawl.Result -> [Module.Raw] -> Task.Task ()
52−generateMonolith (Flags.Options debug target output) summary@(Summary.Summary _ project _ ifaces _) graph names =
66+generateMonolith (Options _ debug target output_) summary@(Summary.Summary _ project _ ifaces _) graph names =
54 objectGraph <- organize summary graph
68 objectGraph <- organize summary graph
55 let pkg = Project.getName project
69 let pkg = Project.getName project
@@ -59,15 +73,15 @@ generateMonolith (Flags.Options debug target output) summary@(Summary.Summary _
59 "(function(scope){\n'use strict';" <> Functions.functions <> builder <> "}(this));"
73 "(function(scope){\n'use strict';" <> Functions.functions <> builder <> "}(this));"
62− case output of
76+ case output_ of
63 Nothing ->
77 Nothing ->
64 IO.writeBuilder "elm.js" monolith
78 IO.writeBuilder "elm.js" monolith
66− Just Flags.None ->
80+ Just None ->
69− Just (Flags.Custom maybeDir fileName) ->
83+ Just (Custom maybeDir fileName) ->
70− do path <- Flags.safeCustomPath maybeDir fileName
84+ do path <- safeCustomPath maybeDir fileName
71 IO.writeBuilder path monolith
85 IO.writeBuilder path monolith
@@ -115,3 +129,67 @@ loadPackageObj ( name, (version,_) ) =
115 do dir <- Task.getPackageCacheDirFor name version
129 do dir <- Task.getPackageCacheDirFor name version
116 IO.readBinary (dir </> "objs.dat")
130 IO.readBinary (dir </> "objs.dat")
139+ | Custom (Maybe FilePath) FilePath
142+safeCustomPath :: Maybe FilePath -> FilePath -> IO FilePath
143+safeCustomPath maybeDirectory fileName =
144+ case maybeDirectory of
149+ do Dir.createDirectoryIfMissing True dir
150+ return (dir </> fileName)
157+output :: Parser Output
160+ { _singular = "output file"
161+ , _plural = "output files"
162+ , _parser = parseOutput
163+ , _suggest = suggestFiles ["js","html"]
164+ , _examples = exampleOutput
168+parseOutput :: String -> Maybe Output
170+ if string == "/dev/null" || string == "NUL" || string == "$null" then
173+ else if FP.takeExtension string == "js" then
180+toCustom :: String -> Maybe Output
182+ case FP.splitPath string of
187+ Just $ Custom Nothing name
190+ Just $ Custom (Just (FP.joinPath (init segments))) (last segments)
193+exampleOutput :: String -> IO [String]
195+ return [ "elm.js", "index.html", "/dev/null" ]