@@ -12,11 +12,10 @@ module Elm.Project.Json
13 , pkgDecoder
13 , pkgDecoder
14 -- queries
14 -- queries
16 , isPlatformPackage
15 , isPlatformPackage
19 , getExposed
17 , getExposed
@@ -62,9 +61,10 @@ data AppInfo =
63 { _app_elm_version :: Version
62 { _app_elm_version :: Version
64 , _app_source_dirs :: [FilePath]
63 , _app_source_dirs :: [FilePath]
65− , _app_deps :: Map Name Version
64+ , _app_deps_direct :: Map Name Version
66− , _app_test_deps :: Map Name Version
65+ , _app_deps_trans :: Map Name Version
66+ , _app_test_direct :: Map Name Version
67− , _app_trans_deps :: Map Name Version
67+ , _app_test_trans :: Map Name Version
@@ -103,15 +103,6 @@ defaultSummary =
103-- QUERIES
103-- QUERIES
106−appSolution :: AppInfo -> Map Name Version
110− , _app_test_deps info
111− , _app_trans_deps info
115isPlatformPackage :: Project -> Bool
106isPlatformPackage :: Project -> Bool
116isPlatformPackage project =
107isPlatformPackage project =
117 case project of
108 case project of
@@ -120,25 +111,20 @@ isPlatformPackage project =
121 Pkg info ->
112 Pkg info ->
123− (Pkg.Name user _) =
114+ (Pkg.Name author _) =
124 _pkg_name info
115 _pkg_name info
126− user == "elm" || user == "elm-explorations"
117+ author == "elm" || author == "elm-explorations"
129−get :: (AppInfo -> a) -> (PkgInfo -> a) -> Project -> a
120+getName :: Project -> Name
130−get appFunc pkgFunc project =
121+getName project =
131 case project of
122 case project of
132− App info ->
123+ App _ ->
133− appFunc info
124+ Pkg.dummyName
135 Pkg info ->
126 Pkg info ->
139−getName :: Project -> Name
141− get (\_ -> Pkg.dummyName) _pkg_name project
127+ _pkg_name info
144getExposed :: PkgInfo -> [Module.Raw]
130getExposed :: PkgInfo -> [Module.Raw]
@@ -151,6 +137,25 @@ getExposed info =
151 concatMap snd chunks
137 concatMap snd chunks
140+check :: Project -> Task.Task ()
143+ Pkg (PkgInfo _ _ _ _ _ deps _ _) ->
144+ if Map.member Pkg.core deps
146+ else throwBadJson E.NoPkgCore
148+ App (AppInfo _ _ direct indirect _ _) ->
149+ if Map.member Pkg.core direct then
151+ if Map.member Pkg.json direct || Map.member Pkg.json indirect
153+ else throwBadJson E.NoAppJson
156+ throwBadJson E.NoAppCore
@@ -167,15 +172,21 @@ write root project =
167encode :: Project -> E.Value
172encode :: Project -> E.Value
168encode project =
173encode project =
169 case project of
174 case project of
170− App (AppInfo elm srcDirs deps tests trans) ->
175+ App (AppInfo elm srcDirs depsDirect depsTrans testDirect testTrans) ->
172 [ "type" ==> E.text "application"
177 [ "type" ==> E.text "application"
173 , "source-directories" ==> E.list (E.text . Text.pack) srcDirs
178 , "source-directories" ==> E.list (E.text . Text.pack) srcDirs
174 , "elm-version" ==> encodeVersion elm
179 , "elm-version" ==> encodeVersion elm
180+ , "dependencies" ==>
182+ [ "direct" ==> encodeDeps encodeVersion depsDirect
175− , "dependencies" ==> encodeDeps encodeVersion deps
183+ , "indirect" ==> encodeDeps encodeVersion depsTrans
185+ , "test-dependencies" ==>
176− , "test-dependencies" ==> encodeDeps encodeVersion tests
187+ [ "direct" ==> encodeDeps encodeVersion testDirect
177− , "do-not-edit-this-by-hand" ==>
178− E.object [ "transitive-dependencies" ==> encodeDeps encodeVersion trans ]
188+ , "indirect" ==> encodeDeps encodeVersion testTrans
181 Pkg (PkgInfo name summary license version exposed deps tests elm) ->
192 Pkg (PkgInfo name summary license version exposed deps tests elm) ->
@@ -238,17 +249,11 @@ read path =
238 Left err ->
249 Left err ->
239 throwBadJson (E.BadJson err)
250 throwBadJson (E.BadJson err)
241− Right project@(Pkg (PkgInfo name _ _ _ _ deps tests _)) ->
252+ Right project@(Pkg _) ->
242− do checkOverlap "dependencies" "test-dependencies" deps tests
243− pkgHasCore name deps
244− return project
253+ return project
246− Right project@(App (AppInfo _ srcDirs deps tests trans)) ->
255+ Right project@(App (AppInfo _ srcDirs _ _ _ _)) ->
247− do checkOverlap "dependencies" "test-dependencies" deps tests
248− checkOverlap "dependencies" "transitive-dependencies" deps trans
249− checkOverlap "test-dependencies" "transitive-dependencies" tests trans
250− mapM_ doesDirectoryExist srcDirs
256+ do mapM_ doesDirectoryExist srcDirs
251− appHasCoreAndJson (Map.union deps trans)
252 return project
257 return project
@@ -257,16 +262,6 @@ throwBadJson problem =
257 Task.throw (Exit.Assets (E.BadElmJson problem))
262 Task.throw (Exit.Assets (E.BadElmJson problem))
260−checkOverlap :: String -> String -> Map Name a -> Map Name a -> Task.Task ()
261−checkOverlap field1 field2 deps1 deps2 =
262− case Map.keys (Map.intersection deps1 deps2) of
267− throwBadJson (E.BadDepDup field1 field2 dup dups)
270doesDirectoryExist :: FilePath -> Task.Task ()
265doesDirectoryExist :: FilePath -> Task.Task ()
271doesDirectoryExist dir =
266doesDirectoryExist dir =
272 do exists <- liftIO $ Dir.doesDirectoryExist dir
267 do exists <- liftIO $ Dir.doesDirectoryExist dir
@@ -275,25 +270,6 @@ doesDirectoryExist dir =
275 else throwBadJson (E.BadSrcDir dir)
270 else throwBadJson (E.BadSrcDir dir)
278−appHasCoreAndJson :: Map Name a -> Task.Task ()
279−appHasCoreAndJson pkgs =
280− if Map.member Pkg.core pkgs then
282− if Map.member Pkg.json pkgs
284− else throwBadJson E.NoAppJson
287− throwBadJson E.NoAppCore
290−pkgHasCore :: Name -> Map Name a -> Task.Task ()
291−pkgHasCore name pkgs =
292− if name == Pkg.core || Map.member Pkg.core pkgs
294− else throwBadJson E.NoPkgCore
298-- JSON DECODE
274-- JSON DECODE
@@ -321,9 +297,10 @@ appDecoder =
322 <$> D.field "elm-version" versionDecoder
298 <$> D.field "elm-version" versionDecoder
323 <*> D.field "source-directories" (D.list dirDecoder)
299 <*> D.field "source-directories" (D.list dirDecoder)
324− <*> D.field "dependencies" (depsDecoder versionDecoder)
300+ <*> D.field "dependencies" (D.field "direct" (depsDecoder versionDecoder))
301+ <*> D.field "dependencies" (D.field "indirect" (depsDecoder versionDecoder))
325− <*> D.field "test-dependencies" (depsDecoder versionDecoder)
302+ <*> D.field "test-dependencies" (D.field "direct" (depsDecoder versionDecoder))
326− <*> D.at ["do-not-edit-this-by-hand", "transitive-dependencies"] (depsDecoder versionDecoder)
303+ <*> D.field "test-dependencies" (D.field "indirect" (depsDecoder versionDecoder))
329pkgDecoder :: Decoder PkgInfo
306pkgDecoder :: Decoder PkgInfo