+80
-67
@@ -19,29 +19,78 @@ // creates a zip file using either the native `zip` command if available, | ||
| function expandSources(cwd, source, done) { | ||
| // options to behave more like the native zip's glob support | ||
| const globOpts = { | ||
| cwd, | ||
| dot: false, // ignore .dotfiles | ||
| noglobstar: true, // treat ** as * | ||
| noext: true, // no (a|b) | ||
| nobrace: true // no {a,b} | ||
| }; | ||
| // first handle arrays | ||
| if (Array.isArray(source)) { | ||
| return async.concat( | ||
| source, | ||
| (_source, next) => expandSources(cwd, _source, next), | ||
| done | ||
| ); | ||
| } | ||
| // then expand magic | ||
| if (typeof source !== "string") { | ||
| throw new Error(`source is (${typeof source}) `); | ||
| } | ||
| if (glob.hasMagic(source, globOpts)) { | ||
| // archiver uses this library but somehow ends up with different results on windows: | ||
| // archiver.glob('*') will include subdirectories, but omit their contents on windows | ||
| // so we'll use glob directly, and add all of the files it finds | ||
| glob(source, globOpts, done); | ||
| } else { | ||
| // or just trigger the callback with the source string if there is no magic | ||
| process.nextTick(() => { | ||
| // always return an array | ||
| done(null, [source]); | ||
| }); | ||
| } | ||
| } | ||
| function walkDir(fullPath) { | ||
| const files = fs.readdirSync(fullPath).map(f => { | ||
| const filePath = path.join(fullPath, f); | ||
| const stats = fs.statSync(filePath); | ||
| if (stats.isDirectory()) { | ||
| return walkDir(filePath); | ||
| } | ||
| return filePath; | ||
| }); | ||
| return files.reduce((acc, cur) => acc.concat(cur), []); | ||
| } | ||
| const nativeZip = options => | ||
| new Promise((resolve, reject) => { | ||
| const sources = Array.isArray(options.source) | ||
| ? options.source.join(" ") | ||
| : options.source; | ||
| const command = `zip --quiet --recurse-paths ${ | ||
| options.destination | ||
| } ${sources}`; | ||
| const zipProcess = cp.exec(command, { | ||
| stdio: "inherit", | ||
| cwd: options.cwd | ||
| const cwd = options.cwd || process.cwd(); | ||
| const command = "zip"; | ||
| expandSources(cwd, options.source, (err, sources) => { | ||
| const args = ["--quiet", "--recurse-paths", options.destination].concat( | ||
| sources | ||
| ); | ||
| const zipProcess = cp.spawn(command, args, { | ||
| stdio: "inherit", | ||
| cwd | ||
| }); | ||
| zipProcess.on("error", reject); | ||
| zipProcess.on("close", exitCode => { | ||
| if (exitCode === 0) { | ||
| resolve(); | ||
| } else { | ||
| // exit code 12 means "nothing to do" right? | ||
| //console.log('rejecting', zipProcess) | ||
| reject( | ||
| new Error( | ||
| `Unexpected exit code from native zip: ${exitCode}\n executed command '${command} ${args.join( | ||
| " " | ||
| )}'\n executed in directory '${cwd}'` | ||
| ) | ||
| ); | ||
| } | ||
| }); | ||
| }); | ||
| zipProcess.on("error", reject); | ||
| zipProcess.on("close", exitCode => { | ||
| if (exitCode === 0) { | ||
| resolve(); | ||
| } else { | ||
| // exit code 12 means "nothing to do" right? | ||
| //console.log('rejecting', zipProcess) | ||
| reject( | ||
| new Error( | ||
| `Unexpected exit code from native zip command: ${exitCode}\n executed command '${command}'\n executed inin directory '${options.cwd || | ||
| process.cwd()}'` | ||
| ) | ||
| ); | ||
| } | ||
| }); | ||
| }); | ||
@@ -61,39 +110,2 @@ | ||
| const globOpts = { | ||
| cwd: cwd, | ||
| // options to behave more like the native zip's glob support | ||
| dot: false, // ignore .dotfiles | ||
| noglobstar: true, // treat ** as * | ||
| noext: true, // no (a|b) | ||
| nobrace: true // no {a,b} | ||
| }; | ||
| function findSource(source, next) { | ||
| if (glob.hasMagic(source, globOpts)) { | ||
| // archiver uses this library but somehow ends up with different results on windows: | ||
| // archiver.glob('*') will include subdirectories, but omit their contents on windows | ||
| // so we'll use glob directly, and add all of the files it finds | ||
| glob(source, globOpts, function(err, files) { | ||
| if (err) { | ||
| return next(err); | ||
| } | ||
| async.forEach(files, addSource, next); | ||
| }); | ||
| } else { | ||
| addSource(source, next); | ||
| } | ||
| } | ||
| function walkDir(fullPath) { | ||
| const files = fs.readdirSync(fullPath).map(f => { | ||
| const filePath = path.join(fullPath, f); | ||
| const stats = fs.statSync(filePath); | ||
| if (stats.isDirectory()) { | ||
| return walkDir(filePath); | ||
| } | ||
| return filePath; | ||
| }); | ||
| return files.reduce((acc, cur) => acc.concat(cur), []); | ||
| } | ||
| function addSource(source, next) { | ||
@@ -122,11 +134,12 @@ const fullPath = path.resolve(cwd, source); | ||
| const sources = Array.isArray(options.source) | ||
| ? options.source | ||
| : [options.source]; | ||
| async.forEach(sources, findSource, function(err) { | ||
| expandSources(cwd, options.source, (err, expandedSources) => { | ||
| if (err) { | ||
| return reject(err); | ||
| } | ||
| archive.finalize(); | ||
| async.forEach(expandedSources, addSource, err => { | ||
| if (err) { | ||
| return reject(err); | ||
| } | ||
| archive.finalize(); | ||
| }); | ||
| }); | ||
@@ -133,0 +146,0 @@ }); |
+2
-2
| { | ||
| "name": "bestzip", | ||
| "version": "2.1.6", | ||
| "version": "2.1.7", | ||
| "description": "Uses OS zip command if avaliable (for better performance and speed) or node.js version if there is no system command avaliable. Can be called via node or command line.", | ||
@@ -25,3 +25,3 @@ "main": "lib/bestzip.js", | ||
| "archiver": "^4.0.2", | ||
| "async": "^2.6.1", | ||
| "async": "^3.2.0", | ||
| "glob": "^7.1.3", | ||
@@ -28,0 +28,0 @@ "which": "^1.3.1", |
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
10548
3.06%187
8.72%- Removed
- Removed
Updated