@@ -7,11 +7,11 @@ module Strategy.Node.Pnpm.PnpmLock (
77
88import Control.Applicative ((<|>) )
99import Control.Effect.Diagnostics (Diagnostics , Has , context )
10- import Data.Maybe (fromMaybe )
1110import Data.Foldable (for_ )
1211import Data.HashMap.Strict qualified as HashMap
1312import Data.Map (Map , toList )
1413import Data.Map qualified as Map
14+ import Data.Maybe (fromMaybe )
1515import Data.Set qualified as Set
1616import Data.Text (Text )
1717import Data.Text qualified as Text
@@ -22,13 +22,13 @@ import DepTypes (
2222 VerConstraint (CEq ),
2323 hydrateDepEnvs ,
2424 insertEnvironment ,
25- )
25+ )
2626import Effect.Grapher (deep , direct , edge , label , run , withLabeling )
2727import Effect.Logger (
2828 Logger ,
2929 logWarn ,
3030 pretty ,
31- )
31+ )
3232import Effect.ReadFS (ReadFS , readContentsYaml )
3333import Graphing (Graphing )
3434import Graphing qualified
@@ -49,11 +49,11 @@ import Strategy.Node.Pnpm.Types (
4949 Resolution (.. ),
5050 TarballResolution (.. ),
5151 withoutPeerDepSuffix ,
52- )
52+ )
5353import Strategy.Node.Pnpm.V4_8 (
5454 buildGraphConfigV4or5 ,
5555 buildGraphConfigV678 ,
56- )
56+ )
5757import Strategy.Node.Pnpm.V9 (buildGraphConfigV9 )
5858
5959-- | Label attached to direct dependencies so that hydrateDepEnvs can
@@ -67,8 +67,12 @@ newtype PnpmLabel = PnpmEnv DepEnvironment
6767--
6868
6969-- | Convert a resolved package into a 'Dependency' node.
70- toDependency :: (Bool -> Set. Set DepEnvironment )
71- -> Text -> Maybe Text -> PackageData -> Dependency
70+ toDependency ::
71+ (Bool -> Set. Set DepEnvironment ) ->
72+ Text ->
73+ Maybe Text ->
74+ PackageData ->
75+ Dependency
7276toDependency toEnv name maybeVersion (PackageData isDev _ (RegistryResolve _) _ _) =
7377 toDep toEnv NodeJSType name (withoutPeerDepSuffix . withoutSymConstraint <$> maybeVersion) isDev
7478toDependency toEnv _ _ (PackageData isDev _ (GitResolve (GitResolution url rev)) _ _) =
@@ -81,8 +85,13 @@ toDependency toEnv name _ (PackageData isDev Nothing (DirectoryResolve _) _ _) =
8185 toDep toEnv UserType name Nothing isDev
8286
8387-- | Construct a 'Dependency' from its components.
84- toDep :: (Bool -> Set. Set DepEnvironment )
85- -> DepType -> Text -> Maybe Text -> Bool -> Dependency
88+ toDep ::
89+ (Bool -> Set. Set DepEnvironment ) ->
90+ DepType ->
91+ Text ->
92+ Maybe Text ->
93+ Bool ->
94+ Dependency
8695toDep toEnv depType name version isDev =
8796 Dependency depType name (CEq <$> version) mempty (toEnv isDev) mempty
8897
@@ -124,13 +133,17 @@ withoutLocalPackages = Graphing.shrink (\dep -> dependencyType dep /= UserType)
124133--
125134-- Non-registry resolvers (tarball, git, directory) use the version value
126135-- directly as the @packages@ key. Registry resolvers use a constructed key.
127- toResolvedDependency
128- :: (Bool -> Set. Set DepEnvironment ) -- ^ toEnv for this version
129- -> Map Text PackageData
130- -> (Text -> Text -> Text ) -- ^ mkPkgKey for this version
131- -> Text -- ^ dependency name
132- -> Text -- ^ dependency version
133- -> Maybe Dependency
136+ toResolvedDependency ::
137+ -- | toEnv for this version
138+ (Bool -> Set. Set DepEnvironment ) ->
139+ Map Text PackageData ->
140+ -- | mkPkgKey for this version
141+ (Text -> Text -> Text ) ->
142+ -- | dependency name
143+ Text ->
144+ -- | dependency version
145+ Text ->
146+ Maybe Dependency
134147toResolvedDependency toEnv pkgs mkPkg depName depVersion = do
135148 -- Some versions of the lockfile remove the peer dep suffix.
136149 -- Others do not which is why it tries both.
@@ -163,44 +176,44 @@ buildGraphCore BuildGraphConfig{bgcGetPkgNameVersion, bgcMkPkgKey, bgcToEnv, bgc
163176 catalogs = bgcCatalogs
164177 pkgs = lockfilePackages base
165178 snapshotEdgesHM = HashMap. fromList snapshotEdges
166- in withoutLocalPackages . hydrateDepEnvs $
167- run . withLabeling applyLabels $ do
168- -- Direct dependencies from each importer (workspace package).
169- for_ (toList (lockfileImporters base)) $ \ (_, projectImporters) -> do
170- for_ (Map. toList $ directDependencies projectImporters) $ \ (depName, ProjectMapDepMetadata depVersion) ->
171- let resolvedVersion = resolveCatalogVersion catalogs depName depVersion
172- in for_ (toResolvedDependency toEnv pkgs mkPkgKey depName resolvedVersion) $ \ dep -> do
173- direct dep
174- case labelingMode of
175- LabelingOn -> label dep (PnpmEnv EnvProduction )
176- LabelingOff -> pure ()
177-
178- for_ (Map. toList $ directDevDependencies projectImporters) $ \ (depName, ProjectMapDepMetadata depVersion) ->
179- let resolvedVersion = resolveCatalogVersion catalogs depName depVersion
180- in for_ (toResolvedDependency toEnv pkgs mkPkgKey depName resolvedVersion) $ \ dep -> do
181- direct dep
182- case labelingMode of
183- LabelingOn -> label dep (PnpmEnv EnvDevelopment )
184- LabelingOff -> pure ()
185-
186- -- Deep dependencies and edges from the packages section.
187- for_ (toList pkgs) $ \ (pkgKey, pkgMeta) -> do
188- let deepDependencies =
189- Map. toList (dependencies pkgMeta)
190- <> Map. toList (peerDependencies pkgMeta)
191- <> fromMaybe mempty (HashMap. lookup pkgKey snapshotEdgesHM)
192-
193- let (depName, depVersion) = case getPkgNameVersion pkgKey of
194- Nothing -> (pkgKey, Nothing )
195- Just (name, version) -> (name, Just version)
196- let parentDep = toDependency toEnv depName depVersion pkgMeta
197-
198- -- It is ok if this dependency was already graphed as direct
199- -- @direct 1 <> deep 1 = direct 1@
200- deep parentDep
201-
202- for_ deepDependencies $ \ (deepName, deepVersion) -> do
203- maybe (pure () ) (edge parentDep) (toResolvedDependency toEnv pkgs mkPkgKey deepName deepVersion)
179+ in withoutLocalPackages . hydrateDepEnvs $
180+ run . withLabeling applyLabels $ do
181+ -- Direct dependencies from each importer (workspace package).
182+ for_ (toList (lockfileImporters base)) $ \ (_, projectImporters) -> do
183+ for_ (Map. toList $ directDependencies projectImporters) $ \ (depName, ProjectMapDepMetadata depVersion) ->
184+ let resolvedVersion = resolveCatalogVersion catalogs depName depVersion
185+ in for_ (toResolvedDependency toEnv pkgs mkPkgKey depName resolvedVersion) $ \ dep -> do
186+ direct dep
187+ case labelingMode of
188+ LabelingOn -> label dep (PnpmEnv EnvProduction )
189+ LabelingOff -> pure ()
190+
191+ for_ (Map. toList $ directDevDependencies projectImporters) $ \ (depName, ProjectMapDepMetadata depVersion) ->
192+ let resolvedVersion = resolveCatalogVersion catalogs depName depVersion
193+ in for_ (toResolvedDependency toEnv pkgs mkPkgKey depName resolvedVersion) $ \ dep -> do
194+ direct dep
195+ case labelingMode of
196+ LabelingOn -> label dep (PnpmEnv EnvDevelopment )
197+ LabelingOff -> pure ()
198+
199+ -- Deep dependencies and edges from the packages section.
200+ for_ (toList pkgs) $ \ (pkgKey, pkgMeta) -> do
201+ let deepDependencies =
202+ Map. toList (dependencies pkgMeta)
203+ <> Map. toList (peerDependencies pkgMeta)
204+ <> fromMaybe mempty (HashMap. lookup pkgKey snapshotEdgesHM)
205+
206+ let (depName, depVersion) = case getPkgNameVersion pkgKey of
207+ Nothing -> (pkgKey, Nothing )
208+ Just (name, version) -> (name, Just version)
209+ let parentDep = toDependency toEnv depName depVersion pkgMeta
210+
211+ -- It is ok if this dependency was already graphed as direct
212+ -- @direct 1 <> deep 1 = direct 1@
213+ deep parentDep
214+
215+ for_ deepDependencies $ \ (deepName, deepVersion) -> do
216+ maybe (pure () ) (edge parentDep) (toResolvedDependency toEnv pkgs mkPkgKey deepName deepVersion)
204217
205218--
206219-- Top-level dispatch
@@ -222,8 +235,9 @@ analyze file = context "Analyzing Pnpm Lockfile" $ do
222235 case pnpmLockFile of
223236 LockfileV4Or5 (PnpmLockfileV4Or5 base) ->
224237 case Text. uncons (lockfileRawVersion base) of
225- Just (c, _) | c `elem` [' 1' , ' 2' , ' 3' ] ->
226- logWarn . pretty $ " pnpm-lock file is using older lockFileVersion: " <> lockfileRawVersion base <> " , which is not officially supported!"
238+ Just (c, _)
239+ | c `elem` [' 1' , ' 2' , ' 3' ] ->
240+ logWarn . pretty $ " pnpm-lock file is using older lockFileVersion: " <> lockfileRawVersion base <> " , which is not officially supported!"
227241 _ -> pure ()
228242 LockfileV678 _ -> pure ()
229243 LockfileV9 _ -> pure ()
0 commit comments