Sinon: Browserify μ—…κ·Έλ ˆμ΄λ“œκ°€ ν…ŒμŠ€νŠΈμ— μ‹€νŒ¨ 함

에 λ§Œλ“  2019λ…„ 08μ›” 07일  Β·  21μ½”λ©˜νŠΈ  Β·  좜처: sinonjs/sinon

  • Sinon 버전 : 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://github.com/sinonjs/sinon/commit/c8ff2b8f6f438ccac7c5c3abd9a106dc84914610

Tough Help wanted

λͺ¨λ“  21 λŒ“κΈ€

ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ νŒ¨ν‚€μ§€λ₯Ό μˆ˜λ™μœΌλ‘œ 되돌리렀 κ³  μ‹œλ„ν–ˆμŠ΅λ‹ˆλ‹€ (λΈŒλΌμš°μ € ν™”, λ‘€μ—…, ++ μ‹œλ„).

이제 ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•˜κ³  ν…ŒμŠ€νŠΈν•˜μ—¬ 슀크립트λ₯Ό μ‚¬μš©ν•˜μ—¬ λ°˜λŒ€λ‘œ μ‹œλ„ν•˜μ‹­μ‹œμ˜€.

성곡. [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

diffμ—μ„œ μ˜μ‹¬μŠ€λŸ¬μš΄ 것을 찾을 수 μ—†μŠ΅λ‹ˆλ‹€ : https://github.com/browserify/browserify/compare/v16.2.3...v16.3.0?

μ—…λ°μ΄νŠΈμ— λŒ€ν•œ 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 의 버그가 μˆ˜μ • 된 것 κ°™μŠ΅λ‹ˆλ‹€. λ‹€μ‹œ μ‹œλ„ ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?

ν•΄λ‹Ή ν”„λ‘œμ νŠΈμ—μ„œ 1 λ…„ 이상 아무 일도 μΌμ–΄λ‚˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ μ—¬μ „νžˆ μ‹€νŒ¨ν•΄μ•Όν•©λ‹ˆλ‹€. μš°λ¦¬λŠ” λ‹€λ₯Έ λͺ¨λ“  νŒ¨ν‚€μ§€λ₯Ό μ—…λ°μ΄νŠΈ ν•  수 μžˆμ§€λ§Œ 이것은 browserify μ—…λ°μ΄νŠΈλ₯Όμœ„ν•œ μ°¨λ‹¨κΈ°λ‘œ 남아 μžˆμŠ΅λ‹ˆλ‹€.

이 버그가 κ°€μ§œ 타이머 μ½”λ“œμ—μ„œ λ“œλŸ¬λ‚¬κΈ° λ•Œλ¬Έμ— 버그가 Lolex에 μžˆλ‹€κ³  κ°€μ •ν–ˆμ§€λ§Œ μ•„μ‰½κ²Œλ„ lolex에 λ™μΌν•œ ν…ŒμŠ€νŠΈλ₯Ό μΆ”κ°€ν•˜κ³  Browserify (=> Chokidar => fsevents => process-nextick-args)λ₯Ό μ—…κ·Έλ ˆμ΄λ“œν•˜λŠ” κ²ƒμœΌλ‘œ λ‚˜νƒ€λ‚¬μŠ΅λ‹ˆλ‹€. _not_ 버그λ₯Ό λͺ…μ‹œν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ™μΌν•œ process-nextick-args 버전 (2.0.0)이 Lolexμ—λ„μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 이것은 Sinon μžμ‹ μ˜ 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 κ΅¬ν˜„μ΄ 된 이유λ₯Ό μ΄ν•΄ν•˜λŠ” 데 μ€‘μš” ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λ§ˆλ„ λ³€μˆ˜κ°€ μ •μ˜ λ˜μ—ˆλŠ”μ§€


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] λ§Œν•˜λ©΄ μΆ©λΆ„ν•˜λ©° ν•΄λ‹Ή λ²„μ „μ˜ λͺ¨λ“  depsλ₯Ό μ—…λ°μ΄νŠΈν•˜κ³  λ™μΌν•œ 버그λ₯Ό λ³΄μ—¬μ€λ‹ˆλ‹€.

이것은 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 μ™ΈλΆ€μ—μ„œ setImmediate μ‚¬μš©ν•˜μ—¬ nextTick setImmediate 을 μ •μ˜ν•œλ‹€λŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

$ 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"

λ‚˜λŠ” 이것을 νŒŒν—€μΉ˜λŠ” 데 30 뢄을 νˆ¬μžν–ˆλ‹€. μ™œ 이런 일이 λ°œμƒν–ˆλŠ”μ§€ μ„€λͺ… ν•  μˆ˜λŠ” μ—†μ§€λ§Œ, Sinon이 setImmediate κ³Ό κ΄€λ ¨ν•˜μ—¬ 잘λͺ»λœ μΌμ„ν•˜κ³  μžˆλ‹€λŠ” 결둠에 λ„λ‹¬ν–ˆμŠ΅λ‹ˆλ‹€.

아무것도 μ—…κ·Έλ ˆμ΄λ“œν•˜μ§€ μ•Šκ³  ν˜„μž¬ λ§ˆμŠ€ν„° λΈŒλžœμΉ˜μ—μ„œ λ‹€μŒ μ½˜ν…μΈ λ‘œ 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://bugs.chromium.org/p/chromium/issues/detail?id=146172

λ¬Έμ œλŠ” setImmediate κ°€ μ œλŒ€λ‘œ λ³΅μ›λ˜μ§€ μ•Šμ€ 것이 μ•„λ‹ˆλΌ μ²˜μŒμ— μ„€μΉ˜ν•΄μ„œλŠ” μ•ˆλœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. ν˜„μž¬ λΈŒλΌμš°μ € ν™˜κ²½μ—μ„œ Sinon κ°€μ§œ 타이머λ₯Ό μ‚¬μš©ν•˜λ©΄ setImmediate μž‘λ™ν•˜μ§€λ§Œ μ‹€μ œλ‘œλŠ” μ•ˆλ©λ‹ˆλ‹€.

문제λ₯Ό λ³΄μ—¬μ£ΌλŠ” ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€κ°€ μ‹€νŒ¨ν•œ ν’€ μš”μ²­μ„ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€. μ•ˆνƒ€κΉκ²Œλ„ 였늘 μž‘μ—…μ„ 계속할 μ‹œκ°„μ΄ μ—†μŠ΅λ‹ˆλ‹€.

그것은 μ‹€μš©μ μΈ μ ‘κ·Ό λ°©μ‹μž…λ‹ˆλ‹€. Sinon이 setImmediateλ₯Ό μ„€μΉ˜ν•˜μ§€ μ•Šλ„λ‘ν•˜λ©΄ 버그가 μ‚¬λΌμ§€λŠ” 지 ν™•μΈν•˜μ‹­μ‹œμ˜€. Lolexμ—μ„œ μ‹€μ œ μˆ˜μ •μ΄ ν•„μš”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜μ€‘μ— lolexμ—μ„œ 이것을 ν…ŒμŠ€νŠΈν–ˆμŠ΅λ‹ˆλ‹€. κ±°κΈ°μ—μ„œ μž¬ν˜„ ν•  수 μ—†μœΌλ―€λ‘œ 타이머에 λŒ€ν•œ Sinon μ„€μΉ˜ μ½”λ“œμ— 확인을 μΆ”κ°€ν•˜λ©΄λ©λ‹ˆλ‹€.

μ œμ•ˆ 된 μˆ˜μ • 사항 (sinonjs / lolex # 268 및 sinonjs / lolex # 269)이 문제λ₯Ό _not_ μˆ˜μ • ν•œ 것을보고 죄인을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. https://github.com/browserify/insert-module-globals/releases/tag/v7.1.0 을 μˆ˜ν–‰ν•˜λŠ” λΈŒλΌμš°μ € ν™” λ³€ν™˜ 인 것 κ°™μŠ΅λ‹ˆλ‹€.

mochify 의 단일 ν…ŒμŠ€νŠΈμ—μ„œ test/util/fake-timers-test.js mochify λ₯Ό μ‹€ν–‰ν•˜μ—¬ μ•Œμ•„ λƒˆμŠ΅λ‹ˆλ‹€. μ‹œκ³„λ₯Ό λ§Œλ“  쀄을 주석 μ²˜λ¦¬ν•˜λ©΄ setImmediate λŠ” 계속 μ •μ˜λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‚΄κ°€ 주석을 달면 μ •μ˜κ°€λ˜μ—ˆλ‹€.

Lolex 5 (# 2131의 쒅속성)μ—μ„œ setImmediateλ₯Ό λ§Œλ“€μ§€ μ•ŠλŠ”λ‹€λŠ” 것을 μ•Œκ³  Lolex도 μ±…μž„μ„μ§€μ§€ μ•ŠλŠ”λ‹€λŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ setImmediate의 λ¬Έμžμ—΄ ν™” 된 μ •μ˜μ—μ„œ λͺ‡ 쀄을 κ²€μƒ‰ν–ˆκ³  Browserify의 쒅속성 인 insert-module-globalsμ—μ„œ ν•¨μˆ˜ μ •μ˜λ₯Ό μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. Browserifyλ₯Ό μ—…λ°μ΄νŠΈν•˜μ—¬μ΄ 쒅속성을 v7.0.1μ—μ„œ 7.3.0으둜 λ³€κ²½ν•˜μ—¬ v7.2μ—μ„œ setImmediate λ₯Ό μΆ”κ°€ν•˜κΈ° μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€.

이 browserify λ³€ν™˜μ΄ setImmediateκ°€ μ‚¬μš© / μ°Έμ‘°λ˜λŠ” 것을 κ°μ§€ν•˜λ©΄μ΄ 전역을 μ„€μΉ˜ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€. μ–΄μ¨Œλ“  μš°λ¦¬λŠ” μ—¬κΈ°μ„œ λΉ„λ‚œλ°›μ§€ μ•ŠλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ ν•œ 가지 μ΄μƒν•œ 점이 μžˆμŠ΅λ‹ˆλ‹€. Mochifyκ°€ μž¬λ―ΈμžˆλŠ” μ‚¬μ—…μ„ν•˜λŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€ ...
μ–ΈκΈ‰ ν•œ λ³€ν™˜μ΄ mochify ν”„λ‘œμ„ΈμŠ€μ— ν¬ν•¨λ˜μ–΄ μžˆμŒμ„ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€ : mochify --bundle bundle.js --consolify test/util/fake-timers-test.js ,ν•˜μ§€λ§Œ Sinon λ²ˆλ“€μ„ λΉŒλ“œ ν•  λ•Œ ν¬ν•¨λ˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€ : npm run build .

@mantoni Mochify κ°€ "일반적인"Browserifyκ°€ μˆ˜ν–‰ν•˜μ§€ μ•ŠλŠ” λ³€ν™˜μœΌλ‘œ λ§Œλ“œλŠ” 원인은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?

λͺ…ν™•ν•˜κ²Œ λ§ν•˜λ©΄ :
이 경우 λ¬Έμ œλŠ” 무언가 (Browserify)κ°€ μ „μ—­ λ²”μœ„μ— setImmediate 을 μΆ”κ°€ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. _after_ 탐지 μ½”λ“œκ°€ 이미 μ‹€ν–‰λ˜μ–΄ λ§Žμ€ 가정이 κΉ¨ μ‘ŒμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€. setImmediate 은 (λŠ”) μ •μ˜λ˜μ§€ μ•Šμ€ μƒνƒœλ‘œ μ‹œμž‘ν•˜κ³  λ§ˆμ§€λ§‰μ—λ„ μ •μ˜λ˜μ§€ μ•Šμ€ κ²ƒμœΌλ‘œ μ˜ˆμƒλ˜μ§€λ§Œ κ·Έ λ™μ•ˆ μ–΄λ”˜κ°€μ— μ„€μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

쑰사 ν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€ πŸ’―

λ‚˜λŠ” μ•½κ°„μ˜ 비동기 적 μ΄μ—ˆλ”λΌλ„ μ–΄λ–€ 식 μœΌλ‘œλ“  해컀 톀 주말에 μ°Έκ°€ν•΄μ•Όν–ˆλ‹€.

μ—¬κΈ°μ„œ κΈ°λ³Έ μˆ˜μ • 사항을 μ•Œκ³  μžˆλ‹€κ³  생각 opts.insertGlobalVars μ •μ˜).ν•˜μ§€λ§Œ @mantoni λŠ” mochify λΉ„νŠΈλ‘œ μ €λ₯Ό μ’€ 도와 μ€˜μ•Όν•©λ‹ˆλ‹€.

mochify λͺ…λ Ή μ€„μ—μ„œ Browserify ν”Œλž˜κ·Έλ₯Ό μ „λ‹¬ν•˜λŠ” 방법이 μ—†μŠ΅λ‹ˆλ‹€. mochify λ¬Έμ„œμ—μ„œ λ‚΄κ°€ λ³΄λŠ” 것은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

mochify ν•¨μˆ˜λŠ” Browserify μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ Browserify APIλ₯Ό μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

즉, Mochify의 ν˜„μž¬ CLI μ‚¬μš©μ„ λŒ€μ²΄ν•˜κ³  μžλ°” 슀크립트 ( build.js 와 μœ μ‚¬)둜 λŒ€μ²΄ν•΄μ•Όν•©λ‹ˆκΉŒ? λ˜ν•œ λ°˜ν™˜ 된 browserify μΈμŠ€ν„΄μŠ€λ₯Ό μΆ”κ°€ μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ—¬ ꡬ성 ν•  수 μžˆμŒμ„ μ˜λ―Έν•œλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€. λ‚˜λŠ” 이것을 참고둜 두 번 κ²Œμ‹œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€ ...

@ fatso83 Mochify에 Browserify μ˜΅μ…˜μ„ 더 μΆ”κ°€ν•˜κ²Œλ˜μ–΄ κΈ°μ©λ‹ˆλ‹€ :)

μ–΄μ¨Œλ“  λ¬Έμ œλŠ” Mochify의 맀우 였래된 λΆ€λΆ„ 인 brout 내에 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. mocha에 λŒ€ν•œ process 개체λ₯Ό shimν•˜κ³  stdout / stderrμ—μ„œ write ν˜ΈμΆœμ„ λ¦¬λ””λ ‰μ…˜ν•©λ‹ˆλ‹€. μ΄λŠ” browserifyκ°€ process κ°œμ²΄κ°€ μ‚¬μš©μ€‘μΈ 것을 κ°μ§€ν•˜κ³  이에 λŒ€ν•œ μ „μ—­ shim을 μΆ”κ°€ 함을 μ˜λ―Έν•©λ‹ˆλ‹€. Mochifyμ—μ„œ --no-insert-globals λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‚΄λΆ€ browserify νŒŒμ΄ν”„ 라인을 μ‹€ν–‰ν•˜κ³  λŒ€μ‹  brout μ‚¬μš©μž 지정 process shim을 μ œκ³΅ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

_Edit : _ brout의 κ΄€λ ¨ 쀄은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€ : https://github.com/mantoni/brout.js/blob/14b62f4e8b88445f90a46adb1921c00921680087/lib/brout.js#L28

μ–΄, ν™λ³΄ν•˜κ³  μ‹Άμ§€λ§Œ λ‚΄κ°€ λ­˜ν• μ§€ λͺ°λΌμ„œ ...

κ±±μ • 마. λ‚˜λŠ” 그것을 κ³ μΉ  것이고 ν˜„μž¬μ˜ 것보닀 μ΄ν•΄ν•˜κΈ° μ‰¬μš΄ 해결책을 생각해 λ‚Ό κ²ƒμž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ‹œκ°„μ„ 찾을 λ•ŒκΉŒμ§€ 며칠이 κ±Έλ¦½λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰