npm-packlist 6.0.1 → 7.0.0-pre.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 +15 -12
- package/lib/index.js +33 -47
- package/package.json +5 -5
- package/bin/index.js +0 -39
package/README.md
CHANGED
|
@@ -6,20 +6,24 @@ These can be handed to [tar](http://npm.im/tar) like so to make an npm
|
|
|
6
6
|
package tarball:
|
|
7
7
|
|
|
8
8
|
```js
|
|
9
|
+
const Arborist = require('@npmcli/arborist')
|
|
9
10
|
const packlist = require('npm-packlist')
|
|
10
11
|
const tar = require('tar')
|
|
11
12
|
const packageDir = '/path/to/package'
|
|
12
13
|
const packageTarball = '/path/to/package.tgz'
|
|
13
14
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
15
|
+
const arborist = new Arborist({ path: packageDir })
|
|
16
|
+
arborist.loadActual().then((tree) => {
|
|
17
|
+
packlist(tree)
|
|
18
|
+
.then(files => tar.create({
|
|
19
|
+
prefix: 'package/',
|
|
20
|
+
cwd: packageDir,
|
|
21
|
+
file: packageTarball,
|
|
22
|
+
gzip: true
|
|
23
|
+
}, files))
|
|
24
|
+
.then(_ => {
|
|
25
|
+
// tarball has been created, continue with your day
|
|
26
|
+
})
|
|
23
27
|
})
|
|
24
28
|
```
|
|
25
29
|
|
|
@@ -97,7 +101,6 @@ Any specific file matched by an exact filename in the package.json `files` list
|
|
|
97
101
|
|
|
98
102
|
## API
|
|
99
103
|
|
|
100
|
-
Same API as [ignore-walk](http://npm.im/ignore-walk),
|
|
101
|
-
file list and rule sets.
|
|
104
|
+
Same API as [ignore-walk](http://npm.im/ignore-walk), except providing a `tree` is required and there are hard-coded file list and rule sets.
|
|
102
105
|
|
|
103
|
-
The `Walker` class
|
|
106
|
+
The `Walker` class requires an [arborist](https://github.com/npm/cli/tree/latest/workspaces/arborist) tree, and if any bundled dependencies are found will include them as well as their own dependencies in the resulting file set.
|
package/lib/index.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const Arborist = require('@npmcli/arborist')
|
|
4
3
|
const { Walker: IgnoreWalker } = require('ignore-walk')
|
|
5
4
|
const { lstatSync: lstat, readFileSync: readFile } = require('fs')
|
|
6
5
|
const { basename, dirname, extname, join, relative, resolve, sep } = require('path')
|
|
@@ -81,30 +80,26 @@ const readOutOfTreeIgnoreFiles = (root, rel, result = []) => {
|
|
|
81
80
|
}
|
|
82
81
|
|
|
83
82
|
class PackWalker extends IgnoreWalker {
|
|
84
|
-
constructor (opts) {
|
|
83
|
+
constructor (tree, opts) {
|
|
85
84
|
const options = {
|
|
86
85
|
...opts,
|
|
87
86
|
includeEmpty: false,
|
|
88
87
|
follow: false,
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
options.path = resolve(options.path || process.cwd()).replace(/\\/g, '/')
|
|
93
|
-
|
|
94
|
-
if (!options.ignoreFiles) {
|
|
95
|
-
options.ignoreFiles = [
|
|
88
|
+
// we path.resolve() here because ignore-walk doesn't do it and we want full paths
|
|
89
|
+
path: resolve(opts?.path || tree.path).replace(/\\/g, '/'),
|
|
90
|
+
ignoreFiles: opts?.ignoreFiles || [
|
|
96
91
|
defaultRules,
|
|
97
92
|
'package.json',
|
|
98
93
|
'.npmignore',
|
|
99
94
|
'.gitignore',
|
|
100
95
|
strictRules,
|
|
101
|
-
]
|
|
96
|
+
],
|
|
102
97
|
}
|
|
103
98
|
|
|
104
99
|
super(options)
|
|
105
100
|
this.isPackage = options.isPackage
|
|
106
101
|
this.seen = options.seen || new Set()
|
|
107
|
-
this.tree =
|
|
102
|
+
this.tree = tree
|
|
108
103
|
this.requiredFiles = options.requiredFiles || []
|
|
109
104
|
|
|
110
105
|
const additionalDefaults = []
|
|
@@ -202,37 +197,16 @@ class PackWalker extends IgnoreWalker {
|
|
|
202
197
|
return super.stat(opts, callback)
|
|
203
198
|
}
|
|
204
199
|
|
|
205
|
-
// overridden method: we need to load the arborist tree before we actually start running
|
|
206
|
-
start () {
|
|
207
|
-
if (this.isPackage && !this.tree) {
|
|
208
|
-
const arborist = new Arborist({ path: this.path })
|
|
209
|
-
// loading the tree is async while the start function depends on being sync
|
|
210
|
-
// eslint-disable-next-line promise/catch-or-return, promise/always-return
|
|
211
|
-
arborist.loadActual().then((tree) => {
|
|
212
|
-
this.tree = tree
|
|
213
|
-
super.start()
|
|
214
|
-
})
|
|
215
|
-
return this
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
return super.start()
|
|
219
|
-
}
|
|
220
|
-
|
|
221
200
|
// overridden method: this is called to create options for a child walker when we step
|
|
222
201
|
// in to a normal child directory (this will never be a bundle). the default method here
|
|
223
202
|
// copies the root's `ignoreFiles` value, but we don't want to respect package.json for
|
|
224
203
|
// subdirectories, so we override it with a list that intentionally omits package.json
|
|
225
204
|
walkerOpt (entry, opts) {
|
|
226
|
-
let ignoreFiles =
|
|
227
|
-
defaultRules,
|
|
228
|
-
'.npmignore',
|
|
229
|
-
'.gitignore',
|
|
230
|
-
strictRules,
|
|
231
|
-
]
|
|
205
|
+
let ignoreFiles = null
|
|
232
206
|
|
|
233
207
|
// however, if we have a tree, and we have workspaces, and the directory we're about
|
|
234
208
|
// to step into is a workspace, then we _do_ want to respect its package.json
|
|
235
|
-
if (this.tree
|
|
209
|
+
if (this.tree.workspaces) {
|
|
236
210
|
const workspaceDirs = [...this.tree.workspaces.values()]
|
|
237
211
|
.map((dir) => dir.replace(/\\/g, '/'))
|
|
238
212
|
|
|
@@ -246,6 +220,13 @@ class PackWalker extends IgnoreWalker {
|
|
|
246
220
|
strictRules,
|
|
247
221
|
]
|
|
248
222
|
}
|
|
223
|
+
} else {
|
|
224
|
+
ignoreFiles = [
|
|
225
|
+
defaultRules,
|
|
226
|
+
'.npmignore',
|
|
227
|
+
'.gitignore',
|
|
228
|
+
strictRules,
|
|
229
|
+
]
|
|
249
230
|
}
|
|
250
231
|
|
|
251
232
|
return {
|
|
@@ -265,7 +246,7 @@ class PackWalker extends IgnoreWalker {
|
|
|
265
246
|
|
|
266
247
|
// overridden method: we want child walkers to be instances of this class, not ignore-walk
|
|
267
248
|
walker (entry, opts, callback) {
|
|
268
|
-
new PackWalker(this.walkerOpt(entry, opts)).on('done', callback).start()
|
|
249
|
+
new PackWalker(this.tree, this.walkerOpt(entry, opts)).on('done', callback).start()
|
|
269
250
|
}
|
|
270
251
|
|
|
271
252
|
// overridden method: we use a custom sort method to help compressibility
|
|
@@ -304,7 +285,6 @@ class PackWalker extends IgnoreWalker {
|
|
|
304
285
|
const strict = [
|
|
305
286
|
...strictDefaults,
|
|
306
287
|
'!/package.json',
|
|
307
|
-
'!/npm-shrinkwrap.json',
|
|
308
288
|
'/.git',
|
|
309
289
|
'/node_modules',
|
|
310
290
|
'/package-lock.json',
|
|
@@ -368,7 +348,7 @@ class PackWalker extends IgnoreWalker {
|
|
|
368
348
|
// custom method: after we've finished gathering the files for the root package, we call this
|
|
369
349
|
// before emitting the 'done' event in order to gather all of the files for bundled deps
|
|
370
350
|
async gatherBundles () {
|
|
371
|
-
if (this.
|
|
351
|
+
if (this.seen.has(this.tree)) {
|
|
372
352
|
return
|
|
373
353
|
}
|
|
374
354
|
|
|
@@ -397,14 +377,16 @@ class PackWalker extends IgnoreWalker {
|
|
|
397
377
|
|
|
398
378
|
// get a reference to the node we're bundling
|
|
399
379
|
const node = this.tree.edgesOut.get(dep).to
|
|
380
|
+
// we use node.path for the path because we want the location the node was linked to,
|
|
381
|
+
// not where it actually lives on disk
|
|
382
|
+
const path = node.path
|
|
383
|
+
// but link nodes don't have edgesOut, so we need to pass in the target of the node
|
|
384
|
+
// in order to make sure we correctly traverse its dependencies
|
|
385
|
+
const tree = node.target
|
|
386
|
+
|
|
400
387
|
// and start building options to be passed to the walker for this package
|
|
401
388
|
const walkerOpts = {
|
|
402
|
-
|
|
403
|
-
// not where it actually lives on disk
|
|
404
|
-
path: node.path,
|
|
405
|
-
// but link nodes don't have edgesOut, so we need to pass in the target of the node
|
|
406
|
-
// in order to make sure we correctly traverse its dependencies
|
|
407
|
-
tree: node.target,
|
|
389
|
+
path,
|
|
408
390
|
isPackage: true,
|
|
409
391
|
ignoreFiles: [],
|
|
410
392
|
seen: this.seen, // pass through seen so we can prevent infinite circular loops
|
|
@@ -430,7 +412,7 @@ class PackWalker extends IgnoreWalker {
|
|
|
430
412
|
walkerOpts.ignoreFiles.push(strictRules)
|
|
431
413
|
|
|
432
414
|
// create a walker for this dependency and gather its results
|
|
433
|
-
const walker = new PackWalker(walkerOpts)
|
|
415
|
+
const walker = new PackWalker(tree, walkerOpts)
|
|
434
416
|
const bundled = await new Promise((pResolve, pReject) => {
|
|
435
417
|
walker.on('error', pReject)
|
|
436
418
|
walker.on('done', pResolve)
|
|
@@ -447,10 +429,14 @@ class PackWalker extends IgnoreWalker {
|
|
|
447
429
|
}
|
|
448
430
|
}
|
|
449
431
|
|
|
450
|
-
const walk = (options, callback) => {
|
|
451
|
-
|
|
432
|
+
const walk = (tree, options, callback) => {
|
|
433
|
+
if (typeof options === 'function') {
|
|
434
|
+
callback = options
|
|
435
|
+
options = {}
|
|
436
|
+
}
|
|
452
437
|
const p = new Promise((pResolve, pReject) => {
|
|
453
|
-
new PackWalker(
|
|
438
|
+
new PackWalker(tree, { ...options, isPackage: true })
|
|
439
|
+
.on('done', pResolve).on('error', pReject).start()
|
|
454
440
|
})
|
|
455
441
|
return callback ? p.then(res => callback(null, res), callback) : p
|
|
456
442
|
}
|
package/package.json
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "npm-packlist",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "7.0.0-pre.1",
|
|
4
4
|
"description": "Get a list of the files to add from a folder into an npm package",
|
|
5
5
|
"directories": {
|
|
6
6
|
"test": "test"
|
|
7
7
|
},
|
|
8
8
|
"main": "lib/index.js",
|
|
9
9
|
"dependencies": {
|
|
10
|
-
"@npmcli/arborist": "^5.0.4 || ^6.0.0 || ^6.0.0-pre.0",
|
|
11
10
|
"ignore-walk": "^5.0.1"
|
|
12
11
|
},
|
|
13
12
|
"author": "GitHub Inc.",
|
|
@@ -17,6 +16,7 @@
|
|
|
17
16
|
"lib/"
|
|
18
17
|
],
|
|
19
18
|
"devDependencies": {
|
|
19
|
+
"@npmcli/arborist": "^6.0.0 || ^6.0.0-pre.0",
|
|
20
20
|
"@npmcli/eslint-config": "^3.0.1",
|
|
21
21
|
"@npmcli/template-oss": "4.4.2",
|
|
22
22
|
"mutate-fs": "^2.1.1",
|
|
@@ -45,11 +45,11 @@
|
|
|
45
45
|
"nyc-arg": [
|
|
46
46
|
"--exclude",
|
|
47
47
|
"tap-snapshots/**"
|
|
48
|
+
],
|
|
49
|
+
"files": [
|
|
50
|
+
"test/*.js"
|
|
48
51
|
]
|
|
49
52
|
},
|
|
50
|
-
"bin": {
|
|
51
|
-
"npm-packlist": "bin/index.js"
|
|
52
|
-
},
|
|
53
53
|
"engines": {
|
|
54
54
|
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
|
|
55
55
|
},
|
package/bin/index.js
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
'use strict'
|
|
3
|
-
|
|
4
|
-
const packlist = require('../')
|
|
5
|
-
|
|
6
|
-
const dirs = []
|
|
7
|
-
let doSort = false
|
|
8
|
-
process.argv.slice(2).forEach(arg => {
|
|
9
|
-
if (arg === '-h' || arg === '--help') {
|
|
10
|
-
console.log('usage: npm-packlist [-s --sort] [directory, directory, ...]')
|
|
11
|
-
process.exit(0)
|
|
12
|
-
} else if (arg === '-s' || arg === '--sort') {
|
|
13
|
-
doSort = true
|
|
14
|
-
} else {
|
|
15
|
-
dirs.push(arg)
|
|
16
|
-
}
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
const sort = list => doSort ? list.sort((a, b) => a.localeCompare(b, 'en')) : list
|
|
20
|
-
|
|
21
|
-
const main = async () => {
|
|
22
|
-
if (!dirs.length) {
|
|
23
|
-
const results = await packlist({ path: process.cwd() })
|
|
24
|
-
console.log(sort(results).join('\n'))
|
|
25
|
-
} else {
|
|
26
|
-
for (const dir of dirs) {
|
|
27
|
-
console.group(`> ${dir}`)
|
|
28
|
-
const results = await packlist({ path: dir })
|
|
29
|
-
console.log(sort(results).join('\n'))
|
|
30
|
-
console.groupEnd()
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// coverage disabled for catch handler because we don't need to test that
|
|
36
|
-
main().catch(/* istanbul ignore next */(err) => {
|
|
37
|
-
process.exitCode = 1
|
|
38
|
-
console.error(err.stack)
|
|
39
|
-
})
|