npmdata 0.16.0 → 0.18.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/README.md +119 -146
- package/dist/cli/actions/check.d.ts.map +1 -1
- package/dist/cli/actions/check.js +3 -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 +4 -7
- package/dist/fileset/diff.js.map +1 -1
- package/dist/fileset/execute.d.ts.map +1 -1
- package/dist/fileset/execute.js +6 -5
- 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 +2 -2
- package/dist/package/action-check.d.ts.map +1 -1
- package/dist/package/action-check.js +58 -4
- 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 +15 -6
- 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/types.d.ts +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -112,7 +112,7 @@ Config is resolved using [cosmiconfig](https://github.com/cosmiconfig/cosmiconfi
|
|
|
112
112
|
| `.npmdatarc.yaml` / `.npmdatarc.yml` | YAML object with `"sets"` array |
|
|
113
113
|
| `npmdata.config.js` | CommonJS module exporting object with `sets` array |
|
|
114
114
|
|
|
115
|
-
All runner flags (`--dry-run`, `--silent`, `--verbose`, `--
|
|
115
|
+
All runner flags (`--dry-run`, `--silent`, `--verbose`, `--gitignore=false`, `--managed=false`, `--presets`, `--output`) work as usual.
|
|
116
116
|
|
|
117
117
|
**When to use:** When a consuming project wants to pin and automate a set of data extractions locally without publishing a separate data package. This is the lightest-weight approach — no extra package, no `init` step, just a config block and a single CLI call.
|
|
118
118
|
|
|
@@ -134,12 +134,6 @@ pnpm dlx npmdata init --files "docs/**" --packages shared-configs@^1.0.0
|
|
|
134
134
|
# share multiple additional packages at once
|
|
135
135
|
pnpm dlx npmdata init --files "docs/**" --packages "shared-configs@^1.0.0,base-templates@2.x"
|
|
136
136
|
|
|
137
|
-
# skip .gitignore entries for managed files (gitignore is enabled by default)
|
|
138
|
-
pnpm dlx npmdata init --files "docs/**,data/**" --no-gitignore
|
|
139
|
-
|
|
140
|
-
# mark extracted files as unmanaged so consumers can edit them freely;
|
|
141
|
-
# files won't be tracked, made read-only, or added to .gitignore
|
|
142
|
-
pnpm dlx npmdata init --files "templates/**" --unmanaged
|
|
143
137
|
```
|
|
144
138
|
|
|
145
139
|
`init` updates `package.json` with the right `files`, `bin`, and `dependencies` fields so those folders are included when the package is published, and writes a thin `bin/npmdata.js` entry point. Then publish normally:
|
|
@@ -171,11 +165,11 @@ npx npmdata extract --packages my-shared-assets --content-regex "env: production
|
|
|
171
165
|
npx npmdata extract --packages my-shared-assets --output ./data --force
|
|
172
166
|
|
|
173
167
|
# skip .gitignore entries for managed files (gitignore is enabled by default)
|
|
174
|
-
npx npmdata extract --packages my-shared-assets --output ./data --
|
|
168
|
+
npx npmdata extract --packages my-shared-assets --output ./data --gitignore=false
|
|
175
169
|
|
|
176
170
|
# write files without a .npmdata marker or .gitignore entry; files won't be read-only
|
|
177
171
|
# and won't be tracked by npmdata; existing files are left unchanged
|
|
178
|
-
npx npmdata extract --packages my-shared-assets --output ./data --
|
|
172
|
+
npx npmdata extract --packages my-shared-assets --output ./data --managed=false
|
|
179
173
|
|
|
180
174
|
# preview what would change without writing any files
|
|
181
175
|
npx npmdata extract --packages my-shared-assets --output ./data --dry-run
|
|
@@ -232,20 +226,20 @@ When calling the bin script bundled in a data package, the following options are
|
|
|
232
226
|
|---|---|
|
|
233
227
|
| `--output, -o <dir>` | Base directory for resolving all `output.path` values (default: cwd). |
|
|
234
228
|
| `--presets <preset1,preset2>` | Limit to entries whose `presets` overlap with the given list (comma-separated). |
|
|
235
|
-
| `--
|
|
236
|
-
| `--
|
|
229
|
+
| `--gitignore [bool]` | Disable `.gitignore` management for every entry when set to `false`, overriding each entry's `gitignore` field. |
|
|
230
|
+
| `--managed [bool]` | Run every entry in unmanaged mode when set to `false`, overriding each entry's `unmanaged` field. Files are written without a `.npmdata` marker, without `.gitignore` updates, and without being made read-only. |
|
|
237
231
|
| `--dry-run` | Simulate changes without writing or deleting any files. |
|
|
238
232
|
| `--verbose, -v` | Print detailed progress information for each step. |
|
|
239
233
|
|
|
240
234
|
```sh
|
|
241
235
|
# disable gitignore management across all entries
|
|
242
|
-
npx my-shared-assets --
|
|
236
|
+
npx my-shared-assets --gitignore=false
|
|
243
237
|
|
|
244
238
|
# write all files as unmanaged (editable, not tracked)
|
|
245
|
-
npx my-shared-assets --
|
|
239
|
+
npx my-shared-assets --managed=false
|
|
246
240
|
|
|
247
241
|
# combine overrides
|
|
248
|
-
npx my-shared-assets --
|
|
242
|
+
npx my-shared-assets --gitignore=false --managed=false --dry-run
|
|
249
243
|
```
|
|
250
244
|
|
|
251
245
|
### npmdata entry options reference
|
|
@@ -264,7 +258,7 @@ Each entry in the `npmdata.sets` array in `package.json` supports the following
|
|
|
264
258
|
| `output.gitignore` | `boolean` | `true` | Create/update a `.gitignore` file alongside each `.npmdata` marker file. Set to `false` to disable. |
|
|
265
259
|
| `output.unmanaged` | `boolean` | `false` | Write files without a `.npmdata` marker, `.gitignore` update, or read-only flag. Existing files are skipped. |
|
|
266
260
|
| `output.dryRun` | `boolean` | `false` | Simulate extraction without writing anything to disk. |
|
|
267
|
-
| `upgrade` | `boolean` | `false` | Force a fresh install of the package even when a satisfying version is already installed. |
|
|
261
|
+
| `selector.upgrade` | `boolean` | `false` | Force a fresh install of the package even when a satisfying version is already installed. |
|
|
268
262
|
| `silent` | `boolean` | `false` | Suppress per-file output, printing only the final result line. |
|
|
269
263
|
| `presets` | `string[]` | none | Presets used to group and selectively run entries with `--presets`. |
|
|
270
264
|
| `output.symlinks` | `SymlinkConfig[]` | none | Post-extract symlink operations (see below). |
|
|
@@ -297,7 +291,8 @@ Example with multiple options:
|
|
|
297
291
|
{
|
|
298
292
|
"package": "my-shared-assets@^2.0.0",
|
|
299
293
|
"selector": {
|
|
300
|
-
"files": ["docs/**", "configs/*.json"]
|
|
294
|
+
"files": ["docs/**", "configs/*.json"],
|
|
295
|
+
"upgrade": true
|
|
301
296
|
},
|
|
302
297
|
"output": {
|
|
303
298
|
"path": "./data",
|
|
@@ -309,7 +304,6 @@ Example with multiple options:
|
|
|
309
304
|
{ "files": "docs/**\/*.md", "match": "<!-- version: .* -->", "replace": "<!-- version: 2.0.0 -->" }
|
|
310
305
|
]
|
|
311
306
|
},
|
|
312
|
-
"upgrade": true,
|
|
313
307
|
"presets": ["prod"]
|
|
314
308
|
}
|
|
315
309
|
]
|
|
@@ -318,9 +312,11 @@ Example with multiple options:
|
|
|
318
312
|
|
|
319
313
|
### 3. Check files are in sync
|
|
320
314
|
|
|
315
|
+
Verifies that every file in the output directory matches what is currently in the published package. When the target package itself declares `npmdata.sets`, check recurses into those transitive dependencies — reporting drift at every level of the hierarchy without downloading anything new beyond what is already installed. Use `selector.presets` on an entry to restrict which of the target's sets are checked.
|
|
316
|
+
|
|
321
317
|
```sh
|
|
322
318
|
npx npmdata check --packages my-shared-assets --output ./data
|
|
323
|
-
# exit 0 = in sync, exit
|
|
319
|
+
# exit 0 = in sync, exit 1 = drift or error
|
|
324
320
|
|
|
325
321
|
# check multiple packages
|
|
326
322
|
npx npmdata check --packages "my-shared-assets,another-pkg" --output ./data
|
|
@@ -355,7 +351,7 @@ another-pkg@1.0.0
|
|
|
355
351
|
|
|
356
352
|
### 5. Purge managed files
|
|
357
353
|
|
|
358
|
-
Remove all files previously extracted by one or more packages without touching any other files in the output directory. No network access or package installation is required — only the local `.npmdata` marker state is used.
|
|
354
|
+
Remove all files previously extracted by one or more packages without touching any other files in the output directory. No network access or package installation is required — only the local `.npmdata` marker state is used. When the target package itself declares `npmdata.sets`, purge recurses into those transitive dependencies and removes their managed files too, mirroring what extract originally created.
|
|
359
355
|
|
|
360
356
|
```sh
|
|
361
357
|
# remove all files managed by a package
|
|
@@ -370,6 +366,65 @@ npx npmdata purge --packages my-shared-assets --output ./data --dry-run
|
|
|
370
366
|
|
|
371
367
|
After a purge, the corresponding entries are removed from the `.npmdata` marker file and any empty directories are cleaned up. `.gitignore` sections written by `extract` are also removed.
|
|
372
368
|
|
|
369
|
+
## Hierarchical package resolution
|
|
370
|
+
|
|
371
|
+
`extract`, `check`, and `purge` are all hierarchy-aware: when a target package carries its own `npmdata.sets` block in its `package.json`, the command automatically recurses into those transitive dependencies.
|
|
372
|
+
|
|
373
|
+
This lets you build layered data package chains:
|
|
374
|
+
|
|
375
|
+
```
|
|
376
|
+
consumer project
|
|
377
|
+
└─ my-org-configs (npm package with npmdata.sets)
|
|
378
|
+
├─ base-datasets (another npm package with its own files)
|
|
379
|
+
└─ org-templates (another npm package with its own files)
|
|
380
|
+
└─ raw-assets (leaf package)
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
Running `npx npmdata extract --packages my-org-configs --output ./data` will extract files from every package in the chain, not just `my-org-configs` itself.
|
|
384
|
+
|
|
385
|
+
### Output path resolution
|
|
386
|
+
|
|
387
|
+
Each level's `output.path` is resolved relative to the caller's own `output.path`. A package at depth 1 with `output.path: "./configs"` and a transitive dependency with `output.path: "./shared"` will land at `./configs/shared`.
|
|
388
|
+
|
|
389
|
+
### Caller overrides (extract only)
|
|
390
|
+
|
|
391
|
+
When `extract` recurses, the caller's `output` flags are inherited by every transitive dependency, with caller-defined values always winning:
|
|
392
|
+
|
|
393
|
+
| Caller sets | Effect on transitive entries |
|
|
394
|
+
|---|---|
|
|
395
|
+
| `force: true` | Transitive entries also overwrite unmanaged / foreign files |
|
|
396
|
+
| `dryRun: true` | No files are written anywhere in the hierarchy |
|
|
397
|
+
| `keepExisting: true` | Existing files are skipped at every level |
|
|
398
|
+
| `gitignore: false` | No `.gitignore` entries are created anywhere |
|
|
399
|
+
| `unmanaged: true` | All transitive files are written without a marker or read-only flag |
|
|
400
|
+
| `symlinks` / `contentReplacements` | Appended to each transitive entry's own lists |
|
|
401
|
+
|
|
402
|
+
Settings that are undefined on the caller are left as-is so the transitive package's own defaults apply.
|
|
403
|
+
|
|
404
|
+
### Filtering transitive sets with `selector.presets`
|
|
405
|
+
|
|
406
|
+
Set `selector.presets` on an entry to control which sets inside the target package are recursed into. Only sets whose `presets` tag overlaps with the filter are processed; sets with no `presets` are skipped when a filter is active.
|
|
407
|
+
|
|
408
|
+
```json
|
|
409
|
+
{
|
|
410
|
+
"npmdata": {
|
|
411
|
+
"sets": [
|
|
412
|
+
{
|
|
413
|
+
"package": "my-org-configs@^2.0.0",
|
|
414
|
+
"output": { "path": "./data" },
|
|
415
|
+
"selector": { "presets": ["prod"] }
|
|
416
|
+
}
|
|
417
|
+
]
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
The same filtering is applied during `check` and `purge` so they stay in sync with what `extract` originally wrote.
|
|
423
|
+
|
|
424
|
+
### Circular dependency detection
|
|
425
|
+
|
|
426
|
+
If a package chain references itself (directly or transitively), the command stops immediately with an error rather than looping forever. Sibling packages — entries already being processed at the same level — are also skipped to prevent double-processing.
|
|
427
|
+
|
|
373
428
|
## CLI reference
|
|
374
429
|
|
|
375
430
|
```
|
|
@@ -388,18 +443,13 @@ Global options:
|
|
|
388
443
|
--version Show version
|
|
389
444
|
|
|
390
445
|
Init options:
|
|
391
|
-
--files <patterns> Comma-separated glob patterns of files to publish
|
|
446
|
+
--files <patterns> Comma-separated glob patterns of files to publish
|
|
392
447
|
e.g. "docs/**,data/**,configs/*.json"
|
|
393
448
|
--packages <specs> Comma-separated additional package specs to bundle as data sources.
|
|
394
449
|
Each spec is "name" or "name@version", e.g.
|
|
395
450
|
"shared-configs@^1.0.0,base-templates@2.x".
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
--no-gitignore Skip adding .gitignore entries for managed files
|
|
399
|
-
(gitignore is enabled by default)
|
|
400
|
-
--unmanaged Mark all generated npmdata entries as unmanaged: extracted files
|
|
401
|
-
are written without a .npmdata marker, without updating .gitignore,
|
|
402
|
-
and without being made read-only. Existing files are skipped.
|
|
451
|
+
Added to `dependencies` so consumers pull data from all of them.
|
|
452
|
+
--output, -o <dir> Directory to scaffold into (default: current directory)
|
|
403
453
|
|
|
404
454
|
Extract options:
|
|
405
455
|
--packages <specs> Comma-separated package specs.
|
|
@@ -412,10 +462,10 @@ Extract options:
|
|
|
412
462
|
--force Overwrite existing unmanaged files or files owned by a different package
|
|
413
463
|
--keep-existing Skip files that already exist; create them when absent. Cannot be
|
|
414
464
|
combined with --force
|
|
415
|
-
--
|
|
416
|
-
--
|
|
417
|
-
flag. Existing files are skipped. Files can be
|
|
418
|
-
and are not tracked by npmdata.
|
|
465
|
+
--gitignore [bool] Disable .gitignore management when set to false (enabled by default)
|
|
466
|
+
--managed [bool] Set to false to write files without a .npmdata marker, .gitignore
|
|
467
|
+
update, or read-only flag. Existing files are skipped. Files can be
|
|
468
|
+
freely edited afterwards and are not tracked by npmdata.
|
|
419
469
|
--files <patterns> Comma-separated glob patterns to filter files
|
|
420
470
|
--content-regex <regex> Regex to filter files by content
|
|
421
471
|
--dry-run Preview changes without writing any files
|
|
@@ -444,110 +494,48 @@ List options:
|
|
|
444
494
|
`npmdata` also exports a programmatic API:
|
|
445
495
|
|
|
446
496
|
```typescript
|
|
447
|
-
import {
|
|
448
|
-
import type {
|
|
449
|
-
|
|
450
|
-
// extract files from one package
|
|
451
|
-
const result = await extract({
|
|
452
|
-
packages: ['my-shared-assets@^2.0.0'],
|
|
453
|
-
outputDir: './data',
|
|
454
|
-
gitignore: true,
|
|
455
|
-
});
|
|
456
|
-
console.log(result.added, result.modified, result.deleted);
|
|
497
|
+
import { actionExtract, actionCheck, actionList, actionPurge } from 'npmdata';
|
|
498
|
+
import type { NpmdataExtractEntry, ProgressEvent } from 'npmdata';
|
|
457
499
|
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
dryRun: true,
|
|
463
|
-
});
|
|
464
|
-
console.log('Would add', preview.added, 'files');
|
|
500
|
+
const entries: NpmdataExtractEntry[] = [
|
|
501
|
+
{ package: 'my-shared-assets@^2.0.0', output: { path: './data' } },
|
|
502
|
+
];
|
|
503
|
+
const cwd = process.cwd();
|
|
465
504
|
|
|
466
|
-
//
|
|
467
|
-
await
|
|
468
|
-
|
|
469
|
-
outputDir: './data',
|
|
470
|
-
upgrade: true,
|
|
471
|
-
});
|
|
505
|
+
// extract files
|
|
506
|
+
const result = await actionExtract({ entries, cwd });
|
|
507
|
+
console.log(result.added, result.modified, result.deleted);
|
|
472
508
|
|
|
473
|
-
//
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
packages: ['shared-templates'],
|
|
477
|
-
outputDir: './templates',
|
|
478
|
-
unmanaged: true,
|
|
479
|
-
});
|
|
509
|
+
// dry-run: preview changes without writing files
|
|
510
|
+
const dryResult = await actionExtract({ entries: entries.map(e => ({ ...e, output: { ...e.output, dryRun: true } })), cwd });
|
|
511
|
+
console.log('Would add', dryResult.added, 'files');
|
|
480
512
|
|
|
481
513
|
// track progress file-by-file
|
|
482
|
-
await
|
|
483
|
-
|
|
484
|
-
|
|
514
|
+
await actionExtract({
|
|
515
|
+
entries,
|
|
516
|
+
cwd,
|
|
485
517
|
onProgress: (event: ProgressEvent) => {
|
|
486
|
-
if (event.type === 'file-added')
|
|
518
|
+
if (event.type === 'file-added') console.log('A', event.file);
|
|
487
519
|
if (event.type === 'file-modified') console.log('M', event.file);
|
|
488
|
-
if (event.type === 'file-deleted')
|
|
520
|
+
if (event.type === 'file-deleted') console.log('D', event.file);
|
|
489
521
|
},
|
|
490
522
|
});
|
|
491
523
|
|
|
492
|
-
//
|
|
493
|
-
const
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
const status = await check({
|
|
500
|
-
packages: ['my-shared-assets'],
|
|
501
|
-
outputDir: './data',
|
|
502
|
-
});
|
|
503
|
-
if (!status.ok) {
|
|
504
|
-
console.log('Missing:', status.differences.missing);
|
|
505
|
-
console.log('Modified:', status.differences.modified);
|
|
506
|
-
console.log('Extra:', status.differences.extra);
|
|
507
|
-
for (const pkg of status.sourcePackages) {
|
|
508
|
-
if (!pkg.ok) {
|
|
509
|
-
console.log(pkg.name, 'missing:', pkg.differences.missing);
|
|
510
|
-
console.log(pkg.name, 'modified:', pkg.differences.modified);
|
|
511
|
-
console.log(pkg.name, 'extra:', pkg.differences.extra);
|
|
512
|
-
}
|
|
513
|
-
}
|
|
524
|
+
// check sync status
|
|
525
|
+
const summary = await actionCheck({ entries, cwd });
|
|
526
|
+
const hasDrift = summary.missing.length > 0 || summary.modified.length > 0 || summary.extra.length > 0;
|
|
527
|
+
if (hasDrift) {
|
|
528
|
+
console.log('Missing:', summary.missing);
|
|
529
|
+
console.log('Modified:', summary.modified);
|
|
530
|
+
console.log('Extra:', summary.extra);
|
|
514
531
|
}
|
|
515
532
|
|
|
516
|
-
// remove all files
|
|
517
|
-
await
|
|
518
|
-
packages: ['my-shared-assets'],
|
|
519
|
-
outputDir: './data',
|
|
520
|
-
});
|
|
521
|
-
|
|
522
|
-
// dry-run: preview what would be deleted without removing anything
|
|
523
|
-
const purgePreview = await purge({
|
|
524
|
-
packages: ['my-shared-assets'],
|
|
525
|
-
outputDir: './data',
|
|
526
|
-
dryRun: true,
|
|
527
|
-
});
|
|
528
|
-
console.log('Would delete', purgePreview.deleted, 'files');
|
|
529
|
-
|
|
530
|
-
// track progress during purge
|
|
531
|
-
await purge({
|
|
532
|
-
packages: ['my-shared-assets'],
|
|
533
|
-
outputDir: './data',
|
|
534
|
-
onProgress: (event: ProgressEvent) => {
|
|
535
|
-
if (event.type === 'file-deleted') console.log('D', event.file);
|
|
536
|
-
},
|
|
537
|
-
});
|
|
533
|
+
// remove all managed files (no network required)
|
|
534
|
+
await actionPurge({ entries, config: null, cwd });
|
|
538
535
|
|
|
539
536
|
// list all files managed by npmdata in an output directory
|
|
540
|
-
const managed =
|
|
541
|
-
//
|
|
542
|
-
|
|
543
|
-
// initialize a publisher package
|
|
544
|
-
await initPublisher(['docs', 'data'], { workingDir: './my-package' });
|
|
545
|
-
|
|
546
|
-
// utility: parse a package spec string
|
|
547
|
-
const { name, version } = parsePackageSpec('my-pkg@^1.0.0');
|
|
548
|
-
|
|
549
|
-
// utility: detect whether a file is binary
|
|
550
|
-
const binary = isBinaryFile('/path/to/file.bin');
|
|
537
|
+
const managed = await actionList({ entries, config: null, cwd });
|
|
538
|
+
// ManagedFileMetadata[]: Array<{ path: string; packageName: string; packageVersion: string }>
|
|
551
539
|
```
|
|
552
540
|
|
|
553
541
|
### `ProgressEvent` type
|
|
@@ -580,39 +568,24 @@ Multiple packages can coexist in the same output directory; each owns its own fi
|
|
|
580
568
|
|
|
581
569
|
### Module overview
|
|
582
570
|
|
|
583
|
-
|
|
|
571
|
+
| Folder / file | Purpose |
|
|
584
572
|
|---|---|
|
|
585
|
-
| `
|
|
586
|
-
| `
|
|
587
|
-
| `
|
|
588
|
-
| `
|
|
589
|
-
| `utils.ts` |
|
|
590
|
-
| `
|
|
591
|
-
|
|
592
|
-
### Publish side (`publisher.ts`)
|
|
593
|
-
|
|
594
|
-
`initPublisher()` modifies the target `package.json` to include `files`, `bin`, and `dependencies` fields, then writes a thin `bin/npmdata.js` that calls `runner.run(__dirname)`. The generated script is kept minimal on purpose — all logic lives in this library.
|
|
595
|
-
|
|
596
|
-
### Consumer side (`consumer.ts`)
|
|
597
|
-
|
|
598
|
-
`extract()` flow:
|
|
599
|
-
1. Detects the package manager (`pnpm` / `yarn` / `npm`) via lock-file presence.
|
|
600
|
-
2. For each entry in `config.packages`, parses the spec (`name` or `name@version`) and runs `<pm> add <package>@<version>` to resolve the package.
|
|
601
|
-
3. Iterates matching files (glob + optional content regex) from each installed package.
|
|
602
|
-
4. Copies files into `outputDir`, tracking state in a `.npmdata` pipe-delimited marker file per output directory.
|
|
603
|
-
5. Optionally writes a `.gitignore` section around the managed files.
|
|
604
|
-
|
|
605
|
-
`check()` performs the same resolution for each package in `config.packages` but compares SHA-256 hashes without writing any files.
|
|
573
|
+
| `src/cli/` | CLI entry-points: argument parsing, help text, config loading, per-command handlers |
|
|
574
|
+
| `src/package/` | Package-level orchestration: config resolution, fileset iteration, purge and init coordination |
|
|
575
|
+
| `src/fileset/` | File-level extraction, diff, check, and sync logic |
|
|
576
|
+
| `src/types.ts` | Shared TypeScript types |
|
|
577
|
+
| `src/utils.ts` | Low-level utilities: package install, glob/hash helpers, package manager detection |
|
|
578
|
+
| `src/index.ts` | Public API surface |
|
|
606
579
|
|
|
607
580
|
### Marker file (`.npmdata`)
|
|
608
581
|
|
|
609
|
-
Each output directory that contains managed files gets a `.npmdata`
|
|
582
|
+
Each output directory that contains managed files gets a `.npmdata` CSV file. Columns: `path`, `packageName`, `packageVersion` — one row per file, no header. This is the source of truth for ownership tracking and clean removal.
|
|
610
583
|
|
|
611
584
|
### Key design decisions
|
|
612
585
|
|
|
613
|
-
- No runtime dependencies beyond `semver` and `minimatch` to keep the consumer install footprint small.
|
|
614
586
|
- File identity is tracked by path + hash, not by timestamp, to be deterministic across machines.
|
|
615
|
-
-
|
|
587
|
+
- Extract uses a two-phase diff + execute model: compute all changes first, then apply them, enabling conflict detection and rollback before any file is written.
|
|
588
|
+
- The bin shim generated by `npmdata init` contains no logic; all behaviour is versioned inside this library.
|
|
616
589
|
|
|
617
590
|
### Dev workflow
|
|
618
591
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/cli/actions/check.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAK5C;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,aAAa,GAAG,IAAI,EAC5B,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/cli/actions/check.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAK5C;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,aAAa,GAAG,IAAI,EAC5B,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAsCf"}
|
|
@@ -23,11 +23,10 @@ async function runCheck(config, argv, cwd) {
|
|
|
23
23
|
}
|
|
24
24
|
const summary = await (0, action_check_1.actionCheck)({
|
|
25
25
|
entries,
|
|
26
|
-
config,
|
|
27
26
|
cwd,
|
|
28
27
|
presets: parsed.presets ?? [],
|
|
29
28
|
verbose: parsed.verbose,
|
|
30
|
-
skipUnmanaged: parsed.
|
|
29
|
+
skipUnmanaged: parsed.managed === false,
|
|
31
30
|
});
|
|
32
31
|
const hasDrift = summary.missing.length > 0 || summary.modified.length > 0 || summary.extra.length > 0;
|
|
33
32
|
if (hasDrift) {
|
|
@@ -37,10 +36,10 @@ async function runCheck(config, argv, cwd) {
|
|
|
37
36
|
console.log(`modified: ${f}`);
|
|
38
37
|
for (const f of summary.extra)
|
|
39
38
|
console.log(`extra: ${f}`);
|
|
40
|
-
|
|
39
|
+
throw new Error('Check failed: some managed files are out of sync');
|
|
41
40
|
}
|
|
42
41
|
else {
|
|
43
|
-
console.log('All managed files are in sync
|
|
42
|
+
console.log('All managed files are in sync');
|
|
44
43
|
}
|
|
45
44
|
}
|
|
46
45
|
//# sourceMappingURL=check.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/cli/actions/check.ts"],"names":[],"mappings":";;AASA,
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/cli/actions/check.ts"],"names":[],"mappings":";;AASA,4BA0CC;AAjDD,kCAA8E;AAC9E,oCAAsC;AACtC,6DAAyD;AAEzD;;GAEG;AACI,KAAK,UAAU,QAAQ,CAC5B,MAA4B,EAC5B,IAAc,EACd,GAAW;IAEX,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,IAAA,kBAAU,EAAC,OAAO,CAAC,CAAC;QACpB,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,gBAAS,EAAC,IAAI,CAAC,CAAC;IAE/B,kDAAkD;IAClD,IAAI,OAAO,GAAG,IAAA,2BAAoB,EAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CACb,gFAAgF,CACjF,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,IAAA,yBAAkB,EAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,IAAA,0BAAW,EAAC;QAChC,OAAO;QACP,GAAG;QACH,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;QAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,aAAa,EAAE,MAAM,CAAC,OAAO,KAAK,KAAK;KACxC,CAAC,CAAC;IAEH,MAAM,QAAQ,GACZ,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAExF,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC9D,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ;YAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAChE,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../../src/cli/actions/extract.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAiB,MAAM,aAAa,CAAC;AAM3D;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,aAAa,GAAG,IAAI,EAC5B,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../../src/cli/actions/extract.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAiB,MAAM,aAAa,CAAC;AAM3D;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,aAAa,GAAG,IAAI,EAC5B,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CA4Df"}
|
|
@@ -16,13 +16,13 @@ async function runExtract(config, argv, cwd) {
|
|
|
16
16
|
return;
|
|
17
17
|
}
|
|
18
18
|
const parsed = (0, argv_1.parseArgv)(argv);
|
|
19
|
-
//
|
|
19
|
+
// Entries built from argv (when --packages is present)
|
|
20
20
|
let entries = (0, argv_1.buildEntriesFromArgv)(parsed);
|
|
21
21
|
if (!entries) {
|
|
22
22
|
if (!config || config.sets.length === 0) {
|
|
23
23
|
throw new Error('No packages specified during extract. Use --packages or a config file with sets.');
|
|
24
24
|
}
|
|
25
|
-
//
|
|
25
|
+
// Entries built from config file. Then CLI flags overrides some config values (e.g. --dry-run, --verbose)
|
|
26
26
|
entries = (0, argv_1.applyArgvOverrides)(config.sets, parsed);
|
|
27
27
|
}
|
|
28
28
|
// Apply preset filter
|
|
@@ -34,7 +34,6 @@ async function runExtract(config, argv, cwd) {
|
|
|
34
34
|
}
|
|
35
35
|
const result = await (0, action_extract_1.actionExtract)({
|
|
36
36
|
entries: filtered,
|
|
37
|
-
config,
|
|
38
37
|
cwd,
|
|
39
38
|
verbose: parsed.verbose,
|
|
40
39
|
onProgress: (event) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../../src/cli/actions/extract.ts"],"names":[],"mappings":";AAAA,+BAA+B;;AAY/B,
|
|
1
|
+
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../../src/cli/actions/extract.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/actions/init.js
CHANGED
|
@@ -24,7 +24,7 @@ async function runInit(config, argv, cwd) {
|
|
|
24
24
|
files,
|
|
25
25
|
packages: packages?.map((p) => (p.version ? `${p.name}@${p.version}` : p.name)),
|
|
26
26
|
};
|
|
27
|
-
await (0, action_init_1.actionInit)(outputDir, verbose, initConfig);
|
|
27
|
+
await (0, action_init_1.actionInit)(outputDir, verbose ?? false, initConfig);
|
|
28
28
|
console.log('Init complete. Scaffolded package.json and bin/npmdata.js.');
|
|
29
29
|
}
|
|
30
30
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/actions/init.ts"],"names":[],"mappings":";;;;;AAWA,0BAqBC;AAhCD,+BAA+B;AAC/B,0DAA6B;AAG7B,kCAAoC;AACpC,oCAAsC;AACtC,2DAAuD;AAEvD;;GAEG;AACI,KAAK,UAAU,OAAO,CAC3B,MAA4B,EAC5B,IAAc,EACd,GAAW;IAEX,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,IAAA,kBAAU,EAAC,MAAM,CAAC,CAAC;QACnB,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,gBAAS,EAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACzE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAE5C,MAAM,UAAU,GAAG;QACjB,KAAK;QACL,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;KAChF,CAAC;IAEF,MAAM,IAAA,wBAAU,EAAC,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/actions/init.ts"],"names":[],"mappings":";;;;;AAWA,0BAqBC;AAhCD,+BAA+B;AAC/B,0DAA6B;AAG7B,kCAAoC;AACpC,oCAAsC;AACtC,2DAAuD;AAEvD;;GAEG;AACI,KAAK,UAAU,OAAO,CAC3B,MAA4B,EAC5B,IAAc,EACd,GAAW;IAEX,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,IAAA,kBAAU,EAAC,MAAM,CAAC,CAAC;QACnB,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,gBAAS,EAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACzE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAE5C,MAAM,UAAU,GAAG;QACjB,KAAK;QACL,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;KAChF,CAAC;IAEF,MAAM,IAAA,wBAAU,EAAC,SAAS,EAAE,OAAO,IAAI,KAAK,EAAE,UAAU,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;AAC5E,CAAC"}
|
package/dist/cli/argv.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { PackageConfig, NpmdataExtractEntry } from '../types';
|
|
2
2
|
/**
|
|
3
3
|
* Parsed CLI flags for all commands.
|
|
4
|
+
* All flags are undefined when not supplied on the command line;
|
|
5
|
+
* defaults are applied downstream in the library.
|
|
4
6
|
*/
|
|
5
7
|
export type ParsedArgv = {
|
|
6
8
|
packages?: PackageConfig[];
|
|
@@ -9,14 +11,16 @@ export type ParsedArgv = {
|
|
|
9
11
|
contentRegexes?: string[];
|
|
10
12
|
presets?: string[];
|
|
11
13
|
configFile?: string;
|
|
12
|
-
force
|
|
13
|
-
keepExisting
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
force?: boolean;
|
|
15
|
+
keepExisting?: boolean;
|
|
16
|
+
/** --gitignore / --gitignore=true|false */
|
|
17
|
+
gitignore?: boolean;
|
|
18
|
+
/** --managed / --managed=true|false (false ≡ unmanaged mode) */
|
|
19
|
+
managed?: boolean;
|
|
20
|
+
dryRun?: boolean;
|
|
21
|
+
upgrade?: boolean;
|
|
22
|
+
silent?: boolean;
|
|
23
|
+
verbose?: boolean;
|
|
20
24
|
};
|
|
21
25
|
/**
|
|
22
26
|
* Parse all supported CLI flags from an argv array.
|
package/dist/cli/argv.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"argv.d.ts","sourceRoot":"","sources":["../../src/cli/argv.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"argv.d.ts","sourceRoot":"","sources":["../../src/cli/argv.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAgC,MAAM,UAAU,CAAC;AAG5F;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iEAAiE;IACjE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAyDpD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,mBAAmB,EAAE,GAAG,IAAI,CAiCrF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,mBAAmB,EAAE,EAC9B,MAAM,EAAE,UAAU,GACjB,mBAAmB,EAAE,CA4BvB"}
|