@@ -6,28 +6,27 @@ module Elm.Project.Root
10+import Control.Monad (msum)
9import Control.Monad.Trans (liftIO)
11import Control.Monad.Trans (liftIO)
10−import qualified Data.ByteString.Lazy as LBS
11import qualified Data.Map as Map
12import qualified Data.Map as Map
12−import Data.Monoid ((<>))
13−import qualified Network.HTTP.Client as Client
14import qualified System.Directory as Dir
13import qualified System.Directory as Dir
15import System.FilePath ((</>))
14import System.FilePath ((</>))
16+import qualified Deps.Cache as Cache
17+import qualified Deps.Explorer as Explorer
18+import qualified Deps.Solver as Solver
17import qualified Elm.Compiler.Version as Elm
19import qualified Elm.Compiler.Version as Elm
18import qualified Elm.Package as Pkg
20import qualified Elm.Package as Pkg
19import qualified Elm.Project.Constraint as Con
21import qualified Elm.Project.Constraint as Con
20import qualified Elm.Project.Json as Project
22import qualified Elm.Project.Json as Project
21import qualified Elm.Project.Licenses as Licenses
23import qualified Elm.Project.Licenses as Licenses
22−import Elm.Project.Json (Project(..), PkgInfo(..))
23−import Elm.Project.Summary (Summary)
24+import qualified Elm.Project.Summary as Summary
24import qualified Elm.PerUserCache as PerUserCache
25import qualified Elm.PerUserCache as PerUserCache
25import qualified File.IO as IO
26import qualified File.IO as IO
26−import qualified Reporting.Doc as D
27import qualified Reporting.Exit as Exit
27import qualified Reporting.Exit as Exit
28import qualified Reporting.Progress as Progress
28import qualified Reporting.Progress as Progress
29import qualified Reporting.Task as Task
29import qualified Reporting.Task as Task
30−import qualified Reporting.Task.Http as Http
31import qualified Stuff.Verify as Verify
30import qualified Stuff.Verify as Verify
32import qualified Json.Encode as Encode
31import qualified Json.Encode as Encode
@@ -36,14 +35,14 @@ import qualified Json.Encode as Encode
39−get :: Task.Task Summary
38+get :: Task.Task Summary.Summary
41 do root <- moveToRoot
40 do root <- moveToRoot
42 project <- Project.read "elm.json"
41 project <- Project.read "elm.json"
43 Verify.verify root project
42 Verify.verify root project
46−unsafeGet :: Task.Task (FilePath, Project)
45+unsafeGet :: Task.Task (FilePath, Project.Project)
47unsafeGet =
46unsafeGet =
48 (,) <$> moveToRoot <*> Project.read "elm.json"
47 (,) <$> moveToRoot <*> Project.read "elm.json"
@@ -61,38 +60,41 @@ moveToRoot =
61 return root
60 return root
63 Nothing ->
62 Nothing ->
64− do approved <- Task.getApproval $ D.vcat $
63+ do addElmJson
65− [ "It looks like you are starting a new Elm project. Very exciting!"
67− , "I would like to create two files to help you get started:"
69− , " 1. elm.json" <> D.black " ------------ describes your dependencies"
70− , " 2. src/Main.elm" <> D.black " ------ a basic Elm program to expand"
72− , "This is common to all Elm projects. Would you like me to create them? [Y/n]: "
77− do liftIO $ Dir.createDirectoryIfMissing True "src"
80− Task.report Progress.ElmJsonApproved
64+ Task.report Progress.ElmJsonAdded
81− liftIO $ Dir.getCurrentDirectory
65+ liftIO $ Dir.getCurrentDirectory
83− do Task.report Progress.ElmJsonRejected
67+
68+addElmJson :: Task.Task ()
70+ do registry <- Cache.optionalUpdate
71+ maybeSolution <- Explorer.run registry $ Solver.run $
72+ msum $ map Solver.solve $
73+ [ defaultDependencies
74+ , Map.singleton Pkg.core Con.anything
76+ case maybeSolution of
84− Task.throw Exit.NoElmJson
78+ Task.throw Exit.NoElmJson
87−fetch :: FilePath -> Task.Task ()
81+ liftIO $ Encode.write "elm.json" $ Project.encode $ Project.App $
88−fetch path =
82+ Project.AppInfo
89− Http.run $
83+ Elm.version
90− Http.anything
84+ ["src"]
91− ("https://experiment.elm-lang.org/" ++ Pkg.versionToString Elm.version ++ "/starter/" ++ path)
85+ (Map.intersection solution defaultDependencies)
92− (\request manager ->
86+ Map.empty
93− do response <- Client.httpLbs request manager
87+ (Map.difference solution defaultDependencies)
94− Right <$> LBS.writeFile path (Client.responseBody response)
88+
90+defaultDependencies :: Map.Map Pkg.Name Con.Constraint
93+ [ (Pkg.browser, Con.anything)
94+ , (Pkg.core, Con.anything)
95+ , (Pkg.html, Con.anything)
96+ , (Pkg.json, Con.anything)
@@ -114,19 +116,19 @@ getWithReplFallback =
114 Dir.createDirectoryIfMissing True root
116 Dir.createDirectoryIfMissing True root
115 Dir.setCurrentDirectory root
117 Dir.setCurrentDirectory root
116 IO.removeDir "elm-stuff"
118 IO.removeDir "elm-stuff"
117− Encode.write "elm.json" (Project.encode (Pkg replInfo))
119+ Encode.write "elm.json" (Project.encode (Project.Pkg replInfo))
118 return root
120 return root
121−replInfo :: PkgInfo
123+replInfo :: Project.PkgInfo
122replInfo =
124replInfo =
123− PkgInfo
125+ Project.PkgInfo
124− { _pkg_name = Pkg.dummyName
126+ { Project._pkg_name = Pkg.dummyName
125− , _pkg_summary = "dummy code for the REPL"
127+ , Project._pkg_summary = "dummy code for the REPL"
126− , _pkg_license = Licenses.bsd3
128+ , Project._pkg_license = Licenses.bsd3
127− , _pkg_version = Pkg.dummyVersion
129+ , Project._pkg_version = Pkg.dummyVersion
128− , _pkg_exposed = Project.ExposedList []
130+ , Project._pkg_exposed = Project.ExposedList []
129− , _pkg_deps = Map.singleton Pkg.core Con.anything
131+ , Project._pkg_deps = Map.singleton Pkg.core Con.anything
130− , _pkg_test_deps = Map.empty
132+ , Project._pkg_test_deps = Map.empty
131− , _pkg_elm_version = Con.defaultElm
133+ , Project._pkg_elm_version = Con.defaultElm