npmdata 0.16.0 → 0.18.1
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/README.md +124 -151
- package/dist/cli/actions/check.d.ts.map +1 -1
- package/dist/cli/actions/check.js +2 -4
- package/dist/cli/actions/check.js.map +1 -1
- package/dist/cli/actions/extract.d.ts.map +1 -1
- package/dist/cli/actions/extract.js +2 -3
- package/dist/cli/actions/extract.js.map +1 -1
- package/dist/cli/actions/init.js +1 -1
- package/dist/cli/actions/init.js.map +1 -1
- package/dist/cli/argv.d.ts +12 -8
- package/dist/cli/argv.d.ts.map +1 -1
- package/dist/cli/argv.js +39 -33
- package/dist/cli/argv.js.map +1 -1
- package/dist/cli/usage.js +3 -3
- package/dist/fileset/check.d.ts.map +1 -1
- package/dist/fileset/check.js +8 -4
- package/dist/fileset/check.js.map +1 -1
- package/dist/fileset/diff.d.ts.map +1 -1
- package/dist/fileset/diff.js +9 -12
- package/dist/fileset/diff.js.map +1 -1
- package/dist/fileset/execute.d.ts.map +1 -1
- package/dist/fileset/execute.js +7 -6
- package/dist/fileset/execute.js.map +1 -1
- package/dist/fileset/markers.d.ts +3 -3
- package/dist/fileset/markers.js +5 -5
- package/dist/fileset/purge.d.ts +7 -1
- package/dist/fileset/purge.d.ts.map +1 -1
- package/dist/fileset/purge.js +17 -16
- package/dist/fileset/purge.js.map +1 -1
- package/dist/npmdata-0.0.1.tgz +0 -0
- package/dist/package/action-check.d.ts +3 -4
- package/dist/package/action-check.d.ts.map +1 -1
- package/dist/package/action-check.js +62 -8
- package/dist/package/action-check.js.map +1 -1
- package/dist/package/action-extract.d.ts +1 -2
- package/dist/package/action-extract.d.ts.map +1 -1
- package/dist/package/action-extract.js +20 -9
- package/dist/package/action-extract.js.map +1 -1
- package/dist/package/action-purge.d.ts +7 -0
- package/dist/package/action-purge.d.ts.map +1 -1
- package/dist/package/action-purge.js +116 -19
- package/dist/package/action-purge.js.map +1 -1
- package/dist/package/config-merge.d.ts +1 -1
- package/dist/package/config-merge.js +2 -2
- package/dist/package/config-merge.js.map +1 -1
- package/dist/types.d.ts +7 -7
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -1
|
@@ -5,17 +5,18 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
};
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.actionCheck = actionCheck;
|
|
8
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
8
9
|
const node_path_1 = __importDefault(require("node:path"));
|
|
9
10
|
const utils_1 = require("../utils");
|
|
10
11
|
const markers_1 = require("../fileset/markers");
|
|
11
12
|
const check_1 = require("../fileset/check");
|
|
12
13
|
/**
|
|
13
|
-
* Orchestrate check across all filesets, filtering out
|
|
14
|
+
* Orchestrate check across all filesets, filtering out entries with managed=false.
|
|
14
15
|
* Returns a summary of all drift found across all entries.
|
|
15
16
|
*/
|
|
16
17
|
// eslint-disable-next-line complexity
|
|
17
18
|
async function actionCheck(options) {
|
|
18
|
-
const { entries, cwd, presets = [], verbose = false, onProgress } = options;
|
|
19
|
+
const { entries, cwd, presets = [], verbose = false, onProgress, visitedPackages = new Set(), } = options;
|
|
19
20
|
const summary = { missing: [], modified: [], extra: [] };
|
|
20
21
|
// Filter by presets (same behaviour as purge)
|
|
21
22
|
const filtered = (0, utils_1.filterEntriesByPresets)(entries, presets);
|
|
@@ -23,9 +24,9 @@ async function actionCheck(options) {
|
|
|
23
24
|
console.log(`[verbose] check: verifying ${filtered.length} entr${filtered.length === 1 ? 'y' : 'ies'} (cwd: ${cwd})`);
|
|
24
25
|
}
|
|
25
26
|
for (const entry of filtered) {
|
|
26
|
-
// Skip
|
|
27
|
-
// The --
|
|
28
|
-
if (entry.output?.
|
|
27
|
+
// Skip entries with managed=false — they write no marker so there is nothing to check.
|
|
28
|
+
// The --managed=false flag also suppresses checking for explicitly marked entries.
|
|
29
|
+
if (entry.output?.managed === false)
|
|
29
30
|
continue;
|
|
30
31
|
const pkg = (0, utils_1.parsePackageSpec)(entry.package);
|
|
31
32
|
const outputDir = node_path_1.default.resolve(cwd, entry.output?.path ?? '.');
|
|
@@ -39,14 +40,18 @@ async function actionCheck(options) {
|
|
|
39
40
|
});
|
|
40
41
|
// Check if package is installed
|
|
41
42
|
const pkgPath = (0, utils_1.getInstalledPackagePath)(pkg.name, cwd);
|
|
42
|
-
// Read existing marker
|
|
43
|
+
// Read existing marker and filter to entries owned by this package only.
|
|
44
|
+
// Multiple packages may share the same outputDir; passing the full marker to
|
|
45
|
+
// checkFileset would cause files owned by other packages to be checked against
|
|
46
|
+
// the current package's source, producing false positives.
|
|
43
47
|
const existingMarker = await (0, markers_1.readOutputDirMarker)(outputDir);
|
|
48
|
+
const pkgMarker = existingMarker.filter((m) => m.packageName === pkg.name);
|
|
44
49
|
if (!pkgPath) {
|
|
45
50
|
console.error(`Package ${pkg.name} is not installed. Run 'extract' first.`);
|
|
46
|
-
summary.missing.push(...
|
|
51
|
+
summary.missing.push(...pkgMarker.map((m) => m.path));
|
|
47
52
|
continue;
|
|
48
53
|
}
|
|
49
|
-
const result = await (0, check_1.checkFileset)(pkgPath, outputDir, entry.selector ?? {}, entry.output ?? {},
|
|
54
|
+
const result = await (0, check_1.checkFileset)(pkgPath, outputDir, entry.selector ?? {}, entry.output ?? {}, pkgMarker);
|
|
50
55
|
summary.missing.push(...result.missing);
|
|
51
56
|
summary.modified.push(...result.modified);
|
|
52
57
|
summary.extra.push(...result.extra);
|
|
@@ -55,6 +60,55 @@ async function actionCheck(options) {
|
|
|
55
60
|
packageName: pkg.name,
|
|
56
61
|
packageVersion: pkg.version ?? 'latest',
|
|
57
62
|
});
|
|
63
|
+
// Hierarchical check: if the installed package declares npmdata.sets, recurse into them
|
|
64
|
+
const installedPkgPath = (0, utils_1.getInstalledIfSatisfies)(pkg.name, pkg.version, cwd);
|
|
65
|
+
if (installedPkgPath) {
|
|
66
|
+
let pkgNpmdataSets;
|
|
67
|
+
try {
|
|
68
|
+
const depPkgJson = JSON.parse(node_fs_1.default.readFileSync(node_path_1.default.join(installedPkgPath, 'package.json')).toString());
|
|
69
|
+
pkgNpmdataSets = depPkgJson.npmdata?.sets;
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
if (verbose) {
|
|
73
|
+
console.warn(`[verbose] check: could not read npmdata.sets from ${pkg.name}/package.json: ${error}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (pkgNpmdataSets && pkgNpmdataSets.length > 0) {
|
|
77
|
+
const siblingNames = new Set(entries.map((e) => (0, utils_1.parsePackageSpec)(e.package).name));
|
|
78
|
+
const presetFilteredSets = (0, utils_1.filterEntriesByPresets)(pkgNpmdataSets, entry.selector?.presets ?? []);
|
|
79
|
+
const filteredSets = presetFilteredSets.filter((e) => !siblingNames.has((0, utils_1.parsePackageSpec)(e.package).name) &&
|
|
80
|
+
!visitedPackages.has((0, utils_1.parsePackageSpec)(e.package).name));
|
|
81
|
+
if (filteredSets.length > 0) {
|
|
82
|
+
const visitedSet = new Set(visitedPackages);
|
|
83
|
+
visitedSet.add(pkg.name);
|
|
84
|
+
const outputConfig = entry.output ?? {};
|
|
85
|
+
const inheritedEntries = filteredSets.map((depEntry) => {
|
|
86
|
+
const { path: depPath, ...restOutput } = depEntry.output ?? {};
|
|
87
|
+
return {
|
|
88
|
+
...depEntry,
|
|
89
|
+
output: {
|
|
90
|
+
...restOutput,
|
|
91
|
+
path: node_path_1.default.join(outputConfig.path ?? '.', depPath ?? '.'),
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
});
|
|
95
|
+
if (verbose) {
|
|
96
|
+
console.log(`[verbose] check: recursing into ${filteredSets.length} transitive set(s) from ${pkg.name}`);
|
|
97
|
+
}
|
|
98
|
+
const subResult = await actionCheck({
|
|
99
|
+
entries: inheritedEntries,
|
|
100
|
+
cwd,
|
|
101
|
+
presets,
|
|
102
|
+
verbose,
|
|
103
|
+
onProgress,
|
|
104
|
+
visitedPackages: visitedSet,
|
|
105
|
+
});
|
|
106
|
+
summary.missing.push(...subResult.missing);
|
|
107
|
+
summary.modified.push(...subResult.modified);
|
|
108
|
+
summary.extra.push(...subResult.extra);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
58
112
|
}
|
|
59
113
|
return summary;
|
|
60
114
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-check.js","sourceRoot":"","sources":["../../src/package/action-check.ts"],"names":[],"mappings":";AAAA,+BAA+B;;;;;
|
|
1
|
+
{"version":3,"file":"action-check.js","sourceRoot":"","sources":["../../src/package/action-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { NpmdataExtractEntry, ProgressEvent } from '../types';
|
|
2
2
|
export type ExtractOptions = {
|
|
3
3
|
entries: NpmdataExtractEntry[];
|
|
4
|
-
config: NpmdataConfig | null;
|
|
5
4
|
cwd: string;
|
|
6
5
|
verbose?: boolean;
|
|
7
6
|
onProgress?: (event: ProgressEvent) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-extract.d.ts","sourceRoot":"","sources":["../../src/package/action-extract.ts"],"names":[],"mappings":"AAKA,OAAO,
|
|
1
|
+
{"version":3,"file":"action-extract.d.ts","sourceRoot":"","sources":["../../src/package/action-extract.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAgC,MAAM,UAAU,CAAC;AAc5F,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC5C,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;GAGG;AAEH,wBAAsB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAqSnF"}
|
|
@@ -18,15 +18,19 @@ const symlinks_1 = require("./symlinks");
|
|
|
18
18
|
*/
|
|
19
19
|
// eslint-disable-next-line complexity
|
|
20
20
|
async function actionExtract(options) {
|
|
21
|
-
const { entries,
|
|
21
|
+
const { entries, cwd, verbose, onProgress, visitedPackages = new Set() } = options;
|
|
22
22
|
if (verbose) {
|
|
23
|
-
console.log(`[verbose]
|
|
23
|
+
console.log(`[verbose] >>> EXTRACT - ${entries.reduce((acc, entry) => acc + entry.package + ', ', '').slice(0, -2)}`);
|
|
24
24
|
}
|
|
25
25
|
const result = { added: 0, modified: 0, deleted: 0, skipped: 0 };
|
|
26
26
|
const allNewlyCreated = [];
|
|
27
27
|
const deferredDeletes = [];
|
|
28
28
|
try {
|
|
29
29
|
for (const entry of entries) {
|
|
30
|
+
if (verbose) {
|
|
31
|
+
// eslint-disable-next-line no-undefined
|
|
32
|
+
console.log(`[verbose] config: ${JSON.stringify(entry, undefined, 2)}`);
|
|
33
|
+
}
|
|
30
34
|
if (!entry.package) {
|
|
31
35
|
throw new Error('Each set entry must have a "package" field.');
|
|
32
36
|
}
|
|
@@ -82,14 +86,16 @@ async function actionExtract(options) {
|
|
|
82
86
|
const pkgMarker = existingMarker.filter((m) => m.packageName === pkg.name);
|
|
83
87
|
// Phase 3: Diff phase (pure, no disk writes)
|
|
84
88
|
const extractionMap = await (0, diff_1.diff)(pkgPath, outputDir, selector, outputConfig, pkgMarker, contentReplacements);
|
|
85
|
-
// Phase 4: Abort on conflicts (unless force or
|
|
86
|
-
if (extractionMap.conflicts.length > 0 &&
|
|
87
|
-
|
|
89
|
+
// Phase 4: Abort on conflicts (unless force or managed=false)
|
|
90
|
+
if (extractionMap.conflicts.length > 0 &&
|
|
91
|
+
!outputConfig.force &&
|
|
92
|
+
outputConfig.managed !== false) {
|
|
93
|
+
const conflictPaths = extractionMap.conflicts.map((c) => c.relPath).join('\n');
|
|
88
94
|
if (verbose) {
|
|
89
95
|
console.warn(`[verbose] extract: aborting due to ${extractionMap.conflicts.length} conflict(s) in ${outputDir}: ${conflictPaths}`);
|
|
90
96
|
}
|
|
91
|
-
throw new Error(`Conflict: the following files exist and are not managed by npmdata
|
|
92
|
-
`Use --force to overwrite or --
|
|
97
|
+
throw new Error(`Conflict: the following files exist and are not managed by npmdata:\n${conflictPaths}\n` +
|
|
98
|
+
`Use --force to overwrite or --managed=false to skip.`);
|
|
93
99
|
}
|
|
94
100
|
// Phase 5: Execute phase (disk writes)
|
|
95
101
|
if (verbose) {
|
|
@@ -148,7 +154,9 @@ async function actionExtract(options) {
|
|
|
148
154
|
if (filteredSets.length > 0) {
|
|
149
155
|
const visitedSet = new Set(visitedPackages);
|
|
150
156
|
visitedSet.add(pkg.name);
|
|
151
|
-
// Inherit caller overrides (force, dryRun, keepExisting) from current entry
|
|
157
|
+
// Inherit caller overrides (force, dryRun, keepExisting, gitignore, managed) from current entry.
|
|
158
|
+
// Caller-defined (non-undefined) values always take precedence; undefined propagates as-is
|
|
159
|
+
// so defaults are only resolved at the leaf execute() level, not during recursion.
|
|
152
160
|
const inheritedEntries = filteredSets.map((depEntry) => {
|
|
153
161
|
const { path: depPath, ...restOutput } = depEntry.output ?? {};
|
|
154
162
|
const inheritedOutput = {
|
|
@@ -157,6 +165,8 @@ async function actionExtract(options) {
|
|
|
157
165
|
force: outputConfig.force ?? restOutput.force,
|
|
158
166
|
dryRun: outputConfig.dryRun ?? restOutput.dryRun,
|
|
159
167
|
keepExisting: outputConfig.keepExisting ?? restOutput.keepExisting,
|
|
168
|
+
gitignore: outputConfig.gitignore ?? restOutput.gitignore,
|
|
169
|
+
managed: outputConfig.managed ?? restOutput.managed,
|
|
160
170
|
// Append symlinks and contentReplacements
|
|
161
171
|
symlinks: [...(outputConfig.symlinks ?? []), ...(restOutput.symlinks ?? [])],
|
|
162
172
|
contentReplacements: [
|
|
@@ -174,7 +184,6 @@ async function actionExtract(options) {
|
|
|
174
184
|
}
|
|
175
185
|
const subResult = await actionExtract({
|
|
176
186
|
entries: inheritedEntries,
|
|
177
|
-
config,
|
|
178
187
|
cwd,
|
|
179
188
|
verbose,
|
|
180
189
|
onProgress,
|
|
@@ -211,6 +220,8 @@ async function actionExtract(options) {
|
|
|
211
220
|
console.error(`[verbose] extract: error encountered, rolling back ${allNewlyCreated.length} newly created file(s): ${error}`);
|
|
212
221
|
}
|
|
213
222
|
await (0, execute_1.rollback)(allNewlyCreated);
|
|
223
|
+
// Ensure temp package.json is cleaned up even on failure
|
|
224
|
+
(0, utils_1.cleanupTempPackageJson)(cwd, verbose);
|
|
214
225
|
throw error;
|
|
215
226
|
}
|
|
216
227
|
return result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-extract.js","sourceRoot":"","sources":["../../src/package/action-extract.ts"],"names":[],"mappings":";AAAA,+BAA+B;;;;;
|
|
1
|
+
{"version":3,"file":"action-extract.js","sourceRoot":"","sources":["../../src/package/action-extract.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ export type PurgeOptions = {
|
|
|
7
7
|
dryRun?: boolean;
|
|
8
8
|
verbose?: boolean;
|
|
9
9
|
onProgress?: (event: ProgressEvent) => void;
|
|
10
|
+
visitedPackages?: Set<string>;
|
|
10
11
|
};
|
|
11
12
|
export type PurgeSummary = {
|
|
12
13
|
deleted: number;
|
|
@@ -16,6 +17,12 @@ export type PurgeSummary = {
|
|
|
16
17
|
/**
|
|
17
18
|
* Purge managed files from all matching filesets.
|
|
18
19
|
* Supports --presets filtering and --dry-run.
|
|
20
|
+
*
|
|
21
|
+
* Operates in two phases:
|
|
22
|
+
* 1. Collect: recursively traverse all sets and accumulate the managed file
|
|
23
|
+
* entries to delete per output directory (no disk writes).
|
|
24
|
+
* 2. Execute: delete the collected files per output directory, then update
|
|
25
|
+
* the marker (removing only purged paths) and gitignore accordingly.
|
|
19
26
|
*/
|
|
20
27
|
export declare function actionPurge(options: PurgeOptions): Promise<PurgeSummary>;
|
|
21
28
|
//# sourceMappingURL=action-purge.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-purge.d.ts","sourceRoot":"","sources":["../../src/package/action-purge.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"action-purge.d.ts","sourceRoot":"","sources":["../../src/package/action-purge.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAuB,aAAa,EAAE,MAAM,UAAU,CAAC;AAKlG,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC5C,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAqHF;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAsD9E"}
|
|
@@ -1,57 +1,154 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
5
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
39
|
exports.actionPurge = actionPurge;
|
|
7
40
|
/* eslint-disable no-console */
|
|
41
|
+
const node_fs_1 = __importStar(require("node:fs"));
|
|
8
42
|
const node_path_1 = __importDefault(require("node:path"));
|
|
9
43
|
const utils_1 = require("../utils");
|
|
10
44
|
const markers_1 = require("../fileset/markers");
|
|
11
45
|
const purge_1 = require("../fileset/purge");
|
|
12
46
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
47
|
+
* Phase 1: recursively collect all managed file entries that need to be purged,
|
|
48
|
+
* grouped by output directory. No disk writes are performed.
|
|
15
49
|
*/
|
|
16
50
|
// eslint-disable-next-line complexity
|
|
17
|
-
async function
|
|
18
|
-
const { entries, cwd, presets = [], dryRun = false, verbose = false, onProgress } = options;
|
|
51
|
+
async function collectPurgePlan(entries, cwd, presets, verbose, visitedPackages, plan, onProgress) {
|
|
19
52
|
if (verbose) {
|
|
20
|
-
console.log(`[verbose] purge:
|
|
53
|
+
console.log(`[verbose] purge: collecting ${entries.length} entr${entries.length === 1 ? 'y' : 'ies'} (cwd: ${cwd})`);
|
|
21
54
|
}
|
|
22
|
-
const summary = { deleted: 0, symlinksRemoved: 0, dirsRemoved: 0 };
|
|
23
|
-
// Filter by presets
|
|
24
55
|
const filtered = (0, utils_1.filterEntriesByPresets)(entries, presets);
|
|
25
56
|
for (const entry of filtered) {
|
|
26
57
|
const pkg = (0, utils_1.parsePackageSpec)(entry.package);
|
|
27
58
|
const outputDir = node_path_1.default.resolve(cwd, entry.output?.path ?? '.');
|
|
28
59
|
if (verbose) {
|
|
29
|
-
console.log(`[verbose] purge: entry package=${entry.package} outputDir=${entry.output?.path ?? '.'}`);
|
|
60
|
+
console.log(`[verbose] purge: collecting entry package=${entry.package} outputDir=${entry.output?.path ?? '.'}`);
|
|
30
61
|
}
|
|
31
62
|
onProgress?.({
|
|
32
63
|
type: 'package-start',
|
|
33
64
|
packageName: pkg.name,
|
|
34
65
|
packageVersion: pkg.version ?? 'latest',
|
|
35
66
|
});
|
|
36
|
-
// Read
|
|
67
|
+
// Read the marker and collect only entries belonging to this package
|
|
37
68
|
const managedFiles = await (0, markers_1.readOutputDirMarker)(outputDir);
|
|
38
|
-
// Purge only files belonging to this package
|
|
39
69
|
const entryFiles = managedFiles.filter((m) => m.packageName === pkg.name);
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
70
|
+
// Accumulate into the plan (multiple entries may share the same outputDir)
|
|
71
|
+
const existing = plan.get(outputDir) ?? [];
|
|
72
|
+
plan.set(outputDir, [...existing, ...entryFiles]);
|
|
73
|
+
onProgress?.({
|
|
74
|
+
type: 'package-end',
|
|
75
|
+
packageName: pkg.name,
|
|
76
|
+
packageVersion: pkg.version ?? 'latest',
|
|
77
|
+
});
|
|
78
|
+
// Hierarchical collection: if the installed package declares npmdata.sets, recurse
|
|
79
|
+
const pkgPath = (0, utils_1.getInstalledIfSatisfies)(pkg.name, pkg.version, cwd);
|
|
80
|
+
if (!pkgPath)
|
|
81
|
+
continue;
|
|
82
|
+
const pkgJsonFile = node_path_1.default.join(pkgPath, 'package.json');
|
|
83
|
+
if (!(0, node_fs_1.existsSync)(pkgJsonFile))
|
|
84
|
+
continue;
|
|
85
|
+
const depPkgJson = JSON.parse(node_fs_1.default.readFileSync(pkgJsonFile).toString());
|
|
86
|
+
const pkgNpmdataSets = depPkgJson.npmdata?.sets;
|
|
87
|
+
if (pkgNpmdataSets && pkgNpmdataSets.length > 0) {
|
|
88
|
+
const siblingNames = new Set(entries.map((e) => (0, utils_1.parsePackageSpec)(e.package).name));
|
|
89
|
+
const presetFilteredSets = (0, utils_1.filterEntriesByPresets)(pkgNpmdataSets, entry.selector?.presets ?? []);
|
|
90
|
+
const filteredSets = presetFilteredSets.filter((e) => !siblingNames.has((0, utils_1.parsePackageSpec)(e.package).name) &&
|
|
91
|
+
!visitedPackages.has((0, utils_1.parsePackageSpec)(e.package).name));
|
|
92
|
+
if (filteredSets.length > 0) {
|
|
93
|
+
const visitedSet = new Set(visitedPackages);
|
|
94
|
+
visitedSet.add(pkg.name);
|
|
95
|
+
const outputConfig = entry.output ?? {};
|
|
96
|
+
const inheritedEntries = filteredSets.map((depEntry) => {
|
|
97
|
+
const { path: depPath, ...restOutput } = depEntry.output ?? {};
|
|
98
|
+
return {
|
|
99
|
+
...depEntry,
|
|
100
|
+
output: {
|
|
101
|
+
...restOutput,
|
|
102
|
+
path: node_path_1.default.join(outputConfig.path ?? '.', depPath ?? '.'),
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
});
|
|
106
|
+
if (verbose) {
|
|
107
|
+
console.log(`[verbose] purge: recursing into ${filteredSets.length} transitive set(s) from ${pkg.name}`);
|
|
108
|
+
}
|
|
109
|
+
await collectPurgePlan(inheritedEntries, cwd, presets, verbose, visitedSet, plan, onProgress);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Purge managed files from all matching filesets.
|
|
116
|
+
* Supports --presets filtering and --dry-run.
|
|
117
|
+
*
|
|
118
|
+
* Operates in two phases:
|
|
119
|
+
* 1. Collect: recursively traverse all sets and accumulate the managed file
|
|
120
|
+
* entries to delete per output directory (no disk writes).
|
|
121
|
+
* 2. Execute: delete the collected files per output directory, then update
|
|
122
|
+
* the marker (removing only purged paths) and gitignore accordingly.
|
|
123
|
+
*/
|
|
124
|
+
async function actionPurge(options) {
|
|
125
|
+
const { entries, cwd, presets = [], dryRun = false, verbose = false, onProgress, visitedPackages = new Set(), } = options;
|
|
126
|
+
// Phase 1: collect all entries to purge across all recursive sets
|
|
127
|
+
if (verbose) {
|
|
128
|
+
console.log(`[verbose] purge: phase 1 - collecting entries to purge (cwd: ${cwd})`);
|
|
129
|
+
}
|
|
130
|
+
const plan = new Map();
|
|
131
|
+
await collectPurgePlan(entries, cwd, presets, verbose, visitedPackages, plan, onProgress);
|
|
132
|
+
const summary = { deleted: 0, symlinksRemoved: 0, dirsRemoved: 0 };
|
|
133
|
+
// Phase 2: execute deletions per output directory
|
|
134
|
+
if (verbose) {
|
|
135
|
+
const total = [...plan.values()].reduce((sum, e) => sum + e.length, 0);
|
|
136
|
+
console.log(`[verbose] purge: phase 2 - deleting ${total} entr${total === 1 ? 'y' : 'ies'} across ${plan.size} output dir(s)`);
|
|
137
|
+
}
|
|
138
|
+
for (const [outputDir, entriesToPurge] of plan) {
|
|
139
|
+
if (verbose) {
|
|
140
|
+
console.log(`[verbose] purge: executing purge for ${node_path_1.default.relative(cwd, outputDir)} (${entriesToPurge.length} entries)`);
|
|
141
|
+
}
|
|
142
|
+
const result = await (0, purge_1.purgeFileset)(outputDir, entriesToPurge, dryRun);
|
|
143
|
+
for (const m of entriesToPurge) {
|
|
144
|
+
onProgress?.({ type: 'file-deleted', packageName: m.packageName, file: m.path });
|
|
43
145
|
}
|
|
44
146
|
summary.deleted += result.deleted;
|
|
45
147
|
summary.symlinksRemoved += result.symlinksRemoved;
|
|
46
148
|
summary.dirsRemoved += result.dirsRemoved;
|
|
47
149
|
if (verbose) {
|
|
48
|
-
console.log(`[verbose] purge: deleted ${result.deleted} files, ${result.symlinksRemoved} symlinks, ${result.dirsRemoved} dirs
|
|
150
|
+
console.log(`[verbose] purge: deleted ${result.deleted} files, ${result.symlinksRemoved} symlinks, ${result.dirsRemoved} dirs`);
|
|
49
151
|
}
|
|
50
|
-
onProgress?.({
|
|
51
|
-
type: 'package-end',
|
|
52
|
-
packageName: pkg.name,
|
|
53
|
-
packageVersion: pkg.version ?? 'latest',
|
|
54
|
-
});
|
|
55
152
|
}
|
|
56
153
|
return summary;
|
|
57
154
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-purge.js","sourceRoot":"","sources":["../../src/package/action-purge.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"action-purge.js","sourceRoot":"","sources":["../../src/package/action-purge.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ import { SelectorConfig, OutputConfig } from '../types';
|
|
|
9
9
|
export declare function mergeSelectorConfig(parent: SelectorConfig, child: SelectorConfig): SelectorConfig;
|
|
10
10
|
/**
|
|
11
11
|
* Merge two OutputConfig objects for recursive extraction.
|
|
12
|
-
* - force, keepExisting, gitignore,
|
|
12
|
+
* - force, keepExisting, gitignore, managed, dryRun: caller value overrides child
|
|
13
13
|
* - path: concatenated (parent/child)
|
|
14
14
|
* - symlinks: appended (parent + child)
|
|
15
15
|
* - contentReplacements: appended (parent + child)
|
|
@@ -25,7 +25,7 @@ function mergeSelectorConfig(parent, child) {
|
|
|
25
25
|
}
|
|
26
26
|
/**
|
|
27
27
|
* Merge two OutputConfig objects for recursive extraction.
|
|
28
|
-
* - force, keepExisting, gitignore,
|
|
28
|
+
* - force, keepExisting, gitignore, managed, dryRun: caller value overrides child
|
|
29
29
|
* - path: concatenated (parent/child)
|
|
30
30
|
* - symlinks: appended (parent + child)
|
|
31
31
|
* - contentReplacements: appended (parent + child)
|
|
@@ -36,7 +36,7 @@ function mergeOutputConfig(caller, child) {
|
|
|
36
36
|
force: caller.force ?? child.force,
|
|
37
37
|
keepExisting: caller.keepExisting ?? child.keepExisting,
|
|
38
38
|
gitignore: caller.gitignore ?? child.gitignore,
|
|
39
|
-
|
|
39
|
+
managed: caller.managed ?? child.managed,
|
|
40
40
|
dryRun: caller.dryRun ?? child.dryRun,
|
|
41
41
|
symlinks: [...(caller.symlinks ?? []), ...(child.symlinks ?? [])],
|
|
42
42
|
contentReplacements: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-merge.js","sourceRoot":"","sources":["../../src/package/config-merge.ts"],"names":[],"mappings":";;AASA,kDAiBC;AASD,8CAcC;AA/CD;;;;;;GAMG;AACH,SAAgB,mBAAmB,CAAC,MAAsB,EAAE,KAAqB;IAC/E,MAAM,KAAK,GACT,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK;QACzB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IAEpC,MAAM,cAAc,GAClB,MAAM,CAAC,cAAc,IAAI,KAAK,CAAC,cAAc;QAC3C,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,cAAc,EAAE,GAAG,KAAK,CAAC,cAAc,CAAC;QACrD,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;IAEtD,OAAO;QACL,KAAK;QACL,cAAc;QACd,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,4BAA4B;QACpD,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,yBAAyB;KAClD,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,iBAAiB,CAAC,MAAoB,EAAE,KAAmB;IACzE,OAAO;QACL,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC;QAC5D,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK;QAClC,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY;QACvD,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS;QAC9C,
|
|
1
|
+
{"version":3,"file":"config-merge.js","sourceRoot":"","sources":["../../src/package/config-merge.ts"],"names":[],"mappings":";;AASA,kDAiBC;AASD,8CAcC;AA/CD;;;;;;GAMG;AACH,SAAgB,mBAAmB,CAAC,MAAsB,EAAE,KAAqB;IAC/E,MAAM,KAAK,GACT,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK;QACzB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IAEpC,MAAM,cAAc,GAClB,MAAM,CAAC,cAAc,IAAI,KAAK,CAAC,cAAc;QAC3C,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,cAAc,EAAE,GAAG,KAAK,CAAC,cAAc,CAAC;QACrD,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;IAEtD,OAAO;QACL,KAAK;QACL,cAAc;QACd,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,4BAA4B;QACpD,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,yBAAyB;KAClD,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,iBAAiB,CAAC,MAAoB,EAAE,KAAmB;IACzE,OAAO;QACL,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC;QAC5D,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK;QAClC,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY;QACvD,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS;QAC9C,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO;QACxC,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM;QACrC,QAAQ,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QACjE,mBAAmB,EAAE;YACnB,GAAG,CAAC,MAAM,CAAC,mBAAmB,IAAI,EAAE,CAAC;YACrC,GAAG,CAAC,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC;SACrC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -58,10 +58,10 @@ export type OutputConfig = {
|
|
|
58
58
|
*/
|
|
59
59
|
gitignore?: boolean;
|
|
60
60
|
/**
|
|
61
|
-
*
|
|
62
|
-
* Takes precedence over force.
|
|
61
|
+
* When set to false: write without .npmdata marker, no gitignore update, no read-only. Existing files skipped.
|
|
62
|
+
* Takes precedence over force. Defaults to true (managed).
|
|
63
63
|
*/
|
|
64
|
-
|
|
64
|
+
managed?: boolean;
|
|
65
65
|
/**
|
|
66
66
|
* Report what would change; no disk writes.
|
|
67
67
|
*/
|
|
@@ -151,10 +151,10 @@ export type FileOperation = {
|
|
|
151
151
|
*/
|
|
152
152
|
export type SkippedFile = {
|
|
153
153
|
relPath: string;
|
|
154
|
-
reason: 'conflict' | 'keep-existing' | '
|
|
154
|
+
reason: 'conflict' | 'keep-existing' | 'not-managed';
|
|
155
155
|
};
|
|
156
156
|
/**
|
|
157
|
-
*
|
|
157
|
+
* A file in outputDir that is not tracked by npmdata and blocks extraction.
|
|
158
158
|
*/
|
|
159
159
|
export type ConflictFile = {
|
|
160
160
|
relPath: string;
|
|
@@ -173,12 +173,12 @@ export type ExtractionMap = {
|
|
|
173
173
|
toDelete: string[];
|
|
174
174
|
/** Files skipped with reason. */
|
|
175
175
|
toSkip: SkippedFile[];
|
|
176
|
-
/**
|
|
176
|
+
/** Files in outputDir not tracked by npmdata that block extraction. */
|
|
177
177
|
conflicts: ConflictFile[];
|
|
178
178
|
};
|
|
179
179
|
/**
|
|
180
180
|
* One row in a .npmdata CSV marker file.
|
|
181
|
-
*
|
|
181
|
+
* Format: path|packageName|packageVersion — one row per file, no header.
|
|
182
182
|
*/
|
|
183
183
|
export type ManagedFileMetadata = {
|
|
184
184
|
/** Relative path from marker file directory. */
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "npmdata",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": "dist/cli/bin.js",
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"homepage": "https://github.com/flaviostutz/npmdata#readme",
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@babel/preset-typescript": "^7.21.0",
|
|
27
|
+
"@jest/globals": "^30.3.0",
|
|
27
28
|
"@stutzlab/eslint-config": "^4.2.1",
|
|
28
29
|
"@tsconfig/node20": "^20.1.4",
|
|
29
30
|
"@types/archiver": "^6.0.2",
|