@yarnpkg/nm 4.0.7 → 4.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/lib/buildPackageMap.d.ts +18 -0
- package/lib/buildPackageMap.js +126 -0
- package/lib/index.d.ts +3 -1
- package/lib/index.js +3 -1
- package/package.json +4 -4
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { PortablePath } from '@yarnpkg/fslib';
|
|
2
|
+
import { PnpApi } from '@yarnpkg/pnp';
|
|
3
|
+
import { NodeModulesTree } from './buildNodeModulesTree';
|
|
4
|
+
export type PackageMap = {
|
|
5
|
+
packages: Record<string, PackageMapPackage>;
|
|
6
|
+
};
|
|
7
|
+
export type PackageMapPackage = {
|
|
8
|
+
url: string;
|
|
9
|
+
dependencies: Record<string, string>;
|
|
10
|
+
};
|
|
11
|
+
export type PackageMapOptions = {
|
|
12
|
+
basePath: PortablePath;
|
|
13
|
+
pnp?: PnpApi | null;
|
|
14
|
+
};
|
|
15
|
+
export type LoosePackageMapOptions = {
|
|
16
|
+
basePath: PortablePath;
|
|
17
|
+
};
|
|
18
|
+
export declare const buildPackageMap: (nodeModulesTree: NodeModulesTree, { basePath, pnp }: PackageMapOptions) => PackageMap;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildPackageMap = void 0;
|
|
4
|
+
const core_1 = require("@yarnpkg/core");
|
|
5
|
+
const fslib_1 = require("@yarnpkg/fslib");
|
|
6
|
+
const buildNodeModulesTree_1 = require("./buildNodeModulesTree");
|
|
7
|
+
const NODE_MODULES = `node_modules`;
|
|
8
|
+
const WORKSPACE_NAME_SUFFIX = `$wsroot$`;
|
|
9
|
+
const isPackageNode = (node) => {
|
|
10
|
+
return !node.dirList;
|
|
11
|
+
};
|
|
12
|
+
const stripTrailingSeparators = (path) => {
|
|
13
|
+
while (path !== fslib_1.PortablePath.root && path.endsWith(fslib_1.ppath.sep))
|
|
14
|
+
path = path.slice(0, -1);
|
|
15
|
+
return path;
|
|
16
|
+
};
|
|
17
|
+
const getPackagePath = (location, node) => {
|
|
18
|
+
return stripTrailingSeparators(node.linkType === buildNodeModulesTree_1.LinkType.SOFT ? node.target : location);
|
|
19
|
+
};
|
|
20
|
+
const getRelativeUrl = (from, to) => {
|
|
21
|
+
let relativePath = fslib_1.ppath.relative(from, to) || fslib_1.PortablePath.dot;
|
|
22
|
+
if (!relativePath.startsWith(`.`))
|
|
23
|
+
relativePath = `./${relativePath}`;
|
|
24
|
+
return relativePath;
|
|
25
|
+
};
|
|
26
|
+
const getPackageId = (basePath, location) => {
|
|
27
|
+
const relativePath = fslib_1.ppath.relative(basePath, location) || fslib_1.PortablePath.dot;
|
|
28
|
+
return relativePath === `..` ? fslib_1.PortablePath.dot : relativePath;
|
|
29
|
+
};
|
|
30
|
+
const getPackageName = (location) => {
|
|
31
|
+
const segments = location.split(fslib_1.ppath.sep);
|
|
32
|
+
const nodeModulesIndex = segments.lastIndexOf(NODE_MODULES);
|
|
33
|
+
if (nodeModulesIndex === -1)
|
|
34
|
+
return null;
|
|
35
|
+
const scopeOrName = segments[nodeModulesIndex + 1];
|
|
36
|
+
if (typeof scopeOrName === `undefined`)
|
|
37
|
+
return null;
|
|
38
|
+
const nodeModulesPath = segments.slice(0, nodeModulesIndex + 1).join(fslib_1.ppath.sep);
|
|
39
|
+
if (!scopeOrName.startsWith(`@`))
|
|
40
|
+
return { nodeModulesPath, packageName: scopeOrName };
|
|
41
|
+
const name = segments[nodeModulesIndex + 2];
|
|
42
|
+
if (typeof name === `undefined`)
|
|
43
|
+
return null;
|
|
44
|
+
return { nodeModulesPath, packageName: `${scopeOrName}/${name}` };
|
|
45
|
+
};
|
|
46
|
+
const compareStrings = (a, b) => {
|
|
47
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
48
|
+
};
|
|
49
|
+
const getPackageDependencyNames = (pnp, node) => {
|
|
50
|
+
const locator = core_1.structUtils.parseLocator(node.locator.replace(WORKSPACE_NAME_SUFFIX, ``));
|
|
51
|
+
const packageInformation = pnp.getPackageInformation({
|
|
52
|
+
name: core_1.structUtils.stringifyIdent(locator),
|
|
53
|
+
reference: locator.reference,
|
|
54
|
+
});
|
|
55
|
+
if (packageInformation === null)
|
|
56
|
+
throw new Error(`Assertion failed: Expected ${node.locator} to have been registered`);
|
|
57
|
+
const dependencyNames = new Set();
|
|
58
|
+
for (const [dependencyName, dependencyReference] of packageInformation.packageDependencies)
|
|
59
|
+
if (dependencyReference !== null)
|
|
60
|
+
dependencyNames.add(dependencyName);
|
|
61
|
+
return dependencyNames;
|
|
62
|
+
};
|
|
63
|
+
const buildPackageMapFromDependencyFilter = (nodeModulesTree, { basePath }, getDependencyNames) => {
|
|
64
|
+
const packageMapNodes = new Map();
|
|
65
|
+
const packageLocationsByNodeModulesPath = new Map();
|
|
66
|
+
basePath = stripTrailingSeparators(basePath);
|
|
67
|
+
for (const [location, node] of nodeModulesTree) {
|
|
68
|
+
if (!isPackageNode(node))
|
|
69
|
+
continue;
|
|
70
|
+
const normalizedLocation = stripTrailingSeparators(location);
|
|
71
|
+
const packageMapNode = {
|
|
72
|
+
id: getPackageId(basePath, normalizedLocation),
|
|
73
|
+
packagePath: getPackagePath(normalizedLocation, node),
|
|
74
|
+
dependencyNames: getDependencyNames(node),
|
|
75
|
+
};
|
|
76
|
+
packageMapNodes.set(normalizedLocation, packageMapNode);
|
|
77
|
+
const packageName = getPackageName(normalizedLocation);
|
|
78
|
+
if (packageName !== null) {
|
|
79
|
+
let packageLocations = packageLocationsByNodeModulesPath.get(packageName.nodeModulesPath);
|
|
80
|
+
if (typeof packageLocations === `undefined`) {
|
|
81
|
+
packageLocations = new Map();
|
|
82
|
+
packageLocationsByNodeModulesPath.set(packageName.nodeModulesPath, packageLocations);
|
|
83
|
+
}
|
|
84
|
+
packageLocations.set(packageName.packageName, normalizedLocation);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const getPackageDependencies = (packagePath, dependencyNames) => {
|
|
88
|
+
const dependencies = new Map();
|
|
89
|
+
let currentPath = packagePath;
|
|
90
|
+
while (true) {
|
|
91
|
+
const nodeModulesPath = fslib_1.ppath.join(currentPath, NODE_MODULES);
|
|
92
|
+
const packageLocations = packageLocationsByNodeModulesPath.get(nodeModulesPath);
|
|
93
|
+
if (typeof packageLocations !== `undefined`) {
|
|
94
|
+
for (const [dependencyName, dependencyLocation] of Array.from(packageLocations).sort(([a], [b]) => compareStrings(a, b))) {
|
|
95
|
+
if (dependencyNames !== null && !dependencyNames.has(dependencyName))
|
|
96
|
+
continue;
|
|
97
|
+
if (dependencies.has(dependencyName))
|
|
98
|
+
continue;
|
|
99
|
+
const dependency = packageMapNodes.get(dependencyLocation);
|
|
100
|
+
if (typeof dependency === `undefined`)
|
|
101
|
+
throw new Error(`Assertion failed: Expected ${dependencyLocation} to have been registered`);
|
|
102
|
+
dependencies.set(dependencyName, dependency.id);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const parentPath = fslib_1.ppath.dirname(currentPath);
|
|
106
|
+
if (parentPath === currentPath)
|
|
107
|
+
break;
|
|
108
|
+
currentPath = parentPath;
|
|
109
|
+
}
|
|
110
|
+
return Object.fromEntries(Array.from(dependencies).sort(([a], [b]) => compareStrings(a, b)));
|
|
111
|
+
};
|
|
112
|
+
const packages = {};
|
|
113
|
+
for (const packageMapNode of Array.from(packageMapNodes.values()).sort((a, b) => compareStrings(a.id, b.id))) {
|
|
114
|
+
packages[packageMapNode.id] = {
|
|
115
|
+
url: getRelativeUrl(basePath, packageMapNode.packagePath),
|
|
116
|
+
dependencies: getPackageDependencies(packageMapNode.packagePath, packageMapNode.dependencyNames),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
return { packages };
|
|
120
|
+
};
|
|
121
|
+
const buildPackageMap = (nodeModulesTree, { basePath, pnp }) => {
|
|
122
|
+
return buildPackageMapFromDependencyFilter(nodeModulesTree, { basePath }, node => {
|
|
123
|
+
return pnp ? getPackageDependencyNames(pnp, node) : null;
|
|
124
|
+
});
|
|
125
|
+
};
|
|
126
|
+
exports.buildPackageMap = buildPackageMap;
|
package/lib/index.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { NodeModulesLocatorMap, getArchivePath } from './buildNodeModulesTree';
|
|
2
2
|
import { buildNodeModulesTree, buildLocatorMap } from './buildNodeModulesTree';
|
|
3
|
+
import { buildPackageMap } from './buildPackageMap';
|
|
3
4
|
export type { NodeModulesBaseNode, NodeModulesPackageNode, NodeModulesTreeOptions, NodeModulesTree, } from './buildNodeModulesTree';
|
|
5
|
+
export type { PackageMap, PackageMapPackage, PackageMapOptions, LoosePackageMapOptions, } from './buildPackageMap';
|
|
4
6
|
export { NodeModulesHoistingLimits, } from './buildNodeModulesTree';
|
|
5
|
-
export { buildNodeModulesTree, buildLocatorMap, getArchivePath, };
|
|
7
|
+
export { buildNodeModulesTree, buildLocatorMap, getArchivePath, buildPackageMap, };
|
|
6
8
|
export type { NodeModulesLocatorMap };
|
|
7
9
|
export type { HoisterTree, HoisterResult } from './hoist';
|
|
8
10
|
export { hoist, HoisterDependencyKind } from './hoist';
|
package/lib/index.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.HoisterDependencyKind = exports.hoist = exports.getArchivePath = exports.buildLocatorMap = exports.buildNodeModulesTree = exports.NodeModulesHoistingLimits = void 0;
|
|
3
|
+
exports.HoisterDependencyKind = exports.hoist = exports.buildPackageMap = exports.getArchivePath = exports.buildLocatorMap = exports.buildNodeModulesTree = exports.NodeModulesHoistingLimits = void 0;
|
|
4
4
|
const buildNodeModulesTree_1 = require("./buildNodeModulesTree");
|
|
5
5
|
Object.defineProperty(exports, "getArchivePath", { enumerable: true, get: function () { return buildNodeModulesTree_1.getArchivePath; } });
|
|
6
6
|
const buildNodeModulesTree_2 = require("./buildNodeModulesTree");
|
|
7
7
|
Object.defineProperty(exports, "buildNodeModulesTree", { enumerable: true, get: function () { return buildNodeModulesTree_2.buildNodeModulesTree; } });
|
|
8
8
|
Object.defineProperty(exports, "buildLocatorMap", { enumerable: true, get: function () { return buildNodeModulesTree_2.buildLocatorMap; } });
|
|
9
|
+
const buildPackageMap_1 = require("./buildPackageMap");
|
|
10
|
+
Object.defineProperty(exports, "buildPackageMap", { enumerable: true, get: function () { return buildPackageMap_1.buildPackageMap; } });
|
|
9
11
|
var buildNodeModulesTree_3 = require("./buildNodeModulesTree");
|
|
10
12
|
Object.defineProperty(exports, "NodeModulesHoistingLimits", { enumerable: true, get: function () { return buildNodeModulesTree_3.NodeModulesHoistingLimits; } });
|
|
11
13
|
var hoist_1 = require("./hoist");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yarnpkg/nm",
|
|
3
|
-
"version": "4.0
|
|
3
|
+
"version": "4.1.0",
|
|
4
4
|
"license": "BSD-2-Clause",
|
|
5
5
|
"main": "./lib/index.js",
|
|
6
6
|
"exports": {
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
},
|
|
11
11
|
"sideEffects": false,
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@yarnpkg/core": "^4.
|
|
14
|
-
"@yarnpkg/fslib": "^3.1.
|
|
15
|
-
"@yarnpkg/pnp": "^4.1.
|
|
13
|
+
"@yarnpkg/core": "^4.9.0",
|
|
14
|
+
"@yarnpkg/fslib": "^3.1.5",
|
|
15
|
+
"@yarnpkg/pnp": "^4.1.7"
|
|
16
16
|
},
|
|
17
17
|
"scripts": {
|
|
18
18
|
"postpack": "rm -rf lib",
|