mirror of
https://gitee.com/dcloud/uni-preset-vue
synced 2026-04-22 00:00:04 +08:00
feat: 支持前后一体登录模板
This commit is contained in:
+12
-1
@@ -1,5 +1,6 @@
|
|||||||
const fs = require('fs')
|
const fs = require('fs')
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
|
const fse = require('fs-extra')
|
||||||
|
|
||||||
const isBinary = require('isbinaryfile')
|
const isBinary = require('isbinaryfile')
|
||||||
|
|
||||||
@@ -113,7 +114,17 @@ module.exports = (api, options, rootOptions) => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
await generate(tmp, files, base)
|
const dirNames = ['cloudfunctions-aliyun', 'cloudfunctions-tcb']
|
||||||
|
dirNames.forEach(dirName => {
|
||||||
|
const dirPath = path.join(tmp, './', dirName)
|
||||||
|
if(fs.existsSync(dirPath)) {
|
||||||
|
fse.moveSync(dirPath, path.join(tmp, '../', dirName), {
|
||||||
|
overwrite: true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
await generate(path.join(tmp, '../'), files, path.join(base, '../'))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
module.exports = r => {
|
||||||
|
const n = process.versions.node.split('.').map(x => parseInt(x, 10))
|
||||||
|
r = r.split('.').map(x => parseInt(x, 10))
|
||||||
|
return n[0] > r[0] || (n[0] === r[0] && (n[1] > r[1] || (n[1] === r[1] && n[2] >= r[2])))
|
||||||
|
}
|
||||||
+32
@@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"name": "at-least-node",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Lightweight Node.js version sniffing/comparison",
|
||||||
|
"keywords": [
|
||||||
|
"semver",
|
||||||
|
"feature"
|
||||||
|
],
|
||||||
|
"homepage": "https://github.com/RyanZim/at-least-node#readme",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/RyanZim/at-least-node/issues"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/RyanZim/at-least-node.git"
|
||||||
|
},
|
||||||
|
"license": "ISC",
|
||||||
|
"author": "Ryan Zimmerman <opensrc@ryanzim.com>",
|
||||||
|
"main": "index.js",
|
||||||
|
"files": [],
|
||||||
|
"scripts": {
|
||||||
|
"test": "ava"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"ava": "^3.1.0",
|
||||||
|
"rewire": "^4.0.1",
|
||||||
|
"semver": "^7.1.2"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 4.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
(function(r){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=r()}else if(typeof define==="function"&&define.amd){define([],r)}else{var e;if(typeof window!=="undefined"){e=window}else if(typeof global!=="undefined"){e=global}else if(typeof self!=="undefined"){e=self}else{e=this}e.base64js=r()}})(function(){var r,e,n;return function(){function d(a,f,i){function u(n,r){if(!f[n]){if(!a[n]){var e="function"==typeof require&&require;if(!r&&e)return e(n,!0);if(v)return v(n,!0);var t=new Error("Cannot find module '"+n+"'");throw t.code="MODULE_NOT_FOUND",t}var o=f[n]={exports:{}};a[n][0].call(o.exports,function(r){var e=a[n][1][r];return u(e||r)},o,o.exports,d,a,f,i)}return f[n].exports}for(var v="function"==typeof require&&require,r=0;r<i.length;r++)u(i[r]);return u}return d}()({"/":[function(r,e,n){"use strict";n.byteLength=f;n.toByteArray=i;n.fromByteArray=p;var u=[];var v=[];var d=typeof Uint8Array!=="undefined"?Uint8Array:Array;var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for(var o=0,a=t.length;o<a;++o){u[o]=t[o];v[t.charCodeAt(o)]=o}v["-".charCodeAt(0)]=62;v["_".charCodeAt(0)]=63;function c(r){var e=r.length;if(e%4>0){throw new Error("Invalid string. Length must be a multiple of 4")}var n=r.indexOf("=");if(n===-1)n=e;var t=n===e?0:4-n%4;return[n,t]}function f(r){var e=c(r);var n=e[0];var t=e[1];return(n+t)*3/4-t}function h(r,e,n){return(e+n)*3/4-n}function i(r){var e;var n=c(r);var t=n[0];var o=n[1];var a=new d(h(r,t,o));var f=0;var i=o>0?t-4:t;var u;for(u=0;u<i;u+=4){e=v[r.charCodeAt(u)]<<18|v[r.charCodeAt(u+1)]<<12|v[r.charCodeAt(u+2)]<<6|v[r.charCodeAt(u+3)];a[f++]=e>>16&255;a[f++]=e>>8&255;a[f++]=e&255}if(o===2){e=v[r.charCodeAt(u)]<<2|v[r.charCodeAt(u+1)]>>4;a[f++]=e&255}if(o===1){e=v[r.charCodeAt(u)]<<10|v[r.charCodeAt(u+1)]<<4|v[r.charCodeAt(u+2)]>>2;a[f++]=e>>8&255;a[f++]=e&255}return a}function s(r){return u[r>>18&63]+u[r>>12&63]+u[r>>6&63]+u[r&63]}function l(r,e,n){var t;var o=[];for(var a=e;a<n;a+=3){t=(r[a]<<16&16711680)+(r[a+1]<<8&65280)+(r[a+2]&255);o.push(s(t))}return o.join("")}function p(r){var e;var n=r.length;var t=n%3;var o=[];var a=16383;for(var f=0,i=n-t;f<i;f+=a){o.push(l(r,f,f+a>i?i:f+a))}if(t===1){e=r[n-1];o.push(u[e>>2]+u[e<<4&63]+"==")}else if(t===2){e=(r[n-2]<<8)+r[n-1];o.push(u[e>>10]+u[e>>4&63]+u[e<<2&63]+"=")}return o.join("")}},{}]},{},[])("/")});
|
||||||
-19
@@ -1,19 +0,0 @@
|
|||||||
var random = require('crypto').pseudoRandomBytes
|
|
||||||
|
|
||||||
var b64 = require('../')
|
|
||||||
var fs = require('fs')
|
|
||||||
var path = require('path')
|
|
||||||
var data = random(1e6).toString('base64')
|
|
||||||
//fs.readFileSync(path.join(__dirname, 'example.b64'), 'ascii').split('\n').join('')
|
|
||||||
var start = Date.now()
|
|
||||||
var raw = b64.toByteArray(data)
|
|
||||||
var middle = Date.now()
|
|
||||||
var data = b64.fromByteArray(raw)
|
|
||||||
var end = Date.now()
|
|
||||||
|
|
||||||
console.log('decode ms, decode ops/ms, encode ms, encode ops/ms')
|
|
||||||
console.log(
|
|
||||||
middle - start, data.length / (middle - start),
|
|
||||||
end - middle, data.length / (end - middle))
|
|
||||||
//console.log(data)
|
|
||||||
|
|
||||||
+152
@@ -0,0 +1,152 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
exports.byteLength = byteLength
|
||||||
|
exports.toByteArray = toByteArray
|
||||||
|
exports.fromByteArray = fromByteArray
|
||||||
|
|
||||||
|
var lookup = []
|
||||||
|
var revLookup = []
|
||||||
|
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
|
||||||
|
|
||||||
|
var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
|
||||||
|
for (var i = 0, len = code.length; i < len; ++i) {
|
||||||
|
lookup[i] = code[i]
|
||||||
|
revLookup[code.charCodeAt(i)] = i
|
||||||
|
}
|
||||||
|
|
||||||
|
// Support decoding URL-safe base64 strings, as Node.js does.
|
||||||
|
// See: https://en.wikipedia.org/wiki/Base64#URL_applications
|
||||||
|
revLookup['-'.charCodeAt(0)] = 62
|
||||||
|
revLookup['_'.charCodeAt(0)] = 63
|
||||||
|
|
||||||
|
function getLens (b64) {
|
||||||
|
var len = b64.length
|
||||||
|
|
||||||
|
if (len % 4 > 0) {
|
||||||
|
throw new Error('Invalid string. Length must be a multiple of 4')
|
||||||
|
}
|
||||||
|
|
||||||
|
// Trim off extra bytes after placeholder bytes are found
|
||||||
|
// See: https://github.com/beatgammit/base64-js/issues/42
|
||||||
|
var validLen = b64.indexOf('=')
|
||||||
|
if (validLen === -1) validLen = len
|
||||||
|
|
||||||
|
var placeHoldersLen = validLen === len
|
||||||
|
? 0
|
||||||
|
: 4 - (validLen % 4)
|
||||||
|
|
||||||
|
return [validLen, placeHoldersLen]
|
||||||
|
}
|
||||||
|
|
||||||
|
// base64 is 4/3 + up to two characters of the original data
|
||||||
|
function byteLength (b64) {
|
||||||
|
var lens = getLens(b64)
|
||||||
|
var validLen = lens[0]
|
||||||
|
var placeHoldersLen = lens[1]
|
||||||
|
return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
|
||||||
|
}
|
||||||
|
|
||||||
|
function _byteLength (b64, validLen, placeHoldersLen) {
|
||||||
|
return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
|
||||||
|
}
|
||||||
|
|
||||||
|
function toByteArray (b64) {
|
||||||
|
var tmp
|
||||||
|
var lens = getLens(b64)
|
||||||
|
var validLen = lens[0]
|
||||||
|
var placeHoldersLen = lens[1]
|
||||||
|
|
||||||
|
var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))
|
||||||
|
|
||||||
|
var curByte = 0
|
||||||
|
|
||||||
|
// if there are placeholders, only get up to the last complete 4 chars
|
||||||
|
var len = placeHoldersLen > 0
|
||||||
|
? validLen - 4
|
||||||
|
: validLen
|
||||||
|
|
||||||
|
var i
|
||||||
|
for (i = 0; i < len; i += 4) {
|
||||||
|
tmp =
|
||||||
|
(revLookup[b64.charCodeAt(i)] << 18) |
|
||||||
|
(revLookup[b64.charCodeAt(i + 1)] << 12) |
|
||||||
|
(revLookup[b64.charCodeAt(i + 2)] << 6) |
|
||||||
|
revLookup[b64.charCodeAt(i + 3)]
|
||||||
|
arr[curByte++] = (tmp >> 16) & 0xFF
|
||||||
|
arr[curByte++] = (tmp >> 8) & 0xFF
|
||||||
|
arr[curByte++] = tmp & 0xFF
|
||||||
|
}
|
||||||
|
|
||||||
|
if (placeHoldersLen === 2) {
|
||||||
|
tmp =
|
||||||
|
(revLookup[b64.charCodeAt(i)] << 2) |
|
||||||
|
(revLookup[b64.charCodeAt(i + 1)] >> 4)
|
||||||
|
arr[curByte++] = tmp & 0xFF
|
||||||
|
}
|
||||||
|
|
||||||
|
if (placeHoldersLen === 1) {
|
||||||
|
tmp =
|
||||||
|
(revLookup[b64.charCodeAt(i)] << 10) |
|
||||||
|
(revLookup[b64.charCodeAt(i + 1)] << 4) |
|
||||||
|
(revLookup[b64.charCodeAt(i + 2)] >> 2)
|
||||||
|
arr[curByte++] = (tmp >> 8) & 0xFF
|
||||||
|
arr[curByte++] = tmp & 0xFF
|
||||||
|
}
|
||||||
|
|
||||||
|
return arr
|
||||||
|
}
|
||||||
|
|
||||||
|
function tripletToBase64 (num) {
|
||||||
|
return lookup[num >> 18 & 0x3F] +
|
||||||
|
lookup[num >> 12 & 0x3F] +
|
||||||
|
lookup[num >> 6 & 0x3F] +
|
||||||
|
lookup[num & 0x3F]
|
||||||
|
}
|
||||||
|
|
||||||
|
function encodeChunk (uint8, start, end) {
|
||||||
|
var tmp
|
||||||
|
var output = []
|
||||||
|
for (var i = start; i < end; i += 3) {
|
||||||
|
tmp =
|
||||||
|
((uint8[i] << 16) & 0xFF0000) +
|
||||||
|
((uint8[i + 1] << 8) & 0xFF00) +
|
||||||
|
(uint8[i + 2] & 0xFF)
|
||||||
|
output.push(tripletToBase64(tmp))
|
||||||
|
}
|
||||||
|
return output.join('')
|
||||||
|
}
|
||||||
|
|
||||||
|
function fromByteArray (uint8) {
|
||||||
|
var tmp
|
||||||
|
var len = uint8.length
|
||||||
|
var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
|
||||||
|
var parts = []
|
||||||
|
var maxChunkLength = 16383 // must be multiple of 3
|
||||||
|
|
||||||
|
// go through the array every three bytes, we'll deal with trailing stuff later
|
||||||
|
for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
|
||||||
|
parts.push(encodeChunk(
|
||||||
|
uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
// pad the end with zeros, but make sure to not forget the extra bytes
|
||||||
|
if (extraBytes === 1) {
|
||||||
|
tmp = uint8[len - 1]
|
||||||
|
parts.push(
|
||||||
|
lookup[tmp >> 2] +
|
||||||
|
lookup[(tmp << 4) & 0x3F] +
|
||||||
|
'=='
|
||||||
|
)
|
||||||
|
} else if (extraBytes === 2) {
|
||||||
|
tmp = (uint8[len - 2] << 8) + uint8[len - 1]
|
||||||
|
parts.push(
|
||||||
|
lookup[tmp >> 10] +
|
||||||
|
lookup[(tmp >> 4) & 0x3F] +
|
||||||
|
lookup[(tmp << 2) & 0x3F] +
|
||||||
|
'='
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return parts.join('')
|
||||||
|
}
|
||||||
-124
@@ -1,124 +0,0 @@
|
|||||||
var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
|
||||||
|
|
||||||
;(function (exports) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var Arr = (typeof Uint8Array !== 'undefined')
|
|
||||||
? Uint8Array
|
|
||||||
: Array
|
|
||||||
|
|
||||||
var PLUS = '+'.charCodeAt(0)
|
|
||||||
var SLASH = '/'.charCodeAt(0)
|
|
||||||
var NUMBER = '0'.charCodeAt(0)
|
|
||||||
var LOWER = 'a'.charCodeAt(0)
|
|
||||||
var UPPER = 'A'.charCodeAt(0)
|
|
||||||
var PLUS_URL_SAFE = '-'.charCodeAt(0)
|
|
||||||
var SLASH_URL_SAFE = '_'.charCodeAt(0)
|
|
||||||
|
|
||||||
function decode (elt) {
|
|
||||||
var code = elt.charCodeAt(0)
|
|
||||||
if (code === PLUS ||
|
|
||||||
code === PLUS_URL_SAFE)
|
|
||||||
return 62 // '+'
|
|
||||||
if (code === SLASH ||
|
|
||||||
code === SLASH_URL_SAFE)
|
|
||||||
return 63 // '/'
|
|
||||||
if (code < NUMBER)
|
|
||||||
return -1 //no match
|
|
||||||
if (code < NUMBER + 10)
|
|
||||||
return code - NUMBER + 26 + 26
|
|
||||||
if (code < UPPER + 26)
|
|
||||||
return code - UPPER
|
|
||||||
if (code < LOWER + 26)
|
|
||||||
return code - LOWER + 26
|
|
||||||
}
|
|
||||||
|
|
||||||
function b64ToByteArray (b64) {
|
|
||||||
var i, j, l, tmp, placeHolders, arr
|
|
||||||
|
|
||||||
if (b64.length % 4 > 0) {
|
|
||||||
throw new Error('Invalid string. Length must be a multiple of 4')
|
|
||||||
}
|
|
||||||
|
|
||||||
// the number of equal signs (place holders)
|
|
||||||
// if there are two placeholders, than the two characters before it
|
|
||||||
// represent one byte
|
|
||||||
// if there is only one, then the three characters before it represent 2 bytes
|
|
||||||
// this is just a cheap hack to not do indexOf twice
|
|
||||||
var len = b64.length
|
|
||||||
placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0
|
|
||||||
|
|
||||||
// base64 is 4/3 + up to two characters of the original data
|
|
||||||
arr = new Arr(b64.length * 3 / 4 - placeHolders)
|
|
||||||
|
|
||||||
// if there are placeholders, only get up to the last complete 4 chars
|
|
||||||
l = placeHolders > 0 ? b64.length - 4 : b64.length
|
|
||||||
|
|
||||||
var L = 0
|
|
||||||
|
|
||||||
function push (v) {
|
|
||||||
arr[L++] = v
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0, j = 0; i < l; i += 4, j += 3) {
|
|
||||||
tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))
|
|
||||||
push((tmp & 0xFF0000) >> 16)
|
|
||||||
push((tmp & 0xFF00) >> 8)
|
|
||||||
push(tmp & 0xFF)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (placeHolders === 2) {
|
|
||||||
tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4)
|
|
||||||
push(tmp & 0xFF)
|
|
||||||
} else if (placeHolders === 1) {
|
|
||||||
tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2)
|
|
||||||
push((tmp >> 8) & 0xFF)
|
|
||||||
push(tmp & 0xFF)
|
|
||||||
}
|
|
||||||
|
|
||||||
return arr
|
|
||||||
}
|
|
||||||
|
|
||||||
function uint8ToBase64 (uint8) {
|
|
||||||
var i,
|
|
||||||
extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes
|
|
||||||
output = "",
|
|
||||||
temp, length
|
|
||||||
|
|
||||||
function encode (num) {
|
|
||||||
return lookup.charAt(num)
|
|
||||||
}
|
|
||||||
|
|
||||||
function tripletToBase64 (num) {
|
|
||||||
return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)
|
|
||||||
}
|
|
||||||
|
|
||||||
// go through the array every three bytes, we'll deal with trailing stuff later
|
|
||||||
for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {
|
|
||||||
temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
|
|
||||||
output += tripletToBase64(temp)
|
|
||||||
}
|
|
||||||
|
|
||||||
// pad the end with zeros, but make sure to not forget the extra bytes
|
|
||||||
switch (extraBytes) {
|
|
||||||
case 1:
|
|
||||||
temp = uint8[uint8.length - 1]
|
|
||||||
output += encode(temp >> 2)
|
|
||||||
output += encode((temp << 4) & 0x3F)
|
|
||||||
output += '=='
|
|
||||||
break
|
|
||||||
case 2:
|
|
||||||
temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])
|
|
||||||
output += encode(temp >> 10)
|
|
||||||
output += encode((temp >> 4) & 0x3F)
|
|
||||||
output += encode((temp << 2) & 0x3F)
|
|
||||||
output += '='
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
return output
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.toByteArray = b64ToByteArray
|
|
||||||
exports.fromByteArray = uint8ToBase64
|
|
||||||
}(typeof exports === 'undefined' ? (this.base64js = {}) : exports))
|
|
||||||
+22
-24
@@ -1,34 +1,32 @@
|
|||||||
{
|
{
|
||||||
"author": "T. Jameson Little <t.jameson.little@gmail.com>",
|
|
||||||
"name": "base64-js",
|
"name": "base64-js",
|
||||||
"description": "Base64 encoding/decoding in pure JS",
|
"description": "Base64 encoding/decoding in pure JS",
|
||||||
"version": "0.0.8",
|
"version": "1.3.1",
|
||||||
|
"author": "T. Jameson Little <t.jameson.little@gmail.com>",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/beatgammit/base64-js/issues"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"benchmark": "^2.1.4",
|
||||||
|
"browserify": "^16.3.0",
|
||||||
|
"standard": "*",
|
||||||
|
"tape": "4.x",
|
||||||
|
"uglify-js": "^3.6.0"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/beatgammit/base64-js",
|
||||||
|
"keywords": [
|
||||||
|
"base64"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"main": "index.js",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "git://github.com/beatgammit/base64-js.git"
|
"url": "git://github.com/beatgammit/base64-js.git"
|
||||||
},
|
},
|
||||||
"main": "lib/b64.js",
|
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "tape test/*.js"
|
"build": "browserify -s base64js -r ./ | uglifyjs -m > base64js.min.js",
|
||||||
},
|
"lint": "standard",
|
||||||
"testling": {
|
"test": "npm run lint && npm run unit",
|
||||||
"files": "test/*.js",
|
"unit": "tape test/*.js"
|
||||||
"browsers": [
|
|
||||||
"ie/6..latest",
|
|
||||||
"chrome/4..latest",
|
|
||||||
"firefox/3..latest",
|
|
||||||
"safari/5.1..latest",
|
|
||||||
"opera/11.0..latest",
|
|
||||||
"iphone/6",
|
|
||||||
"ipad/6"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.4"
|
|
||||||
},
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {},
|
|
||||||
"devDependencies": {
|
|
||||||
"tape": "~2.3.2"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-1
@@ -173,18 +173,22 @@ BufferList.prototype.copy = function copy (dst, dstStart, srcStart, srcEnd) {
|
|||||||
|
|
||||||
if (bytes > l) {
|
if (bytes > l) {
|
||||||
this._bufs[i].copy(dst, bufoff, start)
|
this._bufs[i].copy(dst, bufoff, start)
|
||||||
|
bufoff += l
|
||||||
} else {
|
} else {
|
||||||
this._bufs[i].copy(dst, bufoff, start, start + bytes)
|
this._bufs[i].copy(dst, bufoff, start, start + bytes)
|
||||||
|
bufoff += l
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
bufoff += l
|
|
||||||
bytes -= l
|
bytes -= l
|
||||||
|
|
||||||
if (start)
|
if (start)
|
||||||
start = 0
|
start = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// safeguard so that we don't return uninitialized memory
|
||||||
|
if (dst.length > bufoff) return dst.slice(0, bufoff)
|
||||||
|
|
||||||
return dst
|
return dst
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -217,6 +221,11 @@ BufferList.prototype.toString = function toString (encoding, start, end) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
BufferList.prototype.consume = function consume (bytes) {
|
BufferList.prototype.consume = function consume (bytes) {
|
||||||
|
// first, normalize the argument, in accordance with how Buffer does it
|
||||||
|
bytes = Math.trunc(bytes)
|
||||||
|
// do nothing if not a positive number
|
||||||
|
if (Number.isNaN(bytes) || bytes <= 0) return this
|
||||||
|
|
||||||
while (this._bufs.length) {
|
while (this._bufs.length) {
|
||||||
if (bytes >= this._bufs[0].length) {
|
if (bytes >= this._bufs[0].length) {
|
||||||
bytes -= this._bufs[0].length
|
bytes -= this._bufs[0].length
|
||||||
|
|||||||
+187
@@ -0,0 +1,187 @@
|
|||||||
|
declare module "safe-buffer" {
|
||||||
|
export class Buffer {
|
||||||
|
length: number
|
||||||
|
write(string: string, offset?: number, length?: number, encoding?: string): number;
|
||||||
|
toString(encoding?: string, start?: number, end?: number): string;
|
||||||
|
toJSON(): { type: 'Buffer', data: any[] };
|
||||||
|
equals(otherBuffer: Buffer): boolean;
|
||||||
|
compare(otherBuffer: Buffer, targetStart?: number, targetEnd?: number, sourceStart?: number, sourceEnd?: number): number;
|
||||||
|
copy(targetBuffer: Buffer, targetStart?: number, sourceStart?: number, sourceEnd?: number): number;
|
||||||
|
slice(start?: number, end?: number): Buffer;
|
||||||
|
writeUIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number;
|
||||||
|
writeUIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number;
|
||||||
|
writeIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number;
|
||||||
|
writeIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number;
|
||||||
|
readUIntLE(offset: number, byteLength: number, noAssert?: boolean): number;
|
||||||
|
readUIntBE(offset: number, byteLength: number, noAssert?: boolean): number;
|
||||||
|
readIntLE(offset: number, byteLength: number, noAssert?: boolean): number;
|
||||||
|
readIntBE(offset: number, byteLength: number, noAssert?: boolean): number;
|
||||||
|
readUInt8(offset: number, noAssert?: boolean): number;
|
||||||
|
readUInt16LE(offset: number, noAssert?: boolean): number;
|
||||||
|
readUInt16BE(offset: number, noAssert?: boolean): number;
|
||||||
|
readUInt32LE(offset: number, noAssert?: boolean): number;
|
||||||
|
readUInt32BE(offset: number, noAssert?: boolean): number;
|
||||||
|
readInt8(offset: number, noAssert?: boolean): number;
|
||||||
|
readInt16LE(offset: number, noAssert?: boolean): number;
|
||||||
|
readInt16BE(offset: number, noAssert?: boolean): number;
|
||||||
|
readInt32LE(offset: number, noAssert?: boolean): number;
|
||||||
|
readInt32BE(offset: number, noAssert?: boolean): number;
|
||||||
|
readFloatLE(offset: number, noAssert?: boolean): number;
|
||||||
|
readFloatBE(offset: number, noAssert?: boolean): number;
|
||||||
|
readDoubleLE(offset: number, noAssert?: boolean): number;
|
||||||
|
readDoubleBE(offset: number, noAssert?: boolean): number;
|
||||||
|
swap16(): Buffer;
|
||||||
|
swap32(): Buffer;
|
||||||
|
swap64(): Buffer;
|
||||||
|
writeUInt8(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
writeUInt16LE(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
writeUInt16BE(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
writeUInt32LE(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
writeUInt32BE(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
writeInt8(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
writeInt16LE(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
writeInt16BE(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
writeInt32LE(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
writeInt32BE(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
writeFloatLE(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
writeFloatBE(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
writeDoubleLE(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
writeDoubleBE(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
fill(value: any, offset?: number, end?: number): this;
|
||||||
|
indexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number;
|
||||||
|
lastIndexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number;
|
||||||
|
includes(value: string | number | Buffer, byteOffset?: number, encoding?: string): boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocates a new buffer containing the given {str}.
|
||||||
|
*
|
||||||
|
* @param str String to store in buffer.
|
||||||
|
* @param encoding encoding to use, optional. Default is 'utf8'
|
||||||
|
*/
|
||||||
|
constructor (str: string, encoding?: string);
|
||||||
|
/**
|
||||||
|
* Allocates a new buffer of {size} octets.
|
||||||
|
*
|
||||||
|
* @param size count of octets to allocate.
|
||||||
|
*/
|
||||||
|
constructor (size: number);
|
||||||
|
/**
|
||||||
|
* Allocates a new buffer containing the given {array} of octets.
|
||||||
|
*
|
||||||
|
* @param array The octets to store.
|
||||||
|
*/
|
||||||
|
constructor (array: Uint8Array);
|
||||||
|
/**
|
||||||
|
* Produces a Buffer backed by the same allocated memory as
|
||||||
|
* the given {ArrayBuffer}.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param arrayBuffer The ArrayBuffer with which to share memory.
|
||||||
|
*/
|
||||||
|
constructor (arrayBuffer: ArrayBuffer);
|
||||||
|
/**
|
||||||
|
* Allocates a new buffer containing the given {array} of octets.
|
||||||
|
*
|
||||||
|
* @param array The octets to store.
|
||||||
|
*/
|
||||||
|
constructor (array: any[]);
|
||||||
|
/**
|
||||||
|
* Copies the passed {buffer} data onto a new {Buffer} instance.
|
||||||
|
*
|
||||||
|
* @param buffer The buffer to copy.
|
||||||
|
*/
|
||||||
|
constructor (buffer: Buffer);
|
||||||
|
prototype: Buffer;
|
||||||
|
/**
|
||||||
|
* Allocates a new Buffer using an {array} of octets.
|
||||||
|
*
|
||||||
|
* @param array
|
||||||
|
*/
|
||||||
|
static from(array: any[]): Buffer;
|
||||||
|
/**
|
||||||
|
* When passed a reference to the .buffer property of a TypedArray instance,
|
||||||
|
* the newly created Buffer will share the same allocated memory as the TypedArray.
|
||||||
|
* The optional {byteOffset} and {length} arguments specify a memory range
|
||||||
|
* within the {arrayBuffer} that will be shared by the Buffer.
|
||||||
|
*
|
||||||
|
* @param arrayBuffer The .buffer property of a TypedArray or a new ArrayBuffer()
|
||||||
|
* @param byteOffset
|
||||||
|
* @param length
|
||||||
|
*/
|
||||||
|
static from(arrayBuffer: ArrayBuffer, byteOffset?: number, length?: number): Buffer;
|
||||||
|
/**
|
||||||
|
* Copies the passed {buffer} data onto a new Buffer instance.
|
||||||
|
*
|
||||||
|
* @param buffer
|
||||||
|
*/
|
||||||
|
static from(buffer: Buffer): Buffer;
|
||||||
|
/**
|
||||||
|
* Creates a new Buffer containing the given JavaScript string {str}.
|
||||||
|
* If provided, the {encoding} parameter identifies the character encoding.
|
||||||
|
* If not provided, {encoding} defaults to 'utf8'.
|
||||||
|
*
|
||||||
|
* @param str
|
||||||
|
*/
|
||||||
|
static from(str: string, encoding?: string): Buffer;
|
||||||
|
/**
|
||||||
|
* Returns true if {obj} is a Buffer
|
||||||
|
*
|
||||||
|
* @param obj object to test.
|
||||||
|
*/
|
||||||
|
static isBuffer(obj: any): obj is Buffer;
|
||||||
|
/**
|
||||||
|
* Returns true if {encoding} is a valid encoding argument.
|
||||||
|
* Valid string encodings in Node 0.12: 'ascii'|'utf8'|'utf16le'|'ucs2'(alias of 'utf16le')|'base64'|'binary'(deprecated)|'hex'
|
||||||
|
*
|
||||||
|
* @param encoding string to test.
|
||||||
|
*/
|
||||||
|
static isEncoding(encoding: string): boolean;
|
||||||
|
/**
|
||||||
|
* Gives the actual byte length of a string. encoding defaults to 'utf8'.
|
||||||
|
* This is not the same as String.prototype.length since that returns the number of characters in a string.
|
||||||
|
*
|
||||||
|
* @param string string to test.
|
||||||
|
* @param encoding encoding used to evaluate (defaults to 'utf8')
|
||||||
|
*/
|
||||||
|
static byteLength(string: string, encoding?: string): number;
|
||||||
|
/**
|
||||||
|
* Returns a buffer which is the result of concatenating all the buffers in the list together.
|
||||||
|
*
|
||||||
|
* If the list has no items, or if the totalLength is 0, then it returns a zero-length buffer.
|
||||||
|
* If the list has exactly one item, then the first item of the list is returned.
|
||||||
|
* If the list has more than one item, then a new Buffer is created.
|
||||||
|
*
|
||||||
|
* @param list An array of Buffer objects to concatenate
|
||||||
|
* @param totalLength Total length of the buffers when concatenated.
|
||||||
|
* If totalLength is not provided, it is read from the buffers in the list. However, this adds an additional loop to the function, so it is faster to provide the length explicitly.
|
||||||
|
*/
|
||||||
|
static concat(list: Buffer[], totalLength?: number): Buffer;
|
||||||
|
/**
|
||||||
|
* The same as buf1.compare(buf2).
|
||||||
|
*/
|
||||||
|
static compare(buf1: Buffer, buf2: Buffer): number;
|
||||||
|
/**
|
||||||
|
* Allocates a new buffer of {size} octets.
|
||||||
|
*
|
||||||
|
* @param size count of octets to allocate.
|
||||||
|
* @param fill if specified, buffer will be initialized by calling buf.fill(fill).
|
||||||
|
* If parameter is omitted, buffer will be filled with zeros.
|
||||||
|
* @param encoding encoding used for call to buf.fill while initalizing
|
||||||
|
*/
|
||||||
|
static alloc(size: number, fill?: string | Buffer | number, encoding?: string): Buffer;
|
||||||
|
/**
|
||||||
|
* Allocates a new buffer of {size} octets, leaving memory not initialized, so the contents
|
||||||
|
* of the newly created Buffer are unknown and may contain sensitive data.
|
||||||
|
*
|
||||||
|
* @param size count of octets to allocate
|
||||||
|
*/
|
||||||
|
static allocUnsafe(size: number): Buffer;
|
||||||
|
/**
|
||||||
|
* Allocates a new non-pooled buffer of {size} octets, leaving memory not initialized, so the contents
|
||||||
|
* of the newly created Buffer are unknown and may contain sensitive data.
|
||||||
|
*
|
||||||
|
* @param size count of octets to allocate
|
||||||
|
*/
|
||||||
|
static allocUnsafeSlow(size: number): Buffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
+65
@@ -0,0 +1,65 @@
|
|||||||
|
/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
||||||
|
/* eslint-disable node/no-deprecated-api */
|
||||||
|
var buffer = require('buffer')
|
||||||
|
var Buffer = buffer.Buffer
|
||||||
|
|
||||||
|
// alternative to using Object.keys for old browsers
|
||||||
|
function copyProps (src, dst) {
|
||||||
|
for (var key in src) {
|
||||||
|
dst[key] = src[key]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
|
||||||
|
module.exports = buffer
|
||||||
|
} else {
|
||||||
|
// Copy properties from require('buffer')
|
||||||
|
copyProps(buffer, exports)
|
||||||
|
exports.Buffer = SafeBuffer
|
||||||
|
}
|
||||||
|
|
||||||
|
function SafeBuffer (arg, encodingOrOffset, length) {
|
||||||
|
return Buffer(arg, encodingOrOffset, length)
|
||||||
|
}
|
||||||
|
|
||||||
|
SafeBuffer.prototype = Object.create(Buffer.prototype)
|
||||||
|
|
||||||
|
// Copy static methods from Buffer
|
||||||
|
copyProps(Buffer, SafeBuffer)
|
||||||
|
|
||||||
|
SafeBuffer.from = function (arg, encodingOrOffset, length) {
|
||||||
|
if (typeof arg === 'number') {
|
||||||
|
throw new TypeError('Argument must not be a number')
|
||||||
|
}
|
||||||
|
return Buffer(arg, encodingOrOffset, length)
|
||||||
|
}
|
||||||
|
|
||||||
|
SafeBuffer.alloc = function (size, fill, encoding) {
|
||||||
|
if (typeof size !== 'number') {
|
||||||
|
throw new TypeError('Argument must be a number')
|
||||||
|
}
|
||||||
|
var buf = Buffer(size)
|
||||||
|
if (fill !== undefined) {
|
||||||
|
if (typeof encoding === 'string') {
|
||||||
|
buf.fill(fill, encoding)
|
||||||
|
} else {
|
||||||
|
buf.fill(fill)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
buf.fill(0)
|
||||||
|
}
|
||||||
|
return buf
|
||||||
|
}
|
||||||
|
|
||||||
|
SafeBuffer.allocUnsafe = function (size) {
|
||||||
|
if (typeof size !== 'number') {
|
||||||
|
throw new TypeError('Argument must be a number')
|
||||||
|
}
|
||||||
|
return Buffer(size)
|
||||||
|
}
|
||||||
|
|
||||||
|
SafeBuffer.allocUnsafeSlow = function (size) {
|
||||||
|
if (typeof size !== 'number') {
|
||||||
|
throw new TypeError('Argument must be a number')
|
||||||
|
}
|
||||||
|
return buffer.SlowBuffer(size)
|
||||||
|
}
|
||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"name": "safe-buffer",
|
||||||
|
"description": "Safer Node.js Buffer API",
|
||||||
|
"version": "5.2.1",
|
||||||
|
"author": {
|
||||||
|
"name": "Feross Aboukhadijeh",
|
||||||
|
"email": "feross@feross.org",
|
||||||
|
"url": "https://feross.org"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/feross/safe-buffer/issues"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"standard": "*",
|
||||||
|
"tape": "^5.0.0"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/feross/safe-buffer",
|
||||||
|
"keywords": [
|
||||||
|
"buffer",
|
||||||
|
"buffer allocate",
|
||||||
|
"node security",
|
||||||
|
"safe",
|
||||||
|
"safe-buffer",
|
||||||
|
"security",
|
||||||
|
"uninitialized"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"main": "index.js",
|
||||||
|
"types": "index.d.ts",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/feross/safe-buffer.git"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "standard && tape test/*.js"
|
||||||
|
},
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/feross"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "patreon",
|
||||||
|
"url": "https://www.patreon.com/feross"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "consulting",
|
||||||
|
"url": "https://feross.org/support"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "bl",
|
"name": "bl",
|
||||||
"version": "1.2.2",
|
"version": "1.2.3",
|
||||||
"description": "Buffer List: collect buffers and access with a standard readable Buffer interface, streamable too!",
|
"description": "Buffer List: collect buffers and access with a standard readable Buffer interface, streamable too!",
|
||||||
"main": "bl.js",
|
"main": "bl.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
-126
@@ -1,126 +0,0 @@
|
|||||||
#!/usr/bin/env node
|
|
||||||
|
|
||||||
var concat = require('concat-stream')
|
|
||||||
var fs = require('fs')
|
|
||||||
var hyperquest = require('hyperquest')
|
|
||||||
var cp = require('child_process')
|
|
||||||
var split = require('split')
|
|
||||||
var through = require('through2')
|
|
||||||
|
|
||||||
var url = 'https://api.github.com/repos/nodejs/io.js/contents'
|
|
||||||
var dirs = [
|
|
||||||
'/test/parallel',
|
|
||||||
'/test/pummel'
|
|
||||||
]
|
|
||||||
|
|
||||||
cp.execSync('rm -rf node/*.js', { cwd: __dirname + '/../test' })
|
|
||||||
cp.execSync('rm -rf node-es6/*.js', { cwd: __dirname + '/../test' })
|
|
||||||
|
|
||||||
var httpOpts = {
|
|
||||||
headers: {
|
|
||||||
'User-Agent': null
|
|
||||||
// auth if github rate-limits you...
|
|
||||||
// 'Authorization': 'Basic ' + Buffer('username:password').toString('base64'),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dirs.forEach(function (dir) {
|
|
||||||
var req = hyperquest(url + dir, httpOpts)
|
|
||||||
req.pipe(concat(function (data) {
|
|
||||||
if (req.response.statusCode !== 200) {
|
|
||||||
throw new Error(url + dir + ': ' + data.toString())
|
|
||||||
}
|
|
||||||
downloadBufferTests(dir, JSON.parse(data))
|
|
||||||
}))
|
|
||||||
})
|
|
||||||
|
|
||||||
function downloadBufferTests (dir, files) {
|
|
||||||
files.forEach(function (file) {
|
|
||||||
if (!/test-buffer.*/.test(file.name)) return
|
|
||||||
|
|
||||||
var path
|
|
||||||
if (file.name === 'test-buffer-iterator.js' ||
|
|
||||||
file.name === 'test-buffer-arraybuffer.js') {
|
|
||||||
path = __dirname + '/../test/node-es6/' + file.name
|
|
||||||
} else if (file.name === 'test-buffer-fakes.js') {
|
|
||||||
// These teses only apply to node, where they're calling into C++ and need to
|
|
||||||
// ensure the prototype can't be faked, or else there will be a segfault.
|
|
||||||
return
|
|
||||||
} else {
|
|
||||||
path = __dirname + '/../test/node/' + file.name
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log(file.download_url)
|
|
||||||
hyperquest(file.download_url, httpOpts)
|
|
||||||
.pipe(split())
|
|
||||||
.pipe(testfixer(file.name))
|
|
||||||
.pipe(fs.createWriteStream(path))
|
|
||||||
.on('finish', function () {
|
|
||||||
console.log('wrote ' + file.name)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function testfixer (filename) {
|
|
||||||
var firstline = true
|
|
||||||
|
|
||||||
return through(function (line, enc, cb) {
|
|
||||||
line = line.toString()
|
|
||||||
|
|
||||||
if (firstline) {
|
|
||||||
// require buffer explicitly
|
|
||||||
var preamble = 'if (process.env.OBJECT_IMPL) global.TYPED_ARRAY_SUPPORT = false;\n' +
|
|
||||||
'var Buffer = require(\'../../\').Buffer;'
|
|
||||||
if (/use strict/.test(line)) line += '\n' + preamble
|
|
||||||
else line + preamble + '\n' + line
|
|
||||||
firstline = false
|
|
||||||
}
|
|
||||||
|
|
||||||
// use `var` instead of `const`/`let`
|
|
||||||
line = line.replace(/(const|let) /g, 'var ')
|
|
||||||
|
|
||||||
// make `require('common')` work
|
|
||||||
line = line.replace(/(var common = require.*)/g, 'var common = {};')
|
|
||||||
|
|
||||||
// use `Buffer.isBuffer` instead of `instanceof Buffer`
|
|
||||||
line = line.replace(/buf instanceof Buffer/g, 'Buffer.isBuffer(buf)')
|
|
||||||
|
|
||||||
// require browser buffer
|
|
||||||
line = line.replace(/(.*)require\('buffer'\)(.*)/g, '$1require(\'../../\')$2')
|
|
||||||
|
|
||||||
// smalloc is only used for kMaxLength
|
|
||||||
line = line.replace(
|
|
||||||
/require\('smalloc'\)/g,
|
|
||||||
'{ kMaxLength: process.env.OBJECT_IMPL ? 0x3fffffff : 0x7fffffff }'
|
|
||||||
)
|
|
||||||
|
|
||||||
// comment out console logs
|
|
||||||
line = line.replace(/(.*console\..*)/g, '// $1')
|
|
||||||
|
|
||||||
// we can't reliably test typed array max-sizes in the browser
|
|
||||||
if (filename === 'test-buffer-big.js') {
|
|
||||||
line = line.replace(/(.*new Int8Array.*RangeError.*)/, '// $1')
|
|
||||||
line = line.replace(/(.*new ArrayBuffer.*RangeError.*)/, '// $1')
|
|
||||||
line = line.replace(/(.*new Float64Array.*RangeError.*)/, '// $1')
|
|
||||||
}
|
|
||||||
|
|
||||||
// https://github.com/iojs/io.js/blob/v0.12/test/parallel/test-buffer.js#L38
|
|
||||||
// we can't run this because we need to support
|
|
||||||
// browsers that don't have typed arrays
|
|
||||||
if (filename === 'test-buffer.js') {
|
|
||||||
line = line.replace(/b\[0\] = -1;/, 'b[0] = 255;')
|
|
||||||
}
|
|
||||||
|
|
||||||
// https://github.com/iojs/io.js/blob/v0.12/test/parallel/test-buffer.js#L1138
|
|
||||||
// unfortunately we can't run this as it touches
|
|
||||||
// node streams which do an instanceof check
|
|
||||||
// and crypto-browserify doesn't work in old
|
|
||||||
// versions of ie
|
|
||||||
if (filename === 'test-buffer.js') {
|
|
||||||
line = line.replace(/^(\s*)(var crypto = require.*)/, '$1// $2')
|
|
||||||
line = line.replace(/(crypto.createHash.*\))/, '1 /*$1*/')
|
|
||||||
}
|
|
||||||
|
|
||||||
cb(null, line + '\n')
|
|
||||||
})
|
|
||||||
}
|
|
||||||
-18
@@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/env node
|
|
||||||
|
|
||||||
var cp = require('child_process')
|
|
||||||
|
|
||||||
var runBrowserTests = !process.env.TRAVIS_PULL_REQUEST ||
|
|
||||||
process.env.TRAVIS_PULL_REQUEST === 'false'
|
|
||||||
|
|
||||||
var node = cp.spawn('npm', ['run', 'test-node'], { stdio: 'inherit' })
|
|
||||||
node.on('close', function (code) {
|
|
||||||
if (code === 0 && runBrowserTests) {
|
|
||||||
var browser = cp.spawn('npm', ['run', 'test-browser'], { stdio: 'inherit' })
|
|
||||||
browser.on('close', function (code) {
|
|
||||||
process.exit(code)
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
process.exit(code)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
+186
@@ -0,0 +1,186 @@
|
|||||||
|
export class Buffer extends Uint8Array {
|
||||||
|
length: number
|
||||||
|
write(string: string, offset?: number, length?: number, encoding?: string): number;
|
||||||
|
toString(encoding?: string, start?: number, end?: number): string;
|
||||||
|
toJSON(): { type: 'Buffer', data: any[] };
|
||||||
|
equals(otherBuffer: Buffer): boolean;
|
||||||
|
compare(otherBuffer: Buffer, targetStart?: number, targetEnd?: number, sourceStart?: number, sourceEnd?: number): number;
|
||||||
|
copy(targetBuffer: Buffer, targetStart?: number, sourceStart?: number, sourceEnd?: number): number;
|
||||||
|
slice(start?: number, end?: number): Buffer;
|
||||||
|
writeUIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number;
|
||||||
|
writeUIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number;
|
||||||
|
writeIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number;
|
||||||
|
writeIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number;
|
||||||
|
readUIntLE(offset: number, byteLength: number, noAssert?: boolean): number;
|
||||||
|
readUIntBE(offset: number, byteLength: number, noAssert?: boolean): number;
|
||||||
|
readIntLE(offset: number, byteLength: number, noAssert?: boolean): number;
|
||||||
|
readIntBE(offset: number, byteLength: number, noAssert?: boolean): number;
|
||||||
|
readUInt8(offset: number, noAssert?: boolean): number;
|
||||||
|
readUInt16LE(offset: number, noAssert?: boolean): number;
|
||||||
|
readUInt16BE(offset: number, noAssert?: boolean): number;
|
||||||
|
readUInt32LE(offset: number, noAssert?: boolean): number;
|
||||||
|
readUInt32BE(offset: number, noAssert?: boolean): number;
|
||||||
|
readInt8(offset: number, noAssert?: boolean): number;
|
||||||
|
readInt16LE(offset: number, noAssert?: boolean): number;
|
||||||
|
readInt16BE(offset: number, noAssert?: boolean): number;
|
||||||
|
readInt32LE(offset: number, noAssert?: boolean): number;
|
||||||
|
readInt32BE(offset: number, noAssert?: boolean): number;
|
||||||
|
readFloatLE(offset: number, noAssert?: boolean): number;
|
||||||
|
readFloatBE(offset: number, noAssert?: boolean): number;
|
||||||
|
readDoubleLE(offset: number, noAssert?: boolean): number;
|
||||||
|
readDoubleBE(offset: number, noAssert?: boolean): number;
|
||||||
|
reverse(): this;
|
||||||
|
swap16(): Buffer;
|
||||||
|
swap32(): Buffer;
|
||||||
|
swap64(): Buffer;
|
||||||
|
writeUInt8(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
writeUInt16LE(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
writeUInt16BE(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
writeUInt32LE(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
writeUInt32BE(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
writeInt8(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
writeInt16LE(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
writeInt16BE(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
writeInt32LE(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
writeInt32BE(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
writeFloatLE(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
writeFloatBE(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
writeDoubleLE(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
writeDoubleBE(value: number, offset: number, noAssert?: boolean): number;
|
||||||
|
fill(value: any, offset?: number, end?: number): this;
|
||||||
|
indexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number;
|
||||||
|
lastIndexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number;
|
||||||
|
includes(value: string | number | Buffer, byteOffset?: number, encoding?: string): boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocates a new buffer containing the given {str}.
|
||||||
|
*
|
||||||
|
* @param str String to store in buffer.
|
||||||
|
* @param encoding encoding to use, optional. Default is 'utf8'
|
||||||
|
*/
|
||||||
|
constructor (str: string, encoding?: string);
|
||||||
|
/**
|
||||||
|
* Allocates a new buffer of {size} octets.
|
||||||
|
*
|
||||||
|
* @param size count of octets to allocate.
|
||||||
|
*/
|
||||||
|
constructor (size: number);
|
||||||
|
/**
|
||||||
|
* Allocates a new buffer containing the given {array} of octets.
|
||||||
|
*
|
||||||
|
* @param array The octets to store.
|
||||||
|
*/
|
||||||
|
constructor (array: Uint8Array);
|
||||||
|
/**
|
||||||
|
* Produces a Buffer backed by the same allocated memory as
|
||||||
|
* the given {ArrayBuffer}.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param arrayBuffer The ArrayBuffer with which to share memory.
|
||||||
|
*/
|
||||||
|
constructor (arrayBuffer: ArrayBuffer);
|
||||||
|
/**
|
||||||
|
* Allocates a new buffer containing the given {array} of octets.
|
||||||
|
*
|
||||||
|
* @param array The octets to store.
|
||||||
|
*/
|
||||||
|
constructor (array: any[]);
|
||||||
|
/**
|
||||||
|
* Copies the passed {buffer} data onto a new {Buffer} instance.
|
||||||
|
*
|
||||||
|
* @param buffer The buffer to copy.
|
||||||
|
*/
|
||||||
|
constructor (buffer: Buffer);
|
||||||
|
prototype: Buffer;
|
||||||
|
/**
|
||||||
|
* Allocates a new Buffer using an {array} of octets.
|
||||||
|
*
|
||||||
|
* @param array
|
||||||
|
*/
|
||||||
|
static from(array: any[]): Buffer;
|
||||||
|
/**
|
||||||
|
* When passed a reference to the .buffer property of a TypedArray instance,
|
||||||
|
* the newly created Buffer will share the same allocated memory as the TypedArray.
|
||||||
|
* The optional {byteOffset} and {length} arguments specify a memory range
|
||||||
|
* within the {arrayBuffer} that will be shared by the Buffer.
|
||||||
|
*
|
||||||
|
* @param arrayBuffer The .buffer property of a TypedArray or a new ArrayBuffer()
|
||||||
|
* @param byteOffset
|
||||||
|
* @param length
|
||||||
|
*/
|
||||||
|
static from(arrayBuffer: ArrayBuffer, byteOffset?: number, length?: number): Buffer;
|
||||||
|
/**
|
||||||
|
* Copies the passed {buffer} data onto a new Buffer instance.
|
||||||
|
*
|
||||||
|
* @param buffer
|
||||||
|
*/
|
||||||
|
static from(buffer: Buffer | Uint8Array): Buffer;
|
||||||
|
/**
|
||||||
|
* Creates a new Buffer containing the given JavaScript string {str}.
|
||||||
|
* If provided, the {encoding} parameter identifies the character encoding.
|
||||||
|
* If not provided, {encoding} defaults to 'utf8'.
|
||||||
|
*
|
||||||
|
* @param str
|
||||||
|
*/
|
||||||
|
static from(str: string, encoding?: string): Buffer;
|
||||||
|
/**
|
||||||
|
* Returns true if {obj} is a Buffer
|
||||||
|
*
|
||||||
|
* @param obj object to test.
|
||||||
|
*/
|
||||||
|
static isBuffer(obj: any): obj is Buffer;
|
||||||
|
/**
|
||||||
|
* Returns true if {encoding} is a valid encoding argument.
|
||||||
|
* Valid string encodings in Node 0.12: 'ascii'|'utf8'|'utf16le'|'ucs2'(alias of 'utf16le')|'base64'|'binary'(deprecated)|'hex'
|
||||||
|
*
|
||||||
|
* @param encoding string to test.
|
||||||
|
*/
|
||||||
|
static isEncoding(encoding: string): boolean;
|
||||||
|
/**
|
||||||
|
* Gives the actual byte length of a string. encoding defaults to 'utf8'.
|
||||||
|
* This is not the same as String.prototype.length since that returns the number of characters in a string.
|
||||||
|
*
|
||||||
|
* @param string string to test.
|
||||||
|
* @param encoding encoding used to evaluate (defaults to 'utf8')
|
||||||
|
*/
|
||||||
|
static byteLength(string: string, encoding?: string): number;
|
||||||
|
/**
|
||||||
|
* Returns a buffer which is the result of concatenating all the buffers in the list together.
|
||||||
|
*
|
||||||
|
* If the list has no items, or if the totalLength is 0, then it returns a zero-length buffer.
|
||||||
|
* If the list has exactly one item, then the first item of the list is returned.
|
||||||
|
* If the list has more than one item, then a new Buffer is created.
|
||||||
|
*
|
||||||
|
* @param list An array of Buffer objects to concatenate
|
||||||
|
* @param totalLength Total length of the buffers when concatenated.
|
||||||
|
* If totalLength is not provided, it is read from the buffers in the list. However, this adds an additional loop to the function, so it is faster to provide the length explicitly.
|
||||||
|
*/
|
||||||
|
static concat(list: Buffer[], totalLength?: number): Buffer;
|
||||||
|
/**
|
||||||
|
* The same as buf1.compare(buf2).
|
||||||
|
*/
|
||||||
|
static compare(buf1: Buffer, buf2: Buffer): number;
|
||||||
|
/**
|
||||||
|
* Allocates a new buffer of {size} octets.
|
||||||
|
*
|
||||||
|
* @param size count of octets to allocate.
|
||||||
|
* @param fill if specified, buffer will be initialized by calling buf.fill(fill).
|
||||||
|
* If parameter is omitted, buffer will be filled with zeros.
|
||||||
|
* @param encoding encoding used for call to buf.fill while initalizing
|
||||||
|
*/
|
||||||
|
static alloc(size: number, fill?: string | Buffer | number, encoding?: string): Buffer;
|
||||||
|
/**
|
||||||
|
* Allocates a new buffer of {size} octets, leaving memory not initialized, so the contents
|
||||||
|
* of the newly created Buffer are unknown and may contain sensitive data.
|
||||||
|
*
|
||||||
|
* @param size count of octets to allocate
|
||||||
|
*/
|
||||||
|
static allocUnsafe(size: number): Buffer;
|
||||||
|
/**
|
||||||
|
* Allocates a new non-pooled buffer of {size} octets, leaving memory not initialized, so the contents
|
||||||
|
* of the newly created Buffer are unknown and may contain sensitive data.
|
||||||
|
*
|
||||||
|
* @param size count of octets to allocate
|
||||||
|
*/
|
||||||
|
static allocUnsafeSlow(size: number): Buffer;
|
||||||
|
}
|
||||||
+761
-515
File diff suppressed because it is too large
Load Diff
+51
-43
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "buffer",
|
"name": "buffer",
|
||||||
"description": "Node.js Buffer API, for the browser",
|
"description": "Node.js Buffer API, for the browser",
|
||||||
"version": "3.6.0",
|
"version": "5.6.0",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Feross Aboukhadijeh",
|
"name": "Feross Aboukhadijeh",
|
||||||
"email": "feross@feross.org",
|
"email": "feross@feross.org",
|
||||||
@@ -15,60 +15,68 @@
|
|||||||
"James Halliday <mail@substack.net>"
|
"James Halliday <mail@substack.net>"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"base64-js": "0.0.8",
|
"base64-js": "^1.0.2",
|
||||||
"ieee754": "^1.1.4",
|
"ieee754": "^1.1.4"
|
||||||
"isarray": "^1.0.0"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"benchmark": "^1.0.0",
|
"airtap": "^3.0.0",
|
||||||
"browserify": "^12.0.1",
|
"benchmark": "^2.0.0",
|
||||||
"concat-stream": "^1.4.7",
|
"browserify": "^16.1.0",
|
||||||
"hyperquest": "^1.0.1",
|
"concat-stream": "^2.0.0",
|
||||||
|
"hyperquest": "^2.0.0",
|
||||||
|
"is-buffer": "^2.0.0",
|
||||||
"is-nan": "^1.0.1",
|
"is-nan": "^1.0.1",
|
||||||
"split": "^1.0.0",
|
"split": "^1.0.0",
|
||||||
"standard": "^5.0.0",
|
"standard": "*",
|
||||||
"tape": "^4.0.0",
|
"tape": "^4.0.0",
|
||||||
"through2": "^2.0.0",
|
"through2": "^3.0.1",
|
||||||
"zuul": "^3.0.0"
|
"uglify-js": "^3.4.5"
|
||||||
},
|
},
|
||||||
"homepage": "https://github.com/feross/buffer",
|
"homepage": "https://github.com/feross/buffer",
|
||||||
"keywords": [
|
|
||||||
"buffer",
|
|
||||||
"browserify",
|
|
||||||
"compatible",
|
|
||||||
"browser",
|
|
||||||
"arraybuffer",
|
|
||||||
"uint8array",
|
|
||||||
"dataview"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"main": "index.js",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git://github.com/feross/buffer.git"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"test": "standard && node ./bin/test.js",
|
|
||||||
"test-browser": "zuul -- test/*.js test/node/*.js",
|
|
||||||
"test-browser-local": "zuul --local -- test/*.js test/node/*.js",
|
|
||||||
"test-node": "tape test/*.js test/node/*.js test/node-es6/*.js && OBJECT_IMPL=true tape test/*.js test/node/*.js",
|
|
||||||
"perf": "browserify --debug perf/bracket-notation.js > perf/bundle.js && open perf/index.html",
|
|
||||||
"perf-node": "node perf/bracket-notation.js && node perf/concat.js && node perf/copy-big.js && node perf/copy.js && node perf/new-big.js && node perf/new.js && node perf/readDoubleBE.js && node perf/readFloatBE.js && node perf/readUInt32LE.js && node perf/slice.js && node perf/writeFloatBE.js",
|
|
||||||
"size": "browserify -r ./ | uglifyjs -c -m | gzip | wc -c"
|
|
||||||
},
|
|
||||||
"standard": {
|
|
||||||
"ignore": [
|
|
||||||
"test/node/*.js",
|
|
||||||
"test/node-es6/*.js",
|
|
||||||
"test/_polyfill.js",
|
|
||||||
"perf/*.js"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"jspm": {
|
"jspm": {
|
||||||
"map": {
|
"map": {
|
||||||
"./index.js": {
|
"./index.js": {
|
||||||
"node": "@node/buffer"
|
"node": "@node/buffer"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"arraybuffer",
|
||||||
|
"browser",
|
||||||
|
"browserify",
|
||||||
|
"buffer",
|
||||||
|
"compatible",
|
||||||
|
"dataview",
|
||||||
|
"uint8array"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"main": "index.js",
|
||||||
|
"types": "index.d.ts",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/feross/buffer.git"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"perf": "browserify --debug perf/bracket-notation.js > perf/bundle.js && open perf/index.html",
|
||||||
|
"perf-node": "node perf/bracket-notation.js && node perf/concat.js && node perf/copy-big.js && node perf/copy.js && node perf/new-big.js && node perf/new.js && node perf/readDoubleBE.js && node perf/readFloatBE.js && node perf/readUInt32LE.js && node perf/slice.js && node perf/writeFloatBE.js",
|
||||||
|
"size": "browserify -r ./ | uglifyjs -c -m | gzip | wc -c",
|
||||||
|
"test": "standard && node ./bin/test.js",
|
||||||
|
"test-browser-es5": "airtap -- test/*.js",
|
||||||
|
"test-browser-es5-local": "airtap --local -- test/*.js",
|
||||||
|
"test-browser-es6": "airtap -- test/*.js test/node/*.js",
|
||||||
|
"test-browser-es6-local": "airtap --local -- test/*.js test/node/*.js",
|
||||||
|
"test-node": "tape test/*.js test/node/*.js",
|
||||||
|
"update-authors": "./bin/update-authors.sh"
|
||||||
|
},
|
||||||
|
"standard": {
|
||||||
|
"ignore": [
|
||||||
|
"test/node/**/*.js",
|
||||||
|
"test/common.js",
|
||||||
|
"test/_polyfill.js",
|
||||||
|
"perf/**/*.js"
|
||||||
|
],
|
||||||
|
"globals": [
|
||||||
|
"SharedArrayBuffer"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+296
-175
@@ -1,16 +1,20 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Module dependencies.
|
* Module dependencies.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var EventEmitter = require('events').EventEmitter;
|
var EventEmitter = require('events').EventEmitter;
|
||||||
var spawn = require('child_process').spawn;
|
var spawn = require('child_process').spawn;
|
||||||
var readlink = require('graceful-readlink').readlinkSync;
|
|
||||||
var path = require('path');
|
var path = require('path');
|
||||||
var dirname = path.dirname;
|
var dirname = path.dirname;
|
||||||
var basename = path.basename;
|
var basename = path.basename;
|
||||||
var fs = require('fs');
|
var fs = require('fs');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inherit `Command` from `EventEmitter.prototype`.
|
||||||
|
*/
|
||||||
|
|
||||||
|
require('util').inherits(Command, EventEmitter);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Expose the root command.
|
* Expose the root command.
|
||||||
*/
|
*/
|
||||||
@@ -39,9 +43,9 @@ exports.Option = Option;
|
|||||||
|
|
||||||
function Option(flags, description) {
|
function Option(flags, description) {
|
||||||
this.flags = flags;
|
this.flags = flags;
|
||||||
this.required = ~flags.indexOf('<');
|
this.required = flags.indexOf('<') >= 0;
|
||||||
this.optional = ~flags.indexOf('[');
|
this.optional = flags.indexOf('[') >= 0;
|
||||||
this.bool = !~flags.indexOf('-no-');
|
this.bool = flags.indexOf('-no-') === -1;
|
||||||
flags = flags.split(/[ ,|]+/);
|
flags = flags.split(/[ ,|]+/);
|
||||||
if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift();
|
if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift();
|
||||||
this.long = flags.shift();
|
this.long = flags.shift();
|
||||||
@@ -61,6 +65,18 @@ Option.prototype.name = function() {
|
|||||||
.replace('no-', '');
|
.replace('no-', '');
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return option name, in a camelcase format that can be used
|
||||||
|
* as a object attribute key.
|
||||||
|
*
|
||||||
|
* @return {String}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
Option.prototype.attributeName = function() {
|
||||||
|
return camelcase(this.name());
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if `arg` matches the short or long flag.
|
* Check if `arg` matches the short or long flag.
|
||||||
*
|
*
|
||||||
@@ -70,7 +86,7 @@ Option.prototype.name = function() {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
Option.prototype.is = function(arg) {
|
Option.prototype.is = function(arg) {
|
||||||
return arg == this.short || arg == this.long;
|
return this.short === arg || this.long === arg;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -83,18 +99,12 @@ Option.prototype.is = function(arg) {
|
|||||||
function Command(name) {
|
function Command(name) {
|
||||||
this.commands = [];
|
this.commands = [];
|
||||||
this.options = [];
|
this.options = [];
|
||||||
this._execs = [];
|
this._execs = {};
|
||||||
this._allowUnknownOption = false;
|
this._allowUnknownOption = false;
|
||||||
this._args = [];
|
this._args = [];
|
||||||
this._name = name;
|
this._name = name || '';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Inherit from `EventEmitter.prototype`.
|
|
||||||
*/
|
|
||||||
|
|
||||||
Command.prototype.__proto__ = EventEmitter.prototype;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add command `name`.
|
* Add command `name`.
|
||||||
*
|
*
|
||||||
@@ -157,6 +167,10 @@ Command.prototype.__proto__ = EventEmitter.prototype;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
Command.prototype.command = function(name, desc, opts) {
|
Command.prototype.command = function(name, desc, opts) {
|
||||||
|
if (typeof desc === 'object' && desc !== null) {
|
||||||
|
opts = desc;
|
||||||
|
desc = null;
|
||||||
|
}
|
||||||
opts = opts || {};
|
opts = opts || {};
|
||||||
var args = name.split(/ +/);
|
var args = name.split(/ +/);
|
||||||
var cmd = new Command(args.shift());
|
var cmd = new Command(args.shift());
|
||||||
@@ -165,8 +179,8 @@ Command.prototype.command = function(name, desc, opts) {
|
|||||||
cmd.description(desc);
|
cmd.description(desc);
|
||||||
this.executables = true;
|
this.executables = true;
|
||||||
this._execs[cmd._name] = true;
|
this._execs[cmd._name] = true;
|
||||||
|
if (opts.isDefault) this.defaultExecutable = cmd._name;
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd._noHelp = !!opts.noHelp;
|
cmd._noHelp = !!opts.noHelp;
|
||||||
this.commands.push(cmd);
|
this.commands.push(cmd);
|
||||||
cmd.parseExpectedArgs(args);
|
cmd.parseExpectedArgs(args);
|
||||||
@@ -182,9 +196,9 @@ Command.prototype.command = function(name, desc, opts) {
|
|||||||
* @api public
|
* @api public
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Command.prototype.arguments = function (desc) {
|
Command.prototype.arguments = function(desc) {
|
||||||
return this.parseExpectedArgs(desc.split(/ +/));
|
return this.parseExpectedArgs(desc.split(/ +/));
|
||||||
}
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add an implicit `help [cmd]` subcommand
|
* Add an implicit `help [cmd]` subcommand
|
||||||
@@ -278,7 +292,7 @@ Command.prototype.action = function(fn) {
|
|||||||
if (parsed.args.length) args = parsed.args.concat(args);
|
if (parsed.args.length) args = parsed.args.concat(args);
|
||||||
|
|
||||||
self._args.forEach(function(arg, i) {
|
self._args.forEach(function(arg, i) {
|
||||||
if (arg.required && null == args[i]) {
|
if (arg.required && args[i] == null) {
|
||||||
self.missingArgument(arg.name);
|
self.missingArgument(arg.name);
|
||||||
} else if (arg.variadic) {
|
} else if (arg.variadic) {
|
||||||
if (i !== self._args.length - 1) {
|
if (i !== self._args.length - 1) {
|
||||||
@@ -302,8 +316,8 @@ Command.prototype.action = function(fn) {
|
|||||||
};
|
};
|
||||||
var parent = this.parent || this;
|
var parent = this.parent || this;
|
||||||
var name = parent === this ? '*' : this._name;
|
var name = parent === this ? '*' : this._name;
|
||||||
parent.on(name, listener);
|
parent.on('command:' + name, listener);
|
||||||
if (this._alias) parent.on(this._alias, listener);
|
if (this._alias) parent.on('command:' + this._alias, listener);
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -350,39 +364,41 @@ Command.prototype.action = function(fn) {
|
|||||||
*
|
*
|
||||||
* @param {String} flags
|
* @param {String} flags
|
||||||
* @param {String} description
|
* @param {String} description
|
||||||
* @param {Function|Mixed} fn or default
|
* @param {Function|*} [fn] or default
|
||||||
* @param {Mixed} defaultValue
|
* @param {*} [defaultValue]
|
||||||
* @return {Command} for chaining
|
* @return {Command} for chaining
|
||||||
* @api public
|
* @api public
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Command.prototype.option = function(flags, description, fn, defaultValue) {
|
Command.prototype.option = function(flags, description, fn, defaultValue) {
|
||||||
var self = this
|
var self = this,
|
||||||
, option = new Option(flags, description)
|
option = new Option(flags, description),
|
||||||
, oname = option.name()
|
oname = option.name(),
|
||||||
, name = camelcase(oname);
|
name = option.attributeName();
|
||||||
|
|
||||||
// default as 3rd arg
|
// default as 3rd arg
|
||||||
if (typeof fn != 'function') {
|
if (typeof fn !== 'function') {
|
||||||
if (fn instanceof RegExp) {
|
if (fn instanceof RegExp) {
|
||||||
var regex = fn;
|
var regex = fn;
|
||||||
fn = function(val, def) {
|
fn = function(val, def) {
|
||||||
var m = regex.exec(val);
|
var m = regex.exec(val);
|
||||||
return m ? m[0] : def;
|
return m ? m[0] : def;
|
||||||
}
|
};
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
defaultValue = fn;
|
defaultValue = fn;
|
||||||
fn = null;
|
fn = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// preassign default value only for --no-*, [optional], or <required>
|
// preassign default value only for --no-*, [optional], or <required>
|
||||||
if (false == option.bool || option.optional || option.required) {
|
if (!option.bool || option.optional || option.required) {
|
||||||
// when --no-* we make sure default is true
|
// when --no-* we make sure default is true
|
||||||
if (false == option.bool) defaultValue = true;
|
if (!option.bool) defaultValue = true;
|
||||||
// preassign only if we have a default
|
// preassign only if we have a default
|
||||||
if (undefined !== defaultValue) self[name] = defaultValue;
|
if (defaultValue !== undefined) {
|
||||||
|
self[name] = defaultValue;
|
||||||
|
option.defaultValue = defaultValue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// register the option
|
// register the option
|
||||||
@@ -390,23 +406,23 @@ Command.prototype.option = function(flags, description, fn, defaultValue) {
|
|||||||
|
|
||||||
// when it's passed assign the value
|
// when it's passed assign the value
|
||||||
// and conditionally invoke the callback
|
// and conditionally invoke the callback
|
||||||
this.on(oname, function(val) {
|
this.on('option:' + oname, function(val) {
|
||||||
// coercion
|
// coercion
|
||||||
if (null !== val && fn) val = fn(val, undefined === self[name]
|
if (val !== null && fn) {
|
||||||
? defaultValue
|
val = fn(val, self[name] === undefined ? defaultValue : self[name]);
|
||||||
: self[name]);
|
}
|
||||||
|
|
||||||
// unassigned or bool
|
// unassigned or bool
|
||||||
if ('boolean' == typeof self[name] || 'undefined' == typeof self[name]) {
|
if (typeof self[name] === 'boolean' || typeof self[name] === 'undefined') {
|
||||||
// if no value, bool true, and we have a default, then use it!
|
// if no value, bool true, and we have a default, then use it!
|
||||||
if (null == val) {
|
if (val == null) {
|
||||||
self[name] = option.bool
|
self[name] = option.bool
|
||||||
? defaultValue || true
|
? defaultValue || true
|
||||||
: false;
|
: false;
|
||||||
} else {
|
} else {
|
||||||
self[name] = val;
|
self[name] = val;
|
||||||
}
|
}
|
||||||
} else if (null !== val) {
|
} else if (val !== null) {
|
||||||
// reassign
|
// reassign
|
||||||
self[name] = val;
|
self[name] = val;
|
||||||
}
|
}
|
||||||
@@ -446,7 +462,7 @@ Command.prototype.parse = function(argv) {
|
|||||||
this._name = this._name || basename(argv[1], '.js');
|
this._name = this._name || basename(argv[1], '.js');
|
||||||
|
|
||||||
// github-style sub-commands with no sub-command
|
// github-style sub-commands with no sub-command
|
||||||
if (this.executables && argv.length < 3) {
|
if (this.executables && argv.length < 3 && !this.defaultExecutable) {
|
||||||
// this user needs help
|
// this user needs help
|
||||||
argv.push('--help');
|
argv.push('--help');
|
||||||
}
|
}
|
||||||
@@ -459,7 +475,24 @@ Command.prototype.parse = function(argv) {
|
|||||||
|
|
||||||
// executable sub-commands
|
// executable sub-commands
|
||||||
var name = result.args[0];
|
var name = result.args[0];
|
||||||
if (this._execs[name] && typeof this._execs[name] != "function") {
|
|
||||||
|
var aliasCommand = null;
|
||||||
|
// check alias of sub commands
|
||||||
|
if (name) {
|
||||||
|
aliasCommand = this.commands.filter(function(command) {
|
||||||
|
return command.alias() === name;
|
||||||
|
})[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._execs[name] === true) {
|
||||||
|
return this.executeSubCommand(argv, args, parsed.unknown);
|
||||||
|
} else if (aliasCommand) {
|
||||||
|
// is alias of a subCommand
|
||||||
|
args[0] = aliasCommand._name;
|
||||||
|
return this.executeSubCommand(argv, args, parsed.unknown);
|
||||||
|
} else if (this.defaultExecutable) {
|
||||||
|
// use the default subcommand
|
||||||
|
args.unshift(this.defaultExecutable);
|
||||||
return this.executeSubCommand(argv, args, parsed.unknown);
|
return this.executeSubCommand(argv, args, parsed.unknown);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -479,10 +512,10 @@ Command.prototype.executeSubCommand = function(argv, args, unknown) {
|
|||||||
args = args.concat(unknown);
|
args = args.concat(unknown);
|
||||||
|
|
||||||
if (!args.length) this.help();
|
if (!args.length) this.help();
|
||||||
if ('help' == args[0] && 1 == args.length) this.help();
|
if (args[0] === 'help' && args.length === 1) this.help();
|
||||||
|
|
||||||
// <cmd> --help
|
// <cmd> --help
|
||||||
if ('help' == args[0]) {
|
if (args[0] === 'help') {
|
||||||
args[0] = args[1];
|
args[0] = args[1];
|
||||||
args[1] = '--help';
|
args[1] = '--help';
|
||||||
}
|
}
|
||||||
@@ -490,28 +523,27 @@ Command.prototype.executeSubCommand = function(argv, args, unknown) {
|
|||||||
// executable
|
// executable
|
||||||
var f = argv[1];
|
var f = argv[1];
|
||||||
// name of the subcommand, link `pm-install`
|
// name of the subcommand, link `pm-install`
|
||||||
var bin = basename(f, '.js') + '-' + args[0];
|
var bin = basename(f, path.extname(f)) + '-' + args[0];
|
||||||
|
|
||||||
|
|
||||||
// In case of globally installed, get the base dir where executable
|
// In case of globally installed, get the base dir where executable
|
||||||
// subcommand file should be located at
|
// subcommand file should be located at
|
||||||
var baseDir
|
var baseDir;
|
||||||
, link = readlink(f);
|
|
||||||
|
|
||||||
// when symbolink is relative path
|
var resolvedLink = fs.realpathSync(f);
|
||||||
if (link !== f && link.charAt(0) !== '/') {
|
|
||||||
link = path.join(dirname(f), link)
|
baseDir = dirname(resolvedLink);
|
||||||
}
|
|
||||||
baseDir = dirname(link);
|
|
||||||
|
|
||||||
// prefer local `./<bin>` to bin in the $PATH
|
// prefer local `./<bin>` to bin in the $PATH
|
||||||
var localBin = path.join(baseDir, bin);
|
var localBin = path.join(baseDir, bin);
|
||||||
|
|
||||||
// whether bin file is a js script with explicit `.js` extension
|
// whether bin file is a js script with explicit `.js` or `.ts` extension
|
||||||
var isExplicitJS = false;
|
var isExplicitJS = false;
|
||||||
if (exists(localBin + '.js')) {
|
if (exists(localBin + '.js')) {
|
||||||
bin = localBin + '.js';
|
bin = localBin + '.js';
|
||||||
isExplicitJS = true;
|
isExplicitJS = true;
|
||||||
|
} else if (exists(localBin + '.ts')) {
|
||||||
|
bin = localBin + '.ts';
|
||||||
|
isExplicitJS = true;
|
||||||
} else if (exists(localBin)) {
|
} else if (exists(localBin)) {
|
||||||
bin = localBin;
|
bin = localBin;
|
||||||
}
|
}
|
||||||
@@ -521,29 +553,38 @@ Command.prototype.executeSubCommand = function(argv, args, unknown) {
|
|||||||
var proc;
|
var proc;
|
||||||
if (process.platform !== 'win32') {
|
if (process.platform !== 'win32') {
|
||||||
if (isExplicitJS) {
|
if (isExplicitJS) {
|
||||||
args.unshift(localBin);
|
args.unshift(bin);
|
||||||
// add executable arguments to spawn
|
// add executable arguments to spawn
|
||||||
args = (process.execArgv || []).concat(args);
|
args = (process.execArgv || []).concat(args);
|
||||||
|
|
||||||
proc = spawn('node', args, { stdio: 'inherit', customFds: [0, 1, 2] });
|
proc = spawn(process.argv[0], args, { stdio: 'inherit', customFds: [0, 1, 2] });
|
||||||
} else {
|
} else {
|
||||||
proc = spawn(bin, args, { stdio: 'inherit', customFds: [0, 1, 2] });
|
proc = spawn(bin, args, { stdio: 'inherit', customFds: [0, 1, 2] });
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
args.unshift(localBin);
|
args.unshift(bin);
|
||||||
proc = spawn(process.execPath, args, { stdio: 'inherit'});
|
proc = spawn(process.execPath, args, { stdio: 'inherit' });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var signals = ['SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGINT', 'SIGHUP'];
|
||||||
|
signals.forEach(function(signal) {
|
||||||
|
process.on(signal, function() {
|
||||||
|
if (proc.killed === false && proc.exitCode === null) {
|
||||||
|
proc.kill(signal);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
proc.on('close', process.exit.bind(process));
|
proc.on('close', process.exit.bind(process));
|
||||||
proc.on('error', function(err) {
|
proc.on('error', function(err) {
|
||||||
if (err.code == "ENOENT") {
|
if (err.code === 'ENOENT') {
|
||||||
console.error('\n %s(1) does not exist, try --help\n', bin);
|
console.error('error: %s(1) does not exist, try --help', bin);
|
||||||
} else if (err.code == "EACCES") {
|
} else if (err.code === 'EACCES') {
|
||||||
console.error('\n %s(1) not executable. try chmod or run with root\n', bin);
|
console.error('error: %s(1) not executable. try chmod or run with root', bin);
|
||||||
}
|
}
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Store the reference to the child process
|
||||||
this.runningCommand = proc;
|
this.runningCommand = proc;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -558,15 +599,15 @@ Command.prototype.executeSubCommand = function(argv, args, unknown) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
Command.prototype.normalize = function(args) {
|
Command.prototype.normalize = function(args) {
|
||||||
var ret = []
|
var ret = [],
|
||||||
, arg
|
arg,
|
||||||
, lastOpt
|
lastOpt,
|
||||||
, index;
|
index;
|
||||||
|
|
||||||
for (var i = 0, len = args.length; i < len; ++i) {
|
for (var i = 0, len = args.length; i < len; ++i) {
|
||||||
arg = args[i];
|
arg = args[i];
|
||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
lastOpt = this.optionFor(args[i-1]);
|
lastOpt = this.optionFor(args[i - 1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (arg === '--') {
|
if (arg === '--') {
|
||||||
@@ -575,7 +616,7 @@ Command.prototype.normalize = function(args) {
|
|||||||
break;
|
break;
|
||||||
} else if (lastOpt && lastOpt.required) {
|
} else if (lastOpt && lastOpt.required) {
|
||||||
ret.push(arg);
|
ret.push(arg);
|
||||||
} else if (arg.length > 1 && '-' == arg[0] && '-' != arg[1]) {
|
} else if (arg.length > 1 && arg[0] === '-' && arg[1] !== '-') {
|
||||||
arg.slice(1).split('').forEach(function(c) {
|
arg.slice(1).split('').forEach(function(c) {
|
||||||
ret.push('-' + c);
|
ret.push('-' + c);
|
||||||
});
|
});
|
||||||
@@ -606,10 +647,10 @@ Command.prototype.parseArgs = function(args, unknown) {
|
|||||||
|
|
||||||
if (args.length) {
|
if (args.length) {
|
||||||
name = args[0];
|
name = args[0];
|
||||||
if (this.listeners(name).length) {
|
if (this.listeners('command:' + name).length) {
|
||||||
this.emit(args.shift(), args, unknown);
|
this.emit('command:' + args.shift(), args, unknown);
|
||||||
} else {
|
} else {
|
||||||
this.emit('*', args);
|
this.emit('command:*', args);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
outputHelpIfNecessary(this, unknown);
|
outputHelpIfNecessary(this, unknown);
|
||||||
@@ -619,6 +660,10 @@ Command.prototype.parseArgs = function(args, unknown) {
|
|||||||
if (unknown.length > 0) {
|
if (unknown.length > 0) {
|
||||||
this.unknownOption(unknown[0]);
|
this.unknownOption(unknown[0]);
|
||||||
}
|
}
|
||||||
|
if (this.commands.length === 0 &&
|
||||||
|
this._args.filter(function(a) { return a.required; }).length === 0) {
|
||||||
|
this.emit('command:*');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
@@ -650,11 +695,11 @@ Command.prototype.optionFor = function(arg) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
Command.prototype.parseOptions = function(argv) {
|
Command.prototype.parseOptions = function(argv) {
|
||||||
var args = []
|
var args = [],
|
||||||
, len = argv.length
|
len = argv.length,
|
||||||
, literal
|
literal,
|
||||||
, option
|
option,
|
||||||
, arg;
|
arg;
|
||||||
|
|
||||||
var unknownOptions = [];
|
var unknownOptions = [];
|
||||||
|
|
||||||
@@ -663,13 +708,13 @@ Command.prototype.parseOptions = function(argv) {
|
|||||||
arg = argv[i];
|
arg = argv[i];
|
||||||
|
|
||||||
// literal args after --
|
// literal args after --
|
||||||
if ('--' == arg) {
|
if (literal) {
|
||||||
literal = true;
|
args.push(arg);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (literal) {
|
if (arg === '--') {
|
||||||
args.push(arg);
|
literal = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -681,32 +726,32 @@ Command.prototype.parseOptions = function(argv) {
|
|||||||
// requires arg
|
// requires arg
|
||||||
if (option.required) {
|
if (option.required) {
|
||||||
arg = argv[++i];
|
arg = argv[++i];
|
||||||
if (null == arg) return this.optionMissingArgument(option);
|
if (arg == null) return this.optionMissingArgument(option);
|
||||||
this.emit(option.name(), arg);
|
this.emit('option:' + option.name(), arg);
|
||||||
// optional arg
|
// optional arg
|
||||||
} else if (option.optional) {
|
} else if (option.optional) {
|
||||||
arg = argv[i+1];
|
arg = argv[i + 1];
|
||||||
if (null == arg || ('-' == arg[0] && '-' != arg)) {
|
if (arg == null || (arg[0] === '-' && arg !== '-')) {
|
||||||
arg = null;
|
arg = null;
|
||||||
} else {
|
} else {
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
this.emit(option.name(), arg);
|
this.emit('option:' + option.name(), arg);
|
||||||
// bool
|
// bool
|
||||||
} else {
|
} else {
|
||||||
this.emit(option.name());
|
this.emit('option:' + option.name());
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// looks like an option
|
// looks like an option
|
||||||
if (arg.length > 1 && '-' == arg[0]) {
|
if (arg.length > 1 && arg[0] === '-') {
|
||||||
unknownOptions.push(arg);
|
unknownOptions.push(arg);
|
||||||
|
|
||||||
// If the next argument looks like it might be
|
// If the next argument looks like it might be
|
||||||
// an argument for this option, we pass it on.
|
// an argument for this option, we pass it on.
|
||||||
// If it isn't, then it'll simply be ignored
|
// If it isn't, then it'll simply be ignored
|
||||||
if (argv[i+1] && '-' != argv[i+1][0]) {
|
if ((i + 1) < argv.length && argv[i + 1][0] !== '-') {
|
||||||
unknownOptions.push(argv[++i]);
|
unknownOptions.push(argv[++i]);
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
@@ -726,12 +771,12 @@ Command.prototype.parseOptions = function(argv) {
|
|||||||
* @api public
|
* @api public
|
||||||
*/
|
*/
|
||||||
Command.prototype.opts = function() {
|
Command.prototype.opts = function() {
|
||||||
var result = {}
|
var result = {},
|
||||||
, len = this.options.length;
|
len = this.options.length;
|
||||||
|
|
||||||
for (var i = 0 ; i < len; i++) {
|
for (var i = 0; i < len; i++) {
|
||||||
var key = camelcase(this.options[i].name());
|
var key = this.options[i].attributeName();
|
||||||
result[key] = key === 'version' ? this._version : this[key];
|
result[key] = key === this._versionOptionName ? this._version : this[key];
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
@@ -744,9 +789,7 @@ Command.prototype.opts = function() {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
Command.prototype.missingArgument = function(name) {
|
Command.prototype.missingArgument = function(name) {
|
||||||
console.error();
|
console.error("error: missing required argument `%s'", name);
|
||||||
console.error(" error: missing required argument `%s'", name);
|
|
||||||
console.error();
|
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -759,13 +802,11 @@ Command.prototype.missingArgument = function(name) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
Command.prototype.optionMissingArgument = function(option, flag) {
|
Command.prototype.optionMissingArgument = function(option, flag) {
|
||||||
console.error();
|
|
||||||
if (flag) {
|
if (flag) {
|
||||||
console.error(" error: option `%s' argument missing, got `%s'", option.flags, flag);
|
console.error("error: option `%s' argument missing, got `%s'", option.flags, flag);
|
||||||
} else {
|
} else {
|
||||||
console.error(" error: option `%s' argument missing", option.flags);
|
console.error("error: option `%s' argument missing", option.flags);
|
||||||
}
|
}
|
||||||
console.error();
|
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -778,9 +819,7 @@ Command.prototype.optionMissingArgument = function(option, flag) {
|
|||||||
|
|
||||||
Command.prototype.unknownOption = function(flag) {
|
Command.prototype.unknownOption = function(flag) {
|
||||||
if (this._allowUnknownOption) return;
|
if (this._allowUnknownOption) return;
|
||||||
console.error();
|
console.error("error: unknown option `%s'", flag);
|
||||||
console.error(" error: unknown option `%s'", flag);
|
|
||||||
console.error();
|
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -792,9 +831,7 @@ Command.prototype.unknownOption = function(flag) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
Command.prototype.variadicArgNotLast = function(name) {
|
Command.prototype.variadicArgNotLast = function(name) {
|
||||||
console.error();
|
console.error("error: variadic arguments must be last `%s'", name);
|
||||||
console.error(" error: variadic arguments must be last `%s'", name);
|
|
||||||
console.error();
|
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -805,17 +842,19 @@ Command.prototype.variadicArgNotLast = function(name) {
|
|||||||
* which will print the version number when passed.
|
* which will print the version number when passed.
|
||||||
*
|
*
|
||||||
* @param {String} str
|
* @param {String} str
|
||||||
* @param {String} flags
|
* @param {String} [flags]
|
||||||
* @return {Command} for chaining
|
* @return {Command} for chaining
|
||||||
* @api public
|
* @api public
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Command.prototype.version = function(str, flags) {
|
Command.prototype.version = function(str, flags) {
|
||||||
if (0 == arguments.length) return this._version;
|
if (arguments.length === 0) return this._version;
|
||||||
this._version = str;
|
this._version = str;
|
||||||
flags = flags || '-V, --version';
|
flags = flags || '-V, --version';
|
||||||
this.option(flags, 'output the version number');
|
var versionOption = new Option(flags, 'output the version number');
|
||||||
this.on('version', function() {
|
this._versionOptionName = versionOption.long.substr(2) || 'version';
|
||||||
|
this.options.push(versionOption);
|
||||||
|
this.on('option:' + this._versionOptionName, function() {
|
||||||
process.stdout.write(str + '\n');
|
process.stdout.write(str + '\n');
|
||||||
process.exit(0);
|
process.exit(0);
|
||||||
});
|
});
|
||||||
@@ -826,13 +865,15 @@ Command.prototype.version = function(str, flags) {
|
|||||||
* Set the description to `str`.
|
* Set the description to `str`.
|
||||||
*
|
*
|
||||||
* @param {String} str
|
* @param {String} str
|
||||||
|
* @param {Object} argsDescription
|
||||||
* @return {String|Command}
|
* @return {String|Command}
|
||||||
* @api public
|
* @api public
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Command.prototype.description = function(str) {
|
Command.prototype.description = function(str, argsDescription) {
|
||||||
if (0 == arguments.length) return this._description;
|
if (arguments.length === 0) return this._description;
|
||||||
this._description = str;
|
this._description = str;
|
||||||
|
this._argsDescription = argsDescription;
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -845,8 +886,16 @@ Command.prototype.description = function(str) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
Command.prototype.alias = function(alias) {
|
Command.prototype.alias = function(alias) {
|
||||||
if (0 == arguments.length) return this._alias;
|
var command = this;
|
||||||
this._alias = alias;
|
if (this.commands.length !== 0) {
|
||||||
|
command = this.commands[this.commands.length - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (arguments.length === 0) return command._alias;
|
||||||
|
|
||||||
|
if (alias === command._name) throw new Error('Command alias can\'t be the same as its name');
|
||||||
|
|
||||||
|
command._alias = alias;
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -863,26 +912,67 @@ Command.prototype.usage = function(str) {
|
|||||||
return humanReadableArgName(arg);
|
return humanReadableArgName(arg);
|
||||||
});
|
});
|
||||||
|
|
||||||
var usage = '[options]'
|
var usage = '[options]' +
|
||||||
+ (this.commands.length ? ' [command]' : '')
|
(this.commands.length ? ' [command]' : '') +
|
||||||
+ (this._args.length ? ' ' + args.join(' ') : '');
|
(this._args.length ? ' ' + args.join(' ') : '');
|
||||||
|
|
||||||
if (0 == arguments.length) return this._usage || usage;
|
if (arguments.length === 0) return this._usage || usage;
|
||||||
this._usage = str;
|
this._usage = str;
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the name of the command
|
* Get or set the name of the command
|
||||||
*
|
*
|
||||||
* @param {String} name
|
* @param {String} str
|
||||||
* @return {String|Command}
|
* @return {String|Command}
|
||||||
* @api public
|
* @api public
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Command.prototype.name = function() {
|
Command.prototype.name = function(str) {
|
||||||
return this._name;
|
if (arguments.length === 0) return this._name;
|
||||||
|
this._name = str;
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return prepared commands.
|
||||||
|
*
|
||||||
|
* @return {Array}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
Command.prototype.prepareCommands = function() {
|
||||||
|
return this.commands.filter(function(cmd) {
|
||||||
|
return !cmd._noHelp;
|
||||||
|
}).map(function(cmd) {
|
||||||
|
var args = cmd._args.map(function(arg) {
|
||||||
|
return humanReadableArgName(arg);
|
||||||
|
}).join(' ');
|
||||||
|
|
||||||
|
return [
|
||||||
|
cmd._name +
|
||||||
|
(cmd._alias ? '|' + cmd._alias : '') +
|
||||||
|
(cmd.options.length ? ' [options]' : '') +
|
||||||
|
(args ? ' ' + args : ''),
|
||||||
|
cmd._description
|
||||||
|
];
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the largest command length.
|
||||||
|
*
|
||||||
|
* @return {Number}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
Command.prototype.largestCommandLength = function() {
|
||||||
|
var commands = this.prepareCommands();
|
||||||
|
return commands.reduce(function(max, command) {
|
||||||
|
return Math.max(max, command[0].length);
|
||||||
|
}, 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -893,11 +983,52 @@ Command.prototype.name = function() {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
Command.prototype.largestOptionLength = function() {
|
Command.prototype.largestOptionLength = function() {
|
||||||
return this.options.reduce(function(max, option) {
|
var options = [].slice.call(this.options);
|
||||||
|
options.push({
|
||||||
|
flags: '-h, --help'
|
||||||
|
});
|
||||||
|
return options.reduce(function(max, option) {
|
||||||
return Math.max(max, option.flags.length);
|
return Math.max(max, option.flags.length);
|
||||||
}, 0);
|
}, 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the largest arg length.
|
||||||
|
*
|
||||||
|
* @return {Number}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
Command.prototype.largestArgLength = function() {
|
||||||
|
return this._args.reduce(function(max, arg) {
|
||||||
|
return Math.max(max, arg.name.length);
|
||||||
|
}, 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the pad width.
|
||||||
|
*
|
||||||
|
* @return {Number}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
Command.prototype.padWidth = function() {
|
||||||
|
var width = this.largestOptionLength();
|
||||||
|
if (this._argsDescription && this._args.length) {
|
||||||
|
if (this.largestArgLength() > width) {
|
||||||
|
width = this.largestArgLength();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.commands && this.commands.length) {
|
||||||
|
if (this.largestCommandLength() > width) {
|
||||||
|
width = this.largestCommandLength();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return width;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return help for options.
|
* Return help for options.
|
||||||
*
|
*
|
||||||
@@ -906,13 +1037,13 @@ Command.prototype.largestOptionLength = function() {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
Command.prototype.optionHelp = function() {
|
Command.prototype.optionHelp = function() {
|
||||||
var width = this.largestOptionLength();
|
var width = this.padWidth();
|
||||||
|
|
||||||
// Prepend the help information
|
// Append the help information
|
||||||
return [pad('-h, --help', width) + ' ' + 'output usage information']
|
return this.options.map(function(option) {
|
||||||
.concat(this.options.map(function(option) {
|
return pad(option.flags, width) + ' ' + option.description +
|
||||||
return pad(option.flags, width) + ' ' + option.description;
|
((option.bool && option.defaultValue !== undefined) ? ' (default: ' + JSON.stringify(option.defaultValue) + ')' : '');
|
||||||
}))
|
}).concat([pad('-h, --help', width) + ' ' + 'output usage information'])
|
||||||
.join('\n');
|
.join('\n');
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -926,38 +1057,16 @@ Command.prototype.optionHelp = function() {
|
|||||||
Command.prototype.commandHelp = function() {
|
Command.prototype.commandHelp = function() {
|
||||||
if (!this.commands.length) return '';
|
if (!this.commands.length) return '';
|
||||||
|
|
||||||
var commands = this.commands.filter(function(cmd) {
|
var commands = this.prepareCommands();
|
||||||
return !cmd._noHelp;
|
var width = this.padWidth();
|
||||||
}).map(function(cmd) {
|
|
||||||
var args = cmd._args.map(function(arg) {
|
|
||||||
return humanReadableArgName(arg);
|
|
||||||
}).join(' ');
|
|
||||||
|
|
||||||
return [
|
|
||||||
cmd._name
|
|
||||||
+ (cmd._alias
|
|
||||||
? '|' + cmd._alias
|
|
||||||
: '')
|
|
||||||
+ (cmd.options.length
|
|
||||||
? ' [options]'
|
|
||||||
: '')
|
|
||||||
+ ' ' + args
|
|
||||||
, cmd.description()
|
|
||||||
];
|
|
||||||
});
|
|
||||||
|
|
||||||
var width = commands.reduce(function(max, command) {
|
|
||||||
return Math.max(max, command[0].length);
|
|
||||||
}, 0);
|
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
'Commands:',
|
||||||
|
commands.map(function(cmd) {
|
||||||
|
var desc = cmd[1] ? ' ' + cmd[1] : '';
|
||||||
|
return (desc ? pad(cmd[0], width) : cmd[0]) + desc;
|
||||||
|
}).join('\n').replace(/^/gm, ' '),
|
||||||
''
|
''
|
||||||
, ' Commands:'
|
|
||||||
, ''
|
|
||||||
, commands.map(function(cmd) {
|
|
||||||
return pad(cmd[0], width) + ' ' + cmd[1];
|
|
||||||
}).join('\n').replace(/^/gm, ' ')
|
|
||||||
, ''
|
|
||||||
].join('\n');
|
].join('\n');
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -972,9 +1081,20 @@ Command.prototype.helpInformation = function() {
|
|||||||
var desc = [];
|
var desc = [];
|
||||||
if (this._description) {
|
if (this._description) {
|
||||||
desc = [
|
desc = [
|
||||||
' ' + this._description
|
this._description,
|
||||||
, ''
|
''
|
||||||
];
|
];
|
||||||
|
|
||||||
|
var argsDescription = this._argsDescription;
|
||||||
|
if (argsDescription && this._args.length) {
|
||||||
|
var width = this.padWidth();
|
||||||
|
desc.push('Arguments:');
|
||||||
|
desc.push('');
|
||||||
|
this._args.forEach(function(arg) {
|
||||||
|
desc.push(' ' + pad(arg.name, width) + ' ' + argsDescription[arg.name]);
|
||||||
|
});
|
||||||
|
desc.push('');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var cmdName = this._name;
|
var cmdName = this._name;
|
||||||
@@ -982,9 +1102,8 @@ Command.prototype.helpInformation = function() {
|
|||||||
cmdName = cmdName + '|' + this._alias;
|
cmdName = cmdName + '|' + this._alias;
|
||||||
}
|
}
|
||||||
var usage = [
|
var usage = [
|
||||||
|
'Usage: ' + cmdName + ' ' + this.usage(),
|
||||||
''
|
''
|
||||||
,' Usage: ' + cmdName + ' ' + this.usage()
|
|
||||||
, ''
|
|
||||||
];
|
];
|
||||||
|
|
||||||
var cmds = [];
|
var cmds = [];
|
||||||
@@ -992,17 +1111,15 @@ Command.prototype.helpInformation = function() {
|
|||||||
if (commandHelp) cmds = [commandHelp];
|
if (commandHelp) cmds = [commandHelp];
|
||||||
|
|
||||||
var options = [
|
var options = [
|
||||||
' Options:'
|
'Options:',
|
||||||
, ''
|
'' + this.optionHelp().replace(/^/gm, ' '),
|
||||||
, '' + this.optionHelp().replace(/^/gm, ' ')
|
''
|
||||||
, ''
|
|
||||||
, ''
|
|
||||||
];
|
];
|
||||||
|
|
||||||
return usage
|
return usage
|
||||||
.concat(cmds)
|
|
||||||
.concat(desc)
|
.concat(desc)
|
||||||
.concat(options)
|
.concat(options)
|
||||||
|
.concat(cmds)
|
||||||
.join('\n');
|
.join('\n');
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1012,8 +1129,13 @@ Command.prototype.helpInformation = function() {
|
|||||||
* @api public
|
* @api public
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Command.prototype.outputHelp = function() {
|
Command.prototype.outputHelp = function(cb) {
|
||||||
process.stdout.write(this.helpInformation());
|
if (!cb) {
|
||||||
|
cb = function(passthru) {
|
||||||
|
return passthru;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
process.stdout.write(cb(this.helpInformation()));
|
||||||
this.emit('--help');
|
this.emit('--help');
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1023,8 +1145,8 @@ Command.prototype.outputHelp = function() {
|
|||||||
* @api public
|
* @api public
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Command.prototype.help = function() {
|
Command.prototype.help = function(cb) {
|
||||||
this.outputHelp();
|
this.outputHelp(cb);
|
||||||
process.exit();
|
process.exit();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1067,7 +1189,7 @@ function pad(str, width) {
|
|||||||
function outputHelpIfNecessary(cmd, options) {
|
function outputHelpIfNecessary(cmd, options) {
|
||||||
options = options || [];
|
options = options || [];
|
||||||
for (var i = 0; i < options.length; i++) {
|
for (var i = 0; i < options.length; i++) {
|
||||||
if (options[i] == '--help' || options[i] == '-h') {
|
if (options[i] === '--help' || options[i] === '-h') {
|
||||||
cmd.outputHelp();
|
cmd.outputHelp();
|
||||||
process.exit(0);
|
process.exit(0);
|
||||||
}
|
}
|
||||||
@@ -1087,7 +1209,7 @@ function humanReadableArgName(arg) {
|
|||||||
|
|
||||||
return arg.required
|
return arg.required
|
||||||
? '<' + nameOutput + '>'
|
? '<' + nameOutput + '>'
|
||||||
: '[' + nameOutput + ']'
|
: '[' + nameOutput + ']';
|
||||||
}
|
}
|
||||||
|
|
||||||
// for versions before node v0.8 when there weren't `fs.existsSync`
|
// for versions before node v0.8 when there weren't `fs.existsSync`
|
||||||
@@ -1100,4 +1222,3 @@ function exists(file) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+18
-13
@@ -1,8 +1,9 @@
|
|||||||
{
|
{
|
||||||
"name": "commander",
|
"name": "commander",
|
||||||
"version": "2.8.1",
|
"version": "2.20.3",
|
||||||
"description": "the complete solution for node.js command-line programs",
|
"description": "the complete solution for node.js command-line programs",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
|
"commander",
|
||||||
"command",
|
"command",
|
||||||
"option",
|
"option",
|
||||||
"parser"
|
"parser"
|
||||||
@@ -13,21 +14,25 @@
|
|||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/tj/commander.js.git"
|
"url": "https://github.com/tj/commander.js.git"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
|
||||||
"should": ">= 0.0.1",
|
|
||||||
"sinon": ">= 1.14.1"
|
|
||||||
},
|
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "make test"
|
"lint": "eslint index.js",
|
||||||
|
"test": "node test/run.js && npm run test-typings",
|
||||||
|
"test-typings": "tsc -p tsconfig.json"
|
||||||
},
|
},
|
||||||
"main": "index",
|
"main": "index",
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.6.x"
|
|
||||||
},
|
|
||||||
"files": [
|
"files": [
|
||||||
"index.js"
|
"index.js",
|
||||||
|
"typings/index.d.ts"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {},
|
||||||
"graceful-readlink": ">= 1.0.0"
|
"devDependencies": {
|
||||||
}
|
"@types/node": "^12.7.8",
|
||||||
|
"eslint": "^6.4.0",
|
||||||
|
"should": "^13.2.3",
|
||||||
|
"sinon": "^7.5.0",
|
||||||
|
"standard": "^14.3.1",
|
||||||
|
"ts-node": "^8.4.1",
|
||||||
|
"typescript": "^3.6.3"
|
||||||
|
},
|
||||||
|
"typings": "typings/index.d.ts"
|
||||||
}
|
}
|
||||||
|
|||||||
+310
@@ -0,0 +1,310 @@
|
|||||||
|
// Type definitions for commander 2.11
|
||||||
|
// Project: https://github.com/visionmedia/commander.js
|
||||||
|
// Definitions by: Alan Agius <https://github.com/alan-agius4>, Marcelo Dezem <https://github.com/mdezem>, vvakame <https://github.com/vvakame>, Jules Randolph <https://github.com/sveinburne>
|
||||||
|
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
|
||||||
|
|
||||||
|
declare namespace local {
|
||||||
|
|
||||||
|
class Option {
|
||||||
|
flags: string;
|
||||||
|
required: boolean;
|
||||||
|
optional: boolean;
|
||||||
|
bool: boolean;
|
||||||
|
short?: string;
|
||||||
|
long: string;
|
||||||
|
description: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize a new `Option` with the given `flags` and `description`.
|
||||||
|
*
|
||||||
|
* @param {string} flags
|
||||||
|
* @param {string} [description]
|
||||||
|
*/
|
||||||
|
constructor(flags: string, description?: string);
|
||||||
|
}
|
||||||
|
|
||||||
|
class Command extends NodeJS.EventEmitter {
|
||||||
|
[key: string]: any;
|
||||||
|
|
||||||
|
args: string[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize a new `Command`.
|
||||||
|
*
|
||||||
|
* @param {string} [name]
|
||||||
|
*/
|
||||||
|
constructor(name?: string);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the program version to `str`.
|
||||||
|
*
|
||||||
|
* This method auto-registers the "-V, --version" flag
|
||||||
|
* which will print the version number when passed.
|
||||||
|
*
|
||||||
|
* @param {string} str
|
||||||
|
* @param {string} [flags]
|
||||||
|
* @returns {Command} for chaining
|
||||||
|
*/
|
||||||
|
version(str: string, flags?: string): Command;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add command `name`.
|
||||||
|
*
|
||||||
|
* The `.action()` callback is invoked when the
|
||||||
|
* command `name` is specified via __ARGV__,
|
||||||
|
* and the remaining arguments are applied to the
|
||||||
|
* function for access.
|
||||||
|
*
|
||||||
|
* When the `name` is "*" an un-matched command
|
||||||
|
* will be passed as the first arg, followed by
|
||||||
|
* the rest of __ARGV__ remaining.
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* program
|
||||||
|
* .version('0.0.1')
|
||||||
|
* .option('-C, --chdir <path>', 'change the working directory')
|
||||||
|
* .option('-c, --config <path>', 'set config path. defaults to ./deploy.conf')
|
||||||
|
* .option('-T, --no-tests', 'ignore test hook')
|
||||||
|
*
|
||||||
|
* program
|
||||||
|
* .command('setup')
|
||||||
|
* .description('run remote setup commands')
|
||||||
|
* .action(function() {
|
||||||
|
* console.log('setup');
|
||||||
|
* });
|
||||||
|
*
|
||||||
|
* program
|
||||||
|
* .command('exec <cmd>')
|
||||||
|
* .description('run the given remote command')
|
||||||
|
* .action(function(cmd) {
|
||||||
|
* console.log('exec "%s"', cmd);
|
||||||
|
* });
|
||||||
|
*
|
||||||
|
* program
|
||||||
|
* .command('teardown <dir> [otherDirs...]')
|
||||||
|
* .description('run teardown commands')
|
||||||
|
* .action(function(dir, otherDirs) {
|
||||||
|
* console.log('dir "%s"', dir);
|
||||||
|
* if (otherDirs) {
|
||||||
|
* otherDirs.forEach(function (oDir) {
|
||||||
|
* console.log('dir "%s"', oDir);
|
||||||
|
* });
|
||||||
|
* }
|
||||||
|
* });
|
||||||
|
*
|
||||||
|
* program
|
||||||
|
* .command('*')
|
||||||
|
* .description('deploy the given env')
|
||||||
|
* .action(function(env) {
|
||||||
|
* console.log('deploying "%s"', env);
|
||||||
|
* });
|
||||||
|
*
|
||||||
|
* program.parse(process.argv);
|
||||||
|
*
|
||||||
|
* @param {string} name
|
||||||
|
* @param {string} [desc] for git-style sub-commands
|
||||||
|
* @param {CommandOptions} [opts] command options
|
||||||
|
* @returns {Command} the new command
|
||||||
|
*/
|
||||||
|
command(name: string, desc?: string, opts?: commander.CommandOptions): Command;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define argument syntax for the top-level command.
|
||||||
|
*
|
||||||
|
* @param {string} desc
|
||||||
|
* @returns {Command} for chaining
|
||||||
|
*/
|
||||||
|
arguments(desc: string): Command;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse expected `args`.
|
||||||
|
*
|
||||||
|
* For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`.
|
||||||
|
*
|
||||||
|
* @param {string[]} args
|
||||||
|
* @returns {Command} for chaining
|
||||||
|
*/
|
||||||
|
parseExpectedArgs(args: string[]): Command;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register callback `fn` for the command.
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* program
|
||||||
|
* .command('help')
|
||||||
|
* .description('display verbose help')
|
||||||
|
* .action(function() {
|
||||||
|
* // output help here
|
||||||
|
* });
|
||||||
|
*
|
||||||
|
* @param {(...args: any[]) => void} fn
|
||||||
|
* @returns {Command} for chaining
|
||||||
|
*/
|
||||||
|
action(fn: (...args: any[]) => void): Command;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define option with `flags`, `description` and optional
|
||||||
|
* coercion `fn`.
|
||||||
|
*
|
||||||
|
* The `flags` string should contain both the short and long flags,
|
||||||
|
* separated by comma, a pipe or space. The following are all valid
|
||||||
|
* all will output this way when `--help` is used.
|
||||||
|
*
|
||||||
|
* "-p, --pepper"
|
||||||
|
* "-p|--pepper"
|
||||||
|
* "-p --pepper"
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* // simple boolean defaulting to false
|
||||||
|
* program.option('-p, --pepper', 'add pepper');
|
||||||
|
*
|
||||||
|
* --pepper
|
||||||
|
* program.pepper
|
||||||
|
* // => Boolean
|
||||||
|
*
|
||||||
|
* // simple boolean defaulting to true
|
||||||
|
* program.option('-C, --no-cheese', 'remove cheese');
|
||||||
|
*
|
||||||
|
* program.cheese
|
||||||
|
* // => true
|
||||||
|
*
|
||||||
|
* --no-cheese
|
||||||
|
* program.cheese
|
||||||
|
* // => false
|
||||||
|
*
|
||||||
|
* // required argument
|
||||||
|
* program.option('-C, --chdir <path>', 'change the working directory');
|
||||||
|
*
|
||||||
|
* --chdir /tmp
|
||||||
|
* program.chdir
|
||||||
|
* // => "/tmp"
|
||||||
|
*
|
||||||
|
* // optional argument
|
||||||
|
* program.option('-c, --cheese [type]', 'add cheese [marble]');
|
||||||
|
*
|
||||||
|
* @param {string} flags
|
||||||
|
* @param {string} [description]
|
||||||
|
* @param {((arg1: any, arg2: any) => void) | RegExp} [fn] function or default
|
||||||
|
* @param {*} [defaultValue]
|
||||||
|
* @returns {Command} for chaining
|
||||||
|
*/
|
||||||
|
option(flags: string, description?: string, fn?: ((arg1: any, arg2: any) => void) | RegExp, defaultValue?: any): Command;
|
||||||
|
option(flags: string, description?: string, defaultValue?: any): Command;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allow unknown options on the command line.
|
||||||
|
*
|
||||||
|
* @param {boolean} [arg] if `true` or omitted, no error will be thrown for unknown options.
|
||||||
|
* @returns {Command} for chaining
|
||||||
|
*/
|
||||||
|
allowUnknownOption(arg?: boolean): Command;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse `argv`, settings options and invoking commands when defined.
|
||||||
|
*
|
||||||
|
* @param {string[]} argv
|
||||||
|
* @returns {Command} for chaining
|
||||||
|
*/
|
||||||
|
parse(argv: string[]): Command;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse options from `argv` returning `argv` void of these options.
|
||||||
|
*
|
||||||
|
* @param {string[]} argv
|
||||||
|
* @returns {ParseOptionsResult}
|
||||||
|
*/
|
||||||
|
parseOptions(argv: string[]): commander.ParseOptionsResult;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return an object containing options as key-value pairs
|
||||||
|
*
|
||||||
|
* @returns {{[key: string]: any}}
|
||||||
|
*/
|
||||||
|
opts(): { [key: string]: any };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the description to `str`.
|
||||||
|
*
|
||||||
|
* @param {string} str
|
||||||
|
* @param {{[argName: string]: string}} argsDescription
|
||||||
|
* @return {(Command | string)}
|
||||||
|
*/
|
||||||
|
description(str: string, argsDescription?: {[argName: string]: string}): Command;
|
||||||
|
description(): string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set an alias for the command.
|
||||||
|
*
|
||||||
|
* @param {string} alias
|
||||||
|
* @return {(Command | string)}
|
||||||
|
*/
|
||||||
|
alias(alias: string): Command;
|
||||||
|
alias(): string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set or get the command usage.
|
||||||
|
*
|
||||||
|
* @param {string} str
|
||||||
|
* @return {(Command | string)}
|
||||||
|
*/
|
||||||
|
usage(str: string): Command;
|
||||||
|
usage(): string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the name of the command.
|
||||||
|
*
|
||||||
|
* @param {string} str
|
||||||
|
* @return {Command}
|
||||||
|
*/
|
||||||
|
name(str: string): Command;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the name of the command.
|
||||||
|
*
|
||||||
|
* @return {string}
|
||||||
|
*/
|
||||||
|
name(): string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Output help information for this command.
|
||||||
|
*
|
||||||
|
* @param {(str: string) => string} [cb]
|
||||||
|
*/
|
||||||
|
outputHelp(cb?: (str: string) => string): void;
|
||||||
|
|
||||||
|
/** Output help information and exit.
|
||||||
|
*
|
||||||
|
* @param {(str: string) => string} [cb]
|
||||||
|
*/
|
||||||
|
help(cb?: (str: string) => string): never;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
declare namespace commander {
|
||||||
|
|
||||||
|
type Command = local.Command
|
||||||
|
|
||||||
|
type Option = local.Option
|
||||||
|
|
||||||
|
interface CommandOptions {
|
||||||
|
noHelp?: boolean;
|
||||||
|
isDefault?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ParseOptionsResult {
|
||||||
|
args: string[];
|
||||||
|
unknown: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
interface CommanderStatic extends Command {
|
||||||
|
Command: typeof local.Command;
|
||||||
|
Option: typeof local.Option;
|
||||||
|
CommandOptions: CommandOptions;
|
||||||
|
ParseOptionsResult: ParseOptionsResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
declare const commander: commander.CommanderStatic;
|
||||||
|
export = commander;
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
var concatMap = require('../');
|
||||||
|
var xs = [ 1, 2, 3, 4, 5, 6 ];
|
||||||
|
var ys = concatMap(xs, function (x) {
|
||||||
|
return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
|
||||||
|
});
|
||||||
|
console.dir(ys);
|
||||||
+604
@@ -0,0 +1,604 @@
|
|||||||
|
diff --git a/lib/util.js b/lib/util.js
|
||||||
|
index a03e874..9074e8e 100644
|
||||||
|
--- a/lib/util.js
|
||||||
|
+++ b/lib/util.js
|
||||||
|
@@ -19,430 +19,6 @@
|
||||||
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||||
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
-var formatRegExp = /%[sdj%]/g;
|
||||||
|
-exports.format = function(f) {
|
||||||
|
- if (!isString(f)) {
|
||||||
|
- var objects = [];
|
||||||
|
- for (var i = 0; i < arguments.length; i++) {
|
||||||
|
- objects.push(inspect(arguments[i]));
|
||||||
|
- }
|
||||||
|
- return objects.join(' ');
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- var i = 1;
|
||||||
|
- var args = arguments;
|
||||||
|
- var len = args.length;
|
||||||
|
- var str = String(f).replace(formatRegExp, function(x) {
|
||||||
|
- if (x === '%%') return '%';
|
||||||
|
- if (i >= len) return x;
|
||||||
|
- switch (x) {
|
||||||
|
- case '%s': return String(args[i++]);
|
||||||
|
- case '%d': return Number(args[i++]);
|
||||||
|
- case '%j':
|
||||||
|
- try {
|
||||||
|
- return JSON.stringify(args[i++]);
|
||||||
|
- } catch (_) {
|
||||||
|
- return '[Circular]';
|
||||||
|
- }
|
||||||
|
- default:
|
||||||
|
- return x;
|
||||||
|
- }
|
||||||
|
- });
|
||||||
|
- for (var x = args[i]; i < len; x = args[++i]) {
|
||||||
|
- if (isNull(x) || !isObject(x)) {
|
||||||
|
- str += ' ' + x;
|
||||||
|
- } else {
|
||||||
|
- str += ' ' + inspect(x);
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- return str;
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-// Mark that a method should not be used.
|
||||||
|
-// Returns a modified function which warns once by default.
|
||||||
|
-// If --no-deprecation is set, then it is a no-op.
|
||||||
|
-exports.deprecate = function(fn, msg) {
|
||||||
|
- // Allow for deprecating things in the process of starting up.
|
||||||
|
- if (isUndefined(global.process)) {
|
||||||
|
- return function() {
|
||||||
|
- return exports.deprecate(fn, msg).apply(this, arguments);
|
||||||
|
- };
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (process.noDeprecation === true) {
|
||||||
|
- return fn;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- var warned = false;
|
||||||
|
- function deprecated() {
|
||||||
|
- if (!warned) {
|
||||||
|
- if (process.throwDeprecation) {
|
||||||
|
- throw new Error(msg);
|
||||||
|
- } else if (process.traceDeprecation) {
|
||||||
|
- console.trace(msg);
|
||||||
|
- } else {
|
||||||
|
- console.error(msg);
|
||||||
|
- }
|
||||||
|
- warned = true;
|
||||||
|
- }
|
||||||
|
- return fn.apply(this, arguments);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- return deprecated;
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-var debugs = {};
|
||||||
|
-var debugEnviron;
|
||||||
|
-exports.debuglog = function(set) {
|
||||||
|
- if (isUndefined(debugEnviron))
|
||||||
|
- debugEnviron = process.env.NODE_DEBUG || '';
|
||||||
|
- set = set.toUpperCase();
|
||||||
|
- if (!debugs[set]) {
|
||||||
|
- if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
|
||||||
|
- var pid = process.pid;
|
||||||
|
- debugs[set] = function() {
|
||||||
|
- var msg = exports.format.apply(exports, arguments);
|
||||||
|
- console.error('%s %d: %s', set, pid, msg);
|
||||||
|
- };
|
||||||
|
- } else {
|
||||||
|
- debugs[set] = function() {};
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- return debugs[set];
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-/**
|
||||||
|
- * Echos the value of a value. Trys to print the value out
|
||||||
|
- * in the best way possible given the different types.
|
||||||
|
- *
|
||||||
|
- * @param {Object} obj The object to print out.
|
||||||
|
- * @param {Object} opts Optional options object that alters the output.
|
||||||
|
- */
|
||||||
|
-/* legacy: obj, showHidden, depth, colors*/
|
||||||
|
-function inspect(obj, opts) {
|
||||||
|
- // default options
|
||||||
|
- var ctx = {
|
||||||
|
- seen: [],
|
||||||
|
- stylize: stylizeNoColor
|
||||||
|
- };
|
||||||
|
- // legacy...
|
||||||
|
- if (arguments.length >= 3) ctx.depth = arguments[2];
|
||||||
|
- if (arguments.length >= 4) ctx.colors = arguments[3];
|
||||||
|
- if (isBoolean(opts)) {
|
||||||
|
- // legacy...
|
||||||
|
- ctx.showHidden = opts;
|
||||||
|
- } else if (opts) {
|
||||||
|
- // got an "options" object
|
||||||
|
- exports._extend(ctx, opts);
|
||||||
|
- }
|
||||||
|
- // set default options
|
||||||
|
- if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
|
||||||
|
- if (isUndefined(ctx.depth)) ctx.depth = 2;
|
||||||
|
- if (isUndefined(ctx.colors)) ctx.colors = false;
|
||||||
|
- if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
|
||||||
|
- if (ctx.colors) ctx.stylize = stylizeWithColor;
|
||||||
|
- return formatValue(ctx, obj, ctx.depth);
|
||||||
|
-}
|
||||||
|
-exports.inspect = inspect;
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
|
||||||
|
-inspect.colors = {
|
||||||
|
- 'bold' : [1, 22],
|
||||||
|
- 'italic' : [3, 23],
|
||||||
|
- 'underline' : [4, 24],
|
||||||
|
- 'inverse' : [7, 27],
|
||||||
|
- 'white' : [37, 39],
|
||||||
|
- 'grey' : [90, 39],
|
||||||
|
- 'black' : [30, 39],
|
||||||
|
- 'blue' : [34, 39],
|
||||||
|
- 'cyan' : [36, 39],
|
||||||
|
- 'green' : [32, 39],
|
||||||
|
- 'magenta' : [35, 39],
|
||||||
|
- 'red' : [31, 39],
|
||||||
|
- 'yellow' : [33, 39]
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
-// Don't use 'blue' not visible on cmd.exe
|
||||||
|
-inspect.styles = {
|
||||||
|
- 'special': 'cyan',
|
||||||
|
- 'number': 'yellow',
|
||||||
|
- 'boolean': 'yellow',
|
||||||
|
- 'undefined': 'grey',
|
||||||
|
- 'null': 'bold',
|
||||||
|
- 'string': 'green',
|
||||||
|
- 'date': 'magenta',
|
||||||
|
- // "name": intentionally not styling
|
||||||
|
- 'regexp': 'red'
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-function stylizeWithColor(str, styleType) {
|
||||||
|
- var style = inspect.styles[styleType];
|
||||||
|
-
|
||||||
|
- if (style) {
|
||||||
|
- return '\u001b[' + inspect.colors[style][0] + 'm' + str +
|
||||||
|
- '\u001b[' + inspect.colors[style][1] + 'm';
|
||||||
|
- } else {
|
||||||
|
- return str;
|
||||||
|
- }
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-function stylizeNoColor(str, styleType) {
|
||||||
|
- return str;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-function arrayToHash(array) {
|
||||||
|
- var hash = {};
|
||||||
|
-
|
||||||
|
- array.forEach(function(val, idx) {
|
||||||
|
- hash[val] = true;
|
||||||
|
- });
|
||||||
|
-
|
||||||
|
- return hash;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-function formatValue(ctx, value, recurseTimes) {
|
||||||
|
- // Provide a hook for user-specified inspect functions.
|
||||||
|
- // Check that value is an object with an inspect function on it
|
||||||
|
- if (ctx.customInspect &&
|
||||||
|
- value &&
|
||||||
|
- isFunction(value.inspect) &&
|
||||||
|
- // Filter out the util module, it's inspect function is special
|
||||||
|
- value.inspect !== exports.inspect &&
|
||||||
|
- // Also filter out any prototype objects using the circular check.
|
||||||
|
- !(value.constructor && value.constructor.prototype === value)) {
|
||||||
|
- var ret = value.inspect(recurseTimes, ctx);
|
||||||
|
- if (!isString(ret)) {
|
||||||
|
- ret = formatValue(ctx, ret, recurseTimes);
|
||||||
|
- }
|
||||||
|
- return ret;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- // Primitive types cannot have properties
|
||||||
|
- var primitive = formatPrimitive(ctx, value);
|
||||||
|
- if (primitive) {
|
||||||
|
- return primitive;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- // Look up the keys of the object.
|
||||||
|
- var keys = Object.keys(value);
|
||||||
|
- var visibleKeys = arrayToHash(keys);
|
||||||
|
-
|
||||||
|
- if (ctx.showHidden) {
|
||||||
|
- keys = Object.getOwnPropertyNames(value);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- // Some type of object without properties can be shortcutted.
|
||||||
|
- if (keys.length === 0) {
|
||||||
|
- if (isFunction(value)) {
|
||||||
|
- var name = value.name ? ': ' + value.name : '';
|
||||||
|
- return ctx.stylize('[Function' + name + ']', 'special');
|
||||||
|
- }
|
||||||
|
- if (isRegExp(value)) {
|
||||||
|
- return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
|
||||||
|
- }
|
||||||
|
- if (isDate(value)) {
|
||||||
|
- return ctx.stylize(Date.prototype.toString.call(value), 'date');
|
||||||
|
- }
|
||||||
|
- if (isError(value)) {
|
||||||
|
- return formatError(value);
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- var base = '', array = false, braces = ['{', '}'];
|
||||||
|
-
|
||||||
|
- // Make Array say that they are Array
|
||||||
|
- if (isArray(value)) {
|
||||||
|
- array = true;
|
||||||
|
- braces = ['[', ']'];
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- // Make functions say that they are functions
|
||||||
|
- if (isFunction(value)) {
|
||||||
|
- var n = value.name ? ': ' + value.name : '';
|
||||||
|
- base = ' [Function' + n + ']';
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- // Make RegExps say that they are RegExps
|
||||||
|
- if (isRegExp(value)) {
|
||||||
|
- base = ' ' + RegExp.prototype.toString.call(value);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- // Make dates with properties first say the date
|
||||||
|
- if (isDate(value)) {
|
||||||
|
- base = ' ' + Date.prototype.toUTCString.call(value);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- // Make error with message first say the error
|
||||||
|
- if (isError(value)) {
|
||||||
|
- base = ' ' + formatError(value);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (keys.length === 0 && (!array || value.length == 0)) {
|
||||||
|
- return braces[0] + base + braces[1];
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (recurseTimes < 0) {
|
||||||
|
- if (isRegExp(value)) {
|
||||||
|
- return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
|
||||||
|
- } else {
|
||||||
|
- return ctx.stylize('[Object]', 'special');
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- ctx.seen.push(value);
|
||||||
|
-
|
||||||
|
- var output;
|
||||||
|
- if (array) {
|
||||||
|
- output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
|
||||||
|
- } else {
|
||||||
|
- output = keys.map(function(key) {
|
||||||
|
- return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
|
||||||
|
- });
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- ctx.seen.pop();
|
||||||
|
-
|
||||||
|
- return reduceToSingleString(output, base, braces);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-function formatPrimitive(ctx, value) {
|
||||||
|
- if (isUndefined(value))
|
||||||
|
- return ctx.stylize('undefined', 'undefined');
|
||||||
|
- if (isString(value)) {
|
||||||
|
- var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
|
||||||
|
- .replace(/'/g, "\\'")
|
||||||
|
- .replace(/\\"/g, '"') + '\'';
|
||||||
|
- return ctx.stylize(simple, 'string');
|
||||||
|
- }
|
||||||
|
- if (isNumber(value)) {
|
||||||
|
- // Format -0 as '-0'. Strict equality won't distinguish 0 from -0,
|
||||||
|
- // so instead we use the fact that 1 / -0 < 0 whereas 1 / 0 > 0 .
|
||||||
|
- if (value === 0 && 1 / value < 0)
|
||||||
|
- return ctx.stylize('-0', 'number');
|
||||||
|
- return ctx.stylize('' + value, 'number');
|
||||||
|
- }
|
||||||
|
- if (isBoolean(value))
|
||||||
|
- return ctx.stylize('' + value, 'boolean');
|
||||||
|
- // For some reason typeof null is "object", so special case here.
|
||||||
|
- if (isNull(value))
|
||||||
|
- return ctx.stylize('null', 'null');
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-function formatError(value) {
|
||||||
|
- return '[' + Error.prototype.toString.call(value) + ']';
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
|
||||||
|
- var output = [];
|
||||||
|
- for (var i = 0, l = value.length; i < l; ++i) {
|
||||||
|
- if (hasOwnProperty(value, String(i))) {
|
||||||
|
- output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
|
||||||
|
- String(i), true));
|
||||||
|
- } else {
|
||||||
|
- output.push('');
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- keys.forEach(function(key) {
|
||||||
|
- if (!key.match(/^\d+$/)) {
|
||||||
|
- output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
|
||||||
|
- key, true));
|
||||||
|
- }
|
||||||
|
- });
|
||||||
|
- return output;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
|
||||||
|
- var name, str, desc;
|
||||||
|
- desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
|
||||||
|
- if (desc.get) {
|
||||||
|
- if (desc.set) {
|
||||||
|
- str = ctx.stylize('[Getter/Setter]', 'special');
|
||||||
|
- } else {
|
||||||
|
- str = ctx.stylize('[Getter]', 'special');
|
||||||
|
- }
|
||||||
|
- } else {
|
||||||
|
- if (desc.set) {
|
||||||
|
- str = ctx.stylize('[Setter]', 'special');
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- if (!hasOwnProperty(visibleKeys, key)) {
|
||||||
|
- name = '[' + key + ']';
|
||||||
|
- }
|
||||||
|
- if (!str) {
|
||||||
|
- if (ctx.seen.indexOf(desc.value) < 0) {
|
||||||
|
- if (isNull(recurseTimes)) {
|
||||||
|
- str = formatValue(ctx, desc.value, null);
|
||||||
|
- } else {
|
||||||
|
- str = formatValue(ctx, desc.value, recurseTimes - 1);
|
||||||
|
- }
|
||||||
|
- if (str.indexOf('\n') > -1) {
|
||||||
|
- if (array) {
|
||||||
|
- str = str.split('\n').map(function(line) {
|
||||||
|
- return ' ' + line;
|
||||||
|
- }).join('\n').substr(2);
|
||||||
|
- } else {
|
||||||
|
- str = '\n' + str.split('\n').map(function(line) {
|
||||||
|
- return ' ' + line;
|
||||||
|
- }).join('\n');
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- } else {
|
||||||
|
- str = ctx.stylize('[Circular]', 'special');
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- if (isUndefined(name)) {
|
||||||
|
- if (array && key.match(/^\d+$/)) {
|
||||||
|
- return str;
|
||||||
|
- }
|
||||||
|
- name = JSON.stringify('' + key);
|
||||||
|
- if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
|
||||||
|
- name = name.substr(1, name.length - 2);
|
||||||
|
- name = ctx.stylize(name, 'name');
|
||||||
|
- } else {
|
||||||
|
- name = name.replace(/'/g, "\\'")
|
||||||
|
- .replace(/\\"/g, '"')
|
||||||
|
- .replace(/(^"|"$)/g, "'");
|
||||||
|
- name = ctx.stylize(name, 'string');
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- return name + ': ' + str;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-function reduceToSingleString(output, base, braces) {
|
||||||
|
- var numLinesEst = 0;
|
||||||
|
- var length = output.reduce(function(prev, cur) {
|
||||||
|
- numLinesEst++;
|
||||||
|
- if (cur.indexOf('\n') >= 0) numLinesEst++;
|
||||||
|
- return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
|
||||||
|
- }, 0);
|
||||||
|
-
|
||||||
|
- if (length > 60) {
|
||||||
|
- return braces[0] +
|
||||||
|
- (base === '' ? '' : base + '\n ') +
|
||||||
|
- ' ' +
|
||||||
|
- output.join(',\n ') +
|
||||||
|
- ' ' +
|
||||||
|
- braces[1];
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-
|
||||||
|
// NOTE: These type checking functions intentionally don't use `instanceof`
|
||||||
|
// because it is fragile and can be easily faked with `Object.create()`.
|
||||||
|
function isArray(ar) {
|
||||||
|
@@ -522,166 +98,10 @@ function isPrimitive(arg) {
|
||||||
|
exports.isPrimitive = isPrimitive;
|
||||||
|
|
||||||
|
function isBuffer(arg) {
|
||||||
|
- return arg instanceof Buffer;
|
||||||
|
+ return Buffer.isBuffer(arg);
|
||||||
|
}
|
||||||
|
exports.isBuffer = isBuffer;
|
||||||
|
|
||||||
|
function objectToString(o) {
|
||||||
|
return Object.prototype.toString.call(o);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-function pad(n) {
|
||||||
|
- return n < 10 ? '0' + n.toString(10) : n.toString(10);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
|
||||||
|
- 'Oct', 'Nov', 'Dec'];
|
||||||
|
-
|
||||||
|
-// 26 Feb 16:19:34
|
||||||
|
-function timestamp() {
|
||||||
|
- var d = new Date();
|
||||||
|
- var time = [pad(d.getHours()),
|
||||||
|
- pad(d.getMinutes()),
|
||||||
|
- pad(d.getSeconds())].join(':');
|
||||||
|
- return [d.getDate(), months[d.getMonth()], time].join(' ');
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-// log is just a thin wrapper to console.log that prepends a timestamp
|
||||||
|
-exports.log = function() {
|
||||||
|
- console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-/**
|
||||||
|
- * Inherit the prototype methods from one constructor into another.
|
||||||
|
- *
|
||||||
|
- * The Function.prototype.inherits from lang.js rewritten as a standalone
|
||||||
|
- * function (not on Function.prototype). NOTE: If this file is to be loaded
|
||||||
|
- * during bootstrapping this function needs to be rewritten using some native
|
||||||
|
- * functions as prototype setup using normal JavaScript does not work as
|
||||||
|
- * expected during bootstrapping (see mirror.js in r114903).
|
||||||
|
- *
|
||||||
|
- * @param {function} ctor Constructor function which needs to inherit the
|
||||||
|
- * prototype.
|
||||||
|
- * @param {function} superCtor Constructor function to inherit prototype from.
|
||||||
|
- */
|
||||||
|
-exports.inherits = function(ctor, superCtor) {
|
||||||
|
- ctor.super_ = superCtor;
|
||||||
|
- ctor.prototype = Object.create(superCtor.prototype, {
|
||||||
|
- constructor: {
|
||||||
|
- value: ctor,
|
||||||
|
- enumerable: false,
|
||||||
|
- writable: true,
|
||||||
|
- configurable: true
|
||||||
|
- }
|
||||||
|
- });
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
-exports._extend = function(origin, add) {
|
||||||
|
- // Don't do anything if add isn't an object
|
||||||
|
- if (!add || !isObject(add)) return origin;
|
||||||
|
-
|
||||||
|
- var keys = Object.keys(add);
|
||||||
|
- var i = keys.length;
|
||||||
|
- while (i--) {
|
||||||
|
- origin[keys[i]] = add[keys[i]];
|
||||||
|
- }
|
||||||
|
- return origin;
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
-function hasOwnProperty(obj, prop) {
|
||||||
|
- return Object.prototype.hasOwnProperty.call(obj, prop);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-// Deprecated old stuff.
|
||||||
|
-
|
||||||
|
-exports.p = exports.deprecate(function() {
|
||||||
|
- for (var i = 0, len = arguments.length; i < len; ++i) {
|
||||||
|
- console.error(exports.inspect(arguments[i]));
|
||||||
|
- }
|
||||||
|
-}, 'util.p: Use console.error() instead');
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-exports.exec = exports.deprecate(function() {
|
||||||
|
- return require('child_process').exec.apply(this, arguments);
|
||||||
|
-}, 'util.exec is now called `child_process.exec`.');
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-exports.print = exports.deprecate(function() {
|
||||||
|
- for (var i = 0, len = arguments.length; i < len; ++i) {
|
||||||
|
- process.stdout.write(String(arguments[i]));
|
||||||
|
- }
|
||||||
|
-}, 'util.print: Use console.log instead');
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-exports.puts = exports.deprecate(function() {
|
||||||
|
- for (var i = 0, len = arguments.length; i < len; ++i) {
|
||||||
|
- process.stdout.write(arguments[i] + '\n');
|
||||||
|
- }
|
||||||
|
-}, 'util.puts: Use console.log instead');
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-exports.debug = exports.deprecate(function(x) {
|
||||||
|
- process.stderr.write('DEBUG: ' + x + '\n');
|
||||||
|
-}, 'util.debug: Use console.error instead');
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-exports.error = exports.deprecate(function(x) {
|
||||||
|
- for (var i = 0, len = arguments.length; i < len; ++i) {
|
||||||
|
- process.stderr.write(arguments[i] + '\n');
|
||||||
|
- }
|
||||||
|
-}, 'util.error: Use console.error instead');
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-exports.pump = exports.deprecate(function(readStream, writeStream, callback) {
|
||||||
|
- var callbackCalled = false;
|
||||||
|
-
|
||||||
|
- function call(a, b, c) {
|
||||||
|
- if (callback && !callbackCalled) {
|
||||||
|
- callback(a, b, c);
|
||||||
|
- callbackCalled = true;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- readStream.addListener('data', function(chunk) {
|
||||||
|
- if (writeStream.write(chunk) === false) readStream.pause();
|
||||||
|
- });
|
||||||
|
-
|
||||||
|
- writeStream.addListener('drain', function() {
|
||||||
|
- readStream.resume();
|
||||||
|
- });
|
||||||
|
-
|
||||||
|
- readStream.addListener('end', function() {
|
||||||
|
- writeStream.end();
|
||||||
|
- });
|
||||||
|
-
|
||||||
|
- readStream.addListener('close', function() {
|
||||||
|
- call();
|
||||||
|
- });
|
||||||
|
-
|
||||||
|
- readStream.addListener('error', function(err) {
|
||||||
|
- writeStream.end();
|
||||||
|
- call(err);
|
||||||
|
- });
|
||||||
|
-
|
||||||
|
- writeStream.addListener('error', function(err) {
|
||||||
|
- readStream.destroy();
|
||||||
|
- call(err);
|
||||||
|
- });
|
||||||
|
-}, 'util.pump(): Use readableStream.pipe() instead');
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-var uv;
|
||||||
|
-exports._errnoException = function(err, syscall) {
|
||||||
|
- if (isUndefined(uv)) uv = process.binding('uv');
|
||||||
|
- var errname = uv.errname(err);
|
||||||
|
- var e = new Error(syscall + ' ' + errname);
|
||||||
|
- e.code = errname;
|
||||||
|
- e.errno = errname;
|
||||||
|
- e.syscall = syscall;
|
||||||
|
- return e;
|
||||||
|
-};
|
||||||
|
+}
|
||||||
+57
-2
@@ -19,6 +19,38 @@ const runPlugins = (input, opts) => {
|
|||||||
return Promise.all(opts.plugins.map(x => x(input, opts))).then(files => files.reduce((a, b) => a.concat(b)));
|
return Promise.all(opts.plugins.map(x => x(input, opts))).then(files => files.reduce((a, b) => a.concat(b)));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const safeMakeDir = (dir, realOutputPath) => {
|
||||||
|
return fsP.realpath(dir)
|
||||||
|
.catch(_ => {
|
||||||
|
const parent = path.dirname(dir);
|
||||||
|
return safeMakeDir(parent, realOutputPath);
|
||||||
|
})
|
||||||
|
.then(realParentPath => {
|
||||||
|
if (realParentPath.indexOf(realOutputPath) !== 0) {
|
||||||
|
throw (new Error('Refusing to create a directory outside the output path.'));
|
||||||
|
}
|
||||||
|
|
||||||
|
return makeDir(dir).then(fsP.realpath);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const preventWritingThroughSymlink = (destination, realOutputPath) => {
|
||||||
|
return fsP.readlink(destination)
|
||||||
|
.catch(_ => {
|
||||||
|
// Either no file exists, or it's not a symlink. In either case, this is
|
||||||
|
// not an escape we need to worry about in this phase.
|
||||||
|
return null;
|
||||||
|
})
|
||||||
|
.then(symlinkPointsTo => {
|
||||||
|
if (symlinkPointsTo) {
|
||||||
|
throw new Error('Refusing to write into a symlink');
|
||||||
|
}
|
||||||
|
|
||||||
|
// No symlink exists at `destination`, so we can continue
|
||||||
|
return realOutputPath;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
const extractFile = (input, output, opts) => runPlugins(input, opts).then(files => {
|
const extractFile = (input, output, opts) => runPlugins(input, opts).then(files => {
|
||||||
if (opts.strip > 0) {
|
if (opts.strip > 0) {
|
||||||
files = files
|
files = files
|
||||||
@@ -47,12 +79,35 @@ const extractFile = (input, output, opts) => runPlugins(input, opts).then(files
|
|||||||
const now = new Date();
|
const now = new Date();
|
||||||
|
|
||||||
if (x.type === 'directory') {
|
if (x.type === 'directory') {
|
||||||
return makeDir(dest)
|
return makeDir(output)
|
||||||
|
.then(outputPath => fsP.realpath(outputPath))
|
||||||
|
.then(realOutputPath => safeMakeDir(dest, realOutputPath))
|
||||||
.then(() => fsP.utimes(dest, now, x.mtime))
|
.then(() => fsP.utimes(dest, now, x.mtime))
|
||||||
.then(() => x);
|
.then(() => x);
|
||||||
}
|
}
|
||||||
|
|
||||||
return makeDir(path.dirname(dest))
|
return makeDir(output)
|
||||||
|
.then(outputPath => fsP.realpath(outputPath))
|
||||||
|
.then(realOutputPath => {
|
||||||
|
// Attempt to ensure parent directory exists (failing if it's outside the output dir)
|
||||||
|
return safeMakeDir(path.dirname(dest), realOutputPath)
|
||||||
|
.then(() => realOutputPath);
|
||||||
|
})
|
||||||
|
.then(realOutputPath => {
|
||||||
|
if (x.type === 'file') {
|
||||||
|
return preventWritingThroughSymlink(dest, realOutputPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
return realOutputPath;
|
||||||
|
})
|
||||||
|
.then(realOutputPath => {
|
||||||
|
return fsP.realpath(path.dirname(dest))
|
||||||
|
.then(realDestinationDir => {
|
||||||
|
if (realDestinationDir.indexOf(realOutputPath) !== 0) {
|
||||||
|
throw (new Error('Refusing to write outside output directory: ' + realDestinationDir));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
if (x.type === 'link') {
|
if (x.type === 'link') {
|
||||||
return fsP.link(x.linkname, dest);
|
return fsP.link(x.linkname, dest);
|
||||||
|
|||||||
+13
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "decompress",
|
"name": "decompress",
|
||||||
"version": "4.2.0",
|
"version": "4.2.1",
|
||||||
"description": "Extracting archives made easy",
|
"description": "Extracting archives made easy",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository": "kevva/decompress",
|
"repository": "kevva/decompress",
|
||||||
@@ -41,9 +41,21 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"ava": "*",
|
"ava": "*",
|
||||||
|
"esm": "^3.2.25",
|
||||||
"is-jpg": "^1.0.0",
|
"is-jpg": "^1.0.0",
|
||||||
"path-exists": "^3.0.0",
|
"path-exists": "^3.0.0",
|
||||||
"pify": "^2.3.0",
|
"pify": "^2.3.0",
|
||||||
|
"rimraf": "^3.0.2",
|
||||||
"xo": "*"
|
"xo": "*"
|
||||||
|
},
|
||||||
|
"ava": {
|
||||||
|
"require": [
|
||||||
|
"esm"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"xo": {
|
||||||
|
"rules": {
|
||||||
|
"promise/prefer-await-to-then": "off"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-2
@@ -20,6 +20,7 @@ var eos = function(stream, opts, callback) {
|
|||||||
var rs = stream._readableState;
|
var rs = stream._readableState;
|
||||||
var readable = opts.readable || (opts.readable !== false && stream.readable);
|
var readable = opts.readable || (opts.readable !== false && stream.readable);
|
||||||
var writable = opts.writable || (opts.writable !== false && stream.writable);
|
var writable = opts.writable || (opts.writable !== false && stream.writable);
|
||||||
|
var cancelled = false;
|
||||||
|
|
||||||
var onlegacyfinish = function() {
|
var onlegacyfinish = function() {
|
||||||
if (!stream.writable) onfinish();
|
if (!stream.writable) onfinish();
|
||||||
@@ -44,8 +45,13 @@ var eos = function(stream, opts, callback) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
var onclose = function() {
|
var onclose = function() {
|
||||||
if (readable && !(rs && rs.ended)) return callback.call(stream, new Error('premature close'));
|
process.nextTick(onclosenexttick);
|
||||||
if (writable && !(ws && ws.ended)) return callback.call(stream, new Error('premature close'));
|
};
|
||||||
|
|
||||||
|
var onclosenexttick = function() {
|
||||||
|
if (cancelled) return;
|
||||||
|
if (readable && !(rs && (rs.ended && !rs.destroyed))) return callback.call(stream, new Error('premature close'));
|
||||||
|
if (writable && !(ws && (ws.ended && !ws.destroyed))) return callback.call(stream, new Error('premature close'));
|
||||||
};
|
};
|
||||||
|
|
||||||
var onrequest = function() {
|
var onrequest = function() {
|
||||||
@@ -70,6 +76,7 @@ var eos = function(stream, opts, callback) {
|
|||||||
stream.on('close', onclose);
|
stream.on('close', onclose);
|
||||||
|
|
||||||
return function() {
|
return function() {
|
||||||
|
cancelled = true;
|
||||||
stream.removeListener('complete', onfinish);
|
stream.removeListener('complete', onfinish);
|
||||||
stream.removeListener('abort', onclose);
|
stream.removeListener('abort', onclose);
|
||||||
stream.removeListener('request', onrequest);
|
stream.removeListener('request', onrequest);
|
||||||
|
|||||||
+5
-2
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "end-of-stream",
|
"name": "end-of-stream",
|
||||||
"version": "1.4.1",
|
"version": "1.4.4",
|
||||||
"description": "Call a callback when a readable/writable/duplex stream has completed or failed.",
|
"description": "Call a callback when a readable/writable/duplex stream has completed or failed.",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@@ -30,5 +30,8 @@
|
|||||||
"homepage": "https://github.com/mafintosh/end-of-stream",
|
"homepage": "https://github.com/mafintosh/end-of-stream",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"author": "Mathias Buus <mathiasbuus@gmail.com>",
|
"author": "Mathias Buus <mathiasbuus@gmail.com>",
|
||||||
"license": "MIT"
|
"license": "MIT",
|
||||||
|
"devDependencies": {
|
||||||
|
"tape": "^4.11.0"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+166
@@ -0,0 +1,166 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const fs = require('graceful-fs')
|
||||||
|
const path = require('path')
|
||||||
|
const mkdirsSync = require('../mkdirs').mkdirsSync
|
||||||
|
const utimesMillisSync = require('../util/utimes').utimesMillisSync
|
||||||
|
const stat = require('../util/stat')
|
||||||
|
|
||||||
|
function copySync (src, dest, opts) {
|
||||||
|
if (typeof opts === 'function') {
|
||||||
|
opts = { filter: opts }
|
||||||
|
}
|
||||||
|
|
||||||
|
opts = opts || {}
|
||||||
|
opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now
|
||||||
|
opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber
|
||||||
|
|
||||||
|
// Warn about using preserveTimestamps on 32-bit node
|
||||||
|
if (opts.preserveTimestamps && process.arch === 'ia32') {
|
||||||
|
console.warn(`fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n
|
||||||
|
see https://github.com/jprichardson/node-fs-extra/issues/269`)
|
||||||
|
}
|
||||||
|
|
||||||
|
const { srcStat, destStat } = stat.checkPathsSync(src, dest, 'copy')
|
||||||
|
stat.checkParentPathsSync(src, srcStat, dest, 'copy')
|
||||||
|
return handleFilterAndCopy(destStat, src, dest, opts)
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleFilterAndCopy (destStat, src, dest, opts) {
|
||||||
|
if (opts.filter && !opts.filter(src, dest)) return
|
||||||
|
const destParent = path.dirname(dest)
|
||||||
|
if (!fs.existsSync(destParent)) mkdirsSync(destParent)
|
||||||
|
return startCopy(destStat, src, dest, opts)
|
||||||
|
}
|
||||||
|
|
||||||
|
function startCopy (destStat, src, dest, opts) {
|
||||||
|
if (opts.filter && !opts.filter(src, dest)) return
|
||||||
|
return getStats(destStat, src, dest, opts)
|
||||||
|
}
|
||||||
|
|
||||||
|
function getStats (destStat, src, dest, opts) {
|
||||||
|
const statSync = opts.dereference ? fs.statSync : fs.lstatSync
|
||||||
|
const srcStat = statSync(src)
|
||||||
|
|
||||||
|
if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts)
|
||||||
|
else if (srcStat.isFile() ||
|
||||||
|
srcStat.isCharacterDevice() ||
|
||||||
|
srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts)
|
||||||
|
else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts)
|
||||||
|
}
|
||||||
|
|
||||||
|
function onFile (srcStat, destStat, src, dest, opts) {
|
||||||
|
if (!destStat) return copyFile(srcStat, src, dest, opts)
|
||||||
|
return mayCopyFile(srcStat, src, dest, opts)
|
||||||
|
}
|
||||||
|
|
||||||
|
function mayCopyFile (srcStat, src, dest, opts) {
|
||||||
|
if (opts.overwrite) {
|
||||||
|
fs.unlinkSync(dest)
|
||||||
|
return copyFile(srcStat, src, dest, opts)
|
||||||
|
} else if (opts.errorOnExist) {
|
||||||
|
throw new Error(`'${dest}' already exists`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function copyFile (srcStat, src, dest, opts) {
|
||||||
|
fs.copyFileSync(src, dest)
|
||||||
|
if (opts.preserveTimestamps) handleTimestamps(srcStat.mode, src, dest)
|
||||||
|
return setDestMode(dest, srcStat.mode)
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleTimestamps (srcMode, src, dest) {
|
||||||
|
// Make sure the file is writable before setting the timestamp
|
||||||
|
// otherwise open fails with EPERM when invoked with 'r+'
|
||||||
|
// (through utimes call)
|
||||||
|
if (fileIsNotWritable(srcMode)) makeFileWritable(dest, srcMode)
|
||||||
|
return setDestTimestamps(src, dest)
|
||||||
|
}
|
||||||
|
|
||||||
|
function fileIsNotWritable (srcMode) {
|
||||||
|
return (srcMode & 0o200) === 0
|
||||||
|
}
|
||||||
|
|
||||||
|
function makeFileWritable (dest, srcMode) {
|
||||||
|
return setDestMode(dest, srcMode | 0o200)
|
||||||
|
}
|
||||||
|
|
||||||
|
function setDestMode (dest, srcMode) {
|
||||||
|
return fs.chmodSync(dest, srcMode)
|
||||||
|
}
|
||||||
|
|
||||||
|
function setDestTimestamps (src, dest) {
|
||||||
|
// The initial srcStat.atime cannot be trusted
|
||||||
|
// because it is modified by the read(2) system call
|
||||||
|
// (See https://nodejs.org/api/fs.html#fs_stat_time_values)
|
||||||
|
const updatedSrcStat = fs.statSync(src)
|
||||||
|
return utimesMillisSync(dest, updatedSrcStat.atime, updatedSrcStat.mtime)
|
||||||
|
}
|
||||||
|
|
||||||
|
function onDir (srcStat, destStat, src, dest, opts) {
|
||||||
|
if (!destStat) return mkDirAndCopy(srcStat.mode, src, dest, opts)
|
||||||
|
if (destStat && !destStat.isDirectory()) {
|
||||||
|
throw new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`)
|
||||||
|
}
|
||||||
|
return copyDir(src, dest, opts)
|
||||||
|
}
|
||||||
|
|
||||||
|
function mkDirAndCopy (srcMode, src, dest, opts) {
|
||||||
|
fs.mkdirSync(dest)
|
||||||
|
copyDir(src, dest, opts)
|
||||||
|
return setDestMode(dest, srcMode)
|
||||||
|
}
|
||||||
|
|
||||||
|
function copyDir (src, dest, opts) {
|
||||||
|
fs.readdirSync(src).forEach(item => copyDirItem(item, src, dest, opts))
|
||||||
|
}
|
||||||
|
|
||||||
|
function copyDirItem (item, src, dest, opts) {
|
||||||
|
const srcItem = path.join(src, item)
|
||||||
|
const destItem = path.join(dest, item)
|
||||||
|
const { destStat } = stat.checkPathsSync(srcItem, destItem, 'copy')
|
||||||
|
return startCopy(destStat, srcItem, destItem, opts)
|
||||||
|
}
|
||||||
|
|
||||||
|
function onLink (destStat, src, dest, opts) {
|
||||||
|
let resolvedSrc = fs.readlinkSync(src)
|
||||||
|
if (opts.dereference) {
|
||||||
|
resolvedSrc = path.resolve(process.cwd(), resolvedSrc)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!destStat) {
|
||||||
|
return fs.symlinkSync(resolvedSrc, dest)
|
||||||
|
} else {
|
||||||
|
let resolvedDest
|
||||||
|
try {
|
||||||
|
resolvedDest = fs.readlinkSync(dest)
|
||||||
|
} catch (err) {
|
||||||
|
// dest exists and is a regular file or directory,
|
||||||
|
// Windows may throw UNKNOWN error. If dest already exists,
|
||||||
|
// fs throws error anyway, so no need to guard against it here.
|
||||||
|
if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlinkSync(resolvedSrc, dest)
|
||||||
|
throw err
|
||||||
|
}
|
||||||
|
if (opts.dereference) {
|
||||||
|
resolvedDest = path.resolve(process.cwd(), resolvedDest)
|
||||||
|
}
|
||||||
|
if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) {
|
||||||
|
throw new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`)
|
||||||
|
}
|
||||||
|
|
||||||
|
// prevent copy if src is a subdir of dest since unlinking
|
||||||
|
// dest in this case would result in removing src contents
|
||||||
|
// and therefore a broken symlink would be created.
|
||||||
|
if (fs.statSync(dest).isDirectory() && stat.isSrcSubdir(resolvedDest, resolvedSrc)) {
|
||||||
|
throw new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`)
|
||||||
|
}
|
||||||
|
return copyLink(resolvedSrc, dest)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function copyLink (resolvedSrc, dest) {
|
||||||
|
fs.unlinkSync(dest)
|
||||||
|
return fs.symlinkSync(resolvedSrc, dest)
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = copySync
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
copySync: require('./copy-sync')
|
||||||
|
}
|
||||||
+232
@@ -0,0 +1,232 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const fs = require('graceful-fs')
|
||||||
|
const path = require('path')
|
||||||
|
const mkdirs = require('../mkdirs').mkdirs
|
||||||
|
const pathExists = require('../path-exists').pathExists
|
||||||
|
const utimesMillis = require('../util/utimes').utimesMillis
|
||||||
|
const stat = require('../util/stat')
|
||||||
|
|
||||||
|
function copy (src, dest, opts, cb) {
|
||||||
|
if (typeof opts === 'function' && !cb) {
|
||||||
|
cb = opts
|
||||||
|
opts = {}
|
||||||
|
} else if (typeof opts === 'function') {
|
||||||
|
opts = { filter: opts }
|
||||||
|
}
|
||||||
|
|
||||||
|
cb = cb || function () {}
|
||||||
|
opts = opts || {}
|
||||||
|
|
||||||
|
opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now
|
||||||
|
opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber
|
||||||
|
|
||||||
|
// Warn about using preserveTimestamps on 32-bit node
|
||||||
|
if (opts.preserveTimestamps && process.arch === 'ia32') {
|
||||||
|
console.warn(`fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n
|
||||||
|
see https://github.com/jprichardson/node-fs-extra/issues/269`)
|
||||||
|
}
|
||||||
|
|
||||||
|
stat.checkPaths(src, dest, 'copy', (err, stats) => {
|
||||||
|
if (err) return cb(err)
|
||||||
|
const { srcStat, destStat } = stats
|
||||||
|
stat.checkParentPaths(src, srcStat, dest, 'copy', err => {
|
||||||
|
if (err) return cb(err)
|
||||||
|
if (opts.filter) return handleFilter(checkParentDir, destStat, src, dest, opts, cb)
|
||||||
|
return checkParentDir(destStat, src, dest, opts, cb)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkParentDir (destStat, src, dest, opts, cb) {
|
||||||
|
const destParent = path.dirname(dest)
|
||||||
|
pathExists(destParent, (err, dirExists) => {
|
||||||
|
if (err) return cb(err)
|
||||||
|
if (dirExists) return startCopy(destStat, src, dest, opts, cb)
|
||||||
|
mkdirs(destParent, err => {
|
||||||
|
if (err) return cb(err)
|
||||||
|
return startCopy(destStat, src, dest, opts, cb)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleFilter (onInclude, destStat, src, dest, opts, cb) {
|
||||||
|
Promise.resolve(opts.filter(src, dest)).then(include => {
|
||||||
|
if (include) return onInclude(destStat, src, dest, opts, cb)
|
||||||
|
return cb()
|
||||||
|
}, error => cb(error))
|
||||||
|
}
|
||||||
|
|
||||||
|
function startCopy (destStat, src, dest, opts, cb) {
|
||||||
|
if (opts.filter) return handleFilter(getStats, destStat, src, dest, opts, cb)
|
||||||
|
return getStats(destStat, src, dest, opts, cb)
|
||||||
|
}
|
||||||
|
|
||||||
|
function getStats (destStat, src, dest, opts, cb) {
|
||||||
|
const stat = opts.dereference ? fs.stat : fs.lstat
|
||||||
|
stat(src, (err, srcStat) => {
|
||||||
|
if (err) return cb(err)
|
||||||
|
|
||||||
|
if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts, cb)
|
||||||
|
else if (srcStat.isFile() ||
|
||||||
|
srcStat.isCharacterDevice() ||
|
||||||
|
srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts, cb)
|
||||||
|
else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts, cb)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function onFile (srcStat, destStat, src, dest, opts, cb) {
|
||||||
|
if (!destStat) return copyFile(srcStat, src, dest, opts, cb)
|
||||||
|
return mayCopyFile(srcStat, src, dest, opts, cb)
|
||||||
|
}
|
||||||
|
|
||||||
|
function mayCopyFile (srcStat, src, dest, opts, cb) {
|
||||||
|
if (opts.overwrite) {
|
||||||
|
fs.unlink(dest, err => {
|
||||||
|
if (err) return cb(err)
|
||||||
|
return copyFile(srcStat, src, dest, opts, cb)
|
||||||
|
})
|
||||||
|
} else if (opts.errorOnExist) {
|
||||||
|
return cb(new Error(`'${dest}' already exists`))
|
||||||
|
} else return cb()
|
||||||
|
}
|
||||||
|
|
||||||
|
function copyFile (srcStat, src, dest, opts, cb) {
|
||||||
|
fs.copyFile(src, dest, err => {
|
||||||
|
if (err) return cb(err)
|
||||||
|
if (opts.preserveTimestamps) return handleTimestampsAndMode(srcStat.mode, src, dest, cb)
|
||||||
|
return setDestMode(dest, srcStat.mode, cb)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleTimestampsAndMode (srcMode, src, dest, cb) {
|
||||||
|
// Make sure the file is writable before setting the timestamp
|
||||||
|
// otherwise open fails with EPERM when invoked with 'r+'
|
||||||
|
// (through utimes call)
|
||||||
|
if (fileIsNotWritable(srcMode)) {
|
||||||
|
return makeFileWritable(dest, srcMode, err => {
|
||||||
|
if (err) return cb(err)
|
||||||
|
return setDestTimestampsAndMode(srcMode, src, dest, cb)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return setDestTimestampsAndMode(srcMode, src, dest, cb)
|
||||||
|
}
|
||||||
|
|
||||||
|
function fileIsNotWritable (srcMode) {
|
||||||
|
return (srcMode & 0o200) === 0
|
||||||
|
}
|
||||||
|
|
||||||
|
function makeFileWritable (dest, srcMode, cb) {
|
||||||
|
return setDestMode(dest, srcMode | 0o200, cb)
|
||||||
|
}
|
||||||
|
|
||||||
|
function setDestTimestampsAndMode (srcMode, src, dest, cb) {
|
||||||
|
setDestTimestamps(src, dest, err => {
|
||||||
|
if (err) return cb(err)
|
||||||
|
return setDestMode(dest, srcMode, cb)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function setDestMode (dest, srcMode, cb) {
|
||||||
|
return fs.chmod(dest, srcMode, cb)
|
||||||
|
}
|
||||||
|
|
||||||
|
function setDestTimestamps (src, dest, cb) {
|
||||||
|
// The initial srcStat.atime cannot be trusted
|
||||||
|
// because it is modified by the read(2) system call
|
||||||
|
// (See https://nodejs.org/api/fs.html#fs_stat_time_values)
|
||||||
|
fs.stat(src, (err, updatedSrcStat) => {
|
||||||
|
if (err) return cb(err)
|
||||||
|
return utimesMillis(dest, updatedSrcStat.atime, updatedSrcStat.mtime, cb)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function onDir (srcStat, destStat, src, dest, opts, cb) {
|
||||||
|
if (!destStat) return mkDirAndCopy(srcStat.mode, src, dest, opts, cb)
|
||||||
|
if (destStat && !destStat.isDirectory()) {
|
||||||
|
return cb(new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`))
|
||||||
|
}
|
||||||
|
return copyDir(src, dest, opts, cb)
|
||||||
|
}
|
||||||
|
|
||||||
|
function mkDirAndCopy (srcMode, src, dest, opts, cb) {
|
||||||
|
fs.mkdir(dest, err => {
|
||||||
|
if (err) return cb(err)
|
||||||
|
copyDir(src, dest, opts, err => {
|
||||||
|
if (err) return cb(err)
|
||||||
|
return setDestMode(dest, srcMode, cb)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function copyDir (src, dest, opts, cb) {
|
||||||
|
fs.readdir(src, (err, items) => {
|
||||||
|
if (err) return cb(err)
|
||||||
|
return copyDirItems(items, src, dest, opts, cb)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function copyDirItems (items, src, dest, opts, cb) {
|
||||||
|
const item = items.pop()
|
||||||
|
if (!item) return cb()
|
||||||
|
return copyDirItem(items, item, src, dest, opts, cb)
|
||||||
|
}
|
||||||
|
|
||||||
|
function copyDirItem (items, item, src, dest, opts, cb) {
|
||||||
|
const srcItem = path.join(src, item)
|
||||||
|
const destItem = path.join(dest, item)
|
||||||
|
stat.checkPaths(srcItem, destItem, 'copy', (err, stats) => {
|
||||||
|
if (err) return cb(err)
|
||||||
|
const { destStat } = stats
|
||||||
|
startCopy(destStat, srcItem, destItem, opts, err => {
|
||||||
|
if (err) return cb(err)
|
||||||
|
return copyDirItems(items, src, dest, opts, cb)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function onLink (destStat, src, dest, opts, cb) {
|
||||||
|
fs.readlink(src, (err, resolvedSrc) => {
|
||||||
|
if (err) return cb(err)
|
||||||
|
if (opts.dereference) {
|
||||||
|
resolvedSrc = path.resolve(process.cwd(), resolvedSrc)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!destStat) {
|
||||||
|
return fs.symlink(resolvedSrc, dest, cb)
|
||||||
|
} else {
|
||||||
|
fs.readlink(dest, (err, resolvedDest) => {
|
||||||
|
if (err) {
|
||||||
|
// dest exists and is a regular file or directory,
|
||||||
|
// Windows may throw UNKNOWN error. If dest already exists,
|
||||||
|
// fs throws error anyway, so no need to guard against it here.
|
||||||
|
if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlink(resolvedSrc, dest, cb)
|
||||||
|
return cb(err)
|
||||||
|
}
|
||||||
|
if (opts.dereference) {
|
||||||
|
resolvedDest = path.resolve(process.cwd(), resolvedDest)
|
||||||
|
}
|
||||||
|
if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) {
|
||||||
|
return cb(new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`))
|
||||||
|
}
|
||||||
|
|
||||||
|
// do not copy if src is a subdir of dest since unlinking
|
||||||
|
// dest in this case would result in removing src contents
|
||||||
|
// and therefore a broken symlink would be created.
|
||||||
|
if (destStat.isDirectory() && stat.isSrcSubdir(resolvedDest, resolvedSrc)) {
|
||||||
|
return cb(new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`))
|
||||||
|
}
|
||||||
|
return copyLink(resolvedSrc, dest, cb)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function copyLink (resolvedSrc, dest, cb) {
|
||||||
|
fs.unlink(dest, err => {
|
||||||
|
if (err) return cb(err)
|
||||||
|
return fs.symlink(resolvedSrc, dest, cb)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = copy
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const u = require('universalify').fromCallback
|
||||||
|
module.exports = {
|
||||||
|
copy: u(require('./copy'))
|
||||||
|
}
|
||||||
+48
@@ -0,0 +1,48 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const u = require('universalify').fromCallback
|
||||||
|
const fs = require('graceful-fs')
|
||||||
|
const path = require('path')
|
||||||
|
const mkdir = require('../mkdirs')
|
||||||
|
const remove = require('../remove')
|
||||||
|
|
||||||
|
const emptyDir = u(function emptyDir (dir, callback) {
|
||||||
|
callback = callback || function () {}
|
||||||
|
fs.readdir(dir, (err, items) => {
|
||||||
|
if (err) return mkdir.mkdirs(dir, callback)
|
||||||
|
|
||||||
|
items = items.map(item => path.join(dir, item))
|
||||||
|
|
||||||
|
deleteItem()
|
||||||
|
|
||||||
|
function deleteItem () {
|
||||||
|
const item = items.pop()
|
||||||
|
if (!item) return callback()
|
||||||
|
remove.remove(item, err => {
|
||||||
|
if (err) return callback(err)
|
||||||
|
deleteItem()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
function emptyDirSync (dir) {
|
||||||
|
let items
|
||||||
|
try {
|
||||||
|
items = fs.readdirSync(dir)
|
||||||
|
} catch {
|
||||||
|
return mkdir.mkdirsSync(dir)
|
||||||
|
}
|
||||||
|
|
||||||
|
items.forEach(item => {
|
||||||
|
item = path.join(dir, item)
|
||||||
|
remove.removeSync(item)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
emptyDirSync,
|
||||||
|
emptydirSync: emptyDirSync,
|
||||||
|
emptyDir,
|
||||||
|
emptydir: emptyDir
|
||||||
|
}
|
||||||
+69
@@ -0,0 +1,69 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const u = require('universalify').fromCallback
|
||||||
|
const path = require('path')
|
||||||
|
const fs = require('graceful-fs')
|
||||||
|
const mkdir = require('../mkdirs')
|
||||||
|
|
||||||
|
function createFile (file, callback) {
|
||||||
|
function makeFile () {
|
||||||
|
fs.writeFile(file, '', err => {
|
||||||
|
if (err) return callback(err)
|
||||||
|
callback()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.stat(file, (err, stats) => { // eslint-disable-line handle-callback-err
|
||||||
|
if (!err && stats.isFile()) return callback()
|
||||||
|
const dir = path.dirname(file)
|
||||||
|
fs.stat(dir, (err, stats) => {
|
||||||
|
if (err) {
|
||||||
|
// if the directory doesn't exist, make it
|
||||||
|
if (err.code === 'ENOENT') {
|
||||||
|
return mkdir.mkdirs(dir, err => {
|
||||||
|
if (err) return callback(err)
|
||||||
|
makeFile()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return callback(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stats.isDirectory()) makeFile()
|
||||||
|
else {
|
||||||
|
// parent is not a directory
|
||||||
|
// This is just to cause an internal ENOTDIR error to be thrown
|
||||||
|
fs.readdir(dir, err => {
|
||||||
|
if (err) return callback(err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function createFileSync (file) {
|
||||||
|
let stats
|
||||||
|
try {
|
||||||
|
stats = fs.statSync(file)
|
||||||
|
} catch {}
|
||||||
|
if (stats && stats.isFile()) return
|
||||||
|
|
||||||
|
const dir = path.dirname(file)
|
||||||
|
try {
|
||||||
|
if (!fs.statSync(dir).isDirectory()) {
|
||||||
|
// parent is not a directory
|
||||||
|
// This is just to cause an internal ENOTDIR error to be thrown
|
||||||
|
fs.readdirSync(dir)
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
// If the stat call above failed because the directory doesn't exist, create it
|
||||||
|
if (err && err.code === 'ENOENT') mkdir.mkdirsSync(dir)
|
||||||
|
else throw err
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.writeFileSync(file, '')
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
createFile: u(createFile),
|
||||||
|
createFileSync
|
||||||
|
}
|
||||||
+23
@@ -0,0 +1,23 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const file = require('./file')
|
||||||
|
const link = require('./link')
|
||||||
|
const symlink = require('./symlink')
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
// file
|
||||||
|
createFile: file.createFile,
|
||||||
|
createFileSync: file.createFileSync,
|
||||||
|
ensureFile: file.createFile,
|
||||||
|
ensureFileSync: file.createFileSync,
|
||||||
|
// link
|
||||||
|
createLink: link.createLink,
|
||||||
|
createLinkSync: link.createLinkSync,
|
||||||
|
ensureLink: link.createLink,
|
||||||
|
ensureLinkSync: link.createLinkSync,
|
||||||
|
// symlink
|
||||||
|
createSymlink: symlink.createSymlink,
|
||||||
|
createSymlinkSync: symlink.createSymlinkSync,
|
||||||
|
ensureSymlink: symlink.createSymlink,
|
||||||
|
ensureSymlinkSync: symlink.createSymlinkSync
|
||||||
|
}
|
||||||
+61
@@ -0,0 +1,61 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const u = require('universalify').fromCallback
|
||||||
|
const path = require('path')
|
||||||
|
const fs = require('graceful-fs')
|
||||||
|
const mkdir = require('../mkdirs')
|
||||||
|
const pathExists = require('../path-exists').pathExists
|
||||||
|
|
||||||
|
function createLink (srcpath, dstpath, callback) {
|
||||||
|
function makeLink (srcpath, dstpath) {
|
||||||
|
fs.link(srcpath, dstpath, err => {
|
||||||
|
if (err) return callback(err)
|
||||||
|
callback(null)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pathExists(dstpath, (err, destinationExists) => {
|
||||||
|
if (err) return callback(err)
|
||||||
|
if (destinationExists) return callback(null)
|
||||||
|
fs.lstat(srcpath, (err) => {
|
||||||
|
if (err) {
|
||||||
|
err.message = err.message.replace('lstat', 'ensureLink')
|
||||||
|
return callback(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
const dir = path.dirname(dstpath)
|
||||||
|
pathExists(dir, (err, dirExists) => {
|
||||||
|
if (err) return callback(err)
|
||||||
|
if (dirExists) return makeLink(srcpath, dstpath)
|
||||||
|
mkdir.mkdirs(dir, err => {
|
||||||
|
if (err) return callback(err)
|
||||||
|
makeLink(srcpath, dstpath)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function createLinkSync (srcpath, dstpath) {
|
||||||
|
const destinationExists = fs.existsSync(dstpath)
|
||||||
|
if (destinationExists) return undefined
|
||||||
|
|
||||||
|
try {
|
||||||
|
fs.lstatSync(srcpath)
|
||||||
|
} catch (err) {
|
||||||
|
err.message = err.message.replace('lstat', 'ensureLink')
|
||||||
|
throw err
|
||||||
|
}
|
||||||
|
|
||||||
|
const dir = path.dirname(dstpath)
|
||||||
|
const dirExists = fs.existsSync(dir)
|
||||||
|
if (dirExists) return fs.linkSync(srcpath, dstpath)
|
||||||
|
mkdir.mkdirsSync(dir)
|
||||||
|
|
||||||
|
return fs.linkSync(srcpath, dstpath)
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
createLink: u(createLink),
|
||||||
|
createLinkSync
|
||||||
|
}
|
||||||
+99
@@ -0,0 +1,99 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const path = require('path')
|
||||||
|
const fs = require('graceful-fs')
|
||||||
|
const pathExists = require('../path-exists').pathExists
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function that returns two types of paths, one relative to symlink, and one
|
||||||
|
* relative to the current working directory. Checks if path is absolute or
|
||||||
|
* relative. If the path is relative, this function checks if the path is
|
||||||
|
* relative to symlink or relative to current working directory. This is an
|
||||||
|
* initiative to find a smarter `srcpath` to supply when building symlinks.
|
||||||
|
* This allows you to determine which path to use out of one of three possible
|
||||||
|
* types of source paths. The first is an absolute path. This is detected by
|
||||||
|
* `path.isAbsolute()`. When an absolute path is provided, it is checked to
|
||||||
|
* see if it exists. If it does it's used, if not an error is returned
|
||||||
|
* (callback)/ thrown (sync). The other two options for `srcpath` are a
|
||||||
|
* relative url. By default Node's `fs.symlink` works by creating a symlink
|
||||||
|
* using `dstpath` and expects the `srcpath` to be relative to the newly
|
||||||
|
* created symlink. If you provide a `srcpath` that does not exist on the file
|
||||||
|
* system it results in a broken symlink. To minimize this, the function
|
||||||
|
* checks to see if the 'relative to symlink' source file exists, and if it
|
||||||
|
* does it will use it. If it does not, it checks if there's a file that
|
||||||
|
* exists that is relative to the current working directory, if does its used.
|
||||||
|
* This preserves the expectations of the original fs.symlink spec and adds
|
||||||
|
* the ability to pass in `relative to current working direcotry` paths.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function symlinkPaths (srcpath, dstpath, callback) {
|
||||||
|
if (path.isAbsolute(srcpath)) {
|
||||||
|
return fs.lstat(srcpath, (err) => {
|
||||||
|
if (err) {
|
||||||
|
err.message = err.message.replace('lstat', 'ensureSymlink')
|
||||||
|
return callback(err)
|
||||||
|
}
|
||||||
|
return callback(null, {
|
||||||
|
toCwd: srcpath,
|
||||||
|
toDst: srcpath
|
||||||
|
})
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
const dstdir = path.dirname(dstpath)
|
||||||
|
const relativeToDst = path.join(dstdir, srcpath)
|
||||||
|
return pathExists(relativeToDst, (err, exists) => {
|
||||||
|
if (err) return callback(err)
|
||||||
|
if (exists) {
|
||||||
|
return callback(null, {
|
||||||
|
toCwd: relativeToDst,
|
||||||
|
toDst: srcpath
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
return fs.lstat(srcpath, (err) => {
|
||||||
|
if (err) {
|
||||||
|
err.message = err.message.replace('lstat', 'ensureSymlink')
|
||||||
|
return callback(err)
|
||||||
|
}
|
||||||
|
return callback(null, {
|
||||||
|
toCwd: srcpath,
|
||||||
|
toDst: path.relative(dstdir, srcpath)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function symlinkPathsSync (srcpath, dstpath) {
|
||||||
|
let exists
|
||||||
|
if (path.isAbsolute(srcpath)) {
|
||||||
|
exists = fs.existsSync(srcpath)
|
||||||
|
if (!exists) throw new Error('absolute srcpath does not exist')
|
||||||
|
return {
|
||||||
|
toCwd: srcpath,
|
||||||
|
toDst: srcpath
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const dstdir = path.dirname(dstpath)
|
||||||
|
const relativeToDst = path.join(dstdir, srcpath)
|
||||||
|
exists = fs.existsSync(relativeToDst)
|
||||||
|
if (exists) {
|
||||||
|
return {
|
||||||
|
toCwd: relativeToDst,
|
||||||
|
toDst: srcpath
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
exists = fs.existsSync(srcpath)
|
||||||
|
if (!exists) throw new Error('relative srcpath does not exist')
|
||||||
|
return {
|
||||||
|
toCwd: srcpath,
|
||||||
|
toDst: path.relative(dstdir, srcpath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
symlinkPaths,
|
||||||
|
symlinkPathsSync
|
||||||
|
}
|
||||||
+31
@@ -0,0 +1,31 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const fs = require('graceful-fs')
|
||||||
|
|
||||||
|
function symlinkType (srcpath, type, callback) {
|
||||||
|
callback = (typeof type === 'function') ? type : callback
|
||||||
|
type = (typeof type === 'function') ? false : type
|
||||||
|
if (type) return callback(null, type)
|
||||||
|
fs.lstat(srcpath, (err, stats) => {
|
||||||
|
if (err) return callback(null, 'file')
|
||||||
|
type = (stats && stats.isDirectory()) ? 'dir' : 'file'
|
||||||
|
callback(null, type)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function symlinkTypeSync (srcpath, type) {
|
||||||
|
let stats
|
||||||
|
|
||||||
|
if (type) return type
|
||||||
|
try {
|
||||||
|
stats = fs.lstatSync(srcpath)
|
||||||
|
} catch {
|
||||||
|
return 'file'
|
||||||
|
}
|
||||||
|
return (stats && stats.isDirectory()) ? 'dir' : 'file'
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
symlinkType,
|
||||||
|
symlinkTypeSync
|
||||||
|
}
|
||||||
+63
@@ -0,0 +1,63 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const u = require('universalify').fromCallback
|
||||||
|
const path = require('path')
|
||||||
|
const fs = require('graceful-fs')
|
||||||
|
const _mkdirs = require('../mkdirs')
|
||||||
|
const mkdirs = _mkdirs.mkdirs
|
||||||
|
const mkdirsSync = _mkdirs.mkdirsSync
|
||||||
|
|
||||||
|
const _symlinkPaths = require('./symlink-paths')
|
||||||
|
const symlinkPaths = _symlinkPaths.symlinkPaths
|
||||||
|
const symlinkPathsSync = _symlinkPaths.symlinkPathsSync
|
||||||
|
|
||||||
|
const _symlinkType = require('./symlink-type')
|
||||||
|
const symlinkType = _symlinkType.symlinkType
|
||||||
|
const symlinkTypeSync = _symlinkType.symlinkTypeSync
|
||||||
|
|
||||||
|
const pathExists = require('../path-exists').pathExists
|
||||||
|
|
||||||
|
function createSymlink (srcpath, dstpath, type, callback) {
|
||||||
|
callback = (typeof type === 'function') ? type : callback
|
||||||
|
type = (typeof type === 'function') ? false : type
|
||||||
|
|
||||||
|
pathExists(dstpath, (err, destinationExists) => {
|
||||||
|
if (err) return callback(err)
|
||||||
|
if (destinationExists) return callback(null)
|
||||||
|
symlinkPaths(srcpath, dstpath, (err, relative) => {
|
||||||
|
if (err) return callback(err)
|
||||||
|
srcpath = relative.toDst
|
||||||
|
symlinkType(relative.toCwd, type, (err, type) => {
|
||||||
|
if (err) return callback(err)
|
||||||
|
const dir = path.dirname(dstpath)
|
||||||
|
pathExists(dir, (err, dirExists) => {
|
||||||
|
if (err) return callback(err)
|
||||||
|
if (dirExists) return fs.symlink(srcpath, dstpath, type, callback)
|
||||||
|
mkdirs(dir, err => {
|
||||||
|
if (err) return callback(err)
|
||||||
|
fs.symlink(srcpath, dstpath, type, callback)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function createSymlinkSync (srcpath, dstpath, type) {
|
||||||
|
const destinationExists = fs.existsSync(dstpath)
|
||||||
|
if (destinationExists) return undefined
|
||||||
|
|
||||||
|
const relative = symlinkPathsSync(srcpath, dstpath)
|
||||||
|
srcpath = relative.toDst
|
||||||
|
type = symlinkTypeSync(relative.toCwd, type)
|
||||||
|
const dir = path.dirname(dstpath)
|
||||||
|
const exists = fs.existsSync(dir)
|
||||||
|
if (exists) return fs.symlinkSync(srcpath, dstpath, type)
|
||||||
|
mkdirsSync(dir)
|
||||||
|
return fs.symlinkSync(srcpath, dstpath, type)
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
createSymlink: u(createSymlink),
|
||||||
|
createSymlinkSync
|
||||||
|
}
|
||||||
+128
@@ -0,0 +1,128 @@
|
|||||||
|
'use strict'
|
||||||
|
// This is adapted from https://github.com/normalize/mz
|
||||||
|
// Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors
|
||||||
|
const u = require('universalify').fromCallback
|
||||||
|
const fs = require('graceful-fs')
|
||||||
|
|
||||||
|
const api = [
|
||||||
|
'access',
|
||||||
|
'appendFile',
|
||||||
|
'chmod',
|
||||||
|
'chown',
|
||||||
|
'close',
|
||||||
|
'copyFile',
|
||||||
|
'fchmod',
|
||||||
|
'fchown',
|
||||||
|
'fdatasync',
|
||||||
|
'fstat',
|
||||||
|
'fsync',
|
||||||
|
'ftruncate',
|
||||||
|
'futimes',
|
||||||
|
'lchmod',
|
||||||
|
'lchown',
|
||||||
|
'link',
|
||||||
|
'lstat',
|
||||||
|
'mkdir',
|
||||||
|
'mkdtemp',
|
||||||
|
'open',
|
||||||
|
'opendir',
|
||||||
|
'readdir',
|
||||||
|
'readFile',
|
||||||
|
'readlink',
|
||||||
|
'realpath',
|
||||||
|
'rename',
|
||||||
|
'rmdir',
|
||||||
|
'stat',
|
||||||
|
'symlink',
|
||||||
|
'truncate',
|
||||||
|
'unlink',
|
||||||
|
'utimes',
|
||||||
|
'writeFile'
|
||||||
|
].filter(key => {
|
||||||
|
// Some commands are not available on some systems. Ex:
|
||||||
|
// fs.opendir was added in Node.js v12.12.0
|
||||||
|
// fs.lchown is not available on at least some Linux
|
||||||
|
return typeof fs[key] === 'function'
|
||||||
|
})
|
||||||
|
|
||||||
|
// Export all keys:
|
||||||
|
Object.keys(fs).forEach(key => {
|
||||||
|
if (key === 'promises') {
|
||||||
|
// fs.promises is a getter property that triggers ExperimentalWarning
|
||||||
|
// Don't re-export it here, the getter is defined in "lib/index.js"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
exports[key] = fs[key]
|
||||||
|
})
|
||||||
|
|
||||||
|
// Universalify async methods:
|
||||||
|
api.forEach(method => {
|
||||||
|
exports[method] = u(fs[method])
|
||||||
|
})
|
||||||
|
|
||||||
|
// We differ from mz/fs in that we still ship the old, broken, fs.exists()
|
||||||
|
// since we are a drop-in replacement for the native module
|
||||||
|
exports.exists = function (filename, callback) {
|
||||||
|
if (typeof callback === 'function') {
|
||||||
|
return fs.exists(filename, callback)
|
||||||
|
}
|
||||||
|
return new Promise(resolve => {
|
||||||
|
return fs.exists(filename, resolve)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// fs.read(), fs.write(), & fs.writev() need special treatment due to multiple callback args
|
||||||
|
|
||||||
|
exports.read = function (fd, buffer, offset, length, position, callback) {
|
||||||
|
if (typeof callback === 'function') {
|
||||||
|
return fs.read(fd, buffer, offset, length, position, callback)
|
||||||
|
}
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
fs.read(fd, buffer, offset, length, position, (err, bytesRead, buffer) => {
|
||||||
|
if (err) return reject(err)
|
||||||
|
resolve({ bytesRead, buffer })
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function signature can be
|
||||||
|
// fs.write(fd, buffer[, offset[, length[, position]]], callback)
|
||||||
|
// OR
|
||||||
|
// fs.write(fd, string[, position[, encoding]], callback)
|
||||||
|
// We need to handle both cases, so we use ...args
|
||||||
|
exports.write = function (fd, buffer, ...args) {
|
||||||
|
if (typeof args[args.length - 1] === 'function') {
|
||||||
|
return fs.write(fd, buffer, ...args)
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
fs.write(fd, buffer, ...args, (err, bytesWritten, buffer) => {
|
||||||
|
if (err) return reject(err)
|
||||||
|
resolve({ bytesWritten, buffer })
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// fs.writev only available in Node v12.9.0+
|
||||||
|
if (typeof fs.writev === 'function') {
|
||||||
|
// Function signature is
|
||||||
|
// s.writev(fd, buffers[, position], callback)
|
||||||
|
// We need to handle the optional arg, so we use ...args
|
||||||
|
exports.writev = function (fd, buffers, ...args) {
|
||||||
|
if (typeof args[args.length - 1] === 'function') {
|
||||||
|
return fs.writev(fd, buffers, ...args)
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
fs.writev(fd, buffers, ...args, (err, bytesWritten, buffers) => {
|
||||||
|
if (err) return reject(err)
|
||||||
|
resolve({ bytesWritten, buffers })
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// fs.realpath.native only available in Node v9.2+
|
||||||
|
if (typeof fs.realpath.native === 'function') {
|
||||||
|
exports.realpath.native = u(fs.realpath.native)
|
||||||
|
}
|
||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
// Export promiseified graceful-fs:
|
||||||
|
...require('./fs'),
|
||||||
|
// Export extra methods:
|
||||||
|
...require('./copy-sync'),
|
||||||
|
...require('./copy'),
|
||||||
|
...require('./empty'),
|
||||||
|
...require('./ensure'),
|
||||||
|
...require('./json'),
|
||||||
|
...require('./mkdirs'),
|
||||||
|
...require('./move-sync'),
|
||||||
|
...require('./move'),
|
||||||
|
...require('./output'),
|
||||||
|
...require('./path-exists'),
|
||||||
|
...require('./remove')
|
||||||
|
}
|
||||||
|
|
||||||
|
// Export fs.promises as a getter property so that we don't trigger
|
||||||
|
// ExperimentalWarning before fs.promises is actually accessed.
|
||||||
|
const fs = require('fs')
|
||||||
|
if (Object.getOwnPropertyDescriptor(fs, 'promises')) {
|
||||||
|
Object.defineProperty(module.exports, 'promises', {
|
||||||
|
get () { return fs.promises }
|
||||||
|
})
|
||||||
|
}
|
||||||
+16
@@ -0,0 +1,16 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const u = require('universalify').fromPromise
|
||||||
|
const jsonFile = require('./jsonfile')
|
||||||
|
|
||||||
|
jsonFile.outputJson = u(require('./output-json'))
|
||||||
|
jsonFile.outputJsonSync = require('./output-json-sync')
|
||||||
|
// aliases
|
||||||
|
jsonFile.outputJSON = jsonFile.outputJson
|
||||||
|
jsonFile.outputJSONSync = jsonFile.outputJsonSync
|
||||||
|
jsonFile.writeJSON = jsonFile.writeJson
|
||||||
|
jsonFile.writeJSONSync = jsonFile.writeJsonSync
|
||||||
|
jsonFile.readJSON = jsonFile.readJson
|
||||||
|
jsonFile.readJSONSync = jsonFile.readJsonSync
|
||||||
|
|
||||||
|
module.exports = jsonFile
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const jsonFile = require('jsonfile')
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
// jsonfile exports
|
||||||
|
readJson: jsonFile.readFile,
|
||||||
|
readJsonSync: jsonFile.readFileSync,
|
||||||
|
writeJson: jsonFile.writeFile,
|
||||||
|
writeJsonSync: jsonFile.writeFileSync
|
||||||
|
}
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const { stringify } = require('jsonfile/utils')
|
||||||
|
const { outputFileSync } = require('../output')
|
||||||
|
|
||||||
|
function outputJsonSync (file, data, options) {
|
||||||
|
const str = stringify(data, options)
|
||||||
|
|
||||||
|
outputFileSync(file, str, options)
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = outputJsonSync
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const { stringify } = require('jsonfile/utils')
|
||||||
|
const { outputFile } = require('../output')
|
||||||
|
|
||||||
|
async function outputJson (file, data, options = {}) {
|
||||||
|
const str = stringify(data, options)
|
||||||
|
|
||||||
|
await outputFile(file, str, options)
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = outputJson
|
||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
'use strict'
|
||||||
|
const u = require('universalify').fromPromise
|
||||||
|
const { makeDir: _makeDir, makeDirSync } = require('./make-dir')
|
||||||
|
const makeDir = u(_makeDir)
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
mkdirs: makeDir,
|
||||||
|
mkdirsSync: makeDirSync,
|
||||||
|
// alias
|
||||||
|
mkdirp: makeDir,
|
||||||
|
mkdirpSync: makeDirSync,
|
||||||
|
ensureDir: makeDir,
|
||||||
|
ensureDirSync: makeDirSync
|
||||||
|
}
|
||||||
+141
@@ -0,0 +1,141 @@
|
|||||||
|
// Adapted from https://github.com/sindresorhus/make-dir
|
||||||
|
// Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
'use strict'
|
||||||
|
const fs = require('../fs')
|
||||||
|
const path = require('path')
|
||||||
|
const atLeastNode = require('at-least-node')
|
||||||
|
|
||||||
|
const useNativeRecursiveOption = atLeastNode('10.12.0')
|
||||||
|
|
||||||
|
// https://github.com/nodejs/node/issues/8987
|
||||||
|
// https://github.com/libuv/libuv/pull/1088
|
||||||
|
const checkPath = pth => {
|
||||||
|
if (process.platform === 'win32') {
|
||||||
|
const pathHasInvalidWinCharacters = /[<>:"|?*]/.test(pth.replace(path.parse(pth).root, ''))
|
||||||
|
|
||||||
|
if (pathHasInvalidWinCharacters) {
|
||||||
|
const error = new Error(`Path contains invalid characters: ${pth}`)
|
||||||
|
error.code = 'EINVAL'
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const processOptions = options => {
|
||||||
|
const defaults = { mode: 0o777 }
|
||||||
|
if (typeof options === 'number') options = { mode: options }
|
||||||
|
return { ...defaults, ...options }
|
||||||
|
}
|
||||||
|
|
||||||
|
const permissionError = pth => {
|
||||||
|
// This replicates the exception of `fs.mkdir` with native the
|
||||||
|
// `recusive` option when run on an invalid drive under Windows.
|
||||||
|
const error = new Error(`operation not permitted, mkdir '${pth}'`)
|
||||||
|
error.code = 'EPERM'
|
||||||
|
error.errno = -4048
|
||||||
|
error.path = pth
|
||||||
|
error.syscall = 'mkdir'
|
||||||
|
return error
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.makeDir = async (input, options) => {
|
||||||
|
checkPath(input)
|
||||||
|
options = processOptions(options)
|
||||||
|
|
||||||
|
if (useNativeRecursiveOption) {
|
||||||
|
const pth = path.resolve(input)
|
||||||
|
|
||||||
|
return fs.mkdir(pth, {
|
||||||
|
mode: options.mode,
|
||||||
|
recursive: true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const make = async pth => {
|
||||||
|
try {
|
||||||
|
await fs.mkdir(pth, options.mode)
|
||||||
|
} catch (error) {
|
||||||
|
if (error.code === 'EPERM') {
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
|
||||||
|
if (error.code === 'ENOENT') {
|
||||||
|
if (path.dirname(pth) === pth) {
|
||||||
|
throw permissionError(pth)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (error.message.includes('null bytes')) {
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
|
||||||
|
await make(path.dirname(pth))
|
||||||
|
return make(pth)
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const stats = await fs.stat(pth)
|
||||||
|
if (!stats.isDirectory()) {
|
||||||
|
// This error is never exposed to the user
|
||||||
|
// it is caught below, and the original error is thrown
|
||||||
|
throw new Error('The path is not a directory')
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return make(path.resolve(input))
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.makeDirSync = (input, options) => {
|
||||||
|
checkPath(input)
|
||||||
|
options = processOptions(options)
|
||||||
|
|
||||||
|
if (useNativeRecursiveOption) {
|
||||||
|
const pth = path.resolve(input)
|
||||||
|
|
||||||
|
return fs.mkdirSync(pth, {
|
||||||
|
mode: options.mode,
|
||||||
|
recursive: true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const make = pth => {
|
||||||
|
try {
|
||||||
|
fs.mkdirSync(pth, options.mode)
|
||||||
|
} catch (error) {
|
||||||
|
if (error.code === 'EPERM') {
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
|
||||||
|
if (error.code === 'ENOENT') {
|
||||||
|
if (path.dirname(pth) === pth) {
|
||||||
|
throw permissionError(pth)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (error.message.includes('null bytes')) {
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
|
||||||
|
make(path.dirname(pth))
|
||||||
|
return make(pth)
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (!fs.statSync(pth).isDirectory()) {
|
||||||
|
// This error is never exposed to the user
|
||||||
|
// it is caught below, and the original error is thrown
|
||||||
|
throw new Error('The path is not a directory')
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return make(path.resolve(input))
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
moveSync: require('./move-sync')
|
||||||
|
}
|
||||||
+47
@@ -0,0 +1,47 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const fs = require('graceful-fs')
|
||||||
|
const path = require('path')
|
||||||
|
const copySync = require('../copy-sync').copySync
|
||||||
|
const removeSync = require('../remove').removeSync
|
||||||
|
const mkdirpSync = require('../mkdirs').mkdirpSync
|
||||||
|
const stat = require('../util/stat')
|
||||||
|
|
||||||
|
function moveSync (src, dest, opts) {
|
||||||
|
opts = opts || {}
|
||||||
|
const overwrite = opts.overwrite || opts.clobber || false
|
||||||
|
|
||||||
|
const { srcStat } = stat.checkPathsSync(src, dest, 'move')
|
||||||
|
stat.checkParentPathsSync(src, srcStat, dest, 'move')
|
||||||
|
mkdirpSync(path.dirname(dest))
|
||||||
|
return doRename(src, dest, overwrite)
|
||||||
|
}
|
||||||
|
|
||||||
|
function doRename (src, dest, overwrite) {
|
||||||
|
if (overwrite) {
|
||||||
|
removeSync(dest)
|
||||||
|
return rename(src, dest, overwrite)
|
||||||
|
}
|
||||||
|
if (fs.existsSync(dest)) throw new Error('dest already exists.')
|
||||||
|
return rename(src, dest, overwrite)
|
||||||
|
}
|
||||||
|
|
||||||
|
function rename (src, dest, overwrite) {
|
||||||
|
try {
|
||||||
|
fs.renameSync(src, dest)
|
||||||
|
} catch (err) {
|
||||||
|
if (err.code !== 'EXDEV') throw err
|
||||||
|
return moveAcrossDevice(src, dest, overwrite)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function moveAcrossDevice (src, dest, overwrite) {
|
||||||
|
const opts = {
|
||||||
|
overwrite,
|
||||||
|
errorOnExist: true
|
||||||
|
}
|
||||||
|
copySync(src, dest, opts)
|
||||||
|
return removeSync(src)
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = moveSync
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const u = require('universalify').fromCallback
|
||||||
|
module.exports = {
|
||||||
|
move: u(require('./move'))
|
||||||
|
}
|
||||||
+65
@@ -0,0 +1,65 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const fs = require('graceful-fs')
|
||||||
|
const path = require('path')
|
||||||
|
const copy = require('../copy').copy
|
||||||
|
const remove = require('../remove').remove
|
||||||
|
const mkdirp = require('../mkdirs').mkdirp
|
||||||
|
const pathExists = require('../path-exists').pathExists
|
||||||
|
const stat = require('../util/stat')
|
||||||
|
|
||||||
|
function move (src, dest, opts, cb) {
|
||||||
|
if (typeof opts === 'function') {
|
||||||
|
cb = opts
|
||||||
|
opts = {}
|
||||||
|
}
|
||||||
|
|
||||||
|
const overwrite = opts.overwrite || opts.clobber || false
|
||||||
|
|
||||||
|
stat.checkPaths(src, dest, 'move', (err, stats) => {
|
||||||
|
if (err) return cb(err)
|
||||||
|
const { srcStat } = stats
|
||||||
|
stat.checkParentPaths(src, srcStat, dest, 'move', err => {
|
||||||
|
if (err) return cb(err)
|
||||||
|
mkdirp(path.dirname(dest), err => {
|
||||||
|
if (err) return cb(err)
|
||||||
|
return doRename(src, dest, overwrite, cb)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function doRename (src, dest, overwrite, cb) {
|
||||||
|
if (overwrite) {
|
||||||
|
return remove(dest, err => {
|
||||||
|
if (err) return cb(err)
|
||||||
|
return rename(src, dest, overwrite, cb)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
pathExists(dest, (err, destExists) => {
|
||||||
|
if (err) return cb(err)
|
||||||
|
if (destExists) return cb(new Error('dest already exists.'))
|
||||||
|
return rename(src, dest, overwrite, cb)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function rename (src, dest, overwrite, cb) {
|
||||||
|
fs.rename(src, dest, err => {
|
||||||
|
if (!err) return cb()
|
||||||
|
if (err.code !== 'EXDEV') return cb(err)
|
||||||
|
return moveAcrossDevice(src, dest, overwrite, cb)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function moveAcrossDevice (src, dest, overwrite, cb) {
|
||||||
|
const opts = {
|
||||||
|
overwrite,
|
||||||
|
errorOnExist: true
|
||||||
|
}
|
||||||
|
copy(src, dest, opts, err => {
|
||||||
|
if (err) return cb(err)
|
||||||
|
return remove(src, cb)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = move
|
||||||
+40
@@ -0,0 +1,40 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const u = require('universalify').fromCallback
|
||||||
|
const fs = require('graceful-fs')
|
||||||
|
const path = require('path')
|
||||||
|
const mkdir = require('../mkdirs')
|
||||||
|
const pathExists = require('../path-exists').pathExists
|
||||||
|
|
||||||
|
function outputFile (file, data, encoding, callback) {
|
||||||
|
if (typeof encoding === 'function') {
|
||||||
|
callback = encoding
|
||||||
|
encoding = 'utf8'
|
||||||
|
}
|
||||||
|
|
||||||
|
const dir = path.dirname(file)
|
||||||
|
pathExists(dir, (err, itDoes) => {
|
||||||
|
if (err) return callback(err)
|
||||||
|
if (itDoes) return fs.writeFile(file, data, encoding, callback)
|
||||||
|
|
||||||
|
mkdir.mkdirs(dir, err => {
|
||||||
|
if (err) return callback(err)
|
||||||
|
|
||||||
|
fs.writeFile(file, data, encoding, callback)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function outputFileSync (file, ...args) {
|
||||||
|
const dir = path.dirname(file)
|
||||||
|
if (fs.existsSync(dir)) {
|
||||||
|
return fs.writeFileSync(file, ...args)
|
||||||
|
}
|
||||||
|
mkdir.mkdirsSync(dir)
|
||||||
|
fs.writeFileSync(file, ...args)
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
outputFile: u(outputFile),
|
||||||
|
outputFileSync
|
||||||
|
}
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
'use strict'
|
||||||
|
const u = require('universalify').fromPromise
|
||||||
|
const fs = require('../fs')
|
||||||
|
|
||||||
|
function pathExists (path) {
|
||||||
|
return fs.access(path).then(() => true).catch(() => false)
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
pathExists: u(pathExists),
|
||||||
|
pathExistsSync: fs.existsSync
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const u = require('universalify').fromCallback
|
||||||
|
const rimraf = require('./rimraf')
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
remove: u(rimraf),
|
||||||
|
removeSync: rimraf.sync
|
||||||
|
}
|
||||||
+302
@@ -0,0 +1,302 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const fs = require('graceful-fs')
|
||||||
|
const path = require('path')
|
||||||
|
const assert = require('assert')
|
||||||
|
|
||||||
|
const isWindows = (process.platform === 'win32')
|
||||||
|
|
||||||
|
function defaults (options) {
|
||||||
|
const methods = [
|
||||||
|
'unlink',
|
||||||
|
'chmod',
|
||||||
|
'stat',
|
||||||
|
'lstat',
|
||||||
|
'rmdir',
|
||||||
|
'readdir'
|
||||||
|
]
|
||||||
|
methods.forEach(m => {
|
||||||
|
options[m] = options[m] || fs[m]
|
||||||
|
m = m + 'Sync'
|
||||||
|
options[m] = options[m] || fs[m]
|
||||||
|
})
|
||||||
|
|
||||||
|
options.maxBusyTries = options.maxBusyTries || 3
|
||||||
|
}
|
||||||
|
|
||||||
|
function rimraf (p, options, cb) {
|
||||||
|
let busyTries = 0
|
||||||
|
|
||||||
|
if (typeof options === 'function') {
|
||||||
|
cb = options
|
||||||
|
options = {}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(p, 'rimraf: missing path')
|
||||||
|
assert.strictEqual(typeof p, 'string', 'rimraf: path should be a string')
|
||||||
|
assert.strictEqual(typeof cb, 'function', 'rimraf: callback function required')
|
||||||
|
assert(options, 'rimraf: invalid options argument provided')
|
||||||
|
assert.strictEqual(typeof options, 'object', 'rimraf: options should be object')
|
||||||
|
|
||||||
|
defaults(options)
|
||||||
|
|
||||||
|
rimraf_(p, options, function CB (er) {
|
||||||
|
if (er) {
|
||||||
|
if ((er.code === 'EBUSY' || er.code === 'ENOTEMPTY' || er.code === 'EPERM') &&
|
||||||
|
busyTries < options.maxBusyTries) {
|
||||||
|
busyTries++
|
||||||
|
const time = busyTries * 100
|
||||||
|
// try again, with the same exact callback as this one.
|
||||||
|
return setTimeout(() => rimraf_(p, options, CB), time)
|
||||||
|
}
|
||||||
|
|
||||||
|
// already gone
|
||||||
|
if (er.code === 'ENOENT') er = null
|
||||||
|
}
|
||||||
|
|
||||||
|
cb(er)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Two possible strategies.
|
||||||
|
// 1. Assume it's a file. unlink it, then do the dir stuff on EPERM or EISDIR
|
||||||
|
// 2. Assume it's a directory. readdir, then do the file stuff on ENOTDIR
|
||||||
|
//
|
||||||
|
// Both result in an extra syscall when you guess wrong. However, there
|
||||||
|
// are likely far more normal files in the world than directories. This
|
||||||
|
// is based on the assumption that a the average number of files per
|
||||||
|
// directory is >= 1.
|
||||||
|
//
|
||||||
|
// If anyone ever complains about this, then I guess the strategy could
|
||||||
|
// be made configurable somehow. But until then, YAGNI.
|
||||||
|
function rimraf_ (p, options, cb) {
|
||||||
|
assert(p)
|
||||||
|
assert(options)
|
||||||
|
assert(typeof cb === 'function')
|
||||||
|
|
||||||
|
// sunos lets the root user unlink directories, which is... weird.
|
||||||
|
// so we have to lstat here and make sure it's not a dir.
|
||||||
|
options.lstat(p, (er, st) => {
|
||||||
|
if (er && er.code === 'ENOENT') {
|
||||||
|
return cb(null)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Windows can EPERM on stat. Life is suffering.
|
||||||
|
if (er && er.code === 'EPERM' && isWindows) {
|
||||||
|
return fixWinEPERM(p, options, er, cb)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (st && st.isDirectory()) {
|
||||||
|
return rmdir(p, options, er, cb)
|
||||||
|
}
|
||||||
|
|
||||||
|
options.unlink(p, er => {
|
||||||
|
if (er) {
|
||||||
|
if (er.code === 'ENOENT') {
|
||||||
|
return cb(null)
|
||||||
|
}
|
||||||
|
if (er.code === 'EPERM') {
|
||||||
|
return (isWindows)
|
||||||
|
? fixWinEPERM(p, options, er, cb)
|
||||||
|
: rmdir(p, options, er, cb)
|
||||||
|
}
|
||||||
|
if (er.code === 'EISDIR') {
|
||||||
|
return rmdir(p, options, er, cb)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cb(er)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function fixWinEPERM (p, options, er, cb) {
|
||||||
|
assert(p)
|
||||||
|
assert(options)
|
||||||
|
assert(typeof cb === 'function')
|
||||||
|
|
||||||
|
options.chmod(p, 0o666, er2 => {
|
||||||
|
if (er2) {
|
||||||
|
cb(er2.code === 'ENOENT' ? null : er)
|
||||||
|
} else {
|
||||||
|
options.stat(p, (er3, stats) => {
|
||||||
|
if (er3) {
|
||||||
|
cb(er3.code === 'ENOENT' ? null : er)
|
||||||
|
} else if (stats.isDirectory()) {
|
||||||
|
rmdir(p, options, er, cb)
|
||||||
|
} else {
|
||||||
|
options.unlink(p, cb)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function fixWinEPERMSync (p, options, er) {
|
||||||
|
let stats
|
||||||
|
|
||||||
|
assert(p)
|
||||||
|
assert(options)
|
||||||
|
|
||||||
|
try {
|
||||||
|
options.chmodSync(p, 0o666)
|
||||||
|
} catch (er2) {
|
||||||
|
if (er2.code === 'ENOENT') {
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
throw er
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
stats = options.statSync(p)
|
||||||
|
} catch (er3) {
|
||||||
|
if (er3.code === 'ENOENT') {
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
throw er
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stats.isDirectory()) {
|
||||||
|
rmdirSync(p, options, er)
|
||||||
|
} else {
|
||||||
|
options.unlinkSync(p)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function rmdir (p, options, originalEr, cb) {
|
||||||
|
assert(p)
|
||||||
|
assert(options)
|
||||||
|
assert(typeof cb === 'function')
|
||||||
|
|
||||||
|
// try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)
|
||||||
|
// if we guessed wrong, and it's not a directory, then
|
||||||
|
// raise the original error.
|
||||||
|
options.rmdir(p, er => {
|
||||||
|
if (er && (er.code === 'ENOTEMPTY' || er.code === 'EEXIST' || er.code === 'EPERM')) {
|
||||||
|
rmkids(p, options, cb)
|
||||||
|
} else if (er && er.code === 'ENOTDIR') {
|
||||||
|
cb(originalEr)
|
||||||
|
} else {
|
||||||
|
cb(er)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function rmkids (p, options, cb) {
|
||||||
|
assert(p)
|
||||||
|
assert(options)
|
||||||
|
assert(typeof cb === 'function')
|
||||||
|
|
||||||
|
options.readdir(p, (er, files) => {
|
||||||
|
if (er) return cb(er)
|
||||||
|
|
||||||
|
let n = files.length
|
||||||
|
let errState
|
||||||
|
|
||||||
|
if (n === 0) return options.rmdir(p, cb)
|
||||||
|
|
||||||
|
files.forEach(f => {
|
||||||
|
rimraf(path.join(p, f), options, er => {
|
||||||
|
if (errState) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (er) return cb(errState = er)
|
||||||
|
if (--n === 0) {
|
||||||
|
options.rmdir(p, cb)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// this looks simpler, and is strictly *faster*, but will
|
||||||
|
// tie up the JavaScript thread and fail on excessively
|
||||||
|
// deep directory trees.
|
||||||
|
function rimrafSync (p, options) {
|
||||||
|
let st
|
||||||
|
|
||||||
|
options = options || {}
|
||||||
|
defaults(options)
|
||||||
|
|
||||||
|
assert(p, 'rimraf: missing path')
|
||||||
|
assert.strictEqual(typeof p, 'string', 'rimraf: path should be a string')
|
||||||
|
assert(options, 'rimraf: missing options')
|
||||||
|
assert.strictEqual(typeof options, 'object', 'rimraf: options should be object')
|
||||||
|
|
||||||
|
try {
|
||||||
|
st = options.lstatSync(p)
|
||||||
|
} catch (er) {
|
||||||
|
if (er.code === 'ENOENT') {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Windows can EPERM on stat. Life is suffering.
|
||||||
|
if (er.code === 'EPERM' && isWindows) {
|
||||||
|
fixWinEPERMSync(p, options, er)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// sunos lets the root user unlink directories, which is... weird.
|
||||||
|
if (st && st.isDirectory()) {
|
||||||
|
rmdirSync(p, options, null)
|
||||||
|
} else {
|
||||||
|
options.unlinkSync(p)
|
||||||
|
}
|
||||||
|
} catch (er) {
|
||||||
|
if (er.code === 'ENOENT') {
|
||||||
|
return
|
||||||
|
} else if (er.code === 'EPERM') {
|
||||||
|
return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er)
|
||||||
|
} else if (er.code !== 'EISDIR') {
|
||||||
|
throw er
|
||||||
|
}
|
||||||
|
rmdirSync(p, options, er)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function rmdirSync (p, options, originalEr) {
|
||||||
|
assert(p)
|
||||||
|
assert(options)
|
||||||
|
|
||||||
|
try {
|
||||||
|
options.rmdirSync(p)
|
||||||
|
} catch (er) {
|
||||||
|
if (er.code === 'ENOTDIR') {
|
||||||
|
throw originalEr
|
||||||
|
} else if (er.code === 'ENOTEMPTY' || er.code === 'EEXIST' || er.code === 'EPERM') {
|
||||||
|
rmkidsSync(p, options)
|
||||||
|
} else if (er.code !== 'ENOENT') {
|
||||||
|
throw er
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function rmkidsSync (p, options) {
|
||||||
|
assert(p)
|
||||||
|
assert(options)
|
||||||
|
options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options))
|
||||||
|
|
||||||
|
if (isWindows) {
|
||||||
|
// We only end up here once we got ENOTEMPTY at least once, and
|
||||||
|
// at this point, we are guaranteed to have removed all the kids.
|
||||||
|
// So, we know that it won't be ENOENT or ENOTDIR or anything else.
|
||||||
|
// try really hard to delete stuff on windows, because it has a
|
||||||
|
// PROFOUNDLY annoying habit of not closing handles promptly when
|
||||||
|
// files are deleted, resulting in spurious ENOTEMPTY errors.
|
||||||
|
const startTime = Date.now()
|
||||||
|
do {
|
||||||
|
try {
|
||||||
|
const ret = options.rmdirSync(p, options)
|
||||||
|
return ret
|
||||||
|
} catch {}
|
||||||
|
} while (Date.now() - startTime < 500) // give up after 500ms
|
||||||
|
} else {
|
||||||
|
const ret = options.rmdirSync(p, options)
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = rimraf
|
||||||
|
rimraf.sync = rimrafSync
|
||||||
+139
@@ -0,0 +1,139 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const fs = require('../fs')
|
||||||
|
const path = require('path')
|
||||||
|
const util = require('util')
|
||||||
|
const atLeastNode = require('at-least-node')
|
||||||
|
|
||||||
|
const nodeSupportsBigInt = atLeastNode('10.5.0')
|
||||||
|
const stat = (file) => nodeSupportsBigInt ? fs.stat(file, { bigint: true }) : fs.stat(file)
|
||||||
|
const statSync = (file) => nodeSupportsBigInt ? fs.statSync(file, { bigint: true }) : fs.statSync(file)
|
||||||
|
|
||||||
|
function getStats (src, dest) {
|
||||||
|
return Promise.all([
|
||||||
|
stat(src),
|
||||||
|
stat(dest).catch(err => {
|
||||||
|
if (err.code === 'ENOENT') return null
|
||||||
|
throw err
|
||||||
|
})
|
||||||
|
]).then(([srcStat, destStat]) => ({ srcStat, destStat }))
|
||||||
|
}
|
||||||
|
|
||||||
|
function getStatsSync (src, dest) {
|
||||||
|
let destStat
|
||||||
|
const srcStat = statSync(src)
|
||||||
|
try {
|
||||||
|
destStat = statSync(dest)
|
||||||
|
} catch (err) {
|
||||||
|
if (err.code === 'ENOENT') return { srcStat, destStat: null }
|
||||||
|
throw err
|
||||||
|
}
|
||||||
|
return { srcStat, destStat }
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkPaths (src, dest, funcName, cb) {
|
||||||
|
util.callbackify(getStats)(src, dest, (err, stats) => {
|
||||||
|
if (err) return cb(err)
|
||||||
|
const { srcStat, destStat } = stats
|
||||||
|
if (destStat && areIdentical(srcStat, destStat)) {
|
||||||
|
return cb(new Error('Source and destination must not be the same.'))
|
||||||
|
}
|
||||||
|
if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {
|
||||||
|
return cb(new Error(errMsg(src, dest, funcName)))
|
||||||
|
}
|
||||||
|
return cb(null, { srcStat, destStat })
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkPathsSync (src, dest, funcName) {
|
||||||
|
const { srcStat, destStat } = getStatsSync(src, dest)
|
||||||
|
if (destStat && areIdentical(srcStat, destStat)) {
|
||||||
|
throw new Error('Source and destination must not be the same.')
|
||||||
|
}
|
||||||
|
if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {
|
||||||
|
throw new Error(errMsg(src, dest, funcName))
|
||||||
|
}
|
||||||
|
return { srcStat, destStat }
|
||||||
|
}
|
||||||
|
|
||||||
|
// recursively check if dest parent is a subdirectory of src.
|
||||||
|
// It works for all file types including symlinks since it
|
||||||
|
// checks the src and dest inodes. It starts from the deepest
|
||||||
|
// parent and stops once it reaches the src parent or the root path.
|
||||||
|
function checkParentPaths (src, srcStat, dest, funcName, cb) {
|
||||||
|
const srcParent = path.resolve(path.dirname(src))
|
||||||
|
const destParent = path.resolve(path.dirname(dest))
|
||||||
|
if (destParent === srcParent || destParent === path.parse(destParent).root) return cb()
|
||||||
|
const callback = (err, destStat) => {
|
||||||
|
if (err) {
|
||||||
|
if (err.code === 'ENOENT') return cb()
|
||||||
|
return cb(err)
|
||||||
|
}
|
||||||
|
if (areIdentical(srcStat, destStat)) {
|
||||||
|
return cb(new Error(errMsg(src, dest, funcName)))
|
||||||
|
}
|
||||||
|
return checkParentPaths(src, srcStat, destParent, funcName, cb)
|
||||||
|
}
|
||||||
|
if (nodeSupportsBigInt) fs.stat(destParent, { bigint: true }, callback)
|
||||||
|
else fs.stat(destParent, callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkParentPathsSync (src, srcStat, dest, funcName) {
|
||||||
|
const srcParent = path.resolve(path.dirname(src))
|
||||||
|
const destParent = path.resolve(path.dirname(dest))
|
||||||
|
if (destParent === srcParent || destParent === path.parse(destParent).root) return
|
||||||
|
let destStat
|
||||||
|
try {
|
||||||
|
destStat = statSync(destParent)
|
||||||
|
} catch (err) {
|
||||||
|
if (err.code === 'ENOENT') return
|
||||||
|
throw err
|
||||||
|
}
|
||||||
|
if (areIdentical(srcStat, destStat)) {
|
||||||
|
throw new Error(errMsg(src, dest, funcName))
|
||||||
|
}
|
||||||
|
return checkParentPathsSync(src, srcStat, destParent, funcName)
|
||||||
|
}
|
||||||
|
|
||||||
|
function areIdentical (srcStat, destStat) {
|
||||||
|
if (destStat.ino && destStat.dev && destStat.ino === srcStat.ino && destStat.dev === srcStat.dev) {
|
||||||
|
if (nodeSupportsBigInt || destStat.ino < Number.MAX_SAFE_INTEGER) {
|
||||||
|
// definitive answer
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
// Use additional heuristics if we can't use 'bigint'.
|
||||||
|
// Different 'ino' could be represented the same if they are >= Number.MAX_SAFE_INTEGER
|
||||||
|
// See issue 657
|
||||||
|
if (destStat.size === srcStat.size &&
|
||||||
|
destStat.mode === srcStat.mode &&
|
||||||
|
destStat.nlink === srcStat.nlink &&
|
||||||
|
destStat.atimeMs === srcStat.atimeMs &&
|
||||||
|
destStat.mtimeMs === srcStat.mtimeMs &&
|
||||||
|
destStat.ctimeMs === srcStat.ctimeMs &&
|
||||||
|
destStat.birthtimeMs === srcStat.birthtimeMs) {
|
||||||
|
// heuristic answer
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// return true if dest is a subdir of src, otherwise false.
|
||||||
|
// It only checks the path strings.
|
||||||
|
function isSrcSubdir (src, dest) {
|
||||||
|
const srcArr = path.resolve(src).split(path.sep).filter(i => i)
|
||||||
|
const destArr = path.resolve(dest).split(path.sep).filter(i => i)
|
||||||
|
return srcArr.reduce((acc, cur, i) => acc && destArr[i] === cur, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
function errMsg (src, dest, funcName) {
|
||||||
|
return `Cannot ${funcName} '${src}' to a subdirectory of itself, '${dest}'.`
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
checkPaths,
|
||||||
|
checkPathsSync,
|
||||||
|
checkParentPaths,
|
||||||
|
checkParentPathsSync,
|
||||||
|
isSrcSubdir
|
||||||
|
}
|
||||||
+26
@@ -0,0 +1,26 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const fs = require('graceful-fs')
|
||||||
|
|
||||||
|
function utimesMillis (path, atime, mtime, callback) {
|
||||||
|
// if (!HAS_MILLIS_RES) return fs.utimes(path, atime, mtime, callback)
|
||||||
|
fs.open(path, 'r+', (err, fd) => {
|
||||||
|
if (err) return callback(err)
|
||||||
|
fs.futimes(fd, atime, mtime, futimesErr => {
|
||||||
|
fs.close(fd, closeErr => {
|
||||||
|
if (callback) callback(futimesErr || closeErr)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function utimesMillisSync (path, atime, mtime) {
|
||||||
|
const fd = fs.openSync(path, 'r+')
|
||||||
|
fs.futimesSync(fd, atime, mtime)
|
||||||
|
return fs.closeSync(fd)
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
utimesMillis,
|
||||||
|
utimesMillisSync
|
||||||
|
}
|
||||||
+70
@@ -0,0 +1,70 @@
|
|||||||
|
{
|
||||||
|
"name": "fs-extra",
|
||||||
|
"version": "9.0.1",
|
||||||
|
"description": "fs-extra contains methods that aren't included in the vanilla Node.js fs package. Such as recursive mkdir, copy, and remove.",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/jprichardson/node-fs-extra",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/jprichardson/node-fs-extra"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"fs",
|
||||||
|
"file",
|
||||||
|
"file system",
|
||||||
|
"copy",
|
||||||
|
"directory",
|
||||||
|
"extra",
|
||||||
|
"mkdirp",
|
||||||
|
"mkdir",
|
||||||
|
"mkdirs",
|
||||||
|
"recursive",
|
||||||
|
"json",
|
||||||
|
"read",
|
||||||
|
"write",
|
||||||
|
"extra",
|
||||||
|
"delete",
|
||||||
|
"remove",
|
||||||
|
"touch",
|
||||||
|
"create",
|
||||||
|
"text",
|
||||||
|
"output",
|
||||||
|
"move",
|
||||||
|
"promise"
|
||||||
|
],
|
||||||
|
"author": "JP Richardson <jprichardson@gmail.com>",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"at-least-node": "^1.0.0",
|
||||||
|
"graceful-fs": "^4.2.0",
|
||||||
|
"jsonfile": "^6.0.1",
|
||||||
|
"universalify": "^1.0.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"coveralls": "^3.0.0",
|
||||||
|
"klaw": "^2.1.1",
|
||||||
|
"klaw-sync": "^3.0.2",
|
||||||
|
"minimist": "^1.1.1",
|
||||||
|
"mocha": "^5.0.5",
|
||||||
|
"nyc": "^15.0.0",
|
||||||
|
"proxyquire": "^2.0.1",
|
||||||
|
"read-dir-files": "^0.1.1",
|
||||||
|
"standard": "^14.1.0"
|
||||||
|
},
|
||||||
|
"main": "./lib/index.js",
|
||||||
|
"files": [
|
||||||
|
"lib/",
|
||||||
|
"!lib/**/__tests__/"
|
||||||
|
],
|
||||||
|
"scripts": {
|
||||||
|
"full-ci": "npm run lint && npm run coverage",
|
||||||
|
"coverage": "nyc -r lcovonly npm run unit",
|
||||||
|
"coveralls": "coveralls < coverage/lcov.info",
|
||||||
|
"lint": "standard",
|
||||||
|
"test-find": "find ./lib/**/__tests__ -name *.test.js | xargs mocha",
|
||||||
|
"test": "npm run lint && npm run unit",
|
||||||
|
"unit": "node test.js"
|
||||||
|
}
|
||||||
|
}
|
||||||
+122
-47
@@ -3,12 +3,32 @@ var polyfills = require('./polyfills.js')
|
|||||||
var legacy = require('./legacy-streams.js')
|
var legacy = require('./legacy-streams.js')
|
||||||
var clone = require('./clone.js')
|
var clone = require('./clone.js')
|
||||||
|
|
||||||
var queue = []
|
|
||||||
|
|
||||||
var util = require('util')
|
var util = require('util')
|
||||||
|
|
||||||
|
/* istanbul ignore next - node 0.x polyfill */
|
||||||
|
var gracefulQueue
|
||||||
|
var previousSymbol
|
||||||
|
|
||||||
|
/* istanbul ignore else - node 0.x polyfill */
|
||||||
|
if (typeof Symbol === 'function' && typeof Symbol.for === 'function') {
|
||||||
|
gracefulQueue = Symbol.for('graceful-fs.queue')
|
||||||
|
// This is used in testing by future versions
|
||||||
|
previousSymbol = Symbol.for('graceful-fs.previous')
|
||||||
|
} else {
|
||||||
|
gracefulQueue = '___graceful-fs.queue'
|
||||||
|
previousSymbol = '___graceful-fs.previous'
|
||||||
|
}
|
||||||
|
|
||||||
function noop () {}
|
function noop () {}
|
||||||
|
|
||||||
|
function publishQueue(context, queue) {
|
||||||
|
Object.defineProperty(context, gracefulQueue, {
|
||||||
|
get: function() {
|
||||||
|
return queue
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
var debug = noop
|
var debug = noop
|
||||||
if (util.debuglog)
|
if (util.debuglog)
|
||||||
debug = util.debuglog('gfs4')
|
debug = util.debuglog('gfs4')
|
||||||
@@ -19,11 +39,58 @@ else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || ''))
|
|||||||
console.error(m)
|
console.error(m)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) {
|
// Once time initialization
|
||||||
process.on('exit', function() {
|
if (!fs[gracefulQueue]) {
|
||||||
debug(queue)
|
// This queue can be shared by multiple loaded instances
|
||||||
require('assert').equal(queue.length, 0)
|
var queue = global[gracefulQueue] || []
|
||||||
|
publishQueue(fs, queue)
|
||||||
|
|
||||||
|
// Patch fs.close/closeSync to shared queue version, because we need
|
||||||
|
// to retry() whenever a close happens *anywhere* in the program.
|
||||||
|
// This is essential when multiple graceful-fs instances are
|
||||||
|
// in play at the same time.
|
||||||
|
fs.close = (function (fs$close) {
|
||||||
|
function close (fd, cb) {
|
||||||
|
return fs$close.call(fs, fd, function (err) {
|
||||||
|
// This function uses the graceful-fs shared queue
|
||||||
|
if (!err) {
|
||||||
|
retry()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof cb === 'function')
|
||||||
|
cb.apply(this, arguments)
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
Object.defineProperty(close, previousSymbol, {
|
||||||
|
value: fs$close
|
||||||
|
})
|
||||||
|
return close
|
||||||
|
})(fs.close)
|
||||||
|
|
||||||
|
fs.closeSync = (function (fs$closeSync) {
|
||||||
|
function closeSync (fd) {
|
||||||
|
// This function uses the graceful-fs shared queue
|
||||||
|
fs$closeSync.apply(fs, arguments)
|
||||||
|
retry()
|
||||||
|
}
|
||||||
|
|
||||||
|
Object.defineProperty(closeSync, previousSymbol, {
|
||||||
|
value: fs$closeSync
|
||||||
|
})
|
||||||
|
return closeSync
|
||||||
|
})(fs.closeSync)
|
||||||
|
|
||||||
|
if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) {
|
||||||
|
process.on('exit', function() {
|
||||||
|
debug(fs[gracefulQueue])
|
||||||
|
require('assert').equal(fs[gracefulQueue].length, 0)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!global[gracefulQueue]) {
|
||||||
|
publishQueue(global, fs[gracefulQueue]);
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = patch(clone(fs))
|
module.exports = patch(clone(fs))
|
||||||
@@ -32,45 +99,11 @@ if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) {
|
|||||||
fs.__patched = true;
|
fs.__patched = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Always patch fs.close/closeSync, because we want to
|
|
||||||
// retry() whenever a close happens *anywhere* in the program.
|
|
||||||
// This is essential when multiple graceful-fs instances are
|
|
||||||
// in play at the same time.
|
|
||||||
module.exports.close = (function (fs$close) { return function (fd, cb) {
|
|
||||||
return fs$close.call(fs, fd, function (err) {
|
|
||||||
if (!err)
|
|
||||||
retry()
|
|
||||||
|
|
||||||
if (typeof cb === 'function')
|
|
||||||
cb.apply(this, arguments)
|
|
||||||
})
|
|
||||||
}})(fs.close)
|
|
||||||
|
|
||||||
module.exports.closeSync = (function (fs$closeSync) { return function (fd) {
|
|
||||||
// Note that graceful-fs also retries when fs.closeSync() fails.
|
|
||||||
// Looks like a bug to me, although it's probably a harmless one.
|
|
||||||
var rval = fs$closeSync.apply(fs, arguments)
|
|
||||||
retry()
|
|
||||||
return rval
|
|
||||||
}})(fs.closeSync)
|
|
||||||
|
|
||||||
// Only patch fs once, otherwise we'll run into a memory leak if
|
|
||||||
// graceful-fs is loaded multiple times, such as in test environments that
|
|
||||||
// reset the loaded modules between tests.
|
|
||||||
// We look for the string `graceful-fs` from the comment above. This
|
|
||||||
// way we are not adding any extra properties and it will detect if older
|
|
||||||
// versions of graceful-fs are installed.
|
|
||||||
if (!/\bgraceful-fs\b/.test(fs.closeSync.toString())) {
|
|
||||||
fs.closeSync = module.exports.closeSync;
|
|
||||||
fs.close = module.exports.close;
|
|
||||||
}
|
|
||||||
|
|
||||||
function patch (fs) {
|
function patch (fs) {
|
||||||
// Everything that references the open() function needs to be in here
|
// Everything that references the open() function needs to be in here
|
||||||
polyfills(fs)
|
polyfills(fs)
|
||||||
fs.gracefulify = patch
|
fs.gracefulify = patch
|
||||||
fs.FileReadStream = ReadStream; // Legacy name.
|
|
||||||
fs.FileWriteStream = WriteStream; // Legacy name.
|
|
||||||
fs.createReadStream = createReadStream
|
fs.createReadStream = createReadStream
|
||||||
fs.createWriteStream = createWriteStream
|
fs.createWriteStream = createWriteStream
|
||||||
var fs$readFile = fs.readFile
|
var fs$readFile = fs.readFile
|
||||||
@@ -187,8 +220,50 @@ function patch (fs) {
|
|||||||
WriteStream.prototype.open = WriteStream$open
|
WriteStream.prototype.open = WriteStream$open
|
||||||
}
|
}
|
||||||
|
|
||||||
fs.ReadStream = ReadStream
|
Object.defineProperty(fs, 'ReadStream', {
|
||||||
fs.WriteStream = WriteStream
|
get: function () {
|
||||||
|
return ReadStream
|
||||||
|
},
|
||||||
|
set: function (val) {
|
||||||
|
ReadStream = val
|
||||||
|
},
|
||||||
|
enumerable: true,
|
||||||
|
configurable: true
|
||||||
|
})
|
||||||
|
Object.defineProperty(fs, 'WriteStream', {
|
||||||
|
get: function () {
|
||||||
|
return WriteStream
|
||||||
|
},
|
||||||
|
set: function (val) {
|
||||||
|
WriteStream = val
|
||||||
|
},
|
||||||
|
enumerable: true,
|
||||||
|
configurable: true
|
||||||
|
})
|
||||||
|
|
||||||
|
// legacy names
|
||||||
|
var FileReadStream = ReadStream
|
||||||
|
Object.defineProperty(fs, 'FileReadStream', {
|
||||||
|
get: function () {
|
||||||
|
return FileReadStream
|
||||||
|
},
|
||||||
|
set: function (val) {
|
||||||
|
FileReadStream = val
|
||||||
|
},
|
||||||
|
enumerable: true,
|
||||||
|
configurable: true
|
||||||
|
})
|
||||||
|
var FileWriteStream = WriteStream
|
||||||
|
Object.defineProperty(fs, 'FileWriteStream', {
|
||||||
|
get: function () {
|
||||||
|
return FileWriteStream
|
||||||
|
},
|
||||||
|
set: function (val) {
|
||||||
|
FileWriteStream = val
|
||||||
|
},
|
||||||
|
enumerable: true,
|
||||||
|
configurable: true
|
||||||
|
})
|
||||||
|
|
||||||
function ReadStream (path, options) {
|
function ReadStream (path, options) {
|
||||||
if (this instanceof ReadStream)
|
if (this instanceof ReadStream)
|
||||||
@@ -234,11 +309,11 @@ function patch (fs) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function createReadStream (path, options) {
|
function createReadStream (path, options) {
|
||||||
return new ReadStream(path, options)
|
return new fs.ReadStream(path, options)
|
||||||
}
|
}
|
||||||
|
|
||||||
function createWriteStream (path, options) {
|
function createWriteStream (path, options) {
|
||||||
return new WriteStream(path, options)
|
return new fs.WriteStream(path, options)
|
||||||
}
|
}
|
||||||
|
|
||||||
var fs$open = fs.open
|
var fs$open = fs.open
|
||||||
@@ -267,11 +342,11 @@ function patch (fs) {
|
|||||||
|
|
||||||
function enqueue (elem) {
|
function enqueue (elem) {
|
||||||
debug('ENQUEUE', elem[0].name, elem[1])
|
debug('ENQUEUE', elem[0].name, elem[1])
|
||||||
queue.push(elem)
|
fs[gracefulQueue].push(elem)
|
||||||
}
|
}
|
||||||
|
|
||||||
function retry () {
|
function retry () {
|
||||||
var elem = queue.shift()
|
var elem = fs[gracefulQueue].shift()
|
||||||
if (elem) {
|
if (elem) {
|
||||||
debug('RETRY', elem[0].name, elem[1])
|
debug('RETRY', elem[0].name, elem[1])
|
||||||
elem[0].apply(null, elem[1])
|
elem[0].apply(null, elem[1])
|
||||||
|
|||||||
+5
-4
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "graceful-fs",
|
"name": "graceful-fs",
|
||||||
"description": "A drop-in replacement for fs, making various improvements.",
|
"description": "A drop-in replacement for fs, making various improvements.",
|
||||||
"version": "4.1.15",
|
"version": "4.2.4",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/isaacs/node-graceful-fs"
|
"url": "https://github.com/isaacs/node-graceful-fs"
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"preversion": "npm test",
|
"preversion": "npm test",
|
||||||
"postversion": "npm publish",
|
"postversion": "npm publish",
|
||||||
"postpublish": "git push origin --all; git push origin --tags",
|
"postpublish": "git push origin --follow-tags",
|
||||||
"test": "node test.js | tap -"
|
"test": "node test.js | tap -"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
@@ -37,7 +37,7 @@
|
|||||||
"import-fresh": "^2.0.0",
|
"import-fresh": "^2.0.0",
|
||||||
"mkdirp": "^0.5.0",
|
"mkdirp": "^0.5.0",
|
||||||
"rimraf": "^2.2.8",
|
"rimraf": "^2.2.8",
|
||||||
"tap": "^12.0.1"
|
"tap": "^12.7.0"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"fs.js",
|
"fs.js",
|
||||||
@@ -45,5 +45,6 @@
|
|||||||
"legacy-streams.js",
|
"legacy-streams.js",
|
||||||
"polyfills.js",
|
"polyfills.js",
|
||||||
"clone.js"
|
"clone.js"
|
||||||
]
|
],
|
||||||
|
"dependencies": {}
|
||||||
}
|
}
|
||||||
|
|||||||
+22
-9
@@ -115,7 +115,8 @@ function patch (fs) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// if read() returns EAGAIN, then just try it again.
|
// if read() returns EAGAIN, then just try it again.
|
||||||
fs.read = (function (fs$read) { return function (fd, buffer, offset, length, position, callback_) {
|
fs.read = (function (fs$read) {
|
||||||
|
function read (fd, buffer, offset, length, position, callback_) {
|
||||||
var callback
|
var callback
|
||||||
if (callback_ && typeof callback_ === 'function') {
|
if (callback_ && typeof callback_ === 'function') {
|
||||||
var eagCounter = 0
|
var eagCounter = 0
|
||||||
@@ -128,7 +129,12 @@ function patch (fs) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return fs$read.call(fs, fd, buffer, offset, length, position, callback)
|
return fs$read.call(fs, fd, buffer, offset, length, position, callback)
|
||||||
}})(fs.read)
|
}
|
||||||
|
|
||||||
|
// This ensures `util.promisify` works as it does for native `fs.read`.
|
||||||
|
read.__proto__ = fs$read
|
||||||
|
return read
|
||||||
|
})(fs.read)
|
||||||
|
|
||||||
fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) {
|
fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) {
|
||||||
var eagCounter = 0
|
var eagCounter = 0
|
||||||
@@ -272,18 +278,24 @@ function patch (fs) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function statFix (orig) {
|
function statFix (orig) {
|
||||||
if (!orig) return orig
|
if (!orig) return orig
|
||||||
// Older versions of Node erroneously returned signed integers for
|
// Older versions of Node erroneously returned signed integers for
|
||||||
// uid + gid.
|
// uid + gid.
|
||||||
return function (target, cb) {
|
return function (target, options, cb) {
|
||||||
return orig.call(fs, target, function (er, stats) {
|
if (typeof options === 'function') {
|
||||||
if (!stats) return cb.apply(this, arguments)
|
cb = options
|
||||||
|
options = null
|
||||||
|
}
|
||||||
|
function callback (er, stats) {
|
||||||
|
if (stats) {
|
||||||
if (stats.uid < 0) stats.uid += 0x100000000
|
if (stats.uid < 0) stats.uid += 0x100000000
|
||||||
if (stats.gid < 0) stats.gid += 0x100000000
|
if (stats.gid < 0) stats.gid += 0x100000000
|
||||||
|
}
|
||||||
if (cb) cb.apply(this, arguments)
|
if (cb) cb.apply(this, arguments)
|
||||||
})
|
}
|
||||||
|
return options ? orig.call(fs, target, options, callback)
|
||||||
|
: orig.call(fs, target, callback)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -291,8 +303,9 @@ function patch (fs) {
|
|||||||
if (!orig) return orig
|
if (!orig) return orig
|
||||||
// Older versions of Node erroneously returned signed integers for
|
// Older versions of Node erroneously returned signed integers for
|
||||||
// uid + gid.
|
// uid + gid.
|
||||||
return function (target) {
|
return function (target, options) {
|
||||||
var stats = orig.call(fs, target)
|
var stats = options ? orig.call(fs, target, options)
|
||||||
|
: orig.call(fs, target)
|
||||||
if (stats.uid < 0) stats.uid += 0x100000000
|
if (stats.uid < 0) stats.uid += 0x100000000
|
||||||
if (stats.gid < 0) stats.gid += 0x100000000
|
if (stats.gid < 0) stats.gid += 0x100000000
|
||||||
return stats;
|
return stats;
|
||||||
|
|||||||
-12
@@ -1,12 +0,0 @@
|
|||||||
var fs = require('fs')
|
|
||||||
, lstat = fs.lstatSync;
|
|
||||||
|
|
||||||
exports.readlinkSync = function (p) {
|
|
||||||
if (lstat(p).isSymbolicLink()) {
|
|
||||||
return fs.readlinkSync(p);
|
|
||||||
} else {
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
-18
@@ -1,18 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "graceful-readlink",
|
|
||||||
"version": "1.0.1",
|
|
||||||
"description": "graceful fs.readlink",
|
|
||||||
"main": "index.js",
|
|
||||||
"repository": "git://github.com/zhiyelee/graceful-readlink.git",
|
|
||||||
"homepage": "https://github.com/zhiyelee/graceful-readlink",
|
|
||||||
"bugs": "https://github.com/zhiyelee/graceful-readlink/issues",
|
|
||||||
"keywords": [
|
|
||||||
"fs.readlink",
|
|
||||||
"readlink"
|
|
||||||
],
|
|
||||||
"author": "zhiyelee",
|
|
||||||
"license": "MIT",
|
|
||||||
"scripts": {
|
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+26
@@ -0,0 +1,26 @@
|
|||||||
|
# This file is for unifying the coding style for different editors and IDEs
|
||||||
|
# editorconfig.org
|
||||||
|
|
||||||
|
# top-most EditorConfig file
|
||||||
|
root = true
|
||||||
|
|
||||||
|
# every file
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
indent_size = 2
|
||||||
|
indent_style = space
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
# 4 space indentation
|
||||||
|
[*.py]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
# Tab indentation (no size specified)
|
||||||
|
[Makefile]
|
||||||
|
indent_style = tab
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
lib/*
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
{"version":3,"sources":["lib/has-symbol-support-x.js"],"names":["f","exports","module","define","amd","window","global","self","this","returnExports","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","1","_dereq_","Symbol"],"mappings":"CAAA,SAAUA,GAAG,GAAoB,iBAAVC,SAAoC,oBAATC,OAAsBA,OAAOD,QAAQD,SAAS,GAAmB,mBAATG,QAAqBA,OAAOC,IAAKD,UAAUH,OAAO,EAA0B,oBAATK,OAAwBA,OAA+B,oBAATC,OAAwBA,OAA6B,oBAAPC,KAAsBA,KAAYC,MAAOC,cAAgBT,KAAlU,CAAyU,WAAqC,OAAmB,SAASU,EAAEC,EAAEC,EAAEC,GAAG,SAASC,EAAEC,EAAEC,GAAG,IAAIJ,EAAEG,GAAG,CAAC,IAAIJ,EAAEI,GAAG,CAAC,IAAIE,EAAkB,mBAATC,SAAqBA,QAAQ,IAAIF,GAAGC,EAAE,OAAOA,EAAEF,GAAE,GAAI,GAAGI,EAAE,OAAOA,EAAEJ,GAAE,GAAI,IAAIf,EAAE,IAAIoB,MAAM,uBAAuBL,EAAE,KAAK,MAAMf,EAAEqB,KAAK,mBAAmBrB,EAAE,IAAIsB,EAAEV,EAAEG,IAAId,YAAYU,EAAEI,GAAG,GAAGQ,KAAKD,EAAErB,QAAQ,SAASS,GAAG,IAAIE,EAAED,EAAEI,GAAG,GAAGL,GAAG,OAAOI,EAAEF,GAAIF,IAAIY,EAAEA,EAAErB,QAAQS,EAAEC,EAAEC,EAAEC,GAAG,OAAOD,EAAEG,GAAGd,QAAkD,IAA1C,IAAIkB,EAAkB,mBAATD,SAAqBA,QAAgBH,EAAE,EAAEA,EAAEF,EAAEW,OAAOT,IAAID,EAAED,EAAEE,IAAI,OAAOD,EAAlc,EAAkdW,GAAG,SAASC,QAAQxB,OAAOD;;;;;;;;;AAUl2B,aAQAC,OAAOD,QAA4B,mBAAX0B,QAA+C,iBAAfA,OAAO,cAEpD,GApB0W,CAoBtW"}
|
||||||
+34
@@ -0,0 +1,34 @@
|
|||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<title>Jasmine Spec Runner: has-symbol-support-x</title>
|
||||||
|
|
||||||
|
<link rel="icon" href="http://jasmine.github.io/images/jasmine.ico" sizes="16x16">
|
||||||
|
<link rel="icon" href="http://jasmine.github.io//images/jasmine_32x32.ico" sizes="32x32">
|
||||||
|
|
||||||
|
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/jasmine/1.3.1/jasmine.min.css">
|
||||||
|
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.5.10/es5-shim.min.js"></script>
|
||||||
|
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.5.10/es5-sham.min.js"></script>
|
||||||
|
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/json3/3.3.2/json3.min.js"></script>
|
||||||
|
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/es6-shim/0.35.3/es6-shim.js"></script>
|
||||||
|
<script type="text/javascript" src="https://wzrd.in/standalone/es7-shim@latest"></script>
|
||||||
|
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/1.3.1/jasmine.min.js"></script>
|
||||||
|
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/1.3.1/jasmine-html.min.js"></script>
|
||||||
|
|
||||||
|
<!-- include helper files here... -->
|
||||||
|
|
||||||
|
<!-- include source files here... -->
|
||||||
|
<script src="../lib/has-symbol-support-x.min.js"></script>
|
||||||
|
|
||||||
|
<!-- include spec files here... -->
|
||||||
|
<script src="spec/test.js"></script>
|
||||||
|
|
||||||
|
<!-- run the tests -->
|
||||||
|
<script src="./run.js"></script>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
+25
@@ -0,0 +1,25 @@
|
|||||||
|
/* global window, jasmine */
|
||||||
|
/* eslint strict: 0 */
|
||||||
|
(function () {
|
||||||
|
var jasmineEnv = jasmine.getEnv();
|
||||||
|
jasmineEnv.updateInterval = 1000;
|
||||||
|
|
||||||
|
var trivialReporter = new jasmine.TrivialReporter();
|
||||||
|
|
||||||
|
jasmineEnv.addReporter(trivialReporter);
|
||||||
|
|
||||||
|
jasmineEnv.specFilter = function (spec) {
|
||||||
|
return trivialReporter.specFilter(spec);
|
||||||
|
};
|
||||||
|
|
||||||
|
var currentWindowOnload = window.onload;
|
||||||
|
var execJasmine = function () {
|
||||||
|
jasmineEnv.execute();
|
||||||
|
};
|
||||||
|
window.onload = function () {
|
||||||
|
if (currentWindowOnload) {
|
||||||
|
currentWindowOnload();
|
||||||
|
}
|
||||||
|
execJasmine();
|
||||||
|
};
|
||||||
|
}());
|
||||||
+29
@@ -0,0 +1,29 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var hasSymbolSupport;
|
||||||
|
if (typeof module === 'object' && module.exports) {
|
||||||
|
require('es5-shim');
|
||||||
|
require('es5-shim/es5-sham');
|
||||||
|
if (typeof JSON === 'undefined') {
|
||||||
|
JSON = {};
|
||||||
|
}
|
||||||
|
require('json3').runInContext(null, JSON);
|
||||||
|
require('es6-shim');
|
||||||
|
var es7 = require('es7-shim');
|
||||||
|
Object.keys(es7).forEach(function (key) {
|
||||||
|
var obj = es7[key];
|
||||||
|
if (typeof obj.shim === 'function') {
|
||||||
|
obj.shim();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
hasSymbolSupport = require('../../index.js');
|
||||||
|
} else {
|
||||||
|
hasSymbolSupport = returnExports;
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('Basic tests', function () {
|
||||||
|
it('results should match', function () {
|
||||||
|
var expected = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';
|
||||||
|
expect(hasSymbolSupport).toBe(expected);
|
||||||
|
});
|
||||||
|
});
|
||||||
+26
@@ -0,0 +1,26 @@
|
|||||||
|
# This file is for unifying the coding style for different editors and IDEs
|
||||||
|
# editorconfig.org
|
||||||
|
|
||||||
|
# top-most EditorConfig file
|
||||||
|
root = true
|
||||||
|
|
||||||
|
# every file
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
indent_size = 2
|
||||||
|
indent_style = space
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
# 4 space indentation
|
||||||
|
[*.py]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
# Tab indentation (no size specified)
|
||||||
|
[Makefile]
|
||||||
|
indent_style = tab
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
lib/*
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
{"version":3,"sources":["lib/has-to-string-tag-x.js"],"names":["f","exports","module","define","amd","window","global","self","this","returnExports","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","1","_dereq_","Symbol","toStringTag","has-symbol-support-x","2"],"mappings":"CAAA,SAAUA,GAAG,GAAoB,iBAAVC,SAAoC,oBAATC,OAAsBA,OAAOD,QAAQD,SAAS,GAAmB,mBAATG,QAAqBA,OAAOC,IAAKD,UAAUH,OAAO,EAA0B,oBAATK,OAAwBA,OAA+B,oBAATC,OAAwBA,OAA6B,oBAAPC,KAAsBA,KAAYC,MAAOC,cAAgBT,KAAlU,CAAyU,WAAqC,OAAO,SAAUU,EAAEC,EAAEC,EAAEC,GAAG,SAASC,EAAEC,EAAEC,GAAG,IAAIJ,EAAEG,GAAG,CAAC,IAAIJ,EAAEI,GAAG,CAAC,IAAIE,EAAkB,mBAATC,SAAqBA,QAAQ,IAAIF,GAAGC,EAAE,OAAOA,EAAEF,GAAE,GAAI,GAAGI,EAAE,OAAOA,EAAEJ,GAAE,GAAI,IAAIf,EAAE,IAAIoB,MAAM,uBAAuBL,EAAE,KAAK,MAAMf,EAAEqB,KAAK,mBAAmBrB,EAAE,IAAIsB,EAAEV,EAAEG,IAAId,YAAYU,EAAEI,GAAG,GAAGQ,KAAKD,EAAErB,QAAQ,SAASS,GAAG,IAAIE,EAAED,EAAEI,GAAG,GAAGL,GAAG,OAAOI,EAAEF,GAAIF,IAAIY,EAAEA,EAAErB,QAAQS,EAAEC,EAAEC,EAAEC,GAAG,OAAOD,EAAEG,GAAGd,QAAkD,IAAI,IAA1CkB,EAAkB,mBAATD,SAAqBA,QAAgBH,EAAE,EAAEA,EAAEF,EAAEW,OAAOT,IAAID,EAAED,EAAEE,IAAI,OAAOD,EAAvb,EAA4bW,GAAG,SAASC,QAAQxB,OAAOD;;;;;;;;;AAW50B,aAQAC,OAAOD,QAAUyB,QAAQ,yBAAyD,iBAAvBC,OAAOC,cAE/DC,uBAAuB,IAAIC,GAAG,SAASJ,QAAQxB,OAAOD;;;;;;;;AAUzD,aAQAC,OAAOD,QAA4B,mBAAX0B,QAA+C,iBAAfA,OAAO,cAEpD,IAAI"}
|
||||||
+19
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"name" : "isarray",
|
||||||
|
"description" : "Array#isArray for older browsers",
|
||||||
|
"version" : "0.0.1",
|
||||||
|
"repository" : "juliangruber/isarray",
|
||||||
|
"homepage": "https://github.com/juliangruber/isarray",
|
||||||
|
"main" : "index.js",
|
||||||
|
"scripts" : [
|
||||||
|
"index.js"
|
||||||
|
],
|
||||||
|
"dependencies" : {},
|
||||||
|
"keywords": ["browser","isarray","array"],
|
||||||
|
"author": {
|
||||||
|
"name": "Julian Gruber",
|
||||||
|
"email": "mail@juliangruber.com",
|
||||||
|
"url": "http://juliangruber.com"
|
||||||
|
},
|
||||||
|
"license": "MIT"
|
||||||
|
}
|
||||||
+22
@@ -0,0 +1,22 @@
|
|||||||
|
Copyright (c) 2017 Garen J. Torikian
|
||||||
|
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
+88
@@ -0,0 +1,88 @@
|
|||||||
|
let _fs
|
||||||
|
try {
|
||||||
|
_fs = require('graceful-fs')
|
||||||
|
} catch (_) {
|
||||||
|
_fs = require('fs')
|
||||||
|
}
|
||||||
|
const universalify = require('universalify')
|
||||||
|
const { stringify, stripBom } = require('./utils')
|
||||||
|
|
||||||
|
async function _readFile (file, options = {}) {
|
||||||
|
if (typeof options === 'string') {
|
||||||
|
options = { encoding: options }
|
||||||
|
}
|
||||||
|
|
||||||
|
const fs = options.fs || _fs
|
||||||
|
|
||||||
|
const shouldThrow = 'throws' in options ? options.throws : true
|
||||||
|
|
||||||
|
let data = await universalify.fromCallback(fs.readFile)(file, options)
|
||||||
|
|
||||||
|
data = stripBom(data)
|
||||||
|
|
||||||
|
let obj
|
||||||
|
try {
|
||||||
|
obj = JSON.parse(data, options ? options.reviver : null)
|
||||||
|
} catch (err) {
|
||||||
|
if (shouldThrow) {
|
||||||
|
err.message = `${file}: ${err.message}`
|
||||||
|
throw err
|
||||||
|
} else {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return obj
|
||||||
|
}
|
||||||
|
|
||||||
|
const readFile = universalify.fromPromise(_readFile)
|
||||||
|
|
||||||
|
function readFileSync (file, options = {}) {
|
||||||
|
if (typeof options === 'string') {
|
||||||
|
options = { encoding: options }
|
||||||
|
}
|
||||||
|
|
||||||
|
const fs = options.fs || _fs
|
||||||
|
|
||||||
|
const shouldThrow = 'throws' in options ? options.throws : true
|
||||||
|
|
||||||
|
try {
|
||||||
|
let content = fs.readFileSync(file, options)
|
||||||
|
content = stripBom(content)
|
||||||
|
return JSON.parse(content, options.reviver)
|
||||||
|
} catch (err) {
|
||||||
|
if (shouldThrow) {
|
||||||
|
err.message = `${file}: ${err.message}`
|
||||||
|
throw err
|
||||||
|
} else {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function _writeFile (file, obj, options = {}) {
|
||||||
|
const fs = options.fs || _fs
|
||||||
|
|
||||||
|
const str = stringify(obj, options)
|
||||||
|
|
||||||
|
await universalify.fromCallback(fs.writeFile)(file, str, options)
|
||||||
|
}
|
||||||
|
|
||||||
|
const writeFile = universalify.fromPromise(_writeFile)
|
||||||
|
|
||||||
|
function writeFileSync (file, obj, options = {}) {
|
||||||
|
const fs = options.fs || _fs
|
||||||
|
|
||||||
|
const str = stringify(obj, options)
|
||||||
|
// not sure if fs.writeFileSync returns anything, but just in case
|
||||||
|
return fs.writeFileSync(file, str, options)
|
||||||
|
}
|
||||||
|
|
||||||
|
const jsonfile = {
|
||||||
|
readFile,
|
||||||
|
readFileSync,
|
||||||
|
writeFile,
|
||||||
|
writeFileSync
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = jsonfile
|
||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
exports.fromCallback = function (fn) {
|
||||||
|
return Object.defineProperty(function (...args) {
|
||||||
|
if (typeof args[args.length - 1] === 'function') fn.apply(this, args)
|
||||||
|
else {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
fn.call(
|
||||||
|
this,
|
||||||
|
...args,
|
||||||
|
(err, res) => (err != null) ? reject(err) : resolve(res)
|
||||||
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}, 'name', { value: fn.name })
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.fromPromise = function (fn) {
|
||||||
|
return Object.defineProperty(function (...args) {
|
||||||
|
const cb = args[args.length - 1]
|
||||||
|
if (typeof cb !== 'function') return fn.apply(this, args)
|
||||||
|
else fn.apply(this, args.slice(0, -1)).then(r => cb(null, r), cb)
|
||||||
|
}, 'name', { value: fn.name })
|
||||||
|
}
|
||||||
+34
@@ -0,0 +1,34 @@
|
|||||||
|
{
|
||||||
|
"name": "universalify",
|
||||||
|
"version": "2.0.0",
|
||||||
|
"description": "Make a callback- or promise-based function support both promises and callbacks.",
|
||||||
|
"keywords": [
|
||||||
|
"callback",
|
||||||
|
"native",
|
||||||
|
"promise"
|
||||||
|
],
|
||||||
|
"homepage": "https://github.com/RyanZim/universalify#readme",
|
||||||
|
"bugs": "https://github.com/RyanZim/universalify/issues",
|
||||||
|
"license": "MIT",
|
||||||
|
"author": "Ryan Zimmerman <opensrc@ryanzim.com>",
|
||||||
|
"files": [
|
||||||
|
"index.js"
|
||||||
|
],
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/RyanZim/universalify.git"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "standard && nyc tape test/*.js | colortape"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"colortape": "^0.1.2",
|
||||||
|
"coveralls": "^3.0.1",
|
||||||
|
"nyc": "^15.0.0",
|
||||||
|
"standard": "^14.3.1",
|
||||||
|
"tape": "^5.0.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 10.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
+40
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"name": "jsonfile",
|
||||||
|
"version": "6.1.0",
|
||||||
|
"description": "Easily read/write JSON files.",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git@github.com:jprichardson/node-jsonfile.git"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"read",
|
||||||
|
"write",
|
||||||
|
"file",
|
||||||
|
"json",
|
||||||
|
"fs",
|
||||||
|
"fs-extra"
|
||||||
|
],
|
||||||
|
"author": "JP Richardson <jprichardson@gmail.com>",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"universalify": "^2.0.0"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"graceful-fs": "^4.1.6"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"mocha": "^8.2.0",
|
||||||
|
"rimraf": "^2.4.0",
|
||||||
|
"standard": "^16.0.1"
|
||||||
|
},
|
||||||
|
"main": "index.js",
|
||||||
|
"files": [
|
||||||
|
"index.js",
|
||||||
|
"utils.js"
|
||||||
|
],
|
||||||
|
"scripts": {
|
||||||
|
"lint": "standard",
|
||||||
|
"test": "npm run lint && npm run unit",
|
||||||
|
"unit": "mocha"
|
||||||
|
}
|
||||||
|
}
|
||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
function stringify (obj, { EOL = '\n', finalEOL = true, replacer = null, spaces } = {}) {
|
||||||
|
const EOF = finalEOL ? EOL : ''
|
||||||
|
const str = JSON.stringify(obj, replacer, spaces)
|
||||||
|
|
||||||
|
return str.replace(/\n/g, EOL) + EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
function stripBom (content) {
|
||||||
|
// we do this because JSON.parse would convert it to a utf8 string if encoding wasn't specified
|
||||||
|
if (Buffer.isBuffer(content)) content = content.toString('utf8')
|
||||||
|
return content.replace(/^\uFEFF/, '')
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { stringify, stripBom }
|
||||||
+2
@@ -0,0 +1,2 @@
|
|||||||
|
var argv = require('../')(process.argv.slice(2));
|
||||||
|
console.dir(argv);
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
var mkdirp = require('mkdirp');
|
||||||
|
|
||||||
|
mkdirp('/tmp/foo/bar/baz', function (err) {
|
||||||
|
if (err) console.error(err)
|
||||||
|
else console.log('pow!')
|
||||||
|
});
|
||||||
+2
-1
@@ -1,6 +1,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
if (!process.version ||
|
if (typeof process === 'undefined' ||
|
||||||
|
!process.version ||
|
||||||
process.version.indexOf('v0.') === 0 ||
|
process.version.indexOf('v0.') === 0 ||
|
||||||
process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {
|
process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {
|
||||||
module.exports = { nextTick: nextTick };
|
module.exports = { nextTick: nextTick };
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "process-nextick-args",
|
"name": "process-nextick-args",
|
||||||
"version": "2.0.0",
|
"version": "2.0.1",
|
||||||
"description": "process.nextTick but always with args",
|
"description": "process.nextTick but always with args",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"files": [
|
"files": [
|
||||||
|
|||||||
+1
-1
@@ -43,7 +43,7 @@ var objectKeys = Object.keys || function (obj) {
|
|||||||
module.exports = Duplex;
|
module.exports = Duplex;
|
||||||
|
|
||||||
/*<replacement>*/
|
/*<replacement>*/
|
||||||
var util = require('core-util-is');
|
var util = Object.create(require('core-util-is'));
|
||||||
util.inherits = require('inherits');
|
util.inherits = require('inherits');
|
||||||
/*</replacement>*/
|
/*</replacement>*/
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -30,7 +30,7 @@ module.exports = PassThrough;
|
|||||||
var Transform = require('./_stream_transform');
|
var Transform = require('./_stream_transform');
|
||||||
|
|
||||||
/*<replacement>*/
|
/*<replacement>*/
|
||||||
var util = require('core-util-is');
|
var util = Object.create(require('core-util-is'));
|
||||||
util.inherits = require('inherits');
|
util.inherits = require('inherits');
|
||||||
/*</replacement>*/
|
/*</replacement>*/
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -64,7 +64,7 @@ function _isUint8Array(obj) {
|
|||||||
/*</replacement>*/
|
/*</replacement>*/
|
||||||
|
|
||||||
/*<replacement>*/
|
/*<replacement>*/
|
||||||
var util = require('core-util-is');
|
var util = Object.create(require('core-util-is'));
|
||||||
util.inherits = require('inherits');
|
util.inherits = require('inherits');
|
||||||
/*</replacement>*/
|
/*</replacement>*/
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -68,7 +68,7 @@ module.exports = Transform;
|
|||||||
var Duplex = require('./_stream_duplex');
|
var Duplex = require('./_stream_duplex');
|
||||||
|
|
||||||
/*<replacement>*/
|
/*<replacement>*/
|
||||||
var util = require('core-util-is');
|
var util = Object.create(require('core-util-is'));
|
||||||
util.inherits = require('inherits');
|
util.inherits = require('inherits');
|
||||||
/*</replacement>*/
|
/*</replacement>*/
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -64,7 +64,7 @@ var Duplex;
|
|||||||
Writable.WritableState = WritableState;
|
Writable.WritableState = WritableState;
|
||||||
|
|
||||||
/*<replacement>*/
|
/*<replacement>*/
|
||||||
var util = require('core-util-is');
|
var util = Object.create(require('core-util-is'));
|
||||||
util.inherits = require('inherits');
|
util.inherits = require('inherits');
|
||||||
/*</replacement>*/
|
/*</replacement>*/
|
||||||
|
|
||||||
|
|||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
try {
|
||||||
|
var util = require('util');
|
||||||
|
/* istanbul ignore next */
|
||||||
|
if (typeof util.inherits !== 'function') throw '';
|
||||||
|
module.exports = util.inherits;
|
||||||
|
} catch (e) {
|
||||||
|
/* istanbul ignore next */
|
||||||
|
module.exports = require('./inherits_browser.js');
|
||||||
|
}
|
||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
if (typeof Object.create === 'function') {
|
||||||
|
// implementation from standard node.js 'util' module
|
||||||
|
module.exports = function inherits(ctor, superCtor) {
|
||||||
|
if (superCtor) {
|
||||||
|
ctor.super_ = superCtor
|
||||||
|
ctor.prototype = Object.create(superCtor.prototype, {
|
||||||
|
constructor: {
|
||||||
|
value: ctor,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
configurable: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
// old school shim for old browsers
|
||||||
|
module.exports = function inherits(ctor, superCtor) {
|
||||||
|
if (superCtor) {
|
||||||
|
ctor.super_ = superCtor
|
||||||
|
var TempCtor = function () {}
|
||||||
|
TempCtor.prototype = superCtor.prototype
|
||||||
|
ctor.prototype = new TempCtor()
|
||||||
|
ctor.prototype.constructor = ctor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+29
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"name": "inherits",
|
||||||
|
"description": "Browser-friendly inheritance fully compatible with standard node.js inherits()",
|
||||||
|
"version": "2.0.4",
|
||||||
|
"keywords": [
|
||||||
|
"inheritance",
|
||||||
|
"class",
|
||||||
|
"klass",
|
||||||
|
"oop",
|
||||||
|
"object-oriented",
|
||||||
|
"inherits",
|
||||||
|
"browser",
|
||||||
|
"browserify"
|
||||||
|
],
|
||||||
|
"main": "./inherits.js",
|
||||||
|
"browser": "./inherits_browser.js",
|
||||||
|
"repository": "git://github.com/isaacs/inherits",
|
||||||
|
"license": "ISC",
|
||||||
|
"scripts": {
|
||||||
|
"test": "tap"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"tap": "^14.2.4"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"inherits.js",
|
||||||
|
"inherits_browser.js"
|
||||||
|
]
|
||||||
|
}
|
||||||
+16
-11
@@ -3,19 +3,24 @@ node-bzip - a pure-javascript Node.JS module for decoding bzip2 data
|
|||||||
|
|
||||||
Copyright (C) 2012 Eli Skeggs
|
Copyright (C) 2012 Eli Skeggs
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
modify it under the terms of the GNU Lesser General Public
|
a copy of this software and associated documentation files (the
|
||||||
License as published by the Free Software Foundation; either
|
"Software"), to deal in the Software without restriction, including
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
The above copyright notice and this permission notice shall be
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
included in all copies or substantial portions of the Software.
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
License along with this library; if not, see
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
http://www.gnu.org/licenses/lgpl-2.1.html
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
Adapted from bzip2.js, copyright 2011 antimatter15 (antimatter15@gmail.com).
|
Adapted from bzip2.js, copyright 2011 antimatter15 (antimatter15@gmail.com).
|
||||||
|
|
||||||
|
|||||||
+16
-11
@@ -5,19 +5,24 @@ Copyright (C) 2013 C. Scott Ananian
|
|||||||
Copyright (C) 2012 Eli Skeggs
|
Copyright (C) 2012 Eli Skeggs
|
||||||
Copyright (C) 2011 Kevin Kwok
|
Copyright (C) 2011 Kevin Kwok
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
modify it under the terms of the GNU Lesser General Public
|
a copy of this software and associated documentation files (the
|
||||||
License as published by the Free Software Foundation; either
|
"Software"), to deal in the Software without restriction, including
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
The above copyright notice and this permission notice shall be
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
included in all copies or substantial portions of the Software.
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
License along with this library; if not, see
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
http://www.gnu.org/licenses/lgpl-2.1.html
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
Adapted from node-bzip, copyright 2012 Eli Skeggs.
|
Adapted from node-bzip, copyright 2012 Eli Skeggs.
|
||||||
Adapted from bzip2.js, copyright 2011 Kevin Kwok (antimatter15@gmail.com).
|
Adapted from bzip2.js, copyright 2011 Kevin Kwok (antimatter15@gmail.com).
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "seek-bzip",
|
"name": "seek-bzip",
|
||||||
"version": "1.0.5",
|
"version": "1.0.6",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
"C. Scott Ananian (http://cscott.net)",
|
"C. Scott Ananian (http://cscott.net)",
|
||||||
"Eli Skeggs",
|
"Eli Skeggs",
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
"test": "test"
|
"test": "test"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"commander": "~2.8.1"
|
"commander": "^2.8.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"fibers": "~1.0.6",
|
"fibers": "~1.0.6",
|
||||||
|
|||||||
+16
@@ -0,0 +1,16 @@
|
|||||||
|
The ISC License
|
||||||
|
|
||||||
|
Copyright (c) 2015, Contributors
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and/or distribute this software
|
||||||
|
for any purpose with or without fee is hereby granted, provided
|
||||||
|
that the above copyright notice and this permission notice
|
||||||
|
appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
||||||
|
OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE
|
||||||
|
LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
|
||||||
|
OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||||
|
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||||
|
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
Apache License, Version 2.0
|
||||||
|
|
||||||
|
Copyright (c) 2011 Dominic Tarr
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
+1
-1
File diff suppressed because one or more lines are too long
+4
-3
@@ -17,6 +17,7 @@ function unbzip2Stream() {
|
|||||||
if(!blockSize){
|
if(!blockSize){
|
||||||
blockSize = bz2.header(bitReader);
|
blockSize = bz2.header(bitReader);
|
||||||
//console.error("got header of", blockSize);
|
//console.error("got header of", blockSize);
|
||||||
|
streamCRC = 0;
|
||||||
return true;
|
return true;
|
||||||
}else{
|
}else{
|
||||||
var bufsize = 100000 * blockSize;
|
var bufsize = 100000 * blockSize;
|
||||||
@@ -34,7 +35,7 @@ function unbzip2Stream() {
|
|||||||
return false;
|
return false;
|
||||||
}else{
|
}else{
|
||||||
//console.error('decompressed', chunk.length,'bytes');
|
//console.error('decompressed', chunk.length,'bytes');
|
||||||
push(new Buffer(chunk));
|
push(Buffer.from(chunk));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -78,12 +79,12 @@ function unbzip2Stream() {
|
|||||||
},
|
},
|
||||||
function end(x) {
|
function end(x) {
|
||||||
//console.error(x,'last compressing with', hasBytes, 'bytes in buffer');
|
//console.error(x,'last compressing with', hasBytes, 'bytes in buffer');
|
||||||
while (!broken && hasBytes > bitReader.bytesRead){
|
while (!broken && bitReader && hasBytes > bitReader.bytesRead){
|
||||||
decompressAndQueue(this);
|
decompressAndQueue(this);
|
||||||
}
|
}
|
||||||
if (!broken) {
|
if (!broken) {
|
||||||
if (streamCRC !== null)
|
if (streamCRC !== null)
|
||||||
stream.emit('error', new Error("input stream ended prematurely"));
|
this.emit('error', new Error("input stream ended prematurely"));
|
||||||
this.queue(null);
|
this.queue(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-6
@@ -241,8 +241,8 @@ bzip2.decompress = function(bits, stream, buf, bufsize, streamCRC) {
|
|||||||
|
|
||||||
hufGroup.minLen = minLen;
|
hufGroup.minLen = minLen;
|
||||||
hufGroup.maxLen = maxLen;
|
hufGroup.maxLen = maxLen;
|
||||||
var base = hufGroup.base.subarray(1);
|
var base = hufGroup.base;
|
||||||
var limit = hufGroup.limit.subarray(1);
|
var limit = hufGroup.limit;
|
||||||
var pp = 0;
|
var pp = 0;
|
||||||
for(var i = minLen; i <= maxLen; i++)
|
for(var i = minLen; i <= maxLen; i++)
|
||||||
for(var t = 0; t < symCount; t++)
|
for(var t = 0; t < symCount; t++)
|
||||||
@@ -271,8 +271,8 @@ bzip2.decompress = function(bits, stream, buf, bufsize, streamCRC) {
|
|||||||
symCount = GROUP_SIZE - 1;
|
symCount = GROUP_SIZE - 1;
|
||||||
if (selector >= nSelectors) message.Error("meow i'm a kitty, that's an error");
|
if (selector >= nSelectors) message.Error("meow i'm a kitty, that's an error");
|
||||||
hufGroup = groups[this.selectors[selector++]];
|
hufGroup = groups[this.selectors[selector++]];
|
||||||
base = hufGroup.base.subarray(1);
|
base = hufGroup.base;
|
||||||
limit = hufGroup.limit.subarray(1);
|
limit = hufGroup.limit;
|
||||||
}
|
}
|
||||||
i = hufGroup.minLen;
|
i = hufGroup.minLen;
|
||||||
j = bits(i);
|
j = bits(i);
|
||||||
@@ -358,8 +358,6 @@ bzip2.decompress = function(bits, stream, buf, bufsize, streamCRC) {
|
|||||||
|
|
||||||
crc = (crc ^ (-1)) >>> 0;
|
crc = (crc ^ (-1)) >>> 0;
|
||||||
if ((crc|0) != (crcblock|0)) message.Error("Error in bzip2: crc32 do not match");
|
if ((crc|0) != (crcblock|0)) message.Error("Error in bzip2: crc32 do not match");
|
||||||
if (streamCRC === null)
|
|
||||||
streamCRC = 0;
|
|
||||||
streamCRC = (crc ^ ((streamCRC << 1) | (streamCRC >>> 31))) & 0xFFFFFFFF;
|
streamCRC = (crc ^ ((streamCRC << 1) | (streamCRC >>> 31))) & 0xFFFFFFFF;
|
||||||
return streamCRC;
|
return streamCRC;
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-6
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "unbzip2-stream",
|
"name": "unbzip2-stream",
|
||||||
"version": "1.3.1",
|
"version": "1.4.3",
|
||||||
"description": "streaming unbzip2 implementation in pure javascript for node and browsers",
|
"description": "streaming unbzip2 implementation in pure javascript for node and browsers",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"bzip",
|
"bzip",
|
||||||
@@ -34,18 +34,18 @@
|
|||||||
],
|
],
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"beefy": "^2.1.2",
|
"beefy": "^2.1.8",
|
||||||
"brfs": "^1.2.0",
|
"brfs": "^1.2.0",
|
||||||
"browserify": "^8.1.0",
|
"browserify": "^16.2.3",
|
||||||
"concat-stream": "^1.4.7",
|
"concat-stream": "^1.4.7",
|
||||||
"stream-equal": "^1.1.1",
|
"stream-equal": "^1.1.1",
|
||||||
"tape": "^3.4.0",
|
"tape": "^4.9.2",
|
||||||
"tape-run": "^4.0.0",
|
"tape-run": "^4.0.0",
|
||||||
"uglify-js": "^3.0.10"
|
"uglify-js": "^3.0.10"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"through": "^2.3.6",
|
"buffer": "^5.2.1",
|
||||||
"buffer": "^3.0.1"
|
"through": "^2.3.8"
|
||||||
},
|
},
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
}
|
}
|
||||||
|
|||||||
+23
@@ -0,0 +1,23 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
exports.fromCallback = function (fn) {
|
||||||
|
return Object.defineProperty(function (...args) {
|
||||||
|
if (typeof args[args.length - 1] === 'function') fn.apply(this, args)
|
||||||
|
else {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
fn.apply(
|
||||||
|
this,
|
||||||
|
args.concat([(err, res) => err ? reject(err) : resolve(res)])
|
||||||
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}, 'name', { value: fn.name })
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.fromPromise = function (fn) {
|
||||||
|
return Object.defineProperty(function (...args) {
|
||||||
|
const cb = args[args.length - 1]
|
||||||
|
if (typeof cb !== 'function') return fn.apply(this, args)
|
||||||
|
else fn.apply(this, args.slice(0, -1)).then(r => cb(null, r), cb)
|
||||||
|
}, 'name', { value: fn.name })
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user