master
(更新前)或分支bug-updating-deps
您期望发生什么?
所有测试均在所有环境中通过。
实际发生了什么
一项测试失败。
1360 passing (919ms)
4 pending
1 failing
1) fakeTimers.clock
.useFakeTimers
fakes provided methods:
AssertionError: [refute.same] function onNextTick() {} expected not to be the same object as function onNextTick() {}
at Object.fail (node_modules/@sinonjs/referee/lib/create-fail.js:5)
at Object.fail (node_modules/@sinonjs/referee/lib/define-assertion.js:46)
at assertion (node_modules/@sinonjs/referee/lib/define-assertion.js:68)
at Function.referee.<computed>.<computed> [as same] (node_modules/@sinonjs/referee/lib/define-assertion.js:93)
at Context.<anonymous> (test/util/fake-timers-test.js:1075)
如何繁殖
签出master
(671330ce)。 运行npm update && npm test
。
还推送了更新: https :
尝试一次手动还原一个程序包(尝试过browserify,汇总,++),而没有发现任何差异。
现在,通过一次安装和测试一个软件包,使用脚本尝试反向操作。
成功。 [email protected]
做一些不同的事情。
$ cat test-script.sh
#!/bin/bash
set -e # exit on error
pkgs=([email protected] [email protected] [email protected] [email protected] [email protected])
for pkg in $pkgs; do
git reset --hard
npm install $pkg
npm test
done
我在差异中找不到任何可疑的东西: https :
更新的package-lock.json
确实包含了diff的一个有趣部分:
"process-nextick-args": {
"version": "2.0.1",
},
完整差异(
git diff package-lock.json | egrep -v 'resolved|integrity|"dev"'
)
diff --git a/package-lock.json b/package-lock.json
index e12873c6..23ea8984 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -409,29 +409,29 @@
},
"acorn-node": {
- "version": "1.6.2",
+ "version": "1.7.0",
"requires": {
- "acorn": "^6.0.2",
+ "acorn": "^6.1.1",
"acorn-dynamic-import": "^4.0.0",
- "acorn-walk": "^6.1.0",
+ "acorn-walk": "^6.1.1",
"xtend": "^4.0.1"
},
"dependencies": {
"acorn": {
- "version": "6.0.4",
+ "version": "6.2.1",
}
}
},
"acorn-walk": {
- "version": "6.1.1",
+ "version": "6.2.0",
},
"agent-base": {
@@ -607,12 +607,30 @@
}
},
"assert": {
- "version": "1.4.1",
+ "version": "1.5.0",
"requires": {
+ "object-assign": "^4.1.1",
"util": "0.10.3"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.1",
+ },
+ "util": {
+ "version": "0.10.3",
+ "requires": {
+ "inherits": "2.0.1"
+ }
+ }
}
},
"assign-symbols": {
@@ -627,15 +645,6 @@
},
- "astw": {
- "version": "2.2.0",
- "requires": {
- "acorn": "^4.0.3"
- }
- },
"async": {
"version": "2.6.1",
@@ -761,9 +770,9 @@
}
},
"base64-js": {
- "version": "1.2.1",
+ "version": "1.3.1",
},
"binary-extensions": {
@@ -881,9 +890,9 @@
},
"browser-resolve": {
- "version": "1.11.2",
+ "version": "1.11.3",
"requires": {
"resolve": "1.1.7"
@@ -904,9 +913,9 @@
},
"browserify": {
- "version": "16.2.3",
+ "version": "16.3.0",
"requires": {
"JSONStream": "^1.0.3",
@@ -971,13 +980,19 @@
"typedarray": "^0.0.6"
}
},
+ "safe-buffer": {
+ "version": "5.2.0",
+ },
"string_decoder": {
- "version": "1.1.1",
+ "version": "1.3.0",
"requires": {
- "safe-buffer": "~5.1.0"
+ "safe-buffer": "~5.2.0"
}
}
}
@@ -1064,9 +1079,9 @@
}
},
"buffer": {
- "version": "5.0.7",
+ "version": "5.2.1",
"requires": {
"base64-js": "^1.0.2",
@@ -1690,6 +1705,12 @@
"randombytes": "^2.0.0"
}
},
+ "dash-ast": {
+ "version": "1.0.0",
+ },
"date-fns": {
"version": "1.29.0",
@@ -3332,6 +3353,12 @@
}
}
},
+ "get-assigned-identifiers": {
+ "version": "1.2.0",
+ },
"get-caller-file": {
"version": "2.0.5",
@@ -3652,9 +3679,9 @@
},
"ieee754": {
- "version": "1.1.8",
+ "version": "1.1.13",
},
"ignore": {
@@ -3793,19 +3820,47 @@
}
},
"insert-module-globals": {
- "version": "7.0.1",
+ "version": "7.2.0",
"requires": {
"JSONStream": "^1.0.3",
- "combine-source-map": "~0.7.1",
- "concat-stream": "~1.5.1",
+ "acorn-node": "^1.5.2",
+ "combine-source-map": "^0.8.0",
+ "concat-stream": "^1.6.1",
"is-buffer": "^1.1.0",
- "lexical-scope": "^1.2.0",
+ "path-is-absolute": "^1.0.1",
"process": "~0.11.0",
"through2": "^2.0.0",
+ "undeclared-identifiers": "^1.1.2",
"xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "combine-source-map": {
+ "version": "0.8.0",
+ "requires": {
+ "convert-source-map": "~1.1.0",
+ "inline-source-map": "~0.6.0",
+ "lodash.memoize": "~3.0.3",
+ "source-map": "~0.5.3"
+ }
+ },
+ "concat-stream": {
+ "version": "1.6.2",
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ }
}
},
"invert-kv": {
@@ -4343,13 +4398,12 @@
}
},
"labeled-stream-splicer": {
- "version": "2.0.0",
+ "version": "2.0.2",
"requires": {
"inherits": "^2.0.1",
- "isarray": "~0.0.1",
"stream-splicer": "^2.0.0"
}
},
@@ -4592,15 +4646,6 @@
"type-check": "~0.3.2"
}
},
- "lexical-scope": {
- "version": "1.2.0",
- "requires": {
- "astw": "^2.0.0"
- }
- },
"linkify-it": {
"version": "2.0.3",
@@ -5768,14 +5813,14 @@
}
},
"module-deps": {
- "version": "6.2.0",
+ "version": "6.2.1",
"requires": {
"JSONStream": "^1.0.3",
"browser-resolve": "^1.7.0",
- "cached-path-relative": "^1.0.0",
+ "cached-path-relative": "^1.0.2",
"concat-stream": "~1.6.0",
"defined": "^1.0.0",
"detective": "^5.0.2",
@@ -5803,12 +5848,12 @@
}
},
"detective": {
- "version": "5.1.0",
+ "version": "5.2.0",
"requires": {
- "acorn-node": "^1.3.0",
+ "acorn-node": "^1.6.1",
"defined": "^1.0.0",
"minimist": "^1.1.1"
}
@@ -6607,9 +6652,9 @@
}
},
"pako": {
- "version": "1.0.6",
+ "version": "1.0.10",
},
"parent-module": {
@@ -6666,9 +6711,9 @@
},
"path-browserify": {
- "version": "0.0.0",
+ "version": "0.0.1",
},
"path-dirname": {
@@ -8221,6 +8266,12 @@
},
+ "simple-concat": {
+ "version": "1.0.0",
+ },
"slash": {
"version": "1.0.0",
@@ -8509,9 +8560,9 @@
}
},
"stream-browserify": {
- "version": "2.0.1",
+ "version": "2.0.2",
"requires": {
"inherits": "~2.0.1",
@@ -8529,22 +8580,60 @@
}
},
"stream-http": {
- "version": "2.7.2",
+ "version": "2.8.3",
"requires": {
"builtin-status-codes": "^3.0.0",
"inherits": "^2.0.1",
- "readable-stream": "^2.2.6",
+ "readable-stream": "^2.3.6",
"to-arraybuffer": "^1.0.0",
"xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
}
},
"stream-splicer": {
- "version": "2.0.0",
+ "version": "2.0.1",
"requires": {
"inherits": "^2.0.1",
@@ -8679,12 +8768,12 @@
},
"syntax-error": {
- "version": "1.3.0",
+ "version": "1.4.0",
"requires": {
- "acorn": "^4.0.3"
+ "acorn-node": "^1.2.0"
}
},
"table": {
@@ -8987,6 +9076,19 @@
},
+ "undeclared-identifiers": {
+ "version": "1.1.3",
+ "requires": {
+ "acorn-node": "^1.3.0",
+ "dash-ast": "^1.0.0",
+ "get-assigned-identifiers": "^1.2.0",
+ "simple-concat": "^1.0.0",
+ "xtend": "^4.0.1"
+ }
+ },
"union-value": {
"version": "1.0.1",
@@ -9105,20 +9207,12 @@
},
"util": {
- "version": "0.10.3",
+ "version": "0.10.4",
"requires": {
- "inherits": "2.0.1"
- },
- "dependencies": {
- "inherits": {
- "version": "2.0.1",
- }
+ "inherits": "2.0.3"
}
},
"util-deprecate": {
想知道这是否可能相关(提及sinon和lolex假计时器):
https://github.com/calvinmetcalf/process-nextick-args/commit/108596de940c73e78e0378a4084ab73ac846aed0
看来process-nextick-args
已修复。 您想再试一次吗?
该项目一年多没有发生任何事情,因此它仍然会失败。 我们可以更新所有其他软件包,但这仍然是更新browserify的障碍。
由于此错误已在伪计时器代码中显示出来,因此我认为该错误位于Lolex中,但是,事实证明,向Lolex添加了相同的测试并升级Browserify(=> Chokidar => fsevents => process-nextick-args)可以_not_不能显示错误。 那里(在Lolex中)也有相同的process-nextick-args版本(2.0.0)。 这就说明这是针对锡诺自己的fake-timers.js
的小代码。 我对module.exports
代码的猜测。
对于下面的输出,我添加了一些控制台输出:
$ git diff test/
diff --git a/test/util/fake-timers-test.js b/test/util/fake-timers-test.js
index 97965647..27944a18 100644
--- a/test/util/fake-timers-test.js
+++ b/test/util/fake-timers-test.js
@@ -1068,10 +1068,15 @@ describe("fakeTimers.clock", function() {
});
it("fakes provided methods", function() {
+ console.log("setImmediate", setImmediate);
+ console.log("fakeTimers.timers.setImmediate", fakeTimers.timers.setImmediate);
this.clock = fakeTimers.useFakeTimers({ toFake: ["setTimeout", "Date", "setImmediate"] });
refute.same(setTimeout, fakeTimers.timers.setTimeout);
refute.same(Date, fakeTimers.timers.Date);
+ console.log("setImmediate", setImmediate);
+ console.log("fakeTimers.timers.setImmediate", fakeTimers.timers.setImmediate);
refute.same(setImmediate, fakeTimers.timers.setImmediate);
});
升级Browserify / process-nextick-args之前的输出
# chromium:
fakeTimers.clock
...
.setImmediate
✓ returns numeric id or object with numeric id
✓ calls the given callback immediately
✓ throws if no arguments
✓ manages separate timers per clock instance
✓ passes extra parameters through to the callback
.clearImmediate
✓ removes immediate callbacks
.tick
✓ triggers immediately without specified delay
✓ does not trigger without sufficient delay
✓ triggers after sufficient delay
✓ triggers simultaneous timers
✓ triggers multiple simultaneous timers
✓ triggers multiple simultaneous timers with zero callAt
✓ waits after setTimeout was called
✓ mini integration test
✓ triggers even when some throw
✓ calls function with global object or null (strict mode) as this
✓ triggers in the order scheduled
✓ creates updated Date while ticking
✓ fires timer in intervals of 13
✓ fires timers in correct order
✓ triggers timeouts and intervals in the order scheduled
✓ does not fire canceled intervals
✓ passes 6 seconds
✓ passes 1 minute
✓ passes 2 hours, 34 minutes and 12 seconds (63ms)
✓ throws for invalid format
✓ throws for invalid minutes
✓ throws for negative minutes
✓ treats missing argument as 0
✓ fires nested setTimeout calls properly
✓ does not silently catch exceptions
✓ returns the current now value
.useFakeTimers
✓ returns clock object
✓ has clock property
✓ sets initial timestamp
✓ replaces global setTimeout
✓ global fake setTimeout should return id
✓ replaces global clearTimeout
✓ restores global setTimeout
✓ restores global clearTimeout
✓ replaces global setInterval
✓ replaces global clearInterval
✓ restores global setInterval
✓ restores global clearInterval
✓ deletes global property on restore if it was inherited onto the global object
✓ restores global property on restore if it is present on the global object itself
✓ fakes Date constructor
✓ fake Date constructor should mirror Date's properties
✓ decide on Date.now support at call-time when supported
✓ decide on Date.now support at call-time when unsupported
✓ mirrors custom Date properties
✓ restores Date constructor
setImmediate undefined
fakeTimers.timers.setImmediate undefined
setImmediate function () {
return clock[method].apply(clock, arguments);
}
fakeTimers.timers.setImmediate undefined
✓ fakes provided methods
有趣的位: setImmediate
undefined
在运行测试前为
升级Browserify / process-nextick-args之前的输出,但仅运行单个测试
$ mochify test/util/fake-timers-test.js --grep "fakes provided methods" > output_pre.txt
# chromium:
fakeTimers.clock
.useFakeTimers
1) fakes provided methods
0 passing (32ms)
1 failing
1) fakeTimers.clock
.useFakeTimers
fakes provided methods:
ReferenceError: setImmediate is not defined
at Context.<anonymous> (test/util/fake-timers-test.js:1072)
有趣的是:在此单次运行中,我们得到一个错误,说setImmediate is not defined
,这意味着当我们运行整个测试套件时,我们会添加一个不存在的全局变量(即使将其设置为undefined
)。 这意味着测试会影响全局范围。 这可能对于理解为什么我们在升级process-nextick-args
之后突然有setImmediate
实现至关重要。 也许以某种方式检查变量是否已定义(不同于undefined
) 。
升级Browserify / process-nextick-args后的输出(单个测试运行)
$ cat output_post.txt
# chromium:
fakeTimers.clock
.useFakeTimers
setImmediate function(fn) {
var id = nextImmediateId++;
var args = arguments.length < 2 ? false : slice.call(arguments, 1);
immediateIds[id] = true;
nextTick(function onNextTick() {
if (immediateIds[id]) {
// fn.call() is faster so we optimize for the common use-case
// <strong i="28">@see</strong> http://jsperf.com/call-apply-segu
if (args) {
fn.apply(null, args);
} else {
fn.call(null);
}
// Prevent ids from leaking
exports.clearImmediate(id);
}
});
return id;
}
fakeTimers.timers.setImmediate function(fn) {
var id = nextImmediateId++;
var args = arguments.length < 2 ? false : slice.call(arguments, 1);
immediateIds[id] = true;
nextTick(function onNextTick() {
if (immediateIds[id]) {
// fn.call() is faster so we optimize for the common use-case
// <strong i="29">@see</strong> http://jsperf.com/call-apply-segu
if (args) {
fn.apply(null, args);
} else {
fn.call(null);
}
// Prevent ids from leaking
exports.clearImmediate(id);
}
});
return id;
}
setImmediate function(fn) {
var id = nextImmediateId++;
var args = arguments.length < 2 ? false : slice.call(arguments, 1);
immediateIds[id] = true;
nextTick(function onNextTick() {
if (immediateIds[id]) {
// fn.call() is faster so we optimize for the common use-case
// <strong i="30">@see</strong> http://jsperf.com/call-apply-segu
if (args) {
fn.apply(null, args);
} else {
fn.call(null);
}
// Prevent ids from leaking
exports.clearImmediate(id);
}
});
return id;
}
fakeTimers.timers.setImmediate function(fn) {
var id = nextImmediateId++;
var args = arguments.length < 2 ? false : slice.call(arguments, 1);
immediateIds[id] = true;
nextTick(function onNextTick() {
if (immediateIds[id]) {
// fn.call() is faster so we optimize for the common use-case
// <strong i="31">@see</strong> http://jsperf.com/call-apply-segu
if (args) {
fn.apply(null, args);
} else {
fn.call(null);
}
// Prevent ids from leaking
exports.clearImmediate(id);
}
});
return id;
}
1) fakes provided methods
0 passing (79ms)
1 failing
1) fakeTimers.clock
.useFakeTimers
fakes provided methods:
AssertionError: [refute.same] function onNextTick() {} expected not to be the same object as function onNextTick() {}
at Object.fail (node_modules/@sinonjs/referee/lib/create-fail.js:5)
at Object.fail (node_modules/@sinonjs/referee/lib/define-assertion.js:46)
at assertion (node_modules/@sinonjs/referee/lib/define-assertion.js:68)
at Function.referee.<computed>.<computed> [as same] (node_modules/@sinonjs/referee/lib/define-assertion.js:93)
at Context.<anonymous> (test/util/fake-timers-test.js:1080)
有趣的是
setImmediate
被定义为测试之前的(用户定义)函数setImmediate
值不变不需要更新到Browserify 16.3。 只需执行npm install [email protected]
就足够了,它将更新该版本的所有dep,并且显示相同的错误。
这是package-lock.json中的差异
git diff package-lock.json
diff --git a/package-lock.json b/package-lock.json
index c2290730..92060702 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -403,12 +403,6 @@
"integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=",
"dev": true
},
- "acorn-dynamic-import": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz",
- "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==",
- "dev": true
- },
"acorn-jsx": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz",
@@ -416,29 +410,34 @@
"dev": true
},
"acorn-node": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.6.2.tgz",
- "integrity": "sha512-rIhNEZuNI8ibQcL7ANm/mGyPukIaZsRNX9psFNQURyJW0nu6k8wjSDld20z6v2mDBWqX13pIEnk9gGZJHIlEXg==",
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
+ "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
"dev": true,
"requires": {
- "acorn": "^6.0.2",
- "acorn-dynamic-import": "^4.0.0",
- "acorn-walk": "^6.1.0",
- "xtend": "^4.0.1"
+ "acorn": "^7.0.0",
+ "acorn-walk": "^7.0.0",
+ "xtend": "^4.0.2"
},
"dependencies": {
"acorn": {
- "version": "6.0.4",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.4.tgz",
- "integrity": "sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.0.0.tgz",
+ "integrity": "sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ==",
+ "dev": true
+ },
+ "xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
"dev": true
}
}
},
"acorn-walk": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz",
- "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.0.0.tgz",
+ "integrity": "sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg==",
"dev": true
},
"agent-base": {
@@ -614,12 +613,30 @@
}
},
"assert": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
- "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
+ "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
"dev": true,
"requires": {
+ "object-assign": "^4.1.1",
"util": "0.10.3"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+ "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+ "dev": true
+ },
+ "util": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+ "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.1"
+ }
+ }
}
},
"assign-symbols": {
@@ -634,15 +651,6 @@
"integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
"dev": true
},
- "astw": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz",
- "integrity": "sha1-e9QXhNMkk5h66yOba04cV6hzuRc=",
- "dev": true,
- "requires": {
- "acorn": "^4.0.3"
- }
- },
"async": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
@@ -768,9 +776,9 @@
}
},
"base64-js": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz",
- "integrity": "sha1-qRlH2h9KUW6jjltOwOw3c2deCIY=",
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
+ "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==",
"dev": true
},
"binary-extensions": {
@@ -888,9 +896,9 @@
"dev": true
},
"browser-resolve": {
- "version": "1.11.2",
- "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz",
- "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=",
+ "version": "1.11.3",
+ "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz",
+ "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==",
"dev": true,
"requires": {
"resolve": "1.1.7"
@@ -978,13 +986,19 @@
"typedarray": "^0.0.6"
}
},
+ "safe-buffer": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
+ "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
+ "dev": true
+ },
"string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"dev": true,
"requires": {
- "safe-buffer": "~5.1.0"
+ "safe-buffer": "~5.2.0"
}
}
}
@@ -1071,9 +1085,9 @@
}
},
"buffer": {
- "version": "5.0.7",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.0.7.tgz",
- "integrity": "sha512-NeeHXWh5pCbPQCt2/6rLvXqapZfVsqw/YgRgaHpT3H9Uzgs+S0lSg5SQzouIuDvcmlQRqBe8hOO2scKCu3cxrg==",
+ "version": "5.4.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz",
+ "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==",
"dev": true,
"requires": {
"base64-js": "^1.0.2",
@@ -1697,6 +1711,12 @@
"randombytes": "^2.0.0"
}
},
+ "dash-ast": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz",
+ "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==",
+ "dev": true
+ },
"date-fns": {
"version": "1.29.0",
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz",
@@ -3392,6 +3412,12 @@
}
}
},
+ "get-assigned-identifiers": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz",
+ "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==",
+ "dev": true
+ },
"get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
@@ -3712,9 +3738,9 @@
"dev": true
},
"ieee754": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz",
- "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=",
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
+ "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
"dev": true
},
"ignore": {
@@ -3853,19 +3879,47 @@
}
},
"insert-module-globals": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.0.1.tgz",
- "integrity": "sha1-wDv04BywhtW15azorQr+eInWOMM=",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz",
+ "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==",
"dev": true,
"requires": {
"JSONStream": "^1.0.3",
- "combine-source-map": "~0.7.1",
- "concat-stream": "~1.5.1",
+ "acorn-node": "^1.5.2",
+ "combine-source-map": "^0.8.0",
+ "concat-stream": "^1.6.1",
"is-buffer": "^1.1.0",
- "lexical-scope": "^1.2.0",
+ "path-is-absolute": "^1.0.1",
"process": "~0.11.0",
"through2": "^2.0.0",
+ "undeclared-identifiers": "^1.1.2",
"xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "combine-source-map": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz",
+ "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=",
+ "dev": true,
+ "requires": {
+ "convert-source-map": "~1.1.0",
+ "inline-source-map": "~0.6.0",
+ "lodash.memoize": "~3.0.3",
+ "source-map": "~0.5.3"
+ }
+ },
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ }
}
},
"invert-kv": {
@@ -4403,13 +4457,12 @@
}
},
"labeled-stream-splicer": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz",
- "integrity": "sha1-pS4dE4AkwAuGscDJH2d5GLiuClk=",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz",
+ "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==",
"dev": true,
"requires": {
"inherits": "^2.0.1",
- "isarray": "~0.0.1",
"stream-splicer": "^2.0.0"
}
},
@@ -4652,15 +4705,6 @@
"type-check": "~0.3.2"
}
},
- "lexical-scope": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz",
- "integrity": "sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=",
- "dev": true,
- "requires": {
- "astw": "^2.0.0"
- }
- },
"linkify-it": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.0.3.tgz",
@@ -5829,14 +5873,14 @@
}
},
"module-deps": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.0.tgz",
- "integrity": "sha512-hKPmO06so6bL/ZvqVNVqdTVO8UAYsi3tQWlCa+z9KuWhoN4KDQtb5hcqQQv58qYiDE21wIvnttZEPiDgEbpwbA==",
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.1.tgz",
+ "integrity": "sha512-UnEn6Ah36Tu4jFiBbJVUtt0h+iXqxpLqDvPS8nllbw5RZFmNJ1+Mz5BjYnM9ieH80zyxHkARGLnMIHlPK5bu6A==",
"dev": true,
"requires": {
"JSONStream": "^1.0.3",
"browser-resolve": "^1.7.0",
- "cached-path-relative": "^1.0.0",
+ "cached-path-relative": "^1.0.2",
"concat-stream": "~1.6.0",
"defined": "^1.0.0",
"detective": "^5.0.2",
@@ -5864,12 +5908,12 @@
}
},
"detective": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/detective/-/detective-5.1.0.tgz",
- "integrity": "sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz",
+ "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==",
"dev": true,
"requires": {
- "acorn-node": "^1.3.0",
+ "acorn-node": "^1.6.1",
"defined": "^1.0.0",
"minimist": "^1.1.1"
}
@@ -6668,9 +6712,9 @@
}
},
"pako": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz",
- "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==",
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz",
+ "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==",
"dev": true
},
"parent-module": {
@@ -6727,9 +6771,9 @@
"dev": true
},
"path-browserify": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
- "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
+ "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
"dev": true
},
"path-dirname": {
@@ -8282,6 +8326,12 @@
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
"dev": true
},
+ "simple-concat": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz",
+ "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=",
+ "dev": true
+ },
"slash": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
@@ -8570,9 +8620,9 @@
}
},
"stream-browserify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
- "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
+ "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
"dev": true,
"requires": {
"inherits": "~2.0.1",
@@ -8590,22 +8640,60 @@
}
},
"stream-http": {
- "version": "2.7.2",
- "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz",
- "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==",
+ "version": "2.8.3",
+ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
+ "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
"dev": true,
"requires": {
"builtin-status-codes": "^3.0.0",
"inherits": "^2.0.1",
- "readable-stream": "^2.2.6",
+ "readable-stream": "^2.3.6",
"to-arraybuffer": "^1.0.0",
"xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
}
},
"stream-splicer": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz",
- "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz",
+ "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==",
"dev": true,
"requires": {
"inherits": "^2.0.1",
@@ -8740,12 +8828,12 @@
"dev": true
},
"syntax-error": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.3.0.tgz",
- "integrity": "sha1-HtkmbE1AvnXcVb+bsct3Biu5bKE=",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz",
+ "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==",
"dev": true,
"requires": {
- "acorn": "^4.0.3"
+ "acorn-node": "^1.2.0"
}
},
"table": {
@@ -9048,6 +9136,19 @@
"integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
"dev": true
},
+ "undeclared-identifiers": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz",
+ "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==",
+ "dev": true,
+ "requires": {
+ "acorn-node": "^1.3.0",
+ "dash-ast": "^1.0.0",
+ "get-assigned-identifiers": "^1.2.0",
+ "simple-concat": "^1.0.0",
+ "xtend": "^4.0.1"
+ }
+ },
"union-value": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
@@ -9166,20 +9267,12 @@
"dev": true
},
"util": {
- "version": "0.10.3",
- "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
- "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+ "version": "0.10.4",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
+ "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
"dev": true,
"requires": {
- "inherits": "2.0.1"
- },
- "dependencies": {
- "inherits": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
- "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
- "dev": true
- }
+ "inherits": "2.0.3"
}
},
"util-deprecate": {
也许可以用来在node_modules
找到有罪的嫌疑人:
grep -rl setImmediate node_modules/
node_modules/inquirer/node_modules/rxjs/_esm2015/internal/util/Immediate.js
node_modules/inquirer/node_modules/rxjs/_esm2015/internal/scheduler/AsapAction.js
node_modules/inquirer/node_modules/rxjs/src/internal/util/Immediate.ts
node_modules/inquirer/node_modules/rxjs/src/internal/scheduler/AsapAction.ts
node_modules/inquirer/node_modules/rxjs/internal/util/Immediate.js
node_modules/inquirer/node_modules/rxjs/internal/util/Immediate.d.ts
node_modules/inquirer/node_modules/rxjs/internal/scheduler/AsapAction.js
node_modules/inquirer/node_modules/rxjs/_esm5/internal/util/Immediate.js
node_modules/inquirer/node_modules/rxjs/_esm5/internal/scheduler/AsapAction.js
node_modules/inquirer/node_modules/rxjs/bundles/rxjs.umd.min.js
node_modules/inquirer/node_modules/rxjs/bundles/rxjs.umd.js
node_modules/inquirer/node_modules/rxjs/bundles/rxjs.umd.js.map
node_modules/inquirer/node_modules/rxjs/bundles/rxjs.umd.min.js.map
node_modules/@types/node/index.d.ts
node_modules/@types/node/README.md
node_modules/@sinonjs/samsam/node_modules/lodash/lodash.js
node_modules/uglify-js/tools/domprops.json
node_modules/uglify-js/tools/exit.js
node_modules/mochify/node_modules/mocha/mocha.js
node_modules/mochify/node_modules/mocha/CHANGELOG.md
node_modules/mochify/node_modules/mocha/lib/runner.js
node_modules/mochify/lib/mochify.js
node_modules/readable-stream/lib/_stream_writable.js
node_modules/stream-splicer/index.js
node_modules/levelup/CHANGELOG.md
node_modules/levelup/lib/write-stream.js
node_modules/external-editor/main/index.js
node_modules/rxjs/util/Immediate.js.map
node_modules/rxjs/util/Immediate.js
node_modules/rxjs/util/Immediate.d.ts
node_modules/rxjs/_esm2015/util/Immediate.js
node_modules/rxjs/_esm2015/scheduler/AsapAction.js
node_modules/rxjs/scheduler/AsapAction.js.map
node_modules/rxjs/scheduler/AsapAction.js
node_modules/rxjs/src/util/Immediate.ts
node_modules/rxjs/src/scheduler/AsapAction.ts
node_modules/rxjs/_esm5/util/Immediate.js
node_modules/rxjs/_esm5/scheduler/AsapAction.js
node_modules/rxjs/bundles/Rx.js.map
node_modules/rxjs/bundles/Rx.min.js
node_modules/rxjs/bundles/Rx.js
node_modules/rxjs/bundles/Rx.min.js.map
node_modules/native-promise-only/npo.js
node_modules/native-promise-only/lib/npo.src.js
node_modules/concat-stream/node_modules/readable-stream/lib/_stream_writable.js
node_modules/es6-promise/CHANGELOG.md
node_modules/path-type/node_modules/pify/readme.md
node_modules/globals/globals.json
node_modules/timers-browserify/CHANGELOG.md
node_modules/timers-browserify/README.md
node_modules/timers-browserify/main.js
node_modules/neo-async/async.js
node_modules/neo-async/README.md
node_modules/neo-async/async.min.js
node_modules/neo-async/setImmediate.js
node_modules/readdirp/stream-api.js
node_modules/readdirp/readdirp.js
node_modules/level-blobs/node_modules/readable-stream/float.patch
node_modules/transformify/node_modules/readable-stream/float.patch
node_modules/mocha/mocha.js
node_modules/mocha/CHANGELOG.md
node_modules/mocha/lib/runner.js
node_modules/mocaccino/node_modules/readable-stream/lib/_stream_writable.js
node_modules/mocaccino/node_modules/mocha/mocha.js
node_modules/mocaccino/node_modules/mocha/CHANGELOG.md
node_modules/mocaccino/node_modules/mocha/lib/runner.js
node_modules/esm/esm/loader.js
node_modules/puppeteer/.local-chromium/linux-674921/chrome-linux/resources/inspector/toolbox.js
node_modules/puppeteer/.local-chromium/linux-674921/chrome-linux/resources/inspector/devtools_compatibility.js
node_modules/puppeteer/.local-chromium/linux-674921/chrome-linux/resources/inspector/console/console_module.js
node_modules/puppeteer/.local-chromium/linux-674921/chrome-linux/resources/inspector/heap_snapshot_worker.js
node_modules/puppeteer/.local-chromium/linux-674921/chrome-linux/resources/inspector/text_editor/text_editor_module.js
node_modules/puppeteer/.local-chromium/linux-674921/chrome-linux/resources/inspector/audits_worker/audits_worker_module.js
node_modules/puppeteer/.local-chromium/linux-674921/chrome-linux/resources/inspector/network/network_module.js
node_modules/puppeteer/.local-chromium/linux-674921/chrome-linux/resources/inspector/formatter_worker.js
node_modules/puppeteer/.local-chromium/linux-674921/chrome-linux/resources/inspector/sources/sources_module.js
node_modules/puppeteer/.local-chromium/linux-674921/chrome-linux/resources/inspector/shell.js
node_modules/puppeteer/.local-chromium/linux-674921/chrome-linux/resources.pak
node_modules/load-json-file/node_modules/pify/readme.md
node_modules/async/memoize.js
node_modules/async/wrapSync.js
node_modules/async/nextTick.js
node_modules/async/CHANGELOG.md
node_modules/async/asyncify.js
node_modules/async/dist/async.min.map
node_modules/async/dist/async.js
node_modules/async/dist/async.min.js
node_modules/async/internal/queue.js
node_modules/async/internal/setImmediate.js
node_modules/async/transform.js
node_modules/async/priorityQueue.js
node_modules/async/index.js
node_modules/async/setImmediate.js
node_modules/async/ensureAsync.js
node_modules/lodash/lodash.js
node_modules/stream-http/node_modules/readable-stream/lib/_stream_writable.js
node_modules/lolex/lolex.js
node_modules/lolex/CHANGELOG.md
node_modules/lolex/src/lolex-src.js
node_modules/lolex/README.md
node_modules/prettier/bin-prettier.js
node_modules/prettier/index.js
node_modules/insert-module-globals/readme.markdown
node_modules/insert-module-globals/index.js
node_modules/insert-module-globals/test/immediate/main.js
node_modules/rollup-plugin-node-builtins/src/es6/timers.js
node_modules/rollup-plugin-node-builtins/src/es6/setimmediate.js
node_modules/lint-staged/node_modules/pify/readme.md
node_modules/fd-slicer/CHANGELOG.md
node_modules/fd-slicer/index.js
node_modules/nise/nise.js
node_modules/source-map-resolve/lib/source-map-resolve-node.js
node_modules/source-map-resolve/readme.md
node_modules/source-map-resolve/source-map-resolve.js
node_modules/yauzl/index.js
node_modules/yauzl/README.md
node_modules/rollup-plugin-node-globals/readme.md
node_modules/pify/readme.md
node_modules/extract-zip/index.js
这些是同时提及setImmediate
和使用process-nextick-args
。 我认为问题与这些有关,因为看到Sinon之外的东西使用nextTick
来定义setImmediate
nextTick
。
$ grep -l process-nextick-args $(cat setImm_hits )
node_modules/mochify/node_modules/mocha/mocha.js
node_modules/readable-stream/lib/_stream_writable.js
node_modules/concat-stream/node_modules/readable-stream/lib/_stream_writable.js
node_modules/mocha/mocha.js
node_modules/mocaccino/node_modules/readable-stream/lib/_stream_writable.js
node_modules/mocaccino/node_modules/mocha/mocha.js
node_modules/puppeteer/.local-chromium/linux-674921/chrome-linux/resources/inspector/audits_worker/audits_worker_module.js
node_modules/stream-http/node_modules/readable-stream/lib/_stream_writable.js
我看到了很多与Mochify和流有关的东西,@ mantoni。 您对可能的根本原因有任何想法吗?
升级之前,层次结构中只有两个依赖项:
$ find node_modules/ -regex '.*/process-nextick-args/package.json'
node_modules/process-nextick-args/package.json
node_modules/mocaccino/node_modules/process-nextick-args/package.json
$ find node_modules/ -regex '.*/process-nextick-args/package.json' | xargs jq .version
"1.0.7"
"2.0.1"
升级后,共有三个(新的是stream-http
):
$ find node_modules/ -regex '.*/process-nextick-args/package.json'
node_modules/process-nextick-args/package.json
node_modules/mocaccino/node_modules/process-nextick-args/package.json
node_modules/stream-http/node_modules/process-nextick-args/package.json
carlerik at diffia9350 in /mnt/dev/sinon (2072-upgrade-browserify-bug)
$ find node_modules/ -regex '.*/process-nextick-args/package.json' | xargs jq .version
"1.0.7"
"2.0.1"
"2.0.1"
我花了半个小时研究这个问题。 虽然我无法解释为什么会发生这种情况,但我得出的结论是,锡农确实(而且很可能一直在做)关于setImmediate
的错误事情。
在不进行任何升级的情况下,在当前的master分支上,使用以下内容创建issue.js
:
'use strict';
console.log(String(window.setImmediate));
require('.').useFakeTimers();
console.log(String(window.setImmediate));
使用node_modules/.bin/mochify issue.js
打印运行它
# chromium:
undefined
function () {
return clock[method].apply(clock, arguments);
}
0 passing (1ms)
如您所见,Chromium甚至没有实现setImmediate
。 我发现了一个铬臭虫报告,维护者表示他们不愿意实施它: https :
我要说的问题不是setImmediate
没有正确还原,不应该首先安装它。 当前,在浏览器环境中使用Sinon伪计时器可以使setImmediate
工作,而实际上不应该。
我创建了一个带有失败测试用例的拉取请求,以演示该问题。 不幸的是,我今天没有时间继续研究它。
这是一种务实的方法:只是尝试看看是否使Sinon不安装setImmediate会使该错误消失。 我想实际的修复可能需要在Lolex中完成。
稍后,我在lolex中对此进行了测试。 那里不是可复制的,所以我们只需要在Sinon安装代码中添加一个用于计时器的检查即可。
在看到建议的修复程序(sinonjs / lolex#268和sinonjs / lolex#269)后,我发现sinner不能解决问题。 看来这是通过browserify进行的转换: https :
我通过在test/util/fake-timers-test.js
的单个测试中运行mochify
来发现。 如果我注释掉创建时钟的那一行,则setImmediate
将继续是未定义的。 如果我发表评论,它就定义了。
知道我避免在Lolex 5中创建setImmediate(这是#2131中的依赖项),所以我知道也不应该怪Lolex。 因此,我从setImmediate的字符串化定义中搜索了几行,并在insert-module-globals中找到了函数定义,这是Browserify的一个依赖项。 通过更新Browserify,我们从此依赖项的v7.0.1升级到了7.3.0,它开始在v7.2中添加setImmediate
。
如果检测到setImmediate正在使用/引用,则好像该browserify转换已安装此全局变量? 在任何情况下,看来我们都不会受到指责。
但是有一件事很奇怪。 我想知道Mochify是否做一些有趣的事情...
我可以看到上述转换已包含在mochify流程中: mochify --bundle bundle.js --consolify test/util/fake-timers-test.js
,但在构建Sinon捆绑包npm run build
时不包含在内。
@mantoni什么会导致Mochify进行“常规” Browserify无法完成的转换?
只是要清楚:
这种情况下的问题是(Browserify)向全局范围_after_添加了setImmediate
,我们的检测代码已经运行,这意味着很多假设都被打破了。 setImmediate
开始时是未定义的,我们希望它在末尾也是未定义的,但是在此期间已将其设置为某个位置。
谢谢您对此事的调查💯
从某种意义上说,我不得不参加黑客马拉松周末,即使这有点不同步😛很高兴终于能体会到这一点。
我想我知道这里的基本修复方法(定义opts.insertGlobalVars
),但是@mantoni需要用mochify
来帮助我。
我看不到在mochify
命令行中传递Browserify标志的任何方式。 我从mochify文档中看到的是:
mochify函数返回一个Browserify实例。 有关详细信息,请参考Browserify API。
我认为这意味着我们需要替换当前对Mochify的CLI的使用,并用javascript替换它(类似于build.js
)? 我还假设这意味着可以使用其他选项来配置返回的browserify实例? 我可能会双重张贴以供参考...
@ fatso83我很高兴为Mochify添加更多Browserify选项:)
无论如何,我认为问题出在brout
,这是Mochify的非常老的部分。 它将process
对象填充到mocha中,并在stdout / stderr上重定向write
调用。 这意味着browserify会检测到正在使用process
对象,并为其添加全局填充程序。 这可能是运行在Mochify内部browserify管道一个好主意--no-insert-globals
,并提供自定义process
在垫片brout
来代替。
_Edit:_ brout中的相关行是这样的: https :
恩,我很想提供PR,但我不知道自己会怎么做,所以...
不用担心。 我将对其进行修复,并将尝试提出一种比当前解决方案更易于理解的解决方案。 但是要等到我找到时间后,再过几天。