@vltpkg/graph 0.0.0-15 → 0.0.0-16
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/dist/esm/actual/load.d.ts +26 -2
- package/dist/esm/actual/load.d.ts.map +1 -1
- package/dist/esm/actual/load.js +97 -69
- package/dist/esm/actual/load.js.map +1 -1
- package/dist/esm/dependencies.d.ts +10 -2
- package/dist/esm/dependencies.d.ts.map +1 -1
- package/dist/esm/dependencies.js +63 -0
- package/dist/esm/dependencies.js.map +1 -1
- package/dist/esm/graph.d.ts +5 -1
- package/dist/esm/graph.d.ts.map +1 -1
- package/dist/esm/graph.js +30 -4
- package/dist/esm/graph.js.map +1 -1
- package/dist/esm/ideal/add-nodes.d.ts +3 -0
- package/dist/esm/ideal/add-nodes.d.ts.map +1 -1
- package/dist/esm/ideal/add-nodes.js.map +1 -1
- package/dist/esm/ideal/append-nodes.d.ts.map +1 -1
- package/dist/esm/ideal/append-nodes.js +2 -2
- package/dist/esm/ideal/append-nodes.js.map +1 -1
- package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts +0 -2
- package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts.map +1 -1
- package/dist/esm/ideal/build-ideal-from-starting-graph.js +0 -3
- package/dist/esm/ideal/build-ideal-from-starting-graph.js.map +1 -1
- package/dist/esm/ideal/build.d.ts +0 -5
- package/dist/esm/ideal/build.d.ts.map +1 -1
- package/dist/esm/ideal/build.js +2 -0
- package/dist/esm/ideal/build.js.map +1 -1
- package/dist/esm/ideal/get-importer-specs.d.ts +1 -6
- package/dist/esm/ideal/get-importer-specs.d.ts.map +1 -1
- package/dist/esm/ideal/get-importer-specs.js +1 -9
- package/dist/esm/ideal/get-importer-specs.js.map +1 -1
- package/dist/esm/install.d.ts.map +1 -1
- package/dist/esm/install.js +2 -0
- package/dist/esm/install.js.map +1 -1
- package/dist/esm/lockfile/load-nodes.d.ts.map +1 -1
- package/dist/esm/lockfile/load-nodes.js +10 -3
- package/dist/esm/lockfile/load-nodes.js.map +1 -1
- package/dist/esm/lockfile/load.d.ts +12 -3
- package/dist/esm/lockfile/load.d.ts.map +1 -1
- package/dist/esm/lockfile/load.js +14 -4
- package/dist/esm/lockfile/load.js.map +1 -1
- package/dist/esm/lockfile/save.d.ts +6 -1
- package/dist/esm/lockfile/save.d.ts.map +1 -1
- package/dist/esm/lockfile/save.js +7 -1
- package/dist/esm/lockfile/save.js.map +1 -1
- package/dist/esm/lockfile/types.d.ts +3 -1
- package/dist/esm/lockfile/types.d.ts.map +1 -1
- package/dist/esm/lockfile/types.js.map +1 -1
- package/dist/esm/modifiers.d.ts +7 -17
- package/dist/esm/modifiers.d.ts.map +1 -1
- package/dist/esm/modifiers.js +16 -28
- package/dist/esm/modifiers.js.map +1 -1
- package/dist/esm/node.d.ts +4 -0
- package/dist/esm/node.d.ts.map +1 -1
- package/dist/esm/node.js +11 -6
- package/dist/esm/node.js.map +1 -1
- package/dist/esm/reify/index.d.ts +2 -0
- package/dist/esm/reify/index.d.ts.map +1 -1
- package/dist/esm/reify/index.js +5 -0
- package/dist/esm/reify/index.js.map +1 -1
- package/dist/esm/reify/update-importers-package-json.js +1 -1
- package/dist/esm/reify/update-importers-package-json.js.map +1 -1
- package/dist/esm/types.d.ts +3 -0
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/types.js.map +1 -1
- package/dist/esm/visualization/json-output.d.ts +4 -0
- package/dist/esm/visualization/json-output.d.ts.map +1 -1
- package/dist/esm/visualization/json-output.js +2 -0
- package/dist/esm/visualization/json-output.js.map +1 -1
- package/dist/esm/visualization/mermaid-output.d.ts +6 -0
- package/dist/esm/visualization/mermaid-output.d.ts.map +1 -1
- package/dist/esm/visualization/mermaid-output.js +64 -9
- package/dist/esm/visualization/mermaid-output.js.map +1 -1
- package/package.json +19 -19
- package/dist/esm/ideal/check-nodes.d.ts +0 -33
- package/dist/esm/ideal/check-nodes.d.ts.map +0 -1
- package/dist/esm/ideal/check-nodes.js +0 -42
- package/dist/esm/ideal/check-nodes.js.map +0 -1
|
@@ -8,14 +8,21 @@ export const loadNodes = (graph, nodes) => {
|
|
|
8
8
|
if (graph.nodes.has(id))
|
|
9
9
|
continue;
|
|
10
10
|
const [flags, name, integrity, resolved, location, manifest, rawManifest,] = lockfileNode;
|
|
11
|
-
const [type, ,
|
|
11
|
+
const [type, , maybeExtra, lastExtra] = splitDepID(id);
|
|
12
|
+
const extra = type === 'registry' || type === 'git' ? lastExtra : maybeExtra;
|
|
13
|
+
const registrySpec = maybeExtra;
|
|
12
14
|
// if the lockfile has manifest data then it should just use that
|
|
13
15
|
// otherwise tries to infer name / version value from the lockfile node
|
|
14
16
|
const node = manifest ?
|
|
15
17
|
graph.addNode(id, manifest)
|
|
16
|
-
: graph.addNode(id, undefined, undefined, name ?? undefined, type === 'registry' &&
|
|
17
|
-
|
|
18
|
+
: graph.addNode(id, undefined, undefined, name ?? undefined, (type === 'registry' &&
|
|
19
|
+
registrySpec &&
|
|
20
|
+
registrySpec.indexOf('@') > 0) ?
|
|
21
|
+
registrySpec.split('@').slice(-1)[0]
|
|
18
22
|
: undefined);
|
|
23
|
+
if (extra) {
|
|
24
|
+
node.modifier = extra;
|
|
25
|
+
}
|
|
19
26
|
const { dev, optional } = getBooleanFlagsFromNum(flags);
|
|
20
27
|
node.dev = dev;
|
|
21
28
|
node.optional = optional;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-nodes.js","sourceRoot":"","sources":["../../../src/lockfile/load-nodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAKnD,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,KAAgB,EAChB,KAA4B,EAC5B,EAAE;IACF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAA4B,CAAA;IAChE,KAAK,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,IAAI,OAAO,EAAE,CAAC;QACzC,oEAAoE;QACpE,uEAAuE;QACvE,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAQ;QAEjC,MAAM,CACJ,KAAK,EACL,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,WAAW,EACZ,GAAG,YAAY,CAAA;QAChB,MAAM,CAAC,IAAI,EAAE,AAAD,EAAG,
|
|
1
|
+
{"version":3,"file":"load-nodes.js","sourceRoot":"","sources":["../../../src/lockfile/load-nodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAKnD,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,KAAgB,EAChB,KAA4B,EAC5B,EAAE;IACF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAA4B,CAAA;IAChE,KAAK,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,IAAI,OAAO,EAAE,CAAC;QACzC,oEAAoE;QACpE,uEAAuE;QACvE,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAQ;QAEjC,MAAM,CACJ,KAAK,EACL,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,WAAW,EACZ,GAAG,YAAY,CAAA;QAChB,MAAM,CAAC,IAAI,EAAE,AAAD,EAAG,UAAU,EAAE,SAAS,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC,CAAA;QACtD,MAAM,KAAK,GACT,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAA;QAChE,MAAM,YAAY,GAAG,UAAU,CAAA;QAE/B,iEAAiE;QACjE,uEAAuE;QACvE,MAAM,IAAI,GACR,QAAQ,CAAC,CAAC;YACR,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC;YAC7B,CAAC,CAAC,KAAK,CAAC,OAAO,CACX,EAAE,EACF,SAAS,EACT,SAAS,EACT,IAAI,IAAI,SAAS,EACjB,CACE,IAAI,KAAK,UAAU;gBACjB,YAAY;gBACZ,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAChC,CAAC,CAAC;gBACD,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtC,CAAC,CAAC,SAAS,CACZ,CAAA;QACL,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAA;QACvB,CAAC;QAED,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAA;QACvD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,SAAS,CAAA;QACvC,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,SAAS,CAAA;QACrC,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,WAAW,EAAE,CAAA;QACtC,IAAI,QAAQ;YAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACtC,IAAI,QAAQ,IAAI,WAAW,EAAE,CAAC;YAC5B,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;QACjD,CAAC;IACH,CAAC;AACH,CAAC,CAAA","sourcesContent":["import { splitDepID } from '@vltpkg/dep-id/browser'\nimport { getBooleanFlagsFromNum } from './types.ts'\nimport type { LockfileData, LockfileNode } from './types.ts'\nimport type { DepID } from '@vltpkg/dep-id'\nimport type { GraphLike } from '../types.ts'\n\nexport const loadNodes = (\n graph: GraphLike,\n nodes: LockfileData['nodes'],\n) => {\n const entries = Object.entries(nodes) as [DepID, LockfileNode][]\n for (const [id, lockfileNode] of entries) {\n // workspace nodes and the project root node are already part of the\n // graph and it should not create new nodes if an existing one is there\n if (graph.nodes.has(id)) continue\n\n const [\n flags,\n name,\n integrity,\n resolved,\n location,\n manifest,\n rawManifest,\n ] = lockfileNode\n const [type, , maybeExtra, lastExtra] = splitDepID(id)\n const extra =\n type === 'registry' || type === 'git' ? lastExtra : maybeExtra\n const registrySpec = maybeExtra\n\n // if the lockfile has manifest data then it should just use that\n // otherwise tries to infer name / version value from the lockfile node\n const node =\n manifest ?\n graph.addNode(id, manifest)\n : graph.addNode(\n id,\n undefined,\n undefined,\n name ?? undefined,\n (\n type === 'registry' &&\n registrySpec &&\n registrySpec.indexOf('@') > 0\n ) ?\n registrySpec.split('@').slice(-1)[0]\n : undefined,\n )\n if (extra) {\n node.modifier = extra\n }\n\n const { dev, optional } = getBooleanFlagsFromNum(flags)\n node.dev = dev\n node.optional = optional\n node.integrity = integrity ?? undefined\n node.resolved = resolved ?? undefined\n if (!node.resolved) node.setResolved()\n if (location) node.location = location\n if (manifest && rawManifest) {\n node.setConfusedManifest(manifest, rawManifest)\n }\n }\n}\n"]}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { PackageJson } from '@vltpkg/package-json';
|
|
2
|
-
import type { Manifest } from '@vltpkg/types';
|
|
3
2
|
import { Monorepo } from '@vltpkg/workspaces';
|
|
4
|
-
import type { SpecOptions } from '@vltpkg/spec';
|
|
5
|
-
import type { PathScurry } from 'path-scurry';
|
|
6
3
|
import { Graph } from '../graph.ts';
|
|
4
|
+
import type { PathScurry } from 'path-scurry';
|
|
5
|
+
import type { Manifest } from '@vltpkg/types';
|
|
6
|
+
import type { SpecOptions } from '@vltpkg/spec';
|
|
7
7
|
import type { LockfileData } from './types.ts';
|
|
8
|
+
import type { GraphModifier } from '../modifiers.ts';
|
|
8
9
|
export type LoadOptions = SpecOptions & {
|
|
9
10
|
/**
|
|
10
11
|
* The project root dirname.
|
|
@@ -14,6 +15,10 @@ export type LoadOptions = SpecOptions & {
|
|
|
14
15
|
* The project root manifest.
|
|
15
16
|
*/
|
|
16
17
|
mainManifest: Manifest;
|
|
18
|
+
/**
|
|
19
|
+
* The graph modifiers helper object.
|
|
20
|
+
*/
|
|
21
|
+
modifiers?: GraphModifier;
|
|
17
22
|
/**
|
|
18
23
|
* A {@link Monorepo} object, for managing workspaces
|
|
19
24
|
*/
|
|
@@ -26,6 +31,10 @@ export type LoadOptions = SpecOptions & {
|
|
|
26
31
|
* A {@link PathScurry} object, for use in globs
|
|
27
32
|
*/
|
|
28
33
|
scurry?: PathScurry;
|
|
34
|
+
/**
|
|
35
|
+
* Load only importers into the graph if the modifiers have changed.
|
|
36
|
+
*/
|
|
37
|
+
skipLoadingNodesOnModifiersChange?: boolean;
|
|
29
38
|
};
|
|
30
39
|
export declare const load: (options: LoadOptions) => Graph;
|
|
31
40
|
export declare const loadHidden: (options: LoadOptions) => Graph;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../../src/lockfile/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,
|
|
1
|
+
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../../src/lockfile/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAK7C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAEpD,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG;IACtC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;OAEG;IACH,YAAY,EAAE,QAAQ,CAAA;IACtB;;OAEG;IACH,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB;;OAEG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB;;OAEG;IACH,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB;;OAEG;IACH,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB;;OAEG;IACH,iCAAiC,CAAC,EAAE,OAAO,CAAA;CAC5C,CAAA;AASD,eAAO,MAAM,IAAI,YAAa,WAAW,KAAG,KAM3C,CAAA;AAED,eAAO,MAAM,UAAU,YAAa,WAAW,KAAG,KAMjD,CAAA;AAED,eAAO,MAAM,UAAU,YACZ,WAAW,gBACN,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,GACzC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,UAoEzC,CAAA"}
|
|
@@ -17,11 +17,11 @@ export const loadHidden = (options) => {
|
|
|
17
17
|
return loadObject(options, loadLockfile(projectRoot, 'node_modules/.vlt-lock.json'));
|
|
18
18
|
};
|
|
19
19
|
export const loadObject = (options, lockfileData) => {
|
|
20
|
-
const { mainManifest, scurry } = options;
|
|
20
|
+
const { mainManifest, modifiers, scurry, skipLoadingNodesOnModifiersChange, } = options;
|
|
21
21
|
const packageJson = options.packageJson ?? new PackageJson();
|
|
22
22
|
const monorepo = options.monorepo ??
|
|
23
23
|
Monorepo.maybeLoad(options.projectRoot, { packageJson, scurry });
|
|
24
|
-
const { catalog = {}, catalogs = {}, 'scope-registries': scopeRegistries, registry, registries, 'git-hosts': gitHosts, 'git-host-archives': gitHostArchives, } = lockfileData.options ?? {};
|
|
24
|
+
const { catalog = {}, catalogs = {}, modifiers: modifiersLockfileConfig, 'scope-registries': scopeRegistries, registry, registries, 'git-hosts': gitHosts, 'git-host-archives': gitHostArchives, } = lockfileData.options ?? {};
|
|
25
25
|
const mergedOptions = {
|
|
26
26
|
...options,
|
|
27
27
|
catalog,
|
|
@@ -49,8 +49,18 @@ export const loadObject = (options, lockfileData) => {
|
|
|
49
49
|
mainManifest,
|
|
50
50
|
monorepo,
|
|
51
51
|
});
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
// When using the skipLoadingNodesOnModifiersChange option, we should skip loading
|
|
53
|
+
// dependencies in case the modifiers have changed since we'll need to
|
|
54
|
+
// recalculate the graph - useful for refreshing an ideal graph when
|
|
55
|
+
// modifiers are swapped.
|
|
56
|
+
const lockfileModifiers = JSON.stringify(modifiersLockfileConfig ?? {});
|
|
57
|
+
const optionsModifiers = JSON.stringify(modifiers?.config);
|
|
58
|
+
const modifiersChanged = lockfileModifiers !== optionsModifiers;
|
|
59
|
+
const shouldLoadDependencies = !(skipLoadingNodesOnModifiersChange && modifiersChanged);
|
|
60
|
+
if (shouldLoadDependencies) {
|
|
61
|
+
loadNodes(graph, lockfileData.nodes);
|
|
62
|
+
loadEdges(graph, lockfileData.edges, mergedOptions);
|
|
63
|
+
}
|
|
54
64
|
return graph;
|
|
55
65
|
};
|
|
56
66
|
//# sourceMappingURL=load.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../../src/lockfile/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../../src/lockfile/load.ts"],"names":[],"mappings":"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","sourcesContent":["import { PackageJson } from '@vltpkg/package-json'\nimport { Monorepo } from '@vltpkg/workspaces'\nimport { readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { loadEdges } from './load-edges.ts'\nimport { loadNodes } from './load-nodes.ts'\nimport { Graph } from '../graph.ts'\nimport type { PathScurry } from 'path-scurry'\nimport type { Manifest } from '@vltpkg/types'\nimport type { SpecOptions } from '@vltpkg/spec'\nimport type { LockfileData } from './types.ts'\nimport type { GraphModifier } from '../modifiers.ts'\n\nexport type LoadOptions = SpecOptions & {\n /**\n * The project root dirname.\n */\n projectRoot: string\n /**\n * The project root manifest.\n */\n mainManifest: Manifest\n /**\n * The graph modifiers helper object.\n */\n modifiers?: GraphModifier\n /**\n * A {@link Monorepo} object, for managing workspaces\n */\n monorepo?: Monorepo\n /**\n * A {@link PackageJson} object, for sharing manifest caches\n */\n packageJson?: PackageJson\n /**\n * A {@link PathScurry} object, for use in globs\n */\n scurry?: PathScurry\n /**\n * Load only importers into the graph if the modifiers have changed.\n */\n skipLoadingNodesOnModifiersChange?: boolean\n}\n\nconst loadLockfile = (projectRoot: string, lockfilePath: string) =>\n JSON.parse(\n readFileSync(resolve(projectRoot, lockfilePath), {\n encoding: 'utf8',\n }),\n ) as LockfileData\n\nexport const load = (options: LoadOptions): Graph => {\n const { projectRoot } = options\n return loadObject(\n options,\n loadLockfile(projectRoot, 'vlt-lock.json'),\n )\n}\n\nexport const loadHidden = (options: LoadOptions): Graph => {\n const { projectRoot } = options\n return loadObject(\n options,\n loadLockfile(projectRoot, 'node_modules/.vlt-lock.json'),\n )\n}\n\nexport const loadObject = (\n options: LoadOptions,\n lockfileData: Omit<LockfileData, 'options'> &\n Partial<Pick<LockfileData, 'options'>>,\n) => {\n const {\n mainManifest,\n modifiers,\n scurry,\n skipLoadingNodesOnModifiersChange,\n } = options\n const packageJson = options.packageJson ?? new PackageJson()\n const monorepo =\n options.monorepo ??\n Monorepo.maybeLoad(options.projectRoot, { packageJson, scurry })\n const {\n catalog = {},\n catalogs = {},\n modifiers: modifiersLockfileConfig,\n 'scope-registries': scopeRegistries,\n registry,\n registries,\n 'git-hosts': gitHosts,\n 'git-host-archives': gitHostArchives,\n } = lockfileData.options ?? {}\n const mergedOptions = {\n ...options,\n catalog,\n catalogs,\n 'scope-registries': {\n ...options['scope-registries'],\n ...scopeRegistries,\n },\n registry: registry ?? options.registry,\n registries: {\n ...options.registries,\n ...registries,\n },\n 'git-hosts': {\n ...options['git-hosts'],\n ...gitHosts,\n },\n 'git-host-archives': {\n ...options['git-host-archives'],\n ...gitHostArchives,\n },\n }\n const graph = new Graph({\n ...mergedOptions,\n mainManifest,\n monorepo,\n })\n\n // When using the skipLoadingNodesOnModifiersChange option, we should skip loading\n // dependencies in case the modifiers have changed since we'll need to\n // recalculate the graph - useful for refreshing an ideal graph when\n // modifiers are swapped.\n const lockfileModifiers = JSON.stringify(\n modifiersLockfileConfig ?? {},\n )\n const optionsModifiers = JSON.stringify(modifiers?.config)\n const modifiersChanged = lockfileModifiers !== optionsModifiers\n const shouldLoadDependencies = !(\n skipLoadingNodesOnModifiersChange && modifiersChanged\n )\n if (shouldLoadDependencies) {\n loadNodes(graph, lockfileData.nodes)\n loadEdges(graph, lockfileData.edges, mergedOptions)\n }\n\n return graph\n}\n"]}
|
|
@@ -1,17 +1,22 @@
|
|
|
1
1
|
import type { SpecOptions } from '@vltpkg/spec';
|
|
2
2
|
import type { Graph } from '../graph.ts';
|
|
3
3
|
import type { LockfileData } from './types.ts';
|
|
4
|
+
import type { GraphModifier } from '../modifiers.ts';
|
|
4
5
|
export type SaveOptions = SpecOptions & {
|
|
5
6
|
/**
|
|
6
7
|
* The graph to be stored in the lockfile.
|
|
7
8
|
*/
|
|
8
9
|
graph: Graph;
|
|
10
|
+
/**
|
|
11
|
+
* The graph modifiers helper object.
|
|
12
|
+
*/
|
|
13
|
+
modifiers?: GraphModifier;
|
|
9
14
|
/**
|
|
10
15
|
* Should it save manifest data in the lockfile?
|
|
11
16
|
*/
|
|
12
17
|
saveManifests?: boolean;
|
|
13
18
|
};
|
|
14
|
-
export declare const lockfileData: ({ graph, catalog, catalogs, "git-hosts": gitHosts, "git-host-archives": gitHostArchives, registry, registries, saveManifests, "scope-registries": scopeRegistries, "jsr-registries": jsrRegistries, }: SaveOptions) => LockfileData;
|
|
19
|
+
export declare const lockfileData: ({ graph, catalog, catalogs, "git-hosts": gitHosts, "git-host-archives": gitHostArchives, modifiers, registry, registries, saveManifests, "scope-registries": scopeRegistries, "jsr-registries": jsrRegistries, }: SaveOptions) => LockfileData;
|
|
15
20
|
export declare const saveData: (data: LockfileData, fileName: string, saveManifests?: boolean) => void;
|
|
16
21
|
export declare const save: (options: Omit<SaveOptions, "saveManifests">) => void;
|
|
17
22
|
export declare const saveHidden: (options: Omit<SaveOptions, "saveManifests">) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../../../src/lockfile/save.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../../../src/lockfile/save.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE/C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAExC,OAAO,KAAK,EACV,YAAY,EAKb,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAEpD,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG;IACtC;;OAEG;IACH,KAAK,EAAE,KAAK,CAAA;IACZ;;OAEG;IACH,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,CAAA;AA+FD,eAAO,MAAM,YAAY,qNAYtB,WAAW,KAAG,YAwDhB,CAAA;AAeD,eAAO,MAAM,QAAQ,SACb,YAAY,YACR,MAAM,8BAEf,IAIF,CAAA;AAED,eAAO,MAAM,IAAI,YACN,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,KAC1C,IAKF,CAAA;AAED,eAAO,MAAM,UAAU,YACZ,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,KAC1C,IASF,CAAA"}
|
|
@@ -64,13 +64,16 @@ const removeDefaultItems = (defaultItems, items) => {
|
|
|
64
64
|
}
|
|
65
65
|
return res;
|
|
66
66
|
};
|
|
67
|
-
export const lockfileData = ({ graph, catalog, catalogs, 'git-hosts': gitHosts, 'git-host-archives': gitHostArchives, registry, registries, saveManifests, 'scope-registries': scopeRegistries, 'jsr-registries': jsrRegistries, }) => {
|
|
67
|
+
export const lockfileData = ({ graph, catalog, catalogs, 'git-hosts': gitHosts, 'git-host-archives': gitHostArchives, modifiers, registry, registries, saveManifests, 'scope-registries': scopeRegistries, 'jsr-registries': jsrRegistries, }) => {
|
|
68
68
|
const cleanGitHosts = isRecordStringString(gitHosts) ?
|
|
69
69
|
removeDefaultItems(defaultGitHosts, gitHosts)
|
|
70
70
|
: undefined;
|
|
71
71
|
const cleanGitHostArchives = isRecordStringString(gitHostArchives) ?
|
|
72
72
|
removeDefaultItems(defaultGitHostArchives, gitHostArchives)
|
|
73
73
|
: undefined;
|
|
74
|
+
const cleanModifiers = modifiers && isRecordStringString(modifiers.config) ?
|
|
75
|
+
modifiers.config
|
|
76
|
+
: undefined;
|
|
74
77
|
const cleanRegistries = isRecordStringString(registries) ?
|
|
75
78
|
removeDefaultItems(defaultRegistries, registries)
|
|
76
79
|
: undefined;
|
|
@@ -83,6 +86,9 @@ export const lockfileData = ({ graph, catalog, catalogs, 'git-hosts': gitHosts,
|
|
|
83
86
|
const hasItems = (clean) => clean && Object.keys(clean).length;
|
|
84
87
|
return {
|
|
85
88
|
options: {
|
|
89
|
+
...(hasItems(cleanModifiers) ?
|
|
90
|
+
{ modifiers: cleanModifiers }
|
|
91
|
+
: {}),
|
|
86
92
|
...(hasItems(catalog) ? { catalog } : {}),
|
|
87
93
|
...(hasItems(catalogs) ? { catalogs } : {}),
|
|
88
94
|
...(hasItems(cleanScopeRegistries) ?
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save.js","sourceRoot":"","sources":["../../../src/lockfile/save.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DepID } from '@vltpkg/dep-id'\nimport type { SpecOptions } from '@vltpkg/spec'\nimport { isRecordStringString } from '@vltpkg/types'\nimport {\n defaultGitHostArchives,\n defaultGitHosts,\n defaultJsrRegistries,\n defaultRegistries,\n defaultRegistry,\n defaultScopeRegistries,\n} from '@vltpkg/spec'\nimport { mkdirSync, writeFileSync } from 'node:fs'\nimport { dirname, resolve } from 'node:path'\nimport type { Edge } from '../edge.ts'\nimport type { Graph } from '../graph.ts'\nimport type { Node } from '../node.ts'\nimport type {\n LockfileData,\n LockfileEdgeKey,\n LockfileEdges,\n LockfileEdgeValue,\n LockfileNode,\n} from './types.ts'\nimport { getFlagNumFromNode } from './types.ts'\n\nexport type SaveOptions = SpecOptions & {\n /**\n * The graph to be stored in the lockfile.\n */\n graph: Graph\n /**\n * Should it save manifest data in the lockfile?\n */\n saveManifests?: boolean\n}\n\nconst formatNodes = (\n nodes: Iterable<Node>,\n saveManifests?: boolean,\n registry?: string,\n) => {\n // we do not store importers in the lockfile, though we do store\n // their edges. when we load, we always read workspaces/main fresh.\n const arr: Node[] = [...nodes].filter(node => !node.importer)\n // nodes are sorted in order to have a deterministic result\n const orderedNodes: Node[] = arr.sort((a, b) =>\n a.id.localeCompare(b.id, 'en'),\n )\n\n const res: Record<DepID, LockfileNode> = {}\n for (const node of orderedNodes) {\n const customRegistry =\n node.resolved && registry && !node.resolved.startsWith(registry)\n const resolved = customRegistry ? node.resolved : undefined\n // if it's in a location other than the default, stash that\n const location =\n (\n node.id.startsWith('file') ||\n node.location.endsWith(\n '/node_modules/.vlt/' +\n node.id +\n '/node_modules/' +\n node.name,\n )\n ) ?\n undefined\n : node.location\n\n const flags = getFlagNumFromNode(node)\n const lockfileNode: LockfileNode = [flags, node.name]\n\n if (node.integrity) {\n lockfileNode[2] = node.integrity\n }\n\n if (resolved) {\n lockfileNode[3] = resolved\n }\n\n if (location) {\n lockfileNode[4] = location\n }\n\n if (saveManifests) {\n lockfileNode[5] = node.manifest\n\n if (node.confused) {\n lockfileNode[6] = node.rawManifest\n }\n }\n\n res[node.id] = lockfileNode\n }\n return res\n}\n\nconst formatEdges = (edges: Set<Edge>): LockfileEdges =>\n Object.fromEntries(\n [...edges]\n .sort(\n (a, b) =>\n /* c8 ignore start - nondeterminstic and annoying to test */\n // sort importers to the top, then alphabetically by\n // id, type, target\n Number(b.from.importer) - Number(a.from.importer) ||\n a.from.id.localeCompare(b.from.id, 'en') ||\n a.type.localeCompare(b.type, 'en') ||\n (a.to?.id ?? '').localeCompare(b.to?.id ?? ''),\n /* c8 ignore stop */\n )\n .map((edge): [LockfileEdgeKey, LockfileEdgeValue] => [\n `${edge.from.id} ${edge.spec.name}`,\n `${edge.type} ${edge.spec.bareSpec || '*'} ${edge.to?.id ?? 'MISSING'}`,\n ]),\n )\n\nconst removeDefaultItems = (\n defaultItems: Record<string, string>,\n items: Record<string, string>,\n) => {\n const res: Record<string, string> = {}\n for (const [key, value] of Object.entries(items)) {\n if (!defaultItems[key] || defaultItems[key] !== value) {\n res[key] = value\n }\n }\n return res\n}\n\nexport const lockfileData = ({\n graph,\n catalog,\n catalogs,\n 'git-hosts': gitHosts,\n 'git-host-archives': gitHostArchives,\n registry,\n registries,\n saveManifests,\n 'scope-registries': scopeRegistries,\n 'jsr-registries': jsrRegistries,\n}: SaveOptions): LockfileData => {\n const cleanGitHosts =\n isRecordStringString(gitHosts) ?\n removeDefaultItems(defaultGitHosts, gitHosts)\n : undefined\n const cleanGitHostArchives =\n isRecordStringString(gitHostArchives) ?\n removeDefaultItems(defaultGitHostArchives, gitHostArchives)\n : undefined\n const cleanRegistries =\n isRecordStringString(registries) ?\n removeDefaultItems(defaultRegistries, registries)\n : undefined\n const cleanScopeRegistries =\n isRecordStringString(scopeRegistries) ?\n removeDefaultItems(defaultScopeRegistries, scopeRegistries)\n : undefined\n const cleanJsrRegistries =\n isRecordStringString(jsrRegistries) ?\n removeDefaultItems(defaultJsrRegistries, jsrRegistries)\n : undefined\n const hasItems = (clean: Record<string, unknown> | undefined) =>\n clean && Object.keys(clean).length\n return {\n options: {\n ...(hasItems(catalog) ? { catalog } : {}),\n ...(hasItems(catalogs) ? { catalogs } : {}),\n ...(hasItems(cleanScopeRegistries) ?\n { 'scope-registries': cleanScopeRegistries }\n : undefined),\n ...(hasItems(cleanJsrRegistries) ?\n { 'jsr-registries': cleanJsrRegistries }\n : undefined),\n ...(registry !== undefined && registry !== defaultRegistry ?\n { registry }\n : undefined),\n ...(hasItems(registries) ?\n { registries: cleanRegistries }\n : undefined),\n ...(hasItems(cleanGitHosts) ?\n { 'git-hosts': cleanGitHosts }\n : undefined),\n ...(hasItems(cleanGitHostArchives) ?\n { 'git-host-archives': cleanGitHostArchives }\n : undefined),\n },\n nodes: formatNodes(graph.nodes.values(), saveManifests, registry),\n edges: formatEdges(graph.edges),\n }\n}\n\n// renders each node / edge as a single line entry\nconst extraFormat = (jsonString: string) => {\n const str = `${jsonString}\\n`\n const [init, ...parts] = str.split(' \"nodes\": {')\n const res = [init]\n for (const part of parts) {\n res.push(\n part.replaceAll('\\n ', '').replaceAll('\\n ]', ']'),\n )\n }\n return res.join(' \"nodes\": {')\n}\n\nexport const saveData = (\n data: LockfileData,\n fileName: string,\n saveManifests = false,\n): void => {\n const json = JSON.stringify(data, null, 2)\n const content = saveManifests ? json : extraFormat(json)\n writeFileSync(fileName, content)\n}\n\nexport const save = (\n options: Omit<SaveOptions, 'saveManifests'>,\n): void => {\n const { graph } = options\n const data = lockfileData({ ...options, saveManifests: false })\n const fileName = resolve(graph.projectRoot, 'vlt-lock.json')\n saveData(data, fileName, false)\n}\n\nexport const saveHidden = (\n options: Omit<SaveOptions, 'saveManifests'>,\n): void => {\n const { graph } = options\n const data = lockfileData({ ...options, saveManifests: true })\n const fileName = resolve(\n graph.projectRoot,\n 'node_modules/.vlt-lock.json',\n )\n mkdirSync(dirname(fileName), { recursive: true })\n saveData(data, fileName, true)\n}\n"]}
|
|
1
|
+
{"version":3,"file":"save.js","sourceRoot":"","sources":["../../../src/lockfile/save.ts"],"names":[],"mappings":"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","sourcesContent":["import { isRecordStringString } from '@vltpkg/types'\nimport {\n defaultGitHostArchives,\n defaultGitHosts,\n defaultJsrRegistries,\n defaultRegistries,\n defaultRegistry,\n defaultScopeRegistries,\n} from '@vltpkg/spec'\nimport { mkdirSync, writeFileSync } from 'node:fs'\nimport { dirname, resolve } from 'node:path'\nimport { getFlagNumFromNode } from './types.ts'\nimport type { DepID } from '@vltpkg/dep-id'\nimport type { SpecOptions } from '@vltpkg/spec'\nimport type { Edge } from '../edge.ts'\nimport type { Graph } from '../graph.ts'\nimport type { Node } from '../node.ts'\nimport type {\n LockfileData,\n LockfileEdgeKey,\n LockfileEdges,\n LockfileEdgeValue,\n LockfileNode,\n} from './types.ts'\nimport type { GraphModifier } from '../modifiers.ts'\n\nexport type SaveOptions = SpecOptions & {\n /**\n * The graph to be stored in the lockfile.\n */\n graph: Graph\n /**\n * The graph modifiers helper object.\n */\n modifiers?: GraphModifier\n /**\n * Should it save manifest data in the lockfile?\n */\n saveManifests?: boolean\n}\n\nconst formatNodes = (\n nodes: Iterable<Node>,\n saveManifests?: boolean,\n registry?: string,\n) => {\n // we do not store importers in the lockfile, though we do store\n // their edges. when we load, we always read workspaces/main fresh.\n const arr: Node[] = [...nodes].filter(node => !node.importer)\n // nodes are sorted in order to have a deterministic result\n const orderedNodes: Node[] = arr.sort((a, b) =>\n a.id.localeCompare(b.id, 'en'),\n )\n\n const res: Record<DepID, LockfileNode> = {}\n for (const node of orderedNodes) {\n const customRegistry =\n node.resolved && registry && !node.resolved.startsWith(registry)\n const resolved = customRegistry ? node.resolved : undefined\n // if it's in a location other than the default, stash that\n const location =\n (\n node.id.startsWith('file') ||\n node.location.endsWith(\n '/node_modules/.vlt/' +\n node.id +\n '/node_modules/' +\n node.name,\n )\n ) ?\n undefined\n : node.location\n\n const flags = getFlagNumFromNode(node)\n const lockfileNode: LockfileNode = [flags, node.name]\n\n if (node.integrity) {\n lockfileNode[2] = node.integrity\n }\n\n if (resolved) {\n lockfileNode[3] = resolved\n }\n\n if (location) {\n lockfileNode[4] = location\n }\n\n if (saveManifests) {\n lockfileNode[5] = node.manifest\n\n if (node.confused) {\n lockfileNode[6] = node.rawManifest\n }\n }\n\n res[node.id] = lockfileNode\n }\n return res\n}\n\nconst formatEdges = (edges: Set<Edge>): LockfileEdges =>\n Object.fromEntries(\n [...edges]\n .sort(\n (a, b) =>\n /* c8 ignore start - nondeterminstic and annoying to test */\n // sort importers to the top, then alphabetically by\n // id, type, target\n Number(b.from.importer) - Number(a.from.importer) ||\n a.from.id.localeCompare(b.from.id, 'en') ||\n a.type.localeCompare(b.type, 'en') ||\n (a.to?.id ?? '').localeCompare(b.to?.id ?? ''),\n /* c8 ignore stop */\n )\n .map((edge): [LockfileEdgeKey, LockfileEdgeValue] => [\n `${edge.from.id} ${edge.spec.name}`,\n `${edge.type} ${edge.spec.bareSpec || '*'} ${edge.to?.id ?? 'MISSING'}`,\n ]),\n )\n\nconst removeDefaultItems = (\n defaultItems: Record<string, string>,\n items: Record<string, string>,\n) => {\n const res: Record<string, string> = {}\n for (const [key, value] of Object.entries(items)) {\n if (!defaultItems[key] || defaultItems[key] !== value) {\n res[key] = value\n }\n }\n return res\n}\n\nexport const lockfileData = ({\n graph,\n catalog,\n catalogs,\n 'git-hosts': gitHosts,\n 'git-host-archives': gitHostArchives,\n modifiers,\n registry,\n registries,\n saveManifests,\n 'scope-registries': scopeRegistries,\n 'jsr-registries': jsrRegistries,\n}: SaveOptions): LockfileData => {\n const cleanGitHosts =\n isRecordStringString(gitHosts) ?\n removeDefaultItems(defaultGitHosts, gitHosts)\n : undefined\n const cleanGitHostArchives =\n isRecordStringString(gitHostArchives) ?\n removeDefaultItems(defaultGitHostArchives, gitHostArchives)\n : undefined\n const cleanModifiers =\n modifiers && isRecordStringString(modifiers.config) ?\n modifiers.config\n : undefined\n const cleanRegistries =\n isRecordStringString(registries) ?\n removeDefaultItems(defaultRegistries, registries)\n : undefined\n const cleanScopeRegistries =\n isRecordStringString(scopeRegistries) ?\n removeDefaultItems(defaultScopeRegistries, scopeRegistries)\n : undefined\n const cleanJsrRegistries =\n isRecordStringString(jsrRegistries) ?\n removeDefaultItems(defaultJsrRegistries, jsrRegistries)\n : undefined\n const hasItems = (clean: Record<string, unknown> | undefined) =>\n clean && Object.keys(clean).length\n return {\n options: {\n ...(hasItems(cleanModifiers) ?\n { modifiers: cleanModifiers }\n : {}),\n ...(hasItems(catalog) ? { catalog } : {}),\n ...(hasItems(catalogs) ? { catalogs } : {}),\n ...(hasItems(cleanScopeRegistries) ?\n { 'scope-registries': cleanScopeRegistries }\n : undefined),\n ...(hasItems(cleanJsrRegistries) ?\n { 'jsr-registries': cleanJsrRegistries }\n : undefined),\n ...(registry !== undefined && registry !== defaultRegistry ?\n { registry }\n : undefined),\n ...(hasItems(registries) ?\n { registries: cleanRegistries }\n : undefined),\n ...(hasItems(cleanGitHosts) ?\n { 'git-hosts': cleanGitHosts }\n : undefined),\n ...(hasItems(cleanGitHostArchives) ?\n { 'git-host-archives': cleanGitHostArchives }\n : undefined),\n },\n nodes: formatNodes(graph.nodes.values(), saveManifests, registry),\n edges: formatEdges(graph.edges),\n }\n}\n\n// renders each node / edge as a single line entry\nconst extraFormat = (jsonString: string) => {\n const str = `${jsonString}\\n`\n const [init, ...parts] = str.split(' \"nodes\": {')\n const res = [init]\n for (const part of parts) {\n res.push(\n part.replaceAll('\\n ', '').replaceAll('\\n ]', ']'),\n )\n }\n return res.join(' \"nodes\": {')\n}\n\nexport const saveData = (\n data: LockfileData,\n fileName: string,\n saveManifests = false,\n): void => {\n const json = JSON.stringify(data, null, 2)\n const content = saveManifests ? json : extraFormat(json)\n writeFileSync(fileName, content)\n}\n\nexport const save = (\n options: Omit<SaveOptions, 'saveManifests'>,\n): void => {\n const { graph } = options\n const data = lockfileData({ ...options, saveManifests: false })\n const fileName = resolve(graph.projectRoot, 'vlt-lock.json')\n saveData(data, fileName, false)\n}\n\nexport const saveHidden = (\n options: Omit<SaveOptions, 'saveManifests'>,\n): void => {\n const { graph } = options\n const data = lockfileData({ ...options, saveManifests: true })\n const fileName = resolve(\n graph.projectRoot,\n 'node_modules/.vlt-lock.json',\n )\n mkdirSync(dirname(fileName), { recursive: true })\n saveData(data, fileName, true)\n}\n"]}
|
|
@@ -9,7 +9,9 @@ import type { Integrity, Manifest, DependencyTypeShort } from '@vltpkg/types';
|
|
|
9
9
|
* a {@link Graph} representing a previous install.
|
|
10
10
|
*/
|
|
11
11
|
export type LockfileData = {
|
|
12
|
-
options: SpecOptions
|
|
12
|
+
options: SpecOptions & {
|
|
13
|
+
modifiers?: Record<string, string> | undefined;
|
|
14
|
+
};
|
|
13
15
|
nodes: Record<DepID, LockfileNode>;
|
|
14
16
|
edges: LockfileEdges;
|
|
15
17
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lockfile/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,KAAK,EACV,SAAS,EACT,QAAQ,EACR,mBAAmB,EACpB,MAAM,eAAe,CAAA;AAGtB;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lockfile/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,KAAK,EACV,SAAS,EACT,QAAQ,EACR,mBAAmB,EACpB,MAAM,eAAe,CAAA;AAGtB;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,WAAW,GAAG;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;KAC/C,CAAA;IACD,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,CAAA;IAClC,KAAK,EAAE,aAAa,CAAA;CACrB,CAAA;AAED,eAAO,MAAM,kBAAkB,SAAU;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,GAAG,CAAC,EAAE,OAAO,CAAA;CACd,kBAIuB,CAAA;AAExB,eAAO,MAAM,sBAAsB,UAAW,iBAAiB;;;CAG7D,CAAA;AAEF,eAAO,MAAM,oBAAoB,IAAI,CAAA;AACrC,eAAO,MAAM,wBAAwB,IAAI,CAAA;AACzC,eAAO,MAAM,mBAAmB,IAAI,CAAA;AACpC,eAAO,MAAM,2BAA2B,IAAI,CAAA;AAE5C;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AAE7C;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,iBAAiB;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IACpB,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IACxB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI;IAC1B,WAAW,CAAC,EAAE,QAAQ,GAAG,IAAI;CAC9B,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,CAAC,GAAG,EAAE,eAAe,GAAG,iBAAiB,CAAA;CAC1C,CAAA;AAED,4BAA4B;AAC5B,MAAM,MAAM,eAAe,GAAG,GAAG,KAAK,IAAI,MAAM,EAAE,CAAA;AAElD,8BAA8B;AAC9B,MAAM,MAAM,iBAAiB,GAC3B,GAAG,mBAAmB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,GAAG,SAAS,EAAE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lockfile/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lockfile/types.ts"],"names":[],"mappings":"AAwBA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAGlC,EAAE,EAAE,CACH,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,2BAA2B;IACvD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,wBAAwB;QAC1C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB;YAChC,CAAC,CAAC,oBAAoB,CAAA;AAExB,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAwB,EAAE,EAAE,CAAC,CAAC;IACnE,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,mBAAmB,CAAC;IACpC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,wBAAwB,CAAC;CAC/C,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAA;AACrC,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAA;AACzC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAA;AACpC,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAA","sourcesContent":["import type { DepID } from '@vltpkg/dep-id'\nimport type { Spec, SpecOptions } from '@vltpkg/spec'\nimport type {\n Integrity,\n Manifest,\n DependencyTypeShort,\n} from '@vltpkg/types'\nimport type { Graph } from '../graph.ts'\n\n/**\n * This is the main type definition for the contents of the\n * `vlt-lock.json` file.\n *\n * The nodes and edges information from the lockfile are used to reconstruct\n * a {@link Graph} representing a previous install.\n */\nexport type LockfileData = {\n options: SpecOptions & {\n modifiers?: Record<string, string> | undefined\n }\n nodes: Record<DepID, LockfileNode>\n edges: LockfileEdges\n}\n\nexport const getFlagNumFromNode = (node: {\n optional?: boolean\n dev?: boolean\n}) =>\n node.optional && node.dev ? LockfileNodeFlagDevOptional\n : node.optional ? LockfileNodeFlagOptional\n : node.dev ? LockfileNodeFlagDev\n : LockfileNodeFlagNone\n\nexport const getBooleanFlagsFromNum = (flags: LockfileNodeFlags) => ({\n dev: !!(flags & LockfileNodeFlagDev),\n optional: !!(flags & LockfileNodeFlagOptional),\n})\n\nexport const LockfileNodeFlagNone = 0\nexport const LockfileNodeFlagOptional = 1\nexport const LockfileNodeFlagDev = 2\nexport const LockfileNodeFlagDevOptional = 3\n\n/**\n * Bit flags indicating whether a node is optional and/or dev.\n */\nexport type LockfileNodeFlags = 0 | 1 | 2 | 3\n\n/**\n * Lockfile representation of a node from the install graph.\n */\nexport type LockfileNode = [\n flags: LockfileNodeFlags,\n name?: string | null,\n integrity?: Integrity | null,\n resolved?: string | null,\n location?: string | null,\n manifest?: Manifest | null,\n rawManifest?: Manifest | null,\n]\n\n/**\n * Lockfile edges are stored as a record object where the key\n * is `${from.id} ${spec.name}` and the value is\n * `${type} ${spec.bareSpec} ${to.id | 'MISSING'}`\n *\n * Storing them in a record like this means that we are guaranteed to\n * never end up with duplicates, and a standard `JSON.stringify()`\n * will nicely print them out one line per edge.\n */\nexport type LockfileEdges = {\n [key: LockfileEdgeKey]: LockfileEdgeValue\n}\n\n/** `${from} ${dep name}` */\nexport type LockfileEdgeKey = `${DepID} ${string}`\n\n/** `${type} ${spec} ${to}` */\nexport type LockfileEdgeValue =\n `${DependencyTypeShort} ${Spec['bareSpec']} ${DepID | 'MISSING'}`\n"]}
|
package/dist/esm/modifiers.d.ts
CHANGED
|
@@ -91,9 +91,9 @@ export type ModifierActiveEntry = {
|
|
|
91
91
|
* `modifier.tryImporter(graph.mainImporter)`
|
|
92
92
|
*
|
|
93
93
|
* When traversing the graph, use the `tryNewDependency` method to check
|
|
94
|
-
* if a given dependency
|
|
94
|
+
* if a given dependency spec to the current traversed node has matching
|
|
95
95
|
* registered modifiers, e.g:
|
|
96
|
-
* `const entries = modifier.tryNewDependency(fromNode,
|
|
96
|
+
* `const entries = modifier.tryNewDependency(fromNode, depSpec)`
|
|
97
97
|
*
|
|
98
98
|
* Use `updateActiveEntry` to update a given active modifier entry state
|
|
99
99
|
* with the current node of the graph being traversed. e.g:
|
|
@@ -108,6 +108,8 @@ export declare class GraphModifier {
|
|
|
108
108
|
* A set of currently active modifiers, which are being parsed.
|
|
109
109
|
*/
|
|
110
110
|
activeModifiers: Set<ModifierActiveEntry>;
|
|
111
|
+
/** A set of all modifier string values loaded from vlt.json */
|
|
112
|
+
modifierNames: Set<string>;
|
|
111
113
|
constructor(options: SpecOptions);
|
|
112
114
|
/**
|
|
113
115
|
* Load the modifiers definitions from vlt.json,
|
|
@@ -118,18 +120,6 @@ export declare class GraphModifier {
|
|
|
118
120
|
* Loads the modifiers defined in `vlt.json` into memory.
|
|
119
121
|
*/
|
|
120
122
|
load(options: SpecOptions): void;
|
|
121
|
-
/**
|
|
122
|
-
* Check if a given importer dependency name has potentially a registered
|
|
123
|
-
* modifier. In case of an ambiguous modifier, the method will always
|
|
124
|
-
* return `true`, it only returns `false` in the case that only fully
|
|
125
|
-
* qualified modifiers are registered and none are targeting the given
|
|
126
|
-
* top-level dependency name.
|
|
127
|
-
*
|
|
128
|
-
* This method is useful to help avoiding traversing the sub graph of
|
|
129
|
-
* a direct dependency when we know that it's impossible to ever match
|
|
130
|
-
* beforehand.
|
|
131
|
-
*/
|
|
132
|
-
maybeHasModifier(depName: string): boolean;
|
|
133
123
|
/**
|
|
134
124
|
* Try matching the provided node against the top-level selectors. In case
|
|
135
125
|
* a match is found it will also register the active entry modifier and
|
|
@@ -137,7 +127,7 @@ export declare class GraphModifier {
|
|
|
137
127
|
*/
|
|
138
128
|
tryImporter(importer: Node): void;
|
|
139
129
|
/**
|
|
140
|
-
* Try matching the provided node and
|
|
130
|
+
* Try matching the provided node and spec to the current
|
|
141
131
|
* active parsing modifier entries along with possible starting-level
|
|
142
132
|
* modifiers.
|
|
143
133
|
*
|
|
@@ -152,7 +142,7 @@ export declare class GraphModifier {
|
|
|
152
142
|
* and the active modifier entry state has been updated in the previous
|
|
153
143
|
* iteration.
|
|
154
144
|
*/
|
|
155
|
-
tryNewDependency(from: Node,
|
|
145
|
+
tryNewDependency(from: Node, spec: Spec): ModifierActiveEntry | undefined;
|
|
156
146
|
/**
|
|
157
147
|
* Returns the set of {@link ModifierActiveEntry} instances that matches
|
|
158
148
|
* the provided {@link Dependency} specs for a given node.
|
|
@@ -160,7 +150,7 @@ export declare class GraphModifier {
|
|
|
160
150
|
* This method is mostly a helper to {@link GraphModifier.tryNewDependency}
|
|
161
151
|
* that handles the registered modifiers traversal lookup.
|
|
162
152
|
*/
|
|
163
|
-
tryDependencies(from: Node, dependencies: Dependency[]): Map<string, ModifierActiveEntry>;
|
|
153
|
+
tryDependencies(from: Node, dependencies: Dependency[] | Edge[]): Map<string, ModifierActiveEntry>;
|
|
164
154
|
/**
|
|
165
155
|
* Updates an active entry state keeping track of items in the multi-level
|
|
166
156
|
* active entries map. If the current breadcrumb state shows there's no more
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modifiers.d.ts","sourceRoot":"","sources":["../../src/modifiers.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAGnC,OAAO,KAAK,EACV,kBAAkB,EAClB,6BAA6B,EAC9B,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEnD;;GAEG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,yBAAyB,CAAA;CACrC,CAAA;AAED;;GAEG;AAEH,MAAM,MAAM,yBAAyB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAE9D;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,kBAAkB,CAAA;IAC9B,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAA;IACxB,IAAI,EAAE,GAAG,CAAC;QACR,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,IAAI,CAAA;KACX,CAAC,CAAA;CACH,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,iBAAiB,GAAG;IAClD,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,IAAI,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,iBAAiB,GAAG;IAClD,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,QAAQ,CAAA;CACnB,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,iBAAiB,GAAG,iBAAiB,CAAA;AAEjE;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC;;OAEG;IACH,QAAQ,EAAE,aAAa,CAAA;IACvB;;OAEG;IACH,qBAAqB,EAAE,6BAA6B,CAAA;IACpD;;OAEG;IACH,YAAY,EAAE,IAAI,CAAA;IAClB;;OAEG;IACH,YAAY,CAAC,EAAE,IAAI,CAAA;IACnB;;OAEG;IACH,YAAY,CAAC,EAAE,IAAI,CAAA;CACpB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,aAAa;;IA2BxB;;OAEG;IACH,eAAe,2BAAiC;
|
|
1
|
+
{"version":3,"file":"modifiers.d.ts","sourceRoot":"","sources":["../../src/modifiers.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/modifiers.js
CHANGED
|
@@ -19,9 +19,9 @@ import { load } from '@vltpkg/vlt-json';
|
|
|
19
19
|
* `modifier.tryImporter(graph.mainImporter)`
|
|
20
20
|
*
|
|
21
21
|
* When traversing the graph, use the `tryNewDependency` method to check
|
|
22
|
-
* if a given dependency
|
|
22
|
+
* if a given dependency spec to the current traversed node has matching
|
|
23
23
|
* registered modifiers, e.g:
|
|
24
|
-
* `const entries = modifier.tryNewDependency(fromNode,
|
|
24
|
+
* `const entries = modifier.tryNewDependency(fromNode, depSpec)`
|
|
25
25
|
*
|
|
26
26
|
* Use `updateActiveEntry` to update a given active modifier entry state
|
|
27
27
|
* with the current node of the graph being traversed. e.g:
|
|
@@ -58,6 +58,8 @@ export class GraphModifier {
|
|
|
58
58
|
* A set of currently active modifiers, which are being parsed.
|
|
59
59
|
*/
|
|
60
60
|
activeModifiers = new Set();
|
|
61
|
+
/** A set of all modifier string values loaded from vlt.json */
|
|
62
|
+
modifierNames = new Set();
|
|
61
63
|
constructor(options) {
|
|
62
64
|
this.load(options);
|
|
63
65
|
}
|
|
@@ -76,6 +78,7 @@ export class GraphModifier {
|
|
|
76
78
|
*/
|
|
77
79
|
load(options) {
|
|
78
80
|
for (const [key, value] of Object.entries(this.config)) {
|
|
81
|
+
this.modifierNames.add(key);
|
|
79
82
|
const breadcrumb = parseBreadcrumb(key);
|
|
80
83
|
/* c8 ignore start - should not be possible */
|
|
81
84
|
if (!breadcrumb.last.name) {
|
|
@@ -120,28 +123,6 @@ export class GraphModifier {
|
|
|
120
123
|
}
|
|
121
124
|
}
|
|
122
125
|
}
|
|
123
|
-
/**
|
|
124
|
-
* Check if a given importer dependency name has potentially a registered
|
|
125
|
-
* modifier. In case of an ambiguous modifier, the method will always
|
|
126
|
-
* return `true`, it only returns `false` in the case that only fully
|
|
127
|
-
* qualified modifiers are registered and none are targeting the given
|
|
128
|
-
* top-level dependency name.
|
|
129
|
-
*
|
|
130
|
-
* This method is useful to help avoiding traversing the sub graph of
|
|
131
|
-
* a direct dependency when we know that it's impossible to ever match
|
|
132
|
-
* beforehand.
|
|
133
|
-
*/
|
|
134
|
-
maybeHasModifier(depName) {
|
|
135
|
-
for (const mod of this.#modifiers) {
|
|
136
|
-
const matchingName = mod.breadcrumb.first.importer &&
|
|
137
|
-
mod.breadcrumb.first.next?.name === depName;
|
|
138
|
-
const rootlessBreadcrumb = !mod.breadcrumb.first.importer;
|
|
139
|
-
if (rootlessBreadcrumb || matchingName) {
|
|
140
|
-
return true;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
return false;
|
|
144
|
-
}
|
|
145
126
|
/**
|
|
146
127
|
* Try matching the provided node against the top-level selectors. In case
|
|
147
128
|
* a match is found it will also register the active entry modifier and
|
|
@@ -168,7 +149,7 @@ export class GraphModifier {
|
|
|
168
149
|
}
|
|
169
150
|
}
|
|
170
151
|
/**
|
|
171
|
-
* Try matching the provided node and
|
|
152
|
+
* Try matching the provided node and spec to the current
|
|
172
153
|
* active parsing modifier entries along with possible starting-level
|
|
173
154
|
* modifiers.
|
|
174
155
|
*
|
|
@@ -183,7 +164,8 @@ export class GraphModifier {
|
|
|
183
164
|
* and the active modifier entry state has been updated in the previous
|
|
184
165
|
* iteration.
|
|
185
166
|
*/
|
|
186
|
-
tryNewDependency(from,
|
|
167
|
+
tryNewDependency(from, spec) {
|
|
168
|
+
const { name, semver } = spec;
|
|
187
169
|
// here we use a map instead of a set so that we can associate each
|
|
188
170
|
// modifier active entry with its breadcrumb so that it's easier to
|
|
189
171
|
// pick the correct entry when we sort breadcrbumbs by specificity
|
|
@@ -225,7 +207,13 @@ export class GraphModifier {
|
|
|
225
207
|
// if any were found or from any of the entries if available, otherwise
|
|
226
208
|
// it will return undefined as no entry is found in the `all` map
|
|
227
209
|
const entries = completeEntries.length ? completeEntries : arr;
|
|
228
|
-
return all.get(specificitySort(entries
|
|
210
|
+
return all.get(specificitySort(entries
|
|
211
|
+
// here we filter out any entries that do not match the
|
|
212
|
+
// pseudo selector comparators used in the breadcrumb item
|
|
213
|
+
.filter(i => i.interactiveBreadcrumb.current?.comparator({
|
|
214
|
+
semver,
|
|
215
|
+
}))
|
|
216
|
+
.map(i => i.modifier.breadcrumb))[0]);
|
|
229
217
|
}
|
|
230
218
|
/**
|
|
231
219
|
* Returns the set of {@link ModifierActiveEntry} instances that matches
|
|
@@ -237,7 +225,7 @@ export class GraphModifier {
|
|
|
237
225
|
tryDependencies(from, dependencies) {
|
|
238
226
|
const modifierRefs = new Map();
|
|
239
227
|
for (const { spec } of dependencies) {
|
|
240
|
-
const active = this.tryNewDependency(from, spec
|
|
228
|
+
const active = this.tryNewDependency(from, spec);
|
|
241
229
|
if (active) {
|
|
242
230
|
modifierRefs.set(spec.name, active);
|
|
243
231
|
}
|