packages feed

hydra-0.15.0: src/exec/update-json-manifest/Main.hs

-- | Write per-package manifest.json files under dist/json/<pkg>/src/main/json/.
--
-- Each package's manifest lists only the namespaces it owns. Bootstrap
-- readers (bootstrap-from-json, language hosts) walk multiple package
-- manifests in dependency order rather than reading a single monolithic
-- manifest.

module Main where

import Hydra.Generation (writePerPackageManifestsJson)
import Hydra.PackageRouting (defaultDistJsonRoot)
import Hydra.Sources.Ext (
  mainModules, dslSourceModules, kernelModules, haskellModules, jsonModules, otherModules,
  hydraCoqModules, hydraJavaModules, hydraJavaScriptModules,
  hydraPythonModules, hydraScalaModules, hydraLispModules,
  hydraPgModules, hydraRdfModules, hydraWasmModules,
  hydraExtPackageModules,
  hydraExtDecodingModules, hydraExtEncodingModules)
import Hydra.Sources.Eval.Lib.All (evalLibModules)
import Hydra.Sources.Test.All (testModules)

import qualified Hydra.Kernel as Kernel
import qualified Hydra.Sources.Demos.GenPG.Transform as GenPGTransform

import qualified Data.List as L
import qualified Data.Set as S


-- | Deduplicate a list of modules by namespace, keeping the first occurrence.
dedupByNamespace :: [Kernel.Module] -> [Kernel.Module]
dedupByNamespace = go S.empty
  where
    go _    []     = []
    go seen (m:ms)
      | ns `S.member` seen = go seen ms
      | otherwise          = m : go (S.insert ns seen) ms
      where ns = Kernel.moduleNamespace m

main :: IO ()
main = do
  putStrLn "=== Generate per-package JSON manifests ==="
  putStrLn ""

  -- The full main-side universe mirrors update-json-main's input: every
  -- module written to JSON should appear in exactly one package's manifest.
  let mainUniverse = dedupByNamespace $ L.concat
        [ mainModules
        , evalLibModules
        , dslSourceModules
        , hydraCoqModules
        , hydraJavaModules
        , hydraJavaScriptModules
        , hydraPythonModules
        , hydraScalaModules
        , hydraLispModules
        , hydraPgModules
        , hydraRdfModules
        , hydraWasmModules
        , hydraExtPackageModules
        , hydraExtDecodingModules
        , hydraExtEncodingModules
        , [GenPGTransform.module_]
        ]
  -- DSL generator input: the kernel-side type universe. Matches update-json-main.
  let dslInputMods = kernelModules ++ jsonModules ++ otherModules ++ haskellModules

  writePerPackageManifestsJson defaultDistJsonRoot mainUniverse dslInputMods mainUniverse testModules
  putStrLn ""
  putStrLn "=== Done! ==="