@@ -4,19 +4,14 @@ module Language.PureScript.Docs.Types
44 )
55 where
66
7−import Prelude.Compat
7+import Protolude hiding (to, from)
8+import Prelude (String, unlines)
89
9−import Control.Arrow (first, (***))
10−import Control.Monad (when)
11−import Control.Monad.Error.Class (catchError)
10+import Control.Arrow ((***))
1211
1312import Data.Aeson ((.=))
1413import Data.Aeson.BetterErrors
15−import Data.ByteString.Lazy (ByteString)
16−import Data.Either (isLeft, isRight)
17−import Data.Maybe (mapMaybe, fromMaybe, maybeToList)
18−import Data.Monoid ((<>))
19−import Data.Text (Text)
14+import qualified Data.Map as Map
2015import Data.Time.Clock (UTCTime)
2116import qualified Data.Time.Format as TimeFormat
2217import Data.Version
@@ -47,7 +42,7 @@ data Package a = Package
4742 -- field. It should eventually be changed to just UTCTime.
4843 , pkgTagTime :: Maybe UTCTime
4944 , pkgModules :: [Module]
50− , pkgBookmarks :: [Bookmark]
45+ , pkgModuleMap :: Map P.ModuleName PackageName
5146 , pkgResolvedDependencies :: [(PackageName, Version)]
5247 , pkgGithub :: (GithubUser, GithubRepo)
5348 , pkgUploader :: a
@@ -70,7 +65,7 @@ verifyPackage verifiedUser Package{..} =
7065 pkgVersionTag
7166 pkgTagTime
7267 pkgModules
73− pkgBookmarks
68+ pkgModuleMap
7469 pkgResolvedDependencies
7570 pkgGithub
7671 verifiedUser
@@ -308,8 +303,6 @@ data PackageError
308303 | InvalidTime
309304 deriving (Show, Eq, Ord)
310305
311−type Bookmark = InPackage (P.ModuleName, Text)
312−
313306data InPackage a
314307 = Local a
315308 | FromDep PackageName a
@@ -333,10 +326,10 @@ ignorePackage (FromDep _ x) = x
333326----------------------
334327-- Parsing
335328
336−parseUploadedPackage :: Version -> ByteString -> Either (ParseError PackageError) UploadedPackage
329+parseUploadedPackage :: Version -> LByteString -> Either (ParseError PackageError) UploadedPackage
337330parseUploadedPackage minVersion = parse $ asUploadedPackage minVersion
338331
339−parseVerifiedPackage :: Version -> ByteString -> Either (ParseError PackageError) VerifiedPackage
332+parseVerifiedPackage :: Version -> LByteString -> Either (ParseError PackageError) VerifiedPackage
340333parseVerifiedPackage minVersion = parse $ asVerifiedPackage minVersion
341334
342335asPackage :: Version -> (forall e. Parse e a) -> Parse PackageError (Package a)
@@ -353,11 +346,15 @@ asPackage minimumVersion uploader = do
353346 <*> key "versionTag" asText
354347 <*> keyMay "tagTime" (withString parseTimeEither)
355348 <*> key "modules" (eachInArray asModule)
356− <*> key "bookmarks" asBookmarks .! ErrorInPackageMeta
349+ <*> moduleMap
357350 <*> key "resolvedDependencies" asResolvedDependencies
358351 <*> key "github" asGithub
359352 <*> key "uploader" uploader
360353 <*> pure compilerVersion
354+ where
355+ moduleMap =
356+ key "moduleMap" asModuleMap
357+ `pOr` (key "bookmarks" bookmarksAsModuleMap .! ErrorInPackageMeta)
361358
362359parseTimeEither :: String -> Either PackageError UTCTime
363360parseTimeEither =
@@ -444,9 +441,10 @@ asReExport =
444441 asReExportModuleName :: Parse PackageError (InPackage P.ModuleName)
445442 asReExportModuleName =
446443 asInPackage fromAesonParser .! ErrorInPackageMeta
447− <|> fmap Local fromAesonParser
444+ `pOr` fmap Local fromAesonParser
448445
449− (<|>) p q = catchError p (const q)
446+pOr :: Parse e a -> Parse e a -> Parse e a
447+p `pOr` q = catchError p (const q)
450448
451449asInPackage :: Parse BowerError a -> Parse BowerError (InPackage a)
452450asInPackage inner =
@@ -559,20 +557,38 @@ asQualifiedProperName = fromAesonParser
559557asQualifiedIdent :: Parse e (P.Qualified P.Ident)
560558asQualifiedIdent = fromAesonParser
561559
562−asBookmarks :: Parse BowerError [Bookmark]
563−asBookmarks = eachInArray asBookmark
560+asModuleMap :: Parse PackageError (Map P.ModuleName PackageName)
561+asModuleMap =
562+ Map.fromList <$>
563+ eachInObjectWithKey (Right . P.moduleNameFromString)
564+ (withText parsePackageName')
565+
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 =
571+ convert <$>
572+ eachInArray (asInPackage (nth 0 (P.moduleNameFromString <$> asText)))
573+
574+ where
575+ convert :: [InPackage P.ModuleName] -> Map P.ModuleName PackageName
576+ convert = Map.fromList . mapMaybe toTuple
564577
565−asBookmark :: Parse BowerError Bookmark
566−asBookmark =
567− asInPackage ((,) <$> nth 0 (P.moduleNameFromString <$> asText)
568− <*> nth 1 asText)
578+ toTuple (Local _) = Nothing
579+ toTuple (FromDep pkgName mn) = Just (mn, pkgName)
569580
570581asResolvedDependencies :: Parse PackageError [(PackageName, Version)]
571582asResolvedDependencies =
572− eachInObjectWithKey (mapLeft ErrorInPackageMeta . parsePackageName) asVersion
573− where
574− mapLeft f (Left x) = Left (f x)
575− mapLeft _ (Right x) = Right x
583+ eachInObjectWithKey parsePackageName' asVersion
584+
585+parsePackageName' :: Text -> Either PackageError PackageName
586+parsePackageName' =
587+ mapLeft ErrorInPackageMeta . parsePackageName
588+
589+mapLeft :: (a -> a') -> Either a b -> Either a' b
590+mapLeft f (Left x) = Left (f x)
591+mapLeft _ (Right x) = Right x
576592
577593asGithub :: Parse e (GithubUser, GithubRepo)
578594asGithub = (,) <$> nth 0 (GithubUser <$> asText)
@@ -593,7 +609,9 @@ instance A.ToJSON a => A.ToJSON (Package a) where
593609 , "version" .= showVersion pkgVersion
594610 , "versionTag" .= pkgVersionTag
595611 , "modules" .= pkgModules
596− , "bookmarks" .= map (fmap (first P.runModuleName)) pkgBookmarks
612+ , "moduleMap" .= assocListToJSON P.runModuleName
613+ runPackageName
614+ (Map.toList pkgModuleMap)
597615 , "resolvedDependencies" .= assocListToJSON runPackageName
598616 (T.pack . showVersion)
599617 pkgResolvedDependencies