@@ -4,19 +4,14 @@ module Language.PureScript.Docs.Types
7−import Prelude.Compat
7+import Protolude hiding (to, from)
8+import Prelude (String, unlines)
9−import Control.Arrow (first, (***))
10+import Control.Arrow ((***))
10−import Control.Monad (when)
11−import Control.Monad.Error.Class (catchError)
13import Data.Aeson ((.=))
12import Data.Aeson ((.=))
14import Data.Aeson.BetterErrors
13import Data.Aeson.BetterErrors
15−import Data.ByteString.Lazy (ByteString)
14+import qualified Data.Map as Map
16−import Data.Either (isLeft, isRight)
17−import Data.Maybe (mapMaybe, fromMaybe, maybeToList)
18−import Data.Monoid ((<>))
19−import Data.Text (Text)
20import Data.Time.Clock (UTCTime)
15import Data.Time.Clock (UTCTime)
21import qualified Data.Time.Format as TimeFormat
16import qualified Data.Time.Format as TimeFormat
22import Data.Version
17import Data.Version
@@ -47,7 +42,7 @@ data Package a = Package
47 -- field. It should eventually be changed to just UTCTime.
42 -- field. It should eventually be changed to just UTCTime.
48 , pkgTagTime :: Maybe UTCTime
43 , pkgTagTime :: Maybe UTCTime
49 , pkgModules :: [Module]
44 , pkgModules :: [Module]
50− , pkgBookmarks :: [Bookmark]
45+ , pkgModuleMap :: Map P.ModuleName PackageName
51 , pkgResolvedDependencies :: [(PackageName, Version)]
46 , pkgResolvedDependencies :: [(PackageName, Version)]
52 , pkgGithub :: (GithubUser, GithubRepo)
47 , pkgGithub :: (GithubUser, GithubRepo)
53 , pkgUploader :: a
48 , pkgUploader :: a
@@ -70,7 +65,7 @@ verifyPackage verifiedUser Package{..} =
70 pkgVersionTag
65 pkgVersionTag
71 pkgTagTime
66 pkgTagTime
72 pkgModules
67 pkgModules
73− pkgBookmarks
68+ pkgModuleMap
74 pkgResolvedDependencies
69 pkgResolvedDependencies
76 verifiedUser
71 verifiedUser
@@ -308,8 +303,6 @@ data PackageError
308 | InvalidTime
303 | InvalidTime
309 deriving (Show, Eq, Ord)
304 deriving (Show, Eq, Ord)
311−type Bookmark = InPackage (P.ModuleName, Text)
313data InPackage a
306data InPackage a
314 = Local a
307 = Local a
315 | FromDep PackageName a
308 | FromDep PackageName a
@@ -333,10 +326,10 @@ ignorePackage (FromDep _ x) = x
333----------------------
326----------------------
334-- Parsing
327-- Parsing
336−parseUploadedPackage :: Version -> ByteString -> Either (ParseError PackageError) UploadedPackage
329+parseUploadedPackage :: Version -> LByteString -> Either (ParseError PackageError) UploadedPackage
337parseUploadedPackage minVersion = parse $ asUploadedPackage minVersion
330parseUploadedPackage minVersion = parse $ asUploadedPackage minVersion
339−parseVerifiedPackage :: Version -> ByteString -> Either (ParseError PackageError) VerifiedPackage
332+parseVerifiedPackage :: Version -> LByteString -> Either (ParseError PackageError) VerifiedPackage
340parseVerifiedPackage minVersion = parse $ asVerifiedPackage minVersion
333parseVerifiedPackage minVersion = parse $ asVerifiedPackage minVersion
342asPackage :: Version -> (forall e. Parse e a) -> Parse PackageError (Package a)
335asPackage :: Version -> (forall e. Parse e a) -> Parse PackageError (Package a)
@@ -353,11 +346,15 @@ asPackage minimumVersion uploader = do
353 <*> key "versionTag" asText
346 <*> key "versionTag" asText
354 <*> keyMay "tagTime" (withString parseTimeEither)
347 <*> keyMay "tagTime" (withString parseTimeEither)
355 <*> key "modules" (eachInArray asModule)
348 <*> key "modules" (eachInArray asModule)
356− <*> key "bookmarks" asBookmarks .! ErrorInPackageMeta
349+ <*> moduleMap
357 <*> key "resolvedDependencies" asResolvedDependencies
350 <*> key "resolvedDependencies" asResolvedDependencies
358 <*> key "github" asGithub
351 <*> key "github" asGithub
359 <*> key "uploader" uploader
352 <*> key "uploader" uploader
360 <*> pure compilerVersion
353 <*> pure compilerVersion
356+ key "moduleMap" asModuleMap
357+ `pOr` (key "bookmarks" bookmarksAsModuleMap .! ErrorInPackageMeta)
362parseTimeEither :: String -> Either PackageError UTCTime
359parseTimeEither :: String -> Either PackageError UTCTime
363parseTimeEither =
360parseTimeEither =
@@ -444,9 +441,10 @@ asReExport =
444 asReExportModuleName :: Parse PackageError (InPackage P.ModuleName)
441 asReExportModuleName :: Parse PackageError (InPackage P.ModuleName)
445 asReExportModuleName =
442 asReExportModuleName =
446 asInPackage fromAesonParser .! ErrorInPackageMeta
443 asInPackage fromAesonParser .! ErrorInPackageMeta
447− <|> fmap Local fromAesonParser
444+ `pOr` fmap Local fromAesonParser
446+pOr :: Parse e a -> Parse e a -> Parse e a
449− (<|>) p q = catchError p (const q)
447+p `pOr` q = catchError p (const q)
451asInPackage :: Parse BowerError a -> Parse BowerError (InPackage a)
449asInPackage :: Parse BowerError a -> Parse BowerError (InPackage a)
452asInPackage inner =
450asInPackage inner =
@@ -559,20 +557,38 @@ asQualifiedProperName = fromAesonParser
559asQualifiedIdent :: Parse e (P.Qualified P.Ident)
557asQualifiedIdent :: Parse e (P.Qualified P.Ident)
560asQualifiedIdent = fromAesonParser
558asQualifiedIdent = fromAesonParser
562−asBookmarks :: Parse BowerError [Bookmark]
560+asModuleMap :: Parse PackageError (Map P.ModuleName PackageName)
563−asBookmarks = eachInArray asBookmark
561+asModuleMap =
563+ eachInObjectWithKey (Right . P.moduleNameFromString)
564+ (withText parsePackageName')
566+-- This is here to preserve backwards compatibility with compilers which used
567+-- to generate a 'bookmarks' field in the JSON (i.e. up to 0.10.5). We should
568+-- remove this after the next breaking change to the JSON.
569+bookmarksAsModuleMap :: Parse BowerError (Map P.ModuleName PackageName)
570+bookmarksAsModuleMap =
572+ eachInArray (asInPackage (nth 0 (P.moduleNameFromString <$> asText)))
575+ convert :: [InPackage P.ModuleName] -> Map P.ModuleName PackageName
576+ convert = Map.fromList . mapMaybe toTuple
565−asBookmark :: Parse BowerError Bookmark
578+ toTuple (Local _) = Nothing
566−asBookmark =
579+ toTuple (FromDep pkgName mn) = Just (mn, pkgName)
567− asInPackage ((,) <$> nth 0 (P.moduleNameFromString <$> asText)
570asResolvedDependencies :: Parse PackageError [(PackageName, Version)]
581asResolvedDependencies :: Parse PackageError [(PackageName, Version)]
571asResolvedDependencies =
582asResolvedDependencies =
583+ eachInObjectWithKey parsePackageName' asVersion
585+parsePackageName' :: Text -> Either PackageError PackageName
572− eachInObjectWithKey (mapLeft ErrorInPackageMeta . parsePackageName) asVersion
587+ mapLeft ErrorInPackageMeta . parsePackageName
589+mapLeft :: (a -> a') -> Either a b -> Either a' b
574− mapLeft f (Left x) = Left (f x)
590+mapLeft f (Left x) = Left (f x)
575− mapLeft _ (Right x) = Right x
591+mapLeft _ (Right x) = Right x
577asGithub :: Parse e (GithubUser, GithubRepo)
593asGithub :: Parse e (GithubUser, GithubRepo)
578asGithub = (,) <$> nth 0 (GithubUser <$> asText)
594asGithub = (,) <$> nth 0 (GithubUser <$> asText)
@@ -593,7 +609,9 @@ instance A.ToJSON a => A.ToJSON (Package a) where
593 , "version" .= showVersion pkgVersion
609 , "version" .= showVersion pkgVersion
594 , "versionTag" .= pkgVersionTag
610 , "versionTag" .= pkgVersionTag
595 , "modules" .= pkgModules
611 , "modules" .= pkgModules
596− , "bookmarks" .= map (fmap (first P.runModuleName)) pkgBookmarks
612+ , "moduleMap" .= assocListToJSON P.runModuleName
614+ (Map.toList pkgModuleMap)
597 , "resolvedDependencies" .= assocListToJSON runPackageName
615 , "resolvedDependencies" .= assocListToJSON runPackageName
598 (T.pack . showVersion)
616 (T.pack . showVersion)
599 pkgResolvedDependencies
617 pkgResolvedDependencies