@pnpm/reviewing.dependencies-hierarchy 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE CHANGED
@@ -1,7 +1,7 @@
1
1
  The MIT License (MIT)
2
2
 
3
3
  Copyright (c) 2015-2016 Rico Sta. Cruz and other contributors
4
- Copyright (c) 2016-2022 Zoltan Kochan and other contributors
4
+ Copyright (c) 2016-2023 Zoltan Kochan and other contributors
5
5
 
6
6
  Permission is hereby granted, free of charge, to any person obtaining a copy
7
7
  of this software and associated documentation files (the "Software"), to deal
@@ -0,0 +1,76 @@
1
+ import { PackageNode } from './PackageNode';
2
+ import { TreeNodeId } from './TreeNodeId';
3
+ export interface GetDependenciesCacheEntryArgs {
4
+ readonly parentId: TreeNodeId;
5
+ readonly requestedDepth: number;
6
+ }
7
+ export interface TraversalResultFullyVisited {
8
+ readonly dependencies: PackageNode[];
9
+ /**
10
+ * Describes the height of the parent node in the fully enumerated dependency
11
+ * tree. A height of 0 means no entries are present in the dependencies array.
12
+ * A height of 1 means entries in the dependencies array do not have any of
13
+ * their own dependencies.
14
+ */
15
+ readonly height: number;
16
+ }
17
+ export interface TraversalResultPartiallyVisited {
18
+ readonly dependencies: PackageNode[];
19
+ /**
20
+ * Describes how deep the dependencies tree was previously traversed. Since
21
+ * the traversal result was limited by a max depth, there are likely more
22
+ * dependencies present deeper in the tree not shown.
23
+ *
24
+ * A depth of 0 would indicate no entries in the dependencies array. A depth
25
+ * of 1 means entries in the dependencies array do not have any of their own
26
+ * dependencies.
27
+ */
28
+ readonly depth: number;
29
+ }
30
+ export interface CacheHit {
31
+ readonly dependencies: PackageNode[];
32
+ readonly height: number | 'unknown';
33
+ readonly circular: false;
34
+ }
35
+ /**
36
+ * A cache for the dependencies of a package.
37
+ *
38
+ * ## Depth Considerations
39
+ *
40
+ * Since the enumerated dependency tree can be limited by a max depth argument,
41
+ * several considerations have to be made when caching.
42
+ *
43
+ * - If a package is visited with a requested depth greater than the cached
44
+ * depth, the cache cannot be used. The tree needs to be enumerated again
45
+ * deeper.
46
+ * - If a package is visited with a requested depth less than the cached
47
+ * depth, the cache probably can't be used. This depends on how strict the
48
+ * depth constraint is and whether it's acceptable to exceed the max depth.
49
+ * This cache assumes the max depth should not be exceeded.
50
+ * - Cycles may or may not be cached. It depends on whether the cycle is
51
+ * introduced by a package outside of the cached tree.
52
+ *
53
+ * This cache adds an optimization when a dependency tree has been fully
54
+ * enumerated and wasn't limited by a max depth argument. In that case,
55
+ * dependency trees cached can be used when the max depth argument is greater
56
+ * than or equal to the height of the tree root.
57
+ *
58
+ * ## Future Optimizations
59
+ *
60
+ * The necessity of this cache may be removed in the future with a refactor of
61
+ * the `pnpm list` command. This cache attempts to optimize runtime to O(# of
62
+ * unique packages), but the list command is O(# of nodes) anyway since every
63
+ * node needs to be printed. It's possible a generator function could be
64
+ * returned here to avoid computing large trees in-memory before passing to
65
+ * downstream commands.
66
+ */
67
+ export declare class DependenciesCache {
68
+ private readonly fullyVisitedCache;
69
+ /**
70
+ * Maps cacheKey -> visitedDepth -> dependencies
71
+ */
72
+ private readonly partiallyVisitedCache;
73
+ get(args: GetDependenciesCacheEntryArgs): CacheHit | undefined;
74
+ addFullyVisitedResult(treeNodeId: TreeNodeId, result: TraversalResultFullyVisited): void;
75
+ addPartiallyVisitedResult(treeNodeId: TreeNodeId, result: TraversalResultPartiallyVisited): void;
76
+ }
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DependenciesCache = void 0;
4
+ const TreeNodeId_1 = require("./TreeNodeId");
5
+ /**
6
+ * A cache for the dependencies of a package.
7
+ *
8
+ * ## Depth Considerations
9
+ *
10
+ * Since the enumerated dependency tree can be limited by a max depth argument,
11
+ * several considerations have to be made when caching.
12
+ *
13
+ * - If a package is visited with a requested depth greater than the cached
14
+ * depth, the cache cannot be used. The tree needs to be enumerated again
15
+ * deeper.
16
+ * - If a package is visited with a requested depth less than the cached
17
+ * depth, the cache probably can't be used. This depends on how strict the
18
+ * depth constraint is and whether it's acceptable to exceed the max depth.
19
+ * This cache assumes the max depth should not be exceeded.
20
+ * - Cycles may or may not be cached. It depends on whether the cycle is
21
+ * introduced by a package outside of the cached tree.
22
+ *
23
+ * This cache adds an optimization when a dependency tree has been fully
24
+ * enumerated and wasn't limited by a max depth argument. In that case,
25
+ * dependency trees cached can be used when the max depth argument is greater
26
+ * than or equal to the height of the tree root.
27
+ *
28
+ * ## Future Optimizations
29
+ *
30
+ * The necessity of this cache may be removed in the future with a refactor of
31
+ * the `pnpm list` command. This cache attempts to optimize runtime to O(# of
32
+ * unique packages), but the list command is O(# of nodes) anyway since every
33
+ * node needs to be printed. It's possible a generator function could be
34
+ * returned here to avoid computing large trees in-memory before passing to
35
+ * downstream commands.
36
+ */
37
+ class DependenciesCache {
38
+ constructor() {
39
+ this.fullyVisitedCache = new Map();
40
+ /**
41
+ * Maps cacheKey -> visitedDepth -> dependencies
42
+ */
43
+ this.partiallyVisitedCache = new Map();
44
+ }
45
+ get(args) {
46
+ const cacheKey = (0, TreeNodeId_1.serializeTreeNodeId)(args.parentId);
47
+ // The fully visited cache is only usable if the height doesn't exceed the
48
+ // requested depth. Otherwise the final dependencies listing will print
49
+ // entries with a greater depth than requested.
50
+ //
51
+ // If that is the case, the partially visited cache should be checked to see
52
+ // if dependencies were requested at that exact depth before.
53
+ const fullyVisitedEntry = this.fullyVisitedCache.get(cacheKey);
54
+ if (fullyVisitedEntry !== undefined && fullyVisitedEntry.height <= args.requestedDepth) {
55
+ return {
56
+ dependencies: fullyVisitedEntry.dependencies,
57
+ height: fullyVisitedEntry.height,
58
+ circular: false,
59
+ };
60
+ }
61
+ const partiallyVisitedEntry = this.partiallyVisitedCache.get(cacheKey)?.get(args.requestedDepth);
62
+ if (partiallyVisitedEntry != null) {
63
+ return {
64
+ dependencies: partiallyVisitedEntry,
65
+ height: 'unknown',
66
+ circular: false,
67
+ };
68
+ }
69
+ return undefined;
70
+ }
71
+ addFullyVisitedResult(treeNodeId, result) {
72
+ const cacheKey = (0, TreeNodeId_1.serializeTreeNodeId)(treeNodeId);
73
+ this.fullyVisitedCache.set(cacheKey, result);
74
+ }
75
+ addPartiallyVisitedResult(treeNodeId, result) {
76
+ const cacheKey = (0, TreeNodeId_1.serializeTreeNodeId)(treeNodeId);
77
+ const dependenciesByDepth = this.partiallyVisitedCache.get(cacheKey) ?? new Map();
78
+ if (!this.partiallyVisitedCache.has(cacheKey)) {
79
+ this.partiallyVisitedCache.set(cacheKey, dependenciesByDepth);
80
+ }
81
+ dependenciesByDepth.set(result.depth, result.dependencies);
82
+ }
83
+ }
84
+ exports.DependenciesCache = DependenciesCache;
85
+ //# sourceMappingURL=DependenciesCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DependenciesCache.js","sourceRoot":"","sources":["../src/DependenciesCache.ts"],"names":[],"mappings":";;;AACA,6CAA8D;AAyC9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAa,iBAAiB;IAA9B;QACmB,sBAAiB,GAAG,IAAI,GAAG,EAAuC,CAAA;QAEnF;;WAEG;QACc,0BAAqB,GAAG,IAAI,GAAG,EAAsC,CAAA;IA8CxF,CAAC;IA5CQ,GAAG,CAAE,IAAmC;QAC7C,MAAM,QAAQ,GAAG,IAAA,gCAAmB,EAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAEnD,0EAA0E;QAC1E,uEAAuE;QACvE,+CAA+C;QAC/C,EAAE;QACF,4EAA4E;QAC5E,6DAA6D;QAC7D,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC9D,IAAI,iBAAiB,KAAK,SAAS,IAAI,iBAAiB,CAAC,MAAM,IAAI,IAAI,CAAC,cAAc,EAAE;YACtF,OAAO;gBACL,YAAY,EAAE,iBAAiB,CAAC,YAAY;gBAC5C,MAAM,EAAE,iBAAiB,CAAC,MAAM;gBAChC,QAAQ,EAAE,KAAK;aAChB,CAAA;SACF;QAED,MAAM,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAChG,IAAI,qBAAqB,IAAI,IAAI,EAAE;YACjC,OAAO;gBACL,YAAY,EAAE,qBAAqB;gBACnC,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE,KAAK;aAChB,CAAA;SACF;QAED,OAAO,SAAS,CAAA;IAClB,CAAC;IAEM,qBAAqB,CAAE,UAAsB,EAAE,MAAmC;QACvF,MAAM,QAAQ,GAAG,IAAA,gCAAmB,EAAC,UAAU,CAAC,CAAA;QAChD,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IAC9C,CAAC;IAEM,yBAAyB,CAAE,UAAsB,EAAE,MAAuC;QAC/F,MAAM,QAAQ,GAAG,IAAA,gCAAmB,EAAC,UAAU,CAAC,CAAA;QAChD,MAAM,mBAAmB,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,GAAG,EAAE,CAAA;QACjF,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YAC7C,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAA;SAC9D;QAED,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;IAC5D,CAAC;CACF;AApDD,8CAoDC"}
@@ -0,0 +1,15 @@
1
+ export interface PackageNode {
2
+ alias: string;
3
+ circular?: true;
4
+ dependencies?: PackageNode[];
5
+ dev?: boolean;
6
+ isPeer: boolean;
7
+ isSkipped: boolean;
8
+ isMissing: boolean;
9
+ name: string;
10
+ optional?: true;
11
+ path: string;
12
+ resolved?: string;
13
+ searched?: true;
14
+ version: string;
15
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=PackageNode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PackageNode.js","sourceRoot":"","sources":["../src/PackageNode.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ export type TreeNodeId = TreeNodeIdImporter | TreeNodeIdPackage;
2
+ /**
3
+ * A project local to the pnpm workspace.
4
+ */
5
+ interface TreeNodeIdImporter {
6
+ readonly type: 'importer';
7
+ readonly importerId: string;
8
+ }
9
+ /**
10
+ * An npm package depended on externally.
11
+ */
12
+ interface TreeNodeIdPackage {
13
+ readonly type: 'package';
14
+ readonly depPath: string;
15
+ }
16
+ export declare function serializeTreeNodeId(treeNodeId: TreeNodeId): string;
17
+ export {};
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.serializeTreeNodeId = void 0;
4
+ function serializeTreeNodeId(treeNodeId) {
5
+ switch (treeNodeId.type) {
6
+ case 'importer': {
7
+ // Only serialize known fields from TreeNodeId. TypeScript is duck typed and
8
+ // objects can have any number of unknown extra fields.
9
+ const { type, importerId } = treeNodeId;
10
+ return JSON.stringify({ type, importerId });
11
+ }
12
+ case 'package': {
13
+ const { type, depPath } = treeNodeId;
14
+ return JSON.stringify({ type, depPath });
15
+ }
16
+ }
17
+ }
18
+ exports.serializeTreeNodeId = serializeTreeNodeId;
19
+ //# sourceMappingURL=TreeNodeId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TreeNodeId.js","sourceRoot":"","sources":["../src/TreeNodeId.ts"],"names":[],"mappings":";;;AAkBA,SAAgB,mBAAmB,CAAE,UAAsB;IACzD,QAAQ,UAAU,CAAC,IAAI,EAAE;QACzB,KAAK,UAAU,CAAC,CAAC;YACf,4EAA4E;YAC5E,uDAAuD;YACvD,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,UAAU,CAAA;YACvC,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAA;SAC5C;QACD,KAAK,SAAS,CAAC,CAAC;YACd,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,UAAU,CAAA;YACpC,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;SACzC;KACA;AACH,CAAC;AAbD,kDAaC"}
@@ -0,0 +1,21 @@
1
+ import { DependenciesField, Registries } from '@pnpm/types';
2
+ import { PackageNode } from './PackageNode';
3
+ import { SearchFunction } from './types';
4
+ export interface DependenciesHierarchy {
5
+ dependencies?: PackageNode[];
6
+ devDependencies?: PackageNode[];
7
+ optionalDependencies?: PackageNode[];
8
+ unsavedDependencies?: PackageNode[];
9
+ }
10
+ export declare function buildDependenciesHierarchy(projectPaths: string[], maybeOpts: {
11
+ depth: number;
12
+ include?: {
13
+ [dependenciesField in DependenciesField]: boolean;
14
+ };
15
+ registries?: Registries;
16
+ onlyProjects?: boolean;
17
+ search?: SearchFunction;
18
+ lockfileDir: string;
19
+ }): Promise<{
20
+ [projectDir: string]: DependenciesHierarchy;
21
+ }>;
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.buildDependenciesHierarchy = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const lockfile_file_1 = require("@pnpm/lockfile-file");
9
+ const modules_yaml_1 = require("@pnpm/modules-yaml");
10
+ const normalize_registries_1 = require("@pnpm/normalize-registries");
11
+ const read_modules_dir_1 = require("@pnpm/read-modules-dir");
12
+ const read_package_json_1 = require("@pnpm/read-package-json");
13
+ const types_1 = require("@pnpm/types");
14
+ const normalize_path_1 = __importDefault(require("normalize-path"));
15
+ const realpath_missing_1 = __importDefault(require("realpath-missing"));
16
+ const resolve_link_target_1 = __importDefault(require("resolve-link-target"));
17
+ const getTree_1 = require("./getTree");
18
+ const getTreeNodeChildId_1 = require("./getTreeNodeChildId");
19
+ const getPkgInfo_1 = require("./getPkgInfo");
20
+ async function buildDependenciesHierarchy(projectPaths, maybeOpts) {
21
+ if (!maybeOpts?.lockfileDir) {
22
+ throw new TypeError('opts.lockfileDir is required');
23
+ }
24
+ const modulesDir = await (0, realpath_missing_1.default)(path_1.default.join(maybeOpts.lockfileDir, 'node_modules'));
25
+ const modules = await (0, modules_yaml_1.readModulesManifest)(modulesDir);
26
+ const registries = (0, normalize_registries_1.normalizeRegistries)({
27
+ ...maybeOpts?.registries,
28
+ ...modules?.registries,
29
+ });
30
+ const currentLockfile = (modules?.virtualStoreDir && await (0, lockfile_file_1.readCurrentLockfile)(modules.virtualStoreDir, { ignoreIncompatible: false })) ?? null;
31
+ const result = {};
32
+ if (!currentLockfile) {
33
+ for (const projectPath of projectPaths) {
34
+ result[projectPath] = {};
35
+ }
36
+ return result;
37
+ }
38
+ const opts = {
39
+ depth: maybeOpts.depth || 0,
40
+ include: maybeOpts.include ?? {
41
+ dependencies: true,
42
+ devDependencies: true,
43
+ optionalDependencies: true,
44
+ },
45
+ lockfileDir: maybeOpts.lockfileDir,
46
+ onlyProjects: maybeOpts.onlyProjects,
47
+ registries,
48
+ search: maybeOpts.search,
49
+ skipped: new Set(modules?.skipped ?? []),
50
+ };
51
+ (await Promise.all(projectPaths.map(async (projectPath) => {
52
+ return [
53
+ projectPath,
54
+ await dependenciesHierarchyForPackage(projectPath, currentLockfile, opts),
55
+ ];
56
+ }))).forEach(([projectPath, dependenciesHierarchy]) => {
57
+ result[projectPath] = dependenciesHierarchy;
58
+ });
59
+ return result;
60
+ }
61
+ exports.buildDependenciesHierarchy = buildDependenciesHierarchy;
62
+ async function dependenciesHierarchyForPackage(projectPath, currentLockfile, opts) {
63
+ const importerId = (0, lockfile_file_1.getLockfileImporterId)(opts.lockfileDir, projectPath);
64
+ if (!currentLockfile.importers[importerId])
65
+ return {};
66
+ const modulesDir = path_1.default.join(projectPath, 'node_modules');
67
+ const savedDeps = getAllDirectDependencies(currentLockfile.importers[importerId]);
68
+ const allDirectDeps = await (0, read_modules_dir_1.readModulesDir)(modulesDir) ?? [];
69
+ const unsavedDeps = allDirectDeps.filter((directDep) => !savedDeps[directDep]);
70
+ const wantedLockfile = await (0, lockfile_file_1.readWantedLockfile)(opts.lockfileDir, { ignoreIncompatible: false }) ?? { packages: {} };
71
+ const getChildrenTree = getTree_1.getTree.bind(null, {
72
+ currentPackages: currentLockfile.packages ?? {},
73
+ importers: currentLockfile.importers,
74
+ includeOptionalDependencies: opts.include.optionalDependencies,
75
+ lockfileDir: opts.lockfileDir,
76
+ onlyProjects: opts.onlyProjects,
77
+ rewriteLinkVersionDir: projectPath,
78
+ maxDepth: opts.depth,
79
+ modulesDir,
80
+ registries: opts.registries,
81
+ search: opts.search,
82
+ skipped: opts.skipped,
83
+ wantedPackages: wantedLockfile.packages ?? {},
84
+ });
85
+ const parentId = { type: 'importer', importerId };
86
+ const result = {};
87
+ for (const dependenciesField of types_1.DEPENDENCIES_FIELDS.sort().filter(dependenciedField => opts.include[dependenciedField])) {
88
+ const topDeps = currentLockfile.importers[importerId][dependenciesField] ?? {};
89
+ result[dependenciesField] = [];
90
+ Object.entries(topDeps).forEach(([alias, ref]) => {
91
+ const packageInfo = (0, getPkgInfo_1.getPkgInfo)({
92
+ alias,
93
+ currentPackages: currentLockfile.packages ?? {},
94
+ rewriteLinkVersionDir: projectPath,
95
+ linkedPathBaseDir: projectPath,
96
+ modulesDir,
97
+ ref,
98
+ registries: opts.registries,
99
+ skipped: opts.skipped,
100
+ wantedPackages: wantedLockfile.packages ?? {},
101
+ });
102
+ let newEntry = null;
103
+ const matchedSearched = opts.search?.(packageInfo);
104
+ const nodeId = (0, getTreeNodeChildId_1.getTreeNodeChildId)({
105
+ parentId,
106
+ dep: { alias, ref },
107
+ lockfileDir: opts.lockfileDir,
108
+ importers: currentLockfile.importers,
109
+ });
110
+ if (opts.onlyProjects && nodeId?.type !== 'importer') {
111
+ return;
112
+ }
113
+ else if (nodeId == null) {
114
+ if ((opts.search != null) && !matchedSearched)
115
+ return;
116
+ newEntry = packageInfo;
117
+ }
118
+ else {
119
+ const dependencies = getChildrenTree(nodeId);
120
+ if (dependencies.length > 0) {
121
+ newEntry = {
122
+ ...packageInfo,
123
+ dependencies,
124
+ };
125
+ }
126
+ else if ((opts.search == null) || matchedSearched) {
127
+ newEntry = packageInfo;
128
+ }
129
+ }
130
+ if (newEntry != null) {
131
+ if (matchedSearched) {
132
+ newEntry.searched = true;
133
+ }
134
+ result[dependenciesField].push(newEntry);
135
+ }
136
+ });
137
+ }
138
+ await Promise.all(unsavedDeps.map(async (unsavedDep) => {
139
+ let pkgPath = path_1.default.join(modulesDir, unsavedDep);
140
+ let version;
141
+ try {
142
+ pkgPath = await (0, resolve_link_target_1.default)(pkgPath);
143
+ version = `link:${(0, normalize_path_1.default)(path_1.default.relative(projectPath, pkgPath))}`;
144
+ }
145
+ catch (err) { // eslint-disable-line
146
+ // if error happened. The package is not a link
147
+ const pkg = await (0, read_package_json_1.safeReadPackageJsonFromDir)(pkgPath);
148
+ version = pkg?.version ?? 'undefined';
149
+ }
150
+ const pkg = {
151
+ alias: unsavedDep,
152
+ isMissing: false,
153
+ isPeer: false,
154
+ isSkipped: false,
155
+ name: unsavedDep,
156
+ path: pkgPath,
157
+ version,
158
+ };
159
+ const matchedSearched = opts.search?.(pkg);
160
+ if ((opts.search != null) && !matchedSearched)
161
+ return;
162
+ const newEntry = pkg;
163
+ if (matchedSearched) {
164
+ newEntry.searched = true;
165
+ }
166
+ result.unsavedDependencies = result.unsavedDependencies ?? [];
167
+ result.unsavedDependencies.push(newEntry);
168
+ }));
169
+ return result;
170
+ }
171
+ function getAllDirectDependencies(projectSnapshot) {
172
+ return {
173
+ ...projectSnapshot.dependencies,
174
+ ...projectSnapshot.devDependencies,
175
+ ...projectSnapshot.optionalDependencies,
176
+ };
177
+ }
178
+ //# sourceMappingURL=buildDependenciesHierarchy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildDependenciesHierarchy.js","sourceRoot":"","sources":["../src/buildDependenciesHierarchy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { PackageSnapshots } from '@pnpm/lockfile-file';
2
+ import { Registries } from '@pnpm/types';
3
+ export interface GetPkgInfoOpts {
4
+ readonly alias: string;
5
+ readonly modulesDir: string;
6
+ readonly ref: string;
7
+ readonly currentPackages: PackageSnapshots;
8
+ readonly peers?: Set<string>;
9
+ readonly registries: Registries;
10
+ readonly skipped: Set<string>;
11
+ readonly wantedPackages: PackageSnapshots;
12
+ /**
13
+ * The base dir if the `ref` argument is a `"link:"` relative path.
14
+ */
15
+ readonly linkedPathBaseDir: string;
16
+ /**
17
+ * If the `ref` argument is a `"link:"` relative path, the ref is reused for
18
+ * the version field. (Since the true semver may not be known.)
19
+ *
20
+ * Optionally rewrite this relative path to a base dir before writing it to
21
+ * version.
22
+ */
23
+ readonly rewriteLinkVersionDir?: string;
24
+ }
25
+ export declare function getPkgInfo(opts: GetPkgInfoOpts): {
26
+ alias: string;
27
+ isMissing: boolean;
28
+ isPeer: boolean;
29
+ isSkipped: boolean;
30
+ name: string;
31
+ path: string;
32
+ version: string;
33
+ };
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getPkgInfo = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const lockfile_utils_1 = require("@pnpm/lockfile-utils");
9
+ const dependency_path_1 = require("@pnpm/dependency-path");
10
+ const normalize_path_1 = __importDefault(require("normalize-path"));
11
+ function getPkgInfo(opts) {
12
+ let name;
13
+ let version;
14
+ let resolved;
15
+ let dev;
16
+ let optional;
17
+ let isSkipped = false;
18
+ let isMissing = false;
19
+ const depPath = (0, dependency_path_1.refToRelative)(opts.ref, opts.alias);
20
+ if (depPath) {
21
+ let pkgSnapshot;
22
+ if (opts.currentPackages[depPath]) {
23
+ pkgSnapshot = opts.currentPackages[depPath];
24
+ const parsed = (0, lockfile_utils_1.nameVerFromPkgSnapshot)(depPath, pkgSnapshot);
25
+ name = parsed.name;
26
+ version = parsed.version;
27
+ }
28
+ else {
29
+ pkgSnapshot = opts.wantedPackages[depPath];
30
+ if (pkgSnapshot) {
31
+ const parsed = (0, lockfile_utils_1.nameVerFromPkgSnapshot)(depPath, pkgSnapshot);
32
+ name = parsed.name;
33
+ version = parsed.version;
34
+ }
35
+ else {
36
+ name = opts.alias;
37
+ version = opts.ref;
38
+ }
39
+ isMissing = true;
40
+ isSkipped = opts.skipped.has(depPath);
41
+ }
42
+ resolved = (0, lockfile_utils_1.pkgSnapshotToResolution)(depPath, pkgSnapshot, opts.registries)['tarball'];
43
+ dev = pkgSnapshot.dev;
44
+ optional = pkgSnapshot.optional;
45
+ }
46
+ else {
47
+ name = opts.alias;
48
+ version = opts.ref;
49
+ }
50
+ const fullPackagePath = depPath
51
+ ? path_1.default.join(opts.modulesDir, '.pnpm', (0, dependency_path_1.depPathToFilename)(depPath))
52
+ : path_1.default.join(opts.linkedPathBaseDir, opts.ref.slice(5));
53
+ if (version.startsWith('link:') && opts.rewriteLinkVersionDir) {
54
+ version = `link:${(0, normalize_path_1.default)(path_1.default.relative(opts.rewriteLinkVersionDir, fullPackagePath))}`;
55
+ }
56
+ const packageInfo = {
57
+ alias: opts.alias,
58
+ isMissing,
59
+ isPeer: Boolean(opts.peers?.has(opts.alias)),
60
+ isSkipped,
61
+ name,
62
+ path: fullPackagePath,
63
+ version,
64
+ };
65
+ if (resolved) {
66
+ packageInfo['resolved'] = resolved;
67
+ }
68
+ if (optional === true) {
69
+ packageInfo['optional'] = true;
70
+ }
71
+ if (typeof dev === 'boolean') {
72
+ packageInfo['dev'] = dev;
73
+ }
74
+ return packageInfo;
75
+ }
76
+ exports.getPkgInfo = getPkgInfo;
77
+ //# sourceMappingURL=getPkgInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getPkgInfo.js","sourceRoot":"","sources":["../src/getPkgInfo.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAuB;AAKvB,yDAG6B;AAE7B,2DAAwE;AACxE,oEAA0C;AA2B1C,SAAgB,UAAU,CAAE,IAAoB;IAC9C,IAAI,IAAa,CAAA;IACjB,IAAI,OAAgB,CAAA;IACpB,IAAI,QAA4B,CAAA;IAChC,IAAI,GAAwB,CAAA;IAC5B,IAAI,QAA0B,CAAA;IAC9B,IAAI,SAAS,GAAY,KAAK,CAAA;IAC9B,IAAI,SAAS,GAAY,KAAK,CAAA;IAC9B,MAAM,OAAO,GAAG,IAAA,+BAAa,EAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;IACnD,IAAI,OAAO,EAAE;QACX,IAAI,WAA6B,CAAA;QACjC,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE;YACjC,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;YAC3C,MAAM,MAAM,GAAG,IAAA,uCAAsB,EAAC,OAAO,EAAE,WAAW,CAAC,CAAA;YAC3D,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;YAClB,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;SACzB;aAAM;YACL,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;YAC1C,IAAI,WAAW,EAAE;gBACf,MAAM,MAAM,GAAG,IAAA,uCAAsB,EAAC,OAAO,EAAE,WAAW,CAAC,CAAA;gBAC3D,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;gBAClB,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;aACzB;iBAAM;gBACL,IAAI,GAAG,IAAI,CAAC,KAAK,CAAA;gBACjB,OAAO,GAAG,IAAI,CAAC,GAAG,CAAA;aACnB;YACD,SAAS,GAAG,IAAI,CAAA;YAChB,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;SACtC;QACD,QAAQ,GAAG,IAAA,wCAAuB,EAAC,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAA;QACpF,GAAG,GAAG,WAAW,CAAC,GAAG,CAAA;QACrB,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAA;KAChC;SAAM;QACL,IAAI,GAAG,IAAI,CAAC,KAAK,CAAA;QACjB,OAAO,GAAG,IAAI,CAAC,GAAG,CAAA;KACnB;IACD,MAAM,eAAe,GAAG,OAAO;QAC7B,CAAC,CAAC,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,IAAA,mCAAiB,EAAC,OAAO,CAAC,CAAC;QACjE,CAAC,CAAC,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAExD,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,qBAAqB,EAAE;QAC7D,OAAO,GAAG,QAAQ,IAAA,wBAAa,EAAC,cAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,qBAAqB,EAAE,eAAe,CAAC,CAAC,EAAE,CAAA;KAC9F;IAED,MAAM,WAAW,GAAG;QAClB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,SAAS;QACT,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,SAAS;QACT,IAAI;QACJ,IAAI,EAAE,eAAe;QACrB,OAAO;KACR,CAAA;IACD,IAAI,QAAQ,EAAE;QACZ,WAAW,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAA;KACnC;IACD,IAAI,QAAQ,KAAK,IAAI,EAAE;QACrB,WAAW,CAAC,UAAU,CAAC,GAAG,IAAI,CAAA;KAC/B;IACD,IAAI,OAAO,GAAG,KAAK,SAAS,EAAE;QAC5B,WAAW,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA;KACzB;IACD,OAAO,WAAW,CAAA;AACpB,CAAC;AA/DD,gCA+DC"}
@@ -0,0 +1,21 @@
1
+ import { PackageSnapshots, ProjectSnapshot } from '@pnpm/lockfile-file';
2
+ import { Registries } from '@pnpm/types';
3
+ import { SearchFunction } from './types';
4
+ import { PackageNode } from './PackageNode';
5
+ import { TreeNodeId } from './TreeNodeId';
6
+ interface GetTreeOpts {
7
+ maxDepth: number;
8
+ rewriteLinkVersionDir: string;
9
+ modulesDir: string;
10
+ includeOptionalDependencies: boolean;
11
+ lockfileDir: string;
12
+ onlyProjects?: boolean;
13
+ search?: SearchFunction;
14
+ skipped: Set<string>;
15
+ registries: Registries;
16
+ importers: Record<string, ProjectSnapshot>;
17
+ currentPackages: PackageSnapshots;
18
+ wantedPackages: PackageSnapshots;
19
+ }
20
+ export declare function getTree(opts: GetTreeOpts, parentId: TreeNodeId): PackageNode[];
21
+ export {};
package/lib/getTree.js ADDED
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getTree = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const getPkgInfo_1 = require("./getPkgInfo");
9
+ const getTreeNodeChildId_1 = require("./getTreeNodeChildId");
10
+ const DependenciesCache_1 = require("./DependenciesCache");
11
+ const TreeNodeId_1 = require("./TreeNodeId");
12
+ function getTree(opts, parentId) {
13
+ const dependenciesCache = new DependenciesCache_1.DependenciesCache();
14
+ return getTreeHelper(dependenciesCache, opts, Keypath.initialize(parentId), parentId).dependencies;
15
+ }
16
+ exports.getTree = getTree;
17
+ function getTreeHelper(dependenciesCache, opts, keypath, parentId) {
18
+ if (opts.maxDepth <= 0) {
19
+ return { dependencies: [], height: 'unknown' };
20
+ }
21
+ function getSnapshot(treeNodeId) {
22
+ switch (treeNodeId.type) {
23
+ case 'importer':
24
+ return opts.importers[treeNodeId.importerId];
25
+ case 'package':
26
+ return opts.currentPackages[treeNodeId.depPath];
27
+ }
28
+ }
29
+ const snapshot = getSnapshot(parentId);
30
+ if (!snapshot) {
31
+ return { dependencies: [], height: 0 };
32
+ }
33
+ const deps = !opts.includeOptionalDependencies
34
+ ? snapshot.dependencies
35
+ : {
36
+ ...snapshot.dependencies,
37
+ ...snapshot.optionalDependencies,
38
+ };
39
+ if (deps == null) {
40
+ return { dependencies: [], height: 0 };
41
+ }
42
+ const childTreeMaxDepth = opts.maxDepth - 1;
43
+ const getChildrenTree = getTreeHelper.bind(null, dependenciesCache, {
44
+ ...opts,
45
+ maxDepth: childTreeMaxDepth,
46
+ });
47
+ function getPeerDependencies() {
48
+ switch (parentId.type) {
49
+ case 'importer':
50
+ // Projects in the pnpm workspace can declare peer dependencies, but pnpm
51
+ // doesn't record this block to the importers lockfile object. Returning
52
+ // undefined for now.
53
+ return undefined;
54
+ case 'package':
55
+ return opts.currentPackages[parentId.depPath]?.peerDependencies;
56
+ }
57
+ }
58
+ const peers = new Set(Object.keys(getPeerDependencies() ?? {}));
59
+ // If the "ref" of any dependency is a file system path (e.g. link:../), the
60
+ // base directory of this relative path depends on whether the dependent
61
+ // package is in the pnpm workspace or from node_modules.
62
+ function getLinkedPathBaseDir() {
63
+ switch (parentId.type) {
64
+ case 'importer':
65
+ return path_1.default.join(opts.lockfileDir, parentId.importerId);
66
+ case 'package':
67
+ return opts.lockfileDir;
68
+ }
69
+ }
70
+ const linkedPathBaseDir = getLinkedPathBaseDir();
71
+ const resultDependencies = [];
72
+ let resultHeight = 0;
73
+ let resultCircular = false;
74
+ Object.entries(deps).forEach(([alias, ref]) => {
75
+ const packageInfo = (0, getPkgInfo_1.getPkgInfo)({
76
+ alias,
77
+ currentPackages: opts.currentPackages,
78
+ rewriteLinkVersionDir: opts.rewriteLinkVersionDir,
79
+ linkedPathBaseDir,
80
+ modulesDir: opts.modulesDir,
81
+ peers,
82
+ ref,
83
+ registries: opts.registries,
84
+ skipped: opts.skipped,
85
+ wantedPackages: opts.wantedPackages,
86
+ });
87
+ let circular;
88
+ const matchedSearched = opts.search?.(packageInfo);
89
+ let newEntry = null;
90
+ const nodeId = (0, getTreeNodeChildId_1.getTreeNodeChildId)({
91
+ parentId,
92
+ dep: { alias, ref },
93
+ lockfileDir: opts.lockfileDir,
94
+ importers: opts.importers,
95
+ });
96
+ if (opts.onlyProjects && nodeId?.type !== 'importer') {
97
+ return;
98
+ }
99
+ else if (nodeId == null) {
100
+ circular = false;
101
+ if (opts.search == null || matchedSearched) {
102
+ newEntry = packageInfo;
103
+ }
104
+ }
105
+ else {
106
+ let dependencies;
107
+ circular = keypath.includes(nodeId);
108
+ if (circular) {
109
+ dependencies = [];
110
+ }
111
+ else {
112
+ const cacheEntry = dependenciesCache.get({ parentId: nodeId, requestedDepth: childTreeMaxDepth });
113
+ const children = cacheEntry ?? getChildrenTree(keypath.concat(nodeId), nodeId);
114
+ if (cacheEntry == null && !children.circular) {
115
+ if (children.height === 'unknown') {
116
+ dependenciesCache.addPartiallyVisitedResult(nodeId, {
117
+ dependencies: children.dependencies,
118
+ depth: childTreeMaxDepth,
119
+ });
120
+ }
121
+ else {
122
+ dependenciesCache.addFullyVisitedResult(nodeId, {
123
+ dependencies: children.dependencies,
124
+ height: children.height,
125
+ });
126
+ }
127
+ }
128
+ const heightOfCurrentDepNode = children.height === 'unknown'
129
+ ? 'unknown'
130
+ : children.height + 1;
131
+ dependencies = children.dependencies;
132
+ resultHeight = resultHeight === 'unknown' || heightOfCurrentDepNode === 'unknown'
133
+ ? 'unknown'
134
+ : Math.max(resultHeight, heightOfCurrentDepNode);
135
+ resultCircular = resultCircular || (children.circular ?? false);
136
+ }
137
+ if (dependencies.length > 0) {
138
+ newEntry = {
139
+ ...packageInfo,
140
+ dependencies,
141
+ };
142
+ }
143
+ else if ((opts.search == null) || matchedSearched) {
144
+ newEntry = packageInfo;
145
+ }
146
+ }
147
+ if (newEntry != null) {
148
+ if (circular) {
149
+ newEntry.circular = true;
150
+ resultCircular = true;
151
+ }
152
+ if (matchedSearched) {
153
+ newEntry.searched = true;
154
+ }
155
+ resultDependencies.push(newEntry);
156
+ }
157
+ });
158
+ const result = {
159
+ dependencies: resultDependencies,
160
+ height: resultHeight,
161
+ };
162
+ if (resultCircular) {
163
+ result.circular = resultCircular;
164
+ }
165
+ return result;
166
+ }
167
+ /**
168
+ * Useful for detecting cycles.
169
+ */
170
+ class Keypath {
171
+ constructor(keypath) {
172
+ this.keypath = keypath;
173
+ }
174
+ static initialize(treeNodeId) {
175
+ return new Keypath([(0, TreeNodeId_1.serializeTreeNodeId)(treeNodeId)]);
176
+ }
177
+ includes(treeNodeId) {
178
+ return this.keypath.includes((0, TreeNodeId_1.serializeTreeNodeId)(treeNodeId));
179
+ }
180
+ concat(treeNodeId) {
181
+ return new Keypath([...this.keypath, (0, TreeNodeId_1.serializeTreeNodeId)(treeNodeId)]);
182
+ }
183
+ }
184
+ //# sourceMappingURL=getTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTree.js","sourceRoot":"","sources":["../src/getTree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { ProjectSnapshot } from '@pnpm/lockfile-file';
2
+ import { TreeNodeId } from './TreeNodeId';
3
+ export interface getTreeNodeChildIdOpts {
4
+ readonly parentId: TreeNodeId;
5
+ readonly dep: {
6
+ readonly alias: string;
7
+ readonly ref: string;
8
+ };
9
+ readonly lockfileDir: string;
10
+ readonly importers: Record<string, ProjectSnapshot>;
11
+ }
12
+ export declare function getTreeNodeChildId(opts: getTreeNodeChildIdOpts): TreeNodeId | undefined;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getTreeNodeChildId = void 0;
7
+ const dependency_path_1 = require("@pnpm/dependency-path");
8
+ const path_1 = __importDefault(require("path"));
9
+ const lockfile_file_1 = require("@pnpm/lockfile-file");
10
+ function getTreeNodeChildId(opts) {
11
+ const depPath = (0, dependency_path_1.refToRelative)(opts.dep.ref, opts.dep.alias);
12
+ if (depPath !== null) {
13
+ return { type: 'package', depPath };
14
+ }
15
+ switch (opts.parentId.type) {
16
+ case 'importer': {
17
+ // This should be a link given depPath is null.
18
+ //
19
+ // TODO: Consider updating refToRelative (or writing a new function) to
20
+ // return an enum so there's no implicit assumptions.
21
+ const linkValue = opts.dep.ref.slice('link:'.length);
22
+ // It's a bit roundabout to prepend the lockfile dir only to remove it
23
+ // through getLockfileImporterId, but we can be more certain the right
24
+ // importerId is created by reusing the getLockfileImporterId function.
25
+ const absoluteLinkedPath = path_1.default.join(opts.lockfileDir, opts.parentId.importerId, linkValue);
26
+ const childImporterId = (0, lockfile_file_1.getLockfileImporterId)(opts.lockfileDir, absoluteLinkedPath);
27
+ // A 'link:' reference may refer to a package outside of the pnpm workspace.
28
+ // Return undefined in that case since it would be difficult to list/traverse
29
+ // that package outside of the pnpm workspace.
30
+ const isLinkOutsideWorkspace = opts.importers[childImporterId] == null;
31
+ return isLinkOutsideWorkspace
32
+ ? undefined
33
+ : { type: 'importer', importerId: childImporterId };
34
+ }
35
+ case 'package':
36
+ // In theory an external package could be overridden to link to a
37
+ // dependency in the pnpm workspace. Avoid traversing through this
38
+ // edge case for now.
39
+ return undefined;
40
+ }
41
+ }
42
+ exports.getTreeNodeChildId = getTreeNodeChildId;
43
+ //# sourceMappingURL=getTreeNodeChildId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTreeNodeChildId.js","sourceRoot":"","sources":["../src/getTreeNodeChildId.ts"],"names":[],"mappings":";;;;;;AAAA,2DAAqD;AACrD,gDAAuB;AACvB,uDAA4E;AAa5E,SAAgB,kBAAkB,CAAE,IAA4B;IAC9D,MAAM,OAAO,GAAG,IAAA,+BAAa,EAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAC3D,IAAI,OAAO,KAAK,IAAI,EAAE;QACpB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAA;KACpC;IAED,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;QAC5B,KAAK,UAAU,CAAC,CAAC;YACf,+CAA+C;YAC/C,EAAE;YACF,uEAAuE;YACvE,qDAAqD;YACrD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;YAEpD,sEAAsE;YACtE,sEAAsE;YACtE,uEAAuE;YACvE,MAAM,kBAAkB,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,CAAA;YAC3F,MAAM,eAAe,GAAG,IAAA,qCAAqB,EAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAA;YAEnF,4EAA4E;YAC5E,6EAA6E;YAC7E,8CAA8C;YAC9C,MAAM,sBAAsB,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,IAAI,CAAA;YACtE,OAAO,sBAAsB;gBAC3B,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,CAAA;SACtD;QACD,KAAK,SAAS;YACZ,iEAAiE;YACjE,kEAAkE;YAClE,qBAAqB;YACrB,OAAO,SAAS,CAAA;KACjB;AACH,CAAC;AAlCD,gDAkCC"}
package/lib/index.d.ts CHANGED
@@ -1,37 +1,3 @@
1
- import { DependenciesField, Registries } from '@pnpm/types';
2
- export type SearchFunction = (pkg: {
3
- name: string;
4
- version: string;
5
- }) => boolean;
6
- export interface PackageNode {
7
- alias: string;
8
- circular?: true;
9
- dependencies?: PackageNode[];
10
- dev?: boolean;
11
- isPeer: boolean;
12
- isSkipped: boolean;
13
- isMissing: boolean;
14
- name: string;
15
- optional?: true;
16
- path: string;
17
- resolved?: string;
18
- searched?: true;
19
- version: string;
20
- }
21
- export interface DependenciesHierarchy {
22
- dependencies?: PackageNode[];
23
- devDependencies?: PackageNode[];
24
- optionalDependencies?: PackageNode[];
25
- unsavedDependencies?: PackageNode[];
26
- }
27
- export declare function buildDependenciesHierarchy(projectPaths: string[], maybeOpts: {
28
- depth: number;
29
- include?: {
30
- [dependenciesField in DependenciesField]: boolean;
31
- };
32
- registries?: Registries;
33
- search?: SearchFunction;
34
- lockfileDir: string;
35
- }): Promise<{
36
- [projectDir: string]: DependenciesHierarchy;
37
- }>;
1
+ export { buildDependenciesHierarchy, type DependenciesHierarchy } from './buildDependenciesHierarchy';
2
+ export { type PackageNode } from './PackageNode';
3
+ export { type SearchFunction } from './types';
package/lib/index.js CHANGED
@@ -1,314 +1,6 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.buildDependenciesHierarchy = void 0;
7
- const path_1 = __importDefault(require("path"));
8
- const lockfile_file_1 = require("@pnpm/lockfile-file");
9
- const lockfile_utils_1 = require("@pnpm/lockfile-utils");
10
- const modules_yaml_1 = require("@pnpm/modules-yaml");
11
- const normalize_registries_1 = require("@pnpm/normalize-registries");
12
- const read_modules_dir_1 = require("@pnpm/read-modules-dir");
13
- const read_package_json_1 = require("@pnpm/read-package-json");
14
- const types_1 = require("@pnpm/types");
15
- const dependency_path_1 = require("@pnpm/dependency-path");
16
- const normalize_path_1 = __importDefault(require("normalize-path"));
17
- const realpath_missing_1 = __importDefault(require("realpath-missing"));
18
- const resolve_link_target_1 = __importDefault(require("resolve-link-target"));
19
- async function buildDependenciesHierarchy(projectPaths, maybeOpts) {
20
- if (!maybeOpts?.lockfileDir) {
21
- throw new TypeError('opts.lockfileDir is required');
22
- }
23
- const modulesDir = await (0, realpath_missing_1.default)(path_1.default.join(maybeOpts.lockfileDir, 'node_modules'));
24
- const modules = await (0, modules_yaml_1.readModulesManifest)(modulesDir);
25
- const registries = (0, normalize_registries_1.normalizeRegistries)({
26
- ...maybeOpts?.registries,
27
- ...modules?.registries,
28
- });
29
- const currentLockfile = (modules?.virtualStoreDir && await (0, lockfile_file_1.readCurrentLockfile)(modules.virtualStoreDir, { ignoreIncompatible: false })) ?? null;
30
- const result = {};
31
- if (!currentLockfile) {
32
- for (const projectPath of projectPaths) {
33
- result[projectPath] = {};
34
- }
35
- return result;
36
- }
37
- const opts = {
38
- depth: maybeOpts.depth || 0,
39
- include: maybeOpts.include ?? {
40
- dependencies: true,
41
- devDependencies: true,
42
- optionalDependencies: true,
43
- },
44
- lockfileDir: maybeOpts.lockfileDir,
45
- registries,
46
- search: maybeOpts.search,
47
- skipped: new Set(modules?.skipped ?? []),
48
- };
49
- (await Promise.all(projectPaths.map(async (projectPath) => {
50
- return [
51
- projectPath,
52
- await dependenciesHierarchyForPackage(projectPath, currentLockfile, opts),
53
- ];
54
- }))).forEach(([projectPath, dependenciesHierarchy]) => {
55
- result[projectPath] = dependenciesHierarchy;
56
- });
57
- return result;
58
- }
59
- exports.buildDependenciesHierarchy = buildDependenciesHierarchy;
60
- async function dependenciesHierarchyForPackage(projectPath, currentLockfile, opts) {
61
- const importerId = (0, lockfile_file_1.getLockfileImporterId)(opts.lockfileDir, projectPath);
62
- if (!currentLockfile.importers[importerId])
63
- return {};
64
- const modulesDir = path_1.default.join(projectPath, 'node_modules');
65
- const savedDeps = getAllDirectDependencies(currentLockfile.importers[importerId]);
66
- const allDirectDeps = await (0, read_modules_dir_1.readModulesDir)(modulesDir) ?? [];
67
- const unsavedDeps = allDirectDeps.filter((directDep) => !savedDeps[directDep]);
68
- const wantedLockfile = await (0, lockfile_file_1.readWantedLockfile)(opts.lockfileDir, { ignoreIncompatible: false }) ?? { packages: {} };
69
- const getChildrenTree = getTree.bind(null, {
70
- currentDepth: 1,
71
- currentPackages: currentLockfile.packages ?? {},
72
- includeOptionalDependencies: opts.include.optionalDependencies,
73
- lockfileDir: opts.lockfileDir,
74
- maxDepth: opts.depth,
75
- modulesDir,
76
- registries: opts.registries,
77
- search: opts.search,
78
- skipped: opts.skipped,
79
- wantedPackages: wantedLockfile.packages ?? {},
80
- });
81
- const result = {};
82
- for (const dependenciesField of types_1.DEPENDENCIES_FIELDS.sort().filter(dependenciedField => opts.include[dependenciedField])) {
83
- const topDeps = currentLockfile.importers[importerId][dependenciesField] ?? {};
84
- result[dependenciesField] = [];
85
- Object.entries(topDeps).forEach(([alias, ref]) => {
86
- const { packageInfo, packageAbsolutePath } = getPkgInfo({
87
- alias,
88
- currentPackages: currentLockfile.packages ?? {},
89
- lockfileDir: opts.lockfileDir,
90
- modulesDir,
91
- ref,
92
- registries: opts.registries,
93
- skipped: opts.skipped,
94
- wantedPackages: wantedLockfile.packages ?? {},
95
- });
96
- let newEntry = null;
97
- const matchedSearched = opts.search?.(packageInfo);
98
- if (packageAbsolutePath === null) {
99
- if ((opts.search != null) && !matchedSearched)
100
- return;
101
- newEntry = packageInfo;
102
- }
103
- else {
104
- const relativeId = (0, dependency_path_1.refToRelative)(ref, alias);
105
- if (relativeId) {
106
- const dependencies = getChildrenTree([relativeId], relativeId);
107
- if (dependencies.length > 0) {
108
- newEntry = {
109
- ...packageInfo,
110
- dependencies,
111
- };
112
- }
113
- else if ((opts.search == null) || matchedSearched) {
114
- newEntry = packageInfo;
115
- }
116
- }
117
- }
118
- if (newEntry != null) {
119
- if (matchedSearched) {
120
- newEntry.searched = true;
121
- }
122
- result[dependenciesField].push(newEntry);
123
- }
124
- });
125
- }
126
- await Promise.all(unsavedDeps.map(async (unsavedDep) => {
127
- let pkgPath = path_1.default.join(modulesDir, unsavedDep);
128
- let version;
129
- try {
130
- pkgPath = await (0, resolve_link_target_1.default)(pkgPath);
131
- version = `link:${(0, normalize_path_1.default)(path_1.default.relative(projectPath, pkgPath))}`;
132
- }
133
- catch (err) { // eslint-disable-line
134
- // if error happened. The package is not a link
135
- const pkg = await (0, read_package_json_1.safeReadPackageJsonFromDir)(pkgPath);
136
- version = pkg?.version ?? 'undefined';
137
- }
138
- const pkg = {
139
- alias: unsavedDep,
140
- isMissing: false,
141
- isPeer: false,
142
- isSkipped: false,
143
- name: unsavedDep,
144
- path: pkgPath,
145
- version,
146
- };
147
- const matchedSearched = opts.search?.(pkg);
148
- if ((opts.search != null) && !matchedSearched)
149
- return;
150
- const newEntry = pkg;
151
- if (matchedSearched) {
152
- newEntry.searched = true;
153
- }
154
- result.unsavedDependencies = result.unsavedDependencies ?? [];
155
- result.unsavedDependencies.push(newEntry);
156
- }));
157
- return result;
158
- }
159
- function getAllDirectDependencies(projectSnapshot) {
160
- return {
161
- ...projectSnapshot.dependencies,
162
- ...projectSnapshot.devDependencies,
163
- ...projectSnapshot.optionalDependencies,
164
- };
165
- }
166
- function getTree(opts, keypath, parentId) {
167
- const dependenciesCache = new Map();
168
- return getTreeHelper(dependenciesCache, opts, keypath, parentId).dependencies;
169
- }
170
- function getTreeHelper(dependenciesCache, opts, keypath, parentId) {
171
- const result = { dependencies: [] };
172
- if (opts.currentDepth > opts.maxDepth || !opts.currentPackages || !opts.currentPackages[parentId])
173
- return result;
174
- const deps = !opts.includeOptionalDependencies
175
- ? opts.currentPackages[parentId].dependencies
176
- : {
177
- ...opts.currentPackages[parentId].dependencies,
178
- ...opts.currentPackages[parentId].optionalDependencies,
179
- };
180
- if (deps == null)
181
- return result;
182
- const getChildrenTree = getTreeHelper.bind(null, dependenciesCache, {
183
- ...opts,
184
- currentDepth: opts.currentDepth + 1,
185
- });
186
- const peers = new Set(Object.keys(opts.currentPackages[parentId].peerDependencies ?? {}));
187
- Object.entries(deps).forEach(([alias, ref]) => {
188
- const { packageInfo, packageAbsolutePath } = getPkgInfo({
189
- alias,
190
- currentPackages: opts.currentPackages,
191
- lockfileDir: opts.lockfileDir,
192
- modulesDir: opts.modulesDir,
193
- peers,
194
- ref,
195
- registries: opts.registries,
196
- skipped: opts.skipped,
197
- wantedPackages: opts.wantedPackages,
198
- });
199
- let circular;
200
- const matchedSearched = opts.search?.(packageInfo);
201
- let newEntry = null;
202
- if (packageAbsolutePath === null) {
203
- circular = false;
204
- if (opts.search == null || matchedSearched) {
205
- newEntry = packageInfo;
206
- }
207
- }
208
- else {
209
- let dependencies;
210
- const relativeId = (0, dependency_path_1.refToRelative)(ref, alias); // we know for sure that relative is not null if pkgPath is not null
211
- circular = keypath.includes(relativeId);
212
- if (circular) {
213
- dependencies = [];
214
- }
215
- else {
216
- dependencies = dependenciesCache.get(packageAbsolutePath);
217
- if (dependencies == null) {
218
- const children = getChildrenTree(keypath.concat([relativeId]), relativeId);
219
- dependencies = children.dependencies;
220
- if (children.circular) {
221
- result.circular = true;
222
- }
223
- else {
224
- dependenciesCache.set(packageAbsolutePath, dependencies);
225
- }
226
- }
227
- }
228
- if (dependencies.length > 0) {
229
- newEntry = {
230
- ...packageInfo,
231
- dependencies,
232
- };
233
- }
234
- else if ((opts.search == null) || matchedSearched) {
235
- newEntry = packageInfo;
236
- }
237
- }
238
- if (newEntry != null) {
239
- if (circular) {
240
- newEntry.circular = true;
241
- result.circular = true;
242
- }
243
- if (matchedSearched) {
244
- newEntry.searched = true;
245
- }
246
- result.dependencies.push(newEntry);
247
- }
248
- });
249
- return result;
250
- }
251
- function getPkgInfo(opts) {
252
- let name;
253
- let version;
254
- let resolved;
255
- let dev;
256
- let optional;
257
- let isSkipped = false;
258
- let isMissing = false;
259
- const depPath = (0, dependency_path_1.refToRelative)(opts.ref, opts.alias);
260
- if (depPath) {
261
- let pkgSnapshot;
262
- if (opts.currentPackages[depPath]) {
263
- pkgSnapshot = opts.currentPackages[depPath];
264
- const parsed = (0, lockfile_utils_1.nameVerFromPkgSnapshot)(depPath, pkgSnapshot);
265
- name = parsed.name;
266
- version = parsed.version;
267
- }
268
- else {
269
- pkgSnapshot = opts.wantedPackages[depPath];
270
- if (pkgSnapshot) {
271
- const parsed = (0, lockfile_utils_1.nameVerFromPkgSnapshot)(depPath, pkgSnapshot);
272
- name = parsed.name;
273
- version = parsed.version;
274
- }
275
- else {
276
- name = opts.alias;
277
- version = opts.ref;
278
- }
279
- isMissing = true;
280
- isSkipped = opts.skipped.has(depPath);
281
- }
282
- resolved = (0, lockfile_utils_1.pkgSnapshotToResolution)(depPath, pkgSnapshot, opts.registries)['tarball'];
283
- dev = pkgSnapshot.dev;
284
- optional = pkgSnapshot.optional;
285
- }
286
- else {
287
- name = opts.alias;
288
- version = opts.ref;
289
- }
290
- const packageAbsolutePath = (0, dependency_path_1.refToRelative)(opts.ref, opts.alias);
291
- const packageInfo = {
292
- alias: opts.alias,
293
- isMissing,
294
- isPeer: Boolean(opts.peers?.has(opts.alias)),
295
- isSkipped,
296
- name,
297
- path: depPath ? path_1.default.join(opts.modulesDir, '.pnpm', (0, dependency_path_1.depPathToFilename)(depPath)) : path_1.default.join(opts.modulesDir, '..', opts.ref.slice(5)),
298
- version,
299
- };
300
- if (resolved) {
301
- packageInfo['resolved'] = resolved;
302
- }
303
- if (optional === true) {
304
- packageInfo['optional'] = true;
305
- }
306
- if (typeof dev === 'boolean') {
307
- packageInfo['dev'] = dev;
308
- }
309
- return {
310
- packageAbsolutePath,
311
- packageInfo,
312
- };
313
- }
4
+ var buildDependenciesHierarchy_1 = require("./buildDependenciesHierarchy");
5
+ Object.defineProperty(exports, "buildDependenciesHierarchy", { enumerable: true, get: function () { return buildDependenciesHierarchy_1.buildDependenciesHierarchy; } });
314
6
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,2EAAqG;AAA5F,wIAAA,0BAA0B,OAAA"}
package/lib/types.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export type SearchFunction = (pkg: {
2
+ name: string;
3
+ version: string;
4
+ }) => boolean;
package/lib/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pnpm/reviewing.dependencies-hierarchy",
3
- "version": "1.0.1",
3
+ "version": "1.1.0",
4
4
  "description": "Creates a dependencies hierarchy for a symlinked `node_modules`",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -40,8 +40,8 @@
40
40
  "devDependencies": {
41
41
  "@types/normalize-path": "^3.0.0",
42
42
  "@pnpm/constants": "6.1.0",
43
- "@pnpm/test-fixtures": "0.0.28",
44
- "@pnpm/reviewing.dependencies-hierarchy": "1.0.1"
43
+ "@pnpm/reviewing.dependencies-hierarchy": "1.1.0",
44
+ "@pnpm/test-fixtures": "0.0.28"
45
45
  },
46
46
  "funding": "https://opencollective.com/pnpm",
47
47
  "exports": {