@@ -5,13 +5,14 @@ import Docs.Search.Config as Config
55import Docs.Search.Declarations (Declarations (..), mkDeclarations )
66import Docs.Search.DocsJson (DocsJson )
77import Docs.Search.Extra ((>#>))
8+ import Docs.Search.Meta (Meta )
89import Docs.Search.ModuleIndex (PackedModuleIndex , mkPackedModuleIndex )
10+ import Docs.Search.ModuleParser (parseModuleName )
911import Docs.Search.PackageIndex (PackageInfo , mkPackageInfo )
1012import Docs.Search.Score (mkScores )
1113import Docs.Search.SearchResult (SearchResult )
1214import Docs.Search.TypeIndex (TypeIndex , mkTypeIndex )
13- import Docs.Search.Types (PackageName , PartId )
14- import Docs.Search.Meta (Meta )
15+ import Docs.Search.Types (ModuleName , PackageName , PartId )
1516
1617import Prelude
1718
@@ -20,6 +21,7 @@ import Data.Argonaut.Decode (decodeJson)
2021import Data.Argonaut.Decode.Error (printJsonDecodeError )
2122import Data.Argonaut.Encode (encodeJson )
2223import Data.Argonaut.Parser (jsonParser )
24+ import Data.Array (concat )
2325import Data.Array as Array
2426import Data.Either (Either (..), either )
2527import Data.Foldable (sum )
@@ -38,14 +40,15 @@ import Data.String.Common (replace) as String
3840import Data.String.Pattern (Pattern (..), Replacement (..))
3941import Data.Traversable (for , for_ )
4042import Data.Tuple (Tuple (..), fst )
43+ import Data.Tuple.Nested ((/\))
4144import Effect (Effect )
4245import Effect.Aff (Aff , launchAff_ , parallel , sequential )
4346import Effect.Class (liftEffect )
4447import Effect.Console (log )
4548import Node.Encoding (Encoding (UTF8))
4649import Node.FS.Aff (mkdir , readFile , readTextFile , readdir , stat , writeFile , writeTextFile )
47- import Node.FS.Sync (exists )
4850import Node.FS.Stats (isDirectory , isFile )
51+ import Node.FS.Sync (exists )
4952import Node.Process as Process
5053import Web.Bower.PackageMeta (PackageMeta (..))
5154
@@ -56,6 +59,7 @@ type Config =
5659 , generatedDocs :: String
5760 , noPatch :: Boolean
5861 , packageName :: PackageName
62+ , sourceFiles :: Array String
5963 }
6064
6165
@@ -71,8 +75,11 @@ run' cfg = do
7175 liftEffect do
7276 log " Building the search index..."
7377
74- docsJsons <- decodeDocsJsons cfg
75- packageMetas <- decodeBowerJsons cfg
78+ docsJsons /\ moduleNames /\ packageMetas <- sequential $
79+ (\d h m -> d /\ h /\ m)
80+ <$> parallel (decodeDocsJsons cfg)
81+ <*> parallel (parseModuleHeaders cfg.sourceFiles)
82+ <*> parallel (decodeBowerJsons cfg)
7683
7784 let countOfPackages = Array .length packageMetas
7885 countOfModules = Array .length docsJsons
@@ -89,14 +96,14 @@ run' cfg = do
8996 index = mkDeclarations scores docsJsons
9097 typeIndex = mkTypeIndex scores docsJsons
9198 packageInfo = mkPackageInfo scores packageMetas
92- moduleIndex = mkPackedModuleIndex index
99+ moduleIndex = mkPackedModuleIndex index moduleNames
93100 meta = { localPackageName: cfg.packageName }
94101
95102 createDirectories cfg
96103
97104 void $ sequential do
98105 ignore <$> parallel (writeIndex cfg index)
99- <*> parallel (writeTypeIndex cfg typeIndex)
106+ <*> parallel (writeTypeIndex typeIndex)
100107 <*> parallel (writePackageInfo packageInfo)
101108 <*> parallel (writeModuleIndex moduleIndex)
102109 <*> parallel (writeMeta meta)
@@ -176,6 +183,24 @@ decodeDocsJsons cfg@{ docsFiles } = do
176183
177184 pure docsJsons
178185
186+ -- | This function accepts an array of globs pointing to project sources
187+ -- | and returns a list of module names extracted from these files.
188+ -- | Unfortunately, we can't get all module names from `docs.json`s, because
189+ -- | reexport-only modules do not have a single declaration in them, so we can't
190+ -- | count them normally in `mkPackedModuleIndex.extract`, where we only look at
191+ -- | exported declarations.
192+ parseModuleHeaders :: Array String -> Aff (Array ModuleName )
193+ parseModuleHeaders globs = do
194+ files <- getPathsByGlobs globs
195+ concat <$> for files \filePath -> do
196+ fileContents <- readTextFile UTF8 filePath
197+ case parseModuleName fileContents of
198+ Nothing -> do
199+ liftEffect $ log $
200+ " Module header decoding failed for " <> filePath <>
201+ " , unable to extract module name"
202+ pure []
203+ Just res -> pure [res]
179204
180205decodeBowerJsons
181206 :: forall rest
@@ -210,8 +235,8 @@ decodeBowerJsons { bowerFiles } = do
210235
211236
212237-- | Write type index parts to files.
213- writeTypeIndex :: Config -> TypeIndex -> Aff Unit
214- writeTypeIndex { generatedDocs } typeIndex =
238+ writeTypeIndex :: TypeIndex -> Aff Unit
239+ writeTypeIndex typeIndex =
215240 for_ entries \(Tuple typeShape results) -> do
216241 writeTextFile UTF8 (unwrap Config .typeIndexDirectory <> " /" <> typeShape <> " .js" )
217242 (mkHeader typeShape <> stringify (encodeJson results))
@@ -265,7 +290,7 @@ getIndex (Declarations trie) =
265290 Trie .query prefix trie
266291 else
267292 -- Entries with path lengths > 1 have been added already.
268- List .filter (\(Tuple path value ) -> List .length path == 1 ) (
293+ List .filter (\(Tuple path _value ) -> List .length path == 1 ) (
269294 Trie .query prefix trie
270295 )
271296 in
0 commit comments