summaryrefslogtreecommitdiff
path: root/deps/node/deps/node-inspect
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2019-04-03 15:43:32 +0200
committerFlorian Dold <florian.dold@gmail.com>2019-04-03 15:45:57 +0200
commit71e285b94c7edaa43aa8115965cf5a36b8e0f80a (patch)
tree7d4aa9d0d5aff686b106cd5da72ba77960c4af43 /deps/node/deps/node-inspect
parent7dadf9356b4f3f4137ce982ea5bb960283116e9a (diff)
downloadakono-71e285b94c7edaa43aa8115965cf5a36b8e0f80a.tar.gz
akono-71e285b94c7edaa43aa8115965cf5a36b8e0f80a.tar.bz2
akono-71e285b94c7edaa43aa8115965cf5a36b8e0f80a.zip
Node.js v11.13.0
Diffstat (limited to 'deps/node/deps/node-inspect')
-rw-r--r--deps/node/deps/node-inspect/.editorconfig11
-rw-r--r--deps/node/deps/node-inspect/.eslintrc147
-rw-r--r--deps/node/deps/node-inspect/.gitignore4
-rw-r--r--deps/node/deps/node-inspect/.npmrc2
-rw-r--r--deps/node/deps/node-inspect/.travis.yml13
-rw-r--r--deps/node/deps/node-inspect/CHANGELOG.md288
-rw-r--r--deps/node/deps/node-inspect/CONTRIBUTING.md181
-rw-r--r--deps/node/deps/node-inspect/GOVERNANCE.md4
-rw-r--r--deps/node/deps/node-inspect/LICENSE19
-rw-r--r--deps/node/deps/node-inspect/README.md29
-rw-r--r--deps/node/deps/node-inspect/appveyor.yml13
-rwxr-xr-xdeps/node/deps/node-inspect/cli.js2
-rw-r--r--deps/node/deps/node-inspect/examples/alive.js5
-rw-r--r--deps/node/deps/node-inspect/examples/backtrace.js30
-rw-r--r--deps/node/deps/node-inspect/examples/break.js16
-rw-r--r--deps/node/deps/node-inspect/examples/cjs/index.js5
-rw-r--r--deps/node/deps/node-inspect/examples/cjs/other.js3
-rw-r--r--deps/node/deps/node-inspect/examples/empty.js0
-rw-r--r--deps/node/deps/node-inspect/examples/exceptions.js10
-rw-r--r--deps/node/deps/node-inspect/examples/three-lines.js3
-rw-r--r--deps/node/deps/node-inspect/examples/use-strict.js2
-rw-r--r--deps/node/deps/node-inspect/lib/_inspect.js371
-rw-r--r--deps/node/deps/node-inspect/lib/cli.js24
-rw-r--r--deps/node/deps/node-inspect/lib/internal/inspect_client.js352
-rw-r--r--deps/node/deps/node-inspect/lib/internal/inspect_repl.js1089
-rw-r--r--deps/node/deps/node-inspect/package.json45
-rw-r--r--deps/node/deps/node-inspect/test/cli/backtrace.test.js30
-rw-r--r--deps/node/deps/node-inspect/test/cli/break.test.js195
-rw-r--r--deps/node/deps/node-inspect/test/cli/exceptions.test.js68
-rw-r--r--deps/node/deps/node-inspect/test/cli/exec.test.js77
-rw-r--r--deps/node/deps/node-inspect/test/cli/heap-profiler.test.js34
-rw-r--r--deps/node/deps/node-inspect/test/cli/help.test.js22
-rw-r--r--deps/node/deps/node-inspect/test/cli/invalid-args.test.js54
-rw-r--r--deps/node/deps/node-inspect/test/cli/launch.test.js176
-rw-r--r--deps/node/deps/node-inspect/test/cli/low-level.test.js34
-rw-r--r--deps/node/deps/node-inspect/test/cli/pid.test.js52
-rw-r--r--deps/node/deps/node-inspect/test/cli/preserve-breaks.test.js64
-rw-r--r--deps/node/deps/node-inspect/test/cli/profile.test.js32
-rw-r--r--deps/node/deps/node-inspect/test/cli/scripts.test.js43
-rw-r--r--deps/node/deps/node-inspect/test/cli/start-cli.js156
-rw-r--r--deps/node/deps/node-inspect/test/cli/use-strict.test.js27
-rw-r--r--deps/node/deps/node-inspect/test/cli/watchers.test.js42
-rw-r--r--deps/node/deps/node-inspect/tools/eslint-rules/align-function-arguments.js76
-rw-r--r--deps/node/deps/node-inspect/tools/eslint-rules/align-multiline-assignment.js68
-rw-r--r--deps/node/deps/node-inspect/tools/eslint-rules/assert-fail-single-argument.js30
-rw-r--r--deps/node/deps/node-inspect/tools/eslint-rules/buffer-constructor.js25
-rw-r--r--deps/node/deps/node-inspect/tools/eslint-rules/new-with-error.js31
-rw-r--r--deps/node/deps/node-inspect/tools/eslint-rules/no-let-in-for-declaration.js46
-rw-r--r--deps/node/deps/node-inspect/tools/eslint-rules/prefer-assert-methods.js39
-rw-r--r--deps/node/deps/node-inspect/tools/eslint-rules/require-buffer.js19
-rw-r--r--deps/node/deps/node-inspect/tools/eslint-rules/required-modules.js99
51 files changed, 4207 insertions, 0 deletions
diff --git a/deps/node/deps/node-inspect/.editorconfig b/deps/node/deps/node-inspect/.editorconfig
new file mode 100644
index 00000000..beffa308
--- /dev/null
+++ b/deps/node/deps/node-inspect/.editorconfig
@@ -0,0 +1,11 @@
+root = true
+
+[*]
+indent_style = space
+indent_size = 2
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.md]
+trim_trailing_whitespace = false
diff --git a/deps/node/deps/node-inspect/.eslintrc b/deps/node/deps/node-inspect/.eslintrc
new file mode 100644
index 00000000..b6d45aa4
--- /dev/null
+++ b/deps/node/deps/node-inspect/.eslintrc
@@ -0,0 +1,147 @@
+root: true
+
+env:
+ node: true
+ es6: true
+
+parserOptions:
+ ecmaVersion: 2017
+
+rules:
+ # Possible Errors
+ # http://eslint.org/docs/rules/#possible-errors
+ comma-dangle: [2, only-multiline]
+ no-control-regex: 2
+ no-debugger: 2
+ no-dupe-args: 2
+ no-dupe-keys: 2
+ no-duplicate-case: 2
+ no-empty-character-class: 2
+ no-ex-assign: 2
+ no-extra-boolean-cast: 2
+ no-extra-parens: [2, functions]
+ no-extra-semi: 2
+ no-func-assign: 2
+ no-invalid-regexp: 2
+ no-irregular-whitespace: 2
+ no-obj-calls: 2
+ no-proto: 2
+ no-template-curly-in-string: 2
+ no-unexpected-multiline: 2
+ no-unreachable: 2
+ no-unsafe-negation: 2
+ use-isnan: 2
+ valid-typeof: 2
+
+ # Best Practices
+ # http://eslint.org/docs/rules/#best-practices
+ dot-location: [2, property]
+ no-fallthrough: 2
+ no-global-assign: 2
+ no-multi-spaces: 2
+ no-octal: 2
+ no-redeclare: 2
+ no-self-assign: 2
+ no-unused-labels: 2
+ no-useless-call: 2
+ no-useless-escape: 2
+ no-void: 2
+ no-with: 2
+
+ # Strict Mode
+ # http://eslint.org/docs/rules/#strict-mode
+ strict: [2, global]
+
+ # Variables
+ # http://eslint.org/docs/rules/#variables
+ no-delete-var: 2
+ no-undef: 2
+ no-unused-vars: [2, {args: none}]
+
+ # Node.js and CommonJS
+ # http://eslint.org/docs/rules/#nodejs-and-commonjs
+ no-mixed-requires: 2
+ no-new-require: 2
+ no-path-concat: 2
+ no-restricted-modules: [2, sys, _linklist]
+ no-restricted-properties: [2, {
+ object: assert,
+ property: deepEqual,
+ message: Please use assert.deepStrictEqual().
+ }, {
+ property: __defineGetter__,
+ message: __defineGetter__ is deprecated.
+ }, {
+ property: __defineSetter__,
+ message: __defineSetter__ is deprecated.
+ }]
+
+ # Stylistic Issues
+ # http://eslint.org/docs/rules/#stylistic-issues
+ brace-style: [2, 1tbs, {allowSingleLine: true}]
+ comma-spacing: 2
+ comma-style: 2
+ computed-property-spacing: 2
+ eol-last: 2
+ func-call-spacing: 2
+ func-name-matching: 2
+ indent: [2, 2, {SwitchCase: 1, MemberExpression: 1}]
+ key-spacing: [2, {mode: minimum}]
+ keyword-spacing: 2
+ linebreak-style: [2, unix]
+ max-len: [2, 80, 2]
+ new-parens: 2
+ no-mixed-spaces-and-tabs: 2
+ no-multiple-empty-lines: [2, {max: 2, maxEOF: 0, maxBOF: 0}]
+ no-tabs: 2
+ no-trailing-spaces: 2
+ quotes: [2, single, avoid-escape]
+ semi: 2
+ semi-spacing: 2
+ space-before-blocks: [2, always]
+ space-before-function-paren: [2, never]
+ space-in-parens: [2, never]
+ space-infix-ops: 2
+ space-unary-ops: 2
+
+ # ECMAScript 6
+ # http://eslint.org/docs/rules/#ecmascript-6
+ arrow-parens: [2, always]
+ arrow-spacing: [2, {before: true, after: true}]
+ constructor-super: 2
+ no-class-assign: 2
+ no-confusing-arrow: 2
+ no-const-assign: 2
+ no-dupe-class-members: 2
+ no-new-symbol: 2
+ no-this-before-super: 2
+ prefer-const: [2, {ignoreReadBeforeAssign: true}]
+ rest-spread-spacing: 2
+ template-curly-spacing: 2
+
+ # Custom rules in tools/eslint-rules
+ align-function-arguments: 2
+ align-multiline-assignment: 2
+ assert-fail-single-argument: 2
+ new-with-error: [2, Error, RangeError, TypeError, SyntaxError, ReferenceError]
+
+# Global scoped method and vars
+globals:
+ COUNTER_HTTP_CLIENT_REQUEST: false
+ COUNTER_HTTP_CLIENT_RESPONSE: false
+ COUNTER_HTTP_SERVER_REQUEST: false
+ COUNTER_HTTP_SERVER_RESPONSE: false
+ COUNTER_NET_SERVER_CONNECTION: false
+ COUNTER_NET_SERVER_CONNECTION_CLOSE: false
+ DTRACE_HTTP_CLIENT_REQUEST: false
+ DTRACE_HTTP_CLIENT_RESPONSE: false
+ DTRACE_HTTP_SERVER_REQUEST: false
+ DTRACE_HTTP_SERVER_RESPONSE: false
+ DTRACE_NET_SERVER_CONNECTION: false
+ DTRACE_NET_STREAM_END: false
+ LTTNG_HTTP_CLIENT_REQUEST: false
+ LTTNG_HTTP_CLIENT_RESPONSE: false
+ LTTNG_HTTP_SERVER_REQUEST: false
+ LTTNG_HTTP_SERVER_RESPONSE: false
+ LTTNG_NET_SERVER_CONNECTION: false
+ LTTNG_NET_STREAM_END: false
diff --git a/deps/node/deps/node-inspect/.gitignore b/deps/node/deps/node-inspect/.gitignore
new file mode 100644
index 00000000..72e2c8c1
--- /dev/null
+++ b/deps/node/deps/node-inspect/.gitignore
@@ -0,0 +1,4 @@
+node_modules/
+npm-debug.log
+/tmp
+/.vs
diff --git a/deps/node/deps/node-inspect/.npmrc b/deps/node/deps/node-inspect/.npmrc
new file mode 100644
index 00000000..b7c8444f
--- /dev/null
+++ b/deps/node/deps/node-inspect/.npmrc
@@ -0,0 +1,2 @@
+registry=https://registry.npmjs.org
+package-lock=false
diff --git a/deps/node/deps/node-inspect/.travis.yml b/deps/node/deps/node-inspect/.travis.yml
new file mode 100644
index 00000000..07418a91
--- /dev/null
+++ b/deps/node/deps/node-inspect/.travis.yml
@@ -0,0 +1,13 @@
+language: node_js
+node_js:
+ - '6.8'
+before_deploy:
+ - git config --global user.email "jan.krems@gmail.com"
+ - git config --global user.name "Jan Krems"
+deploy:
+ provider: script
+ script: ./node_modules/.bin/nlm release
+ skip_cleanup: true
+ 'on':
+ branch: master
+ node: '6.8'
diff --git a/deps/node/deps/node-inspect/CHANGELOG.md b/deps/node/deps/node-inspect/CHANGELOG.md
new file mode 100644
index 00000000..44ae510e
--- /dev/null
+++ b/deps/node/deps/node-inspect/CHANGELOG.md
@@ -0,0 +1,288 @@
+### 1.11.5
+
+* Fix eslint issues - **[@jkrems](https://github.com/jkrems)** [#63](https://github.com/nodejs/node-inspect/pull/63)
+ - [`2adadbc`](https://github.com/nodejs/node-inspect/commit/2adadbc1086d2e374c425acbf96260a122705db2) **style:** Fix eslint issues
+ - [`a6d2f88`](https://github.com/nodejs/node-inspect/commit/a6d2f882c026409696a1b063ff40ceba7e1ddb86) **doc:** Remove redundant newline at the end
+
+
+### 1.11.4
+
+* Handle blocked port - **[@jkrems](https://github.com/jkrems)** [#62](https://github.com/nodejs/node-inspect/pull/62)
+ - [`3388969`](https://github.com/nodejs/node-inspect/commit/3388969d0032a78ff0cdb8146f170b978ec13b7b) **chore:** Disable package-lock
+ - [`d278b23`](https://github.com/nodejs/node-inspect/commit/d278b233ae5e11a2b62d01ccbaae594f39b32a96) **fix:** Stop asking to report a blocked port - see: [#60](https://github.com/nodejs/node-inspect/issues/60)
+
+
+### 1.11.3
+
+* [`93caa0f`](https://github.com/nodejs/node-inspect/commit/93caa0f5267c7ab452b258d3b03329a0bb5ac7f7) **docs:** Add missing oc in protocol
+* [`2d87cbe`](https://github.com/nodejs/node-inspect/commit/2d87cbe76aa968dfc1ac69d9571af1be81abd8e0) **fix:** Make --inspect-port=0 work
+* [`ebfd02e`](https://github.com/nodejs/node-inspect/commit/ebfd02ece9b642586023f7791da71defeb13d746) **chore:** Bump tap to 10.7
+* [`c07adb1`](https://github.com/nodejs/node-inspect/commit/c07adb17b164c1cf3da8d38659ea9f5d7ff42e9c) **test:** Use useful break location
+* [`94f0bf9`](https://github.com/nodejs/node-inspect/commit/94f0bf97d24c376baf3ecced2088d81715a73464) **fix:** Fix `takeHeapSnapshot()` truncation bug
+
+
+### 1.11.2
+
+* [`42e0cd1`](https://github.com/nodejs/node-inspect/commit/42e0cd111d89ed09faba1c0ec45089b0b44de011) **fix:** look for generic hint text
+
+
+### 1.11.1
+
+* Prefer --inspect-brk over --debug-brk - **[@ofrobots](https://github.com/ofrobots)** [#43](https://github.com/nodejs/node-inspect/pull/43)
+ - [`2c1ed27`](https://github.com/nodejs/node-inspect/commit/2c1ed27ee44d9aebb3c5ac50039abae8166a54e3) **fix:** use --inspect-brk with Node 8+
+
+
+### 1.11.0
+
+* doc: add profile and heap to help - **[@joshgav](https://github.com/joshgav)** [#39](https://github.com/nodejs/node-inspect/pull/39)
+ - [`f64c920`](https://github.com/nodejs/node-inspect/commit/f64c9205bd8382289660aa677d3ac192a9c81fd5) **doc:** add profile and heap to help
+* Update test suite to pass on latest nightly - **[@jkrems](https://github.com/jkrems)** [#36](https://github.com/nodejs/node-inspect/pull/36)
+ - [`41148d7`](https://github.com/nodejs/node-inspect/commit/41148d74a2d563eea3b7ad5463622b6b9fd4c46e) **test:** Remove outdated test
+ - [`2c224c5`](https://github.com/nodejs/node-inspect/commit/2c224c551619e386e80fc3154cc14562cac063b9) **test:** Accept any kind of "break"
+ - [`22bf349`](https://github.com/nodejs/node-inspect/commit/22bf349bc86d7bf6fd449791c9d1e7eaf66c2681) **test:** Adjust for v8 5.7
+ - [`6ce8c16`](https://github.com/nodejs/node-inspect/commit/6ce8c165c45a491bea8cfb3c67d2ae80e7c34dcb) **test:** Revert to old assertions
+* Verify custom port support - **[@jkrems](https://github.com/jkrems)** [#41](https://github.com/nodejs/node-inspect/pull/41)
+ - [`e3a489f`](https://github.com/nodejs/node-inspect/commit/e3a489f23b089d3d57a25d5efe40daf06de63e23) **test:** custom port
+* Support for debugging a pid - **[@jkrems](https://github.com/jkrems)** [#37](https://github.com/nodejs/node-inspect/pull/37)
+ - [`4179506`](https://github.com/nodejs/node-inspect/commit/4179506a4d546bac2c93b2a7ff491b1fa4494fd9) **feat:** Support for debugging a pid
+
+
+### 1.10.6
+
+* chore: Fix usage text for embedded mode - **[@addaleax](https://github.com/addaleax)** [#20](https://github.com/nodejs/node-inspect/pull/20)
+ - [`b0779f5`](https://github.com/nodejs/node-inspect/commit/b0779f597104e9ada5681f64d7e714525b753511) **chore:** Fix usage text for embedded mode
+* print 'ok' after connection - **[@ofrobots](https://github.com/ofrobots)** [#25](https://github.com/nodejs/node-inspect/pull/25)
+ - [`2a47125`](https://github.com/nodejs/node-inspect/commit/2a4712577f6996fbb078dcfcd7320c397685d76a) **fix:** print 'ok' after connection
+* Make autocompletion in REPL work - **[@aqrln](https://github.com/aqrln)** [#28](https://github.com/nodejs/node-inspect/pull/28)
+ - [`ccab737`](https://github.com/nodejs/node-inspect/commit/ccab737399249a8c2230ed6adfec579c7d724364) **fix:** Make autocompletion in REPL work
+* Remove console.error() statement - **[@aqrln](https://github.com/aqrln)** [#30](https://github.com/nodejs/node-inspect/pull/30)
+ - [`032b045`](https://github.com/nodejs/node-inspect/commit/032b045d4d73622c77b7ebcc26781c6ad98200b3) **style:** Remove console.error() statement
+* Take --debug-port into account - **[@jkrems](https://github.com/jkrems)** [#26](https://github.com/nodejs/node-inspect/pull/26)
+ - [`054d4b1`](https://github.com/nodejs/node-inspect/commit/054d4b10e65f12a3a4b10b4c0ab2a4768cc5e893) **fix:** Take --debug-port into account
+* Delay run until breakpoints are restored - **[@jkrems](https://github.com/jkrems)** [#34](https://github.com/nodejs/node-inspect/pull/34)
+ - [`802b88c`](https://github.com/nodejs/node-inspect/commit/802b88c8ad0a57608cb9e0cb4bf46ed683bb6344) **fix:** Delay run until breakpoints are restored
+ - [`2b93173`](https://github.com/nodejs/node-inspect/commit/2b93173d95e7f8b30d85603613cb2ae3b3ec18db) **fix:** Use single string for paused notice
+ - [`b4d5ee2`](https://github.com/nodejs/node-inspect/commit/b4d5ee2a3d25613b35a2e8e10a0eb75582cc5654) **fix:** Work around inconsistent handling of strict directive
+ - [`f6ccfc7`](https://github.com/nodejs/node-inspect/commit/f6ccfc7f4d00ad4fdf3b581b677f8d7f1699c44c) **fix:** Only restart after port is free
+ - [`8b101bf`](https://github.com/nodejs/node-inspect/commit/8b101bf669ca102df4980bfad3e0436ef1c2f1a4) **test:** Skip exact match on AIX
+* [`a4e4b6f`](https://github.com/nodejs/node-inspect/commit/a4e4b6feeba4dedfd2c89ef32f39e813314d3bbd) **chore:** Fix repo info in package.json
+
+
+### 1.10.5
+
+* docs: minor edits to governance docs - **[@joshgav](https://github.com/joshgav)** [#17](https://github.com/buggerjs/node-inspect/pull/17)
+ - [`a70fe04`](https://github.com/buggerjs/node-inspect/commit/a70fe04bdde9b7c74588685066291f9b11183328) **docs:** minor edits to governance docs
+
+
+### 1.10.4
+
+* [`1c31bf7`](https://github.com/buggerjs/node-inspect/commit/1c31bf7d1b3ea1b424ae0662526596670cb506c9) **chore:** Support embedded mode
+
+
+### 1.10.3
+
+* [`7b20379`](https://github.com/buggerjs/node-inspect/commit/7b20379069af692a9038a31a4465f72db9eb532f) **chore:** Mark .eslintrc as root
+
+
+### 1.10.2
+
+* Run tests on windows - **[@jkrems](https://github.com/jkrems)** [#16](https://github.com/buggerjs/node-inspect/pull/16)
+ - [`5a57f98`](https://github.com/buggerjs/node-inspect/commit/5a57f9865e02eef0763c2a7f26236c34a632ccdd) **chore:** Run tests on windows
+ - [`0a04b50`](https://github.com/buggerjs/node-inspect/commit/0a04b50cc8b4dc6ce868927c635c479d75ce71f4) **chore:** Bump nlm to get rid of postinstall
+ - [`4a8b27c`](https://github.com/buggerjs/node-inspect/commit/4a8b27cea814a37895effd2a0c1b85dbfee3a7f4) **test:** Remove unix path assumptions
+
+
+### 1.10.1
+
+* [`4ba3c72`](https://github.com/buggerjs/node-inspect/commit/4ba3c72270fae9a71343ddca11aa27980678a67c) **refactor:** Undo weird bundling into one file
+
+
+### 1.10.0
+
+* [`3e1a66a`](https://github.com/buggerjs/node-inspect/commit/3e1a66a489bef19beaa5f859e99e027274ff43cb) **feat:** Support CPU & heap profiles
+
+
+### 1.9.3
+
+* Move back to single file - **[@jkrems](https://github.com/jkrems)** [#15](https://github.com/buggerjs/node-inspect/pull/15)
+ - [`9877660`](https://github.com/buggerjs/node-inspect/commit/9877660a73ff0ec0885ad7f939ba62020a46b4b6) **refactor:** Wrap client in IIFE
+ - [`7795c53`](https://github.com/buggerjs/node-inspect/commit/7795c533f0605eb128db610a5874b27e555251ef) **refactor:** Move more code in createRepl scope
+ - [`be34a39`](https://github.com/buggerjs/node-inspect/commit/be34a398e823612bdf5ac90bad5222af27035a00) **refactor:** Move back to single file
+ - [`ab45b62`](https://github.com/buggerjs/node-inspect/commit/ab45b6273dc0d3a49d3cf46a80cb48ab79d1caf8) **refactor:** Remove single-use functions
+ - [`37a711e`](https://github.com/buggerjs/node-inspect/commit/37a711ed5334c06ed4d85f995e567a9f176a68d5) **style:** Stop using `new Buffer`
+ - [`d669dc5`](https://github.com/buggerjs/node-inspect/commit/d669dc593f5ad5ca7a48f19f0905ef66ec0e540d) **chore:** Switch to node eslint rules
+ - [`15e7917`](https://github.com/buggerjs/node-inspect/commit/15e79177918d96dcffd2384715faf0308e97a26c) **style:** Use var in classical for loops
+
+
+### 1.9.2
+
+* [`c9dc4be`](https://github.com/buggerjs/node-inspect/commit/c9dc4beb08236e33d64f19417682cf5b3f5aeed6) **doc:** Link directly to GOVERNANCE file
+
+
+### 1.9.1
+
+* Handle big ws frames correctly - **[@jkrems](https://github.com/jkrems)** [#14](https://github.com/buggerjs/node-inspect/pull/14)
+ - [`f80100e`](https://github.com/buggerjs/node-inspect/commit/f80100e932710d232d074b239cbf8fefa564c789) **fix:** Handle big ws frames correctly - see: [#10](https://github.com/buggerjs/node-inspect/issues/10)
+
+
+### 1.9.0
+
+* Support for low-level agent access - **[@jkrems](https://github.com/jkrems)** [#13](https://github.com/buggerjs/node-inspect/pull/13)
+ - [`90ed431`](https://github.com/buggerjs/node-inspect/commit/90ed4310c62d130637c12f8ecdb752075c43ac36) **feat:** Support for low-level agent access
+
+
+### 1.8.4
+
+* Use proper path for websocket - **[@jkrems](https://github.com/jkrems)** [#12](https://github.com/buggerjs/node-inspect/pull/12)
+ - [`3405225`](https://github.com/buggerjs/node-inspect/commit/3405225979dfc2058bcc6d1b90f41c060dbd1f92) **fix:** Use proper path for websocket - see: [#11](https://github.com/buggerjs/node-inspect/issues/11)
+
+
+### 1.8.3
+
+* [`6f9883d`](https://github.com/buggerjs/node-inspect/commit/6f9883d4b29419831133988981b83e891b19739a) **fix:** Breakpoints & scripts work when not paused
+* [`ecb1362`](https://github.com/buggerjs/node-inspect/commit/ecb1362c842e6ed5bc28c091a32bfd540742db75) **chore:** Pin node to 6.8
+
+
+### 1.8.2
+
+* [`4219a98`](https://github.com/buggerjs/node-inspect/commit/4219a98d6514f1068feabce2945c21a0d5ba6561) **refactor:** Decouple source snippet from repl
+
+
+### 1.8.1
+
+* [`95402ee`](https://github.com/buggerjs/node-inspect/commit/95402ee5dff04057f074677d39db2f61ec74c151) **refactor:** Move `list` into CallFrame
+
+
+### 1.8.0
+
+* [`d0e6499`](https://github.com/buggerjs/node-inspect/commit/d0e6499084f5d656ef0c5fd470d3ab21f2e9a6b4) **feat:** `exec .scope`
+
+
+### 1.7.0
+
+* `breakOn{Exception,Uncaught,None}` - **[@jkrems](https://github.com/jkrems)** [#8](https://github.com/buggerjs/node-inspect/pull/8)
+ - [`fa8c4c7`](https://github.com/buggerjs/node-inspect/commit/fa8c4c7d7bb6972733c92da4d04fdd62c02b0e3b) **feat:** `breakOn{Exception,Uncaught,None}` - see: [#6](https://github.com/buggerjs/node-inspect/issues/6)
+
+
+### 1.6.0
+
+* Add `help` command - **[@jkrems](https://github.com/jkrems)** [#7](https://github.com/buggerjs/node-inspect/pull/7)
+ - [`09b37a0`](https://github.com/buggerjs/node-inspect/commit/09b37a02e04e16a38ce27f69538d3b098548b47c) **feat:** Add `help` command - see: [#5](https://github.com/buggerjs/node-inspect/issues/5)
+
+
+### 1.5.0
+
+* [`7e0fd99`](https://github.com/buggerjs/node-inspect/commit/7e0fd99fcfc65d8b647a2259df78f4cabf1d3d63) **feat:** Add `r` shortcut for `run`
+
+
+### 1.4.1
+
+* [`484d098`](https://github.com/buggerjs/node-inspect/commit/484d0983f06d6ff9639ab5197ba0a58313f532df) **chore:** Remove old implementation
+
+
+### 1.4.0
+
+* Properly tested implementation - **[@jkrems](https://github.com/jkrems)** [#4](https://github.com/buggerjs/node-inspect/pull/4)
+ - [`ba060d3`](https://github.com/buggerjs/node-inspect/commit/ba060d3ef65ae84df2a3a9b9f16d563f3c4b29be) **feat:** Error handling w/o args
+ - [`b39b3bc`](https://github.com/buggerjs/node-inspect/commit/b39b3bc07c13adc48fc8bb720889285c51e62548) **feat:** Launch child
+ - [`481693f`](https://github.com/buggerjs/node-inspect/commit/481693f676ee099b7787cd2426b980858e973602) **feat:** Connect debug client
+ - [`3bba0f2`](https://github.com/buggerjs/node-inspect/commit/3bba0f2416b2e3b4e6010de675003fcc328b16e8) **chore:** Disable lint for inactive code
+ - [`cc7bdfc`](https://github.com/buggerjs/node-inspect/commit/cc7bdfcf7f21ef5cd5c32c7800407238b0d4f100) **feat:** Properly fail with invalid host:port
+ - [`73f34f9`](https://github.com/buggerjs/node-inspect/commit/73f34f902634e9778597e129f46895aa8b643d72) **refactor:** Remove unused field
+ - [`6a23e0c`](https://github.com/buggerjs/node-inspect/commit/6a23e0cf3179f43ca6fc5a0fa2b1dd18ebc044b5) **refactor:** Better debug output & support node 6.6
+ - [`63b0f9b`](https://github.com/buggerjs/node-inspect/commit/63b0f9b6ef8bd9af0f7cb14a5938a45838731fc9) **test:** Add timeout to waitFor(pattern)
+ - [`cfa197b`](https://github.com/buggerjs/node-inspect/commit/cfa197bf8325a1a4ca1b296f8d6971d368bfbfbb) **refactor:** Move REPL setup into own file
+ - [`3f46c2c`](https://github.com/buggerjs/node-inspect/commit/3f46c2c43f836e1135b66871087aa74969f6b330) **feat:** Working repl eval
+ - [`6911eb1`](https://github.com/buggerjs/node-inspect/commit/6911eb1a00b964bc5683506d433fa4f665f5a82c) **feat:** Enter repeats last command
+ - [`7d20b7d`](https://github.com/buggerjs/node-inspect/commit/7d20b7deadf1b251ea8cf2cc9167c175624932c4) **chore:** Add missing license header
+ - [`23c62f8`](https://github.com/buggerjs/node-inspect/commit/23c62f8375ca7c8b71d032047e728dace02f4efa) **feat:** Print break context
+ - [`5dbc83d`](https://github.com/buggerjs/node-inspect/commit/5dbc83df31171f9c38a974c99340bde26f2e24ec) **feat:** Stepping and breakpoints
+ - [`8deb8cc`](https://github.com/buggerjs/node-inspect/commit/8deb8cc36b9fca432ab8df63a82e9de7ab5adaf0) **feat:** list for printing source
+ - [`1ed2ec9`](https://github.com/buggerjs/node-inspect/commit/1ed2ec9937070652be611dbb6b11dfb42cb840f8) **chore:** Disable verbose output on CI
+ - [`625a435`](https://github.com/buggerjs/node-inspect/commit/625a435925dd8fd980bed2dc9e3fd73dd27df4ef) **fix:** Gracefully handle delayed scriptParsed
+ - [`8823c60`](https://github.com/buggerjs/node-inspect/commit/8823c60d347600b2313cfdd8cb5e96fe02419a8a) **chore:** Run all the tests
+ - [`00506f7`](https://github.com/buggerjs/node-inspect/commit/00506f763928cc440505a81030167a11b9a84e00) **feat:** backtrace/bt
+ - [`e1ee02d`](https://github.com/buggerjs/node-inspect/commit/e1ee02d5cc389916489d387d07d5dd161230427a) **refactor:** Leverage util.inspect.custom
+ - [`5dcc319`](https://github.com/buggerjs/node-inspect/commit/5dcc31922d40f56c7435319d1538390a442e8e4b) **feat:** scripts and scripts(true)
+ - [`085cd5a`](https://github.com/buggerjs/node-inspect/commit/085cd5a76a961edfcaa342fff5eb09bf2f9c8983) **refactor:** Consistent import style
+ - [`1c60f91`](https://github.com/buggerjs/node-inspect/commit/1c60f91f233848c05d865617dc7f5aacb36270b6) **feat:** Set breakpoint before file is loaded
+ - [`bc82ecc`](https://github.com/buggerjs/node-inspect/commit/bc82eccb2a1a7c0f5332371254f6584e748216aa) **feat:** breakpoints to list breakpoints
+ - [`7f48c95`](https://github.com/buggerjs/node-inspect/commit/7f48c9510696ec400d51afaca8d23a9c292640f8) **feat:** watchers & exec
+ - [`0f8cd13`](https://github.com/buggerjs/node-inspect/commit/0f8cd13a092e5dbeb395ff04cbe2ed97cb986423) **feat:** clearBreakpoint
+ - [`0d31560`](https://github.com/buggerjs/node-inspect/commit/0d315603bdcb9f4da42fab24dc569c325151269e) **feat:** version to print v8 version
+ - [`df6b89d`](https://github.com/buggerjs/node-inspect/commit/df6b89df580a9afcb3b8883b0e4224cbcebb384f) **feat:** Paused & global exec
+ - [`9e97d73`](https://github.com/buggerjs/node-inspect/commit/9e97d73073ceffd70974d45887c84fadb9159d5c) **feat:** repl to enter exec mode
+ - [`9ee9f90`](https://github.com/buggerjs/node-inspect/commit/9ee9f903d6202f54ed2b3b3559da4006b65d39b5) **feat:** run & restart
+* [`3a752aa`](https://github.com/buggerjs/node-inspect/commit/3a752aaa773968bfe16c5f543bd739feed598bea) **feat:** kill
+* [`a67e470`](https://github.com/buggerjs/node-inspect/commit/a67e47018b20d46aeeaa7abd27eb8e7770fd0b8f) **feat:** Restore breakpoints on restart
+
+
+### 1.3.3
+
+* [`eb7a54c`](https://github.com/buggerjs/node-inspect/commit/eb7a54c6fa731ed3276072c72034046fc5ffbac6) **chore:** Switch to tap for tests
+
+
+### 1.3.2
+
+* Add notes about governance - **[@jkrems](https://github.com/jkrems)** [#3](https://github.com/buggerjs/node-inspect/pull/3)
+ - [`e94089d`](https://github.com/buggerjs/node-inspect/commit/e94089d93689cacf5c953e94563463d1e174452d) **chore:** Add notes about governance
+
+
+### 1.3.1
+
+* [`8767137`](https://github.com/buggerjs/node-inspect/commit/8767137c53a2f6b1d36970074ea95be9871e50e3) **style:** Remove rogue console.log
+
+
+### 1.3.0
+
+* [`3ac6232`](https://github.com/buggerjs/node-inspect/commit/3ac623219ba44b0af40ef66826610a26a46c7966) **feat:** Add `version` command
+
+
+### 1.2.0
+
+* [`86b5812`](https://github.com/buggerjs/node-inspect/commit/86b581218ccab44e6bde259a17ad1e71645a6137) **feat:** scripts & listScripts(true)
+
+
+### 1.1.1
+
+* [`feaea38`](https://github.com/buggerjs/node-inspect/commit/feaea385a981e6b72a8d99277fbf575c54e15fc6) **style:** Typo in comment
+
+
+### 1.1.0
+
+* [`c64155f`](https://github.com/buggerjs/node-inspect/commit/c64155faa552f71463842a26330aa5bcbfc31670) **feat:** repl command
+
+
+### 1.0.0
+
+* [`44c4c79`](https://github.com/buggerjs/node-inspect/commit/44c4c79af5a228ccfd8906f11409b2a33390b878) **chore:** Initial commit
+* [`985873c`](https://github.com/buggerjs/node-inspect/commit/985873cfb97146b38480080f9907219c473f1f6f) **feat:** Launching the example works
+* [`3d92d05`](https://github.com/buggerjs/node-inspect/commit/3d92d05cca152a2c2647aa64eefc80432638bc4d) **chore:** Proper license and passing tests
+* [`b3f99d9`](https://github.com/buggerjs/node-inspect/commit/b3f99d981038b17663fcfd984d2f5d6d9b51ee18) **feat:** Futile attempts to send a valid ws frame
+* [`465cfb7`](https://github.com/buggerjs/node-inspect/commit/465cfb7b295aebb48b285c26f6de9c4657fe590d) **feat:** Working ws connection
+* [`da9f011`](https://github.com/buggerjs/node-inspect/commit/da9f01118e2b144f2da8cd370113a608526774a1) **fix:** Fix remote connect
+* [`5ef33d7`](https://github.com/buggerjs/node-inspect/commit/5ef33d7892cc49becb4c66098fc7927bc74b014a) **feat:** Working step-by-step
+* [`534e1e4`](https://github.com/buggerjs/node-inspect/commit/534e1e46b307d61d51eb4c0aab4a3b17c17aea3d) **chore:** Add bin entry
+* [`8cff9cf`](https://github.com/buggerjs/node-inspect/commit/8cff9cfb0138b5ecff0f5f6a7839dbfddc0684fd) **style:** Use simpler key thingy
+* [`720ec53`](https://github.com/buggerjs/node-inspect/commit/720ec53a5b251ab3caf27f06b60924efb9e03a92) **doc:** Add instructions
+* [`b89ad60`](https://github.com/buggerjs/node-inspect/commit/b89ad601b885a417e6433b1609477d8453f498a1) **doc:** More helpful docs
+* [`de9243c`](https://github.com/buggerjs/node-inspect/commit/de9243c95eabe733d05952229340808c3cebf129) **feat:** Watchers
+* [`e16978f`](https://github.com/buggerjs/node-inspect/commit/e16978ff8e4b2b2bdccf88fd7d3905f525822981) **docs:** Working usage hints
+* [`2dbc204`](https://github.com/buggerjs/node-inspect/commit/2dbc2042145fd97169fc7536186a449715e27810) **refactor:** Use proxies
+* [`b8c9b14`](https://github.com/buggerjs/node-inspect/commit/b8c9b147713f63181396d5a7fe4c2f737b733b4c) **style:** Remove unused var
+* [`f6b4b20`](https://github.com/buggerjs/node-inspect/commit/f6b4b20a1d28d91cfe452b995f7dbe5f7c749e89) **feat:** Nicer inspect of remote values
+* [`36887c6`](https://github.com/buggerjs/node-inspect/commit/36887c66bbf26d540f087f80ddfec38462a33bdf) **fix:** Properly print watchers
+* [`7729442`](https://github.com/buggerjs/node-inspect/commit/77294426157a28cc76e339cb13916a205182641e) **feat:** Add pause command
+* [`e39a713`](https://github.com/buggerjs/node-inspect/commit/e39a7134873f06da37baaa9b6252cede4ad38d7a) **fix:** Properly format boolean properties
+* [`f8f51d7`](https://github.com/buggerjs/node-inspect/commit/f8f51d7a01e8d74023306a08a3d6e2da63d123e1) **fix:** Properly format numeric properties
+* [`89e6e08`](https://github.com/buggerjs/node-inspect/commit/89e6e087220f3c3cb628ac7541c44298485a2e04) **feat:** Add backtrace command
+* [`82362ac`](https://github.com/buggerjs/node-inspect/commit/82362acfc7ce22b4cccc64889ec136dedc8895ec) **feat:** Add setBreakpoint()
+* [`7064cce`](https://github.com/buggerjs/node-inspect/commit/7064ccec3b103683088d532abfe5b4e7c066948b) **feat:** Add `setBreakpoint(line)`
+* [`360580e`](https://github.com/buggerjs/node-inspect/commit/360580eba4353e81311e56df018eec0ca233da11) **feat:** Add run/kill/restart
+* [`b1b576e`](https://github.com/buggerjs/node-inspect/commit/b1b576e2645723a8575df544e0bfb672d60d9d91) **feat:** Add `help` command
+* [`2db4660`](https://github.com/buggerjs/node-inspect/commit/2db46609cd1c8543d31ebd5dc47e4c27ec254841) **feat:** Add remaining sb() variants
+* [`f2ad1ae`](https://github.com/buggerjs/node-inspect/commit/f2ad1aeedafb154043d70bb9195b10986d311d26) **fix:** Display breakpoints set into the future
+* [`73272f9`](https://github.com/buggerjs/node-inspect/commit/73272f9ace1f8546f8cad1d53627dbffba50bb4e) **refactor:** Make breakpoints more inspect friendly
+* [`507a71d`](https://github.com/buggerjs/node-inspect/commit/507a71de345a3de7fe144517e9f5ea264ff993e3) **feat:** Add breakpoints command
+* [`5fb3e5d`](https://github.com/buggerjs/node-inspect/commit/5fb3e5d17bbcfd45b264431547b3cf0b781c7640) **docs:** Link to Command Line API docs
+* [`81af501`](https://github.com/buggerjs/node-inspect/commit/81af501bbf85397e2078310c7f24a9ac5b7f02dc) **chore:** Fix license field
diff --git a/deps/node/deps/node-inspect/CONTRIBUTING.md b/deps/node/deps/node-inspect/CONTRIBUTING.md
new file mode 100644
index 00000000..012d2947
--- /dev/null
+++ b/deps/node/deps/node-inspect/CONTRIBUTING.md
@@ -0,0 +1,181 @@
+# Contributing
+
+🎉🏅 Thanks for helping us improve this project! 🙏
+
+This document outlines some of the practices we care about.
+If you have any questions or suggestions about the process,
+feel free to [open an issue](#reporting-issues).
+
+## Code of Conduct
+
+The [Node.js Code of Conduct][] applies to this repo.
+
+[Node.js Code of Conduct]: https://github.com/nodejs/node/blob/master/CODE_OF_CONDUCT.md
+
+## Governance
+
+This project falls under the governance of the Node.js Diagnostics WG as
+described at <https://github.com/nodejs/diagnostics/blob/master/GOVERNANCE.md>.
+
+## Developer's Certificate of Origin 1.1
+
+By making a contribution to this project, I certify that:
+
+* (a) The contribution was created in whole or in part by me and I
+ have the right to submit it under the open source license
+ indicated in the file; or
+
+* (b) The contribution is based upon previous work that, to the best
+ of my knowledge, is covered under an appropriate open source
+ license and I have the right under that license to submit that
+ work with modifications, whether created in whole or in part
+ by me, under the same open source license (unless I am
+ permitted to submit under a different license), as indicated
+ in the file; or
+
+* (c) The contribution was provided directly to me by some other
+ person who certified (a), (b) or (c) and I have not modified
+ it.
+
+* (d) I understand and agree that this project and the contribution
+ are public and that a record of the contribution (including all
+ personal information I submit with it, including my sign-off) is
+ maintained indefinitely and may be redistributed consistent with
+ this project or the open source license(s) involved.
+
+## How Can I Contribute?
+
+### Reporting Issues
+
+If you find any mistakes in the docs or a bug in the code,
+please [open an issue in Github](https://github.com/nodejs/node-inspect/issues/new) so we can look into it.
+You can also [create a PR](#contributing-code) fixing it yourself of course.
+
+If you report a bug, please follow these guidelines:
+
+* Make sure the bug exists in the latest version.
+* Include instructions on how to reproduce the issue.
+ The instructions should be as minimal as possible
+ and answer the three big questions:
+ 1. What are the exact steps you took? This includes the exact versions of node, npm, and any packages involved.
+ 1. What result are you expecting?
+ 1. What is the actual result?
+
+### Improving Documentation
+
+For small documentation changes, you can use [Github's editing feature](https://help.github.com/articles/editing-files-in-another-user-s-repository/).
+The only thing to keep in mind is to prefix the commit message with "docs: ".
+The default commit message generated by Github will lead to a failing CI build.
+
+For larger updates to the documentation
+it might be better to follow the [instructions for contributing code below](#contributing-code).
+
+### Contributing Code
+
+**Note:** If you're planning on making substantial changes,
+please [open an issue first to discuss your idea](#reporting-issues).
+Otherwise you might end up investing a lot of work
+only to discover that it conflicts with plans the maintainers might have.
+
+The general steps for creating a pull request are:
+
+1. Create a branch for your change.
+ Always start your branch from the latest `master`.
+ We often prefix the branch name with our initials, e.g. `jk-a-change`.
+1. Run `npm install` to install the dependencies.
+1. If you're fixing a bug, be sure to write a test *first*.
+ That way you can validate that the test actually catches the bug and doesn't pass.
+1. Make your changes to the code.
+ Remember to update the tests if you add new features or change behavior.
+1. Run the tests via `npm test`. This will also run style checks and other validations.
+ You might see errors about uncommitted files.
+ This is expected until you commit your changes.
+1. Once you're done, `git add .` and `git commit`.
+ Please follow the [commit message conventions](#commits--commit-messages) described below.
+1. Push your branch to Github & create a PR.
+
+#### Code Style
+
+In addition to any linting rules the project might include,
+a few general rules of thumb:
+
+* Try to match the style of the rest of the code.
+* We prefer simple code that is easy to understand over terse, expressive code.
+* We try to structure projects by semantics instead of role.
+ E.g. we'd rather have a `tree.js` module that contains tree traversal-related helpers
+ than a `helpers.js` module.
+* Actually, if you create helpers you might want to put those into a separate package.
+ That way it's easier to reuse them.
+
+#### Commits & Commit Messages
+
+Please follow the [angular commit message conventions](https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md#-git-commit-guidelines).
+We use an automated tool for generating releases
+that depends on the conventions to determine the next version and the content of the changelog.
+Commit messages that don't follow the conventions will cause `npm test` (and thus CI) to fail.
+
+The short summary - a commit message should look like this:
+
+```
+<type>: <subject>
+
+<body>
+
+<references>
+
+<footer>
+```
+
+Everything but the first line is optional.
+The empty lines between the different parts are required.
+
+* `<type>`: One of the following:
+ - **feat:** Introduces a new feature. This will cause the minor version to go up.
+ - **fix:** A bug fix. Causes a patch version bump.
+ - **docs:** Changes to the documentation.
+ This will also cause an increase of the patch version so that the changes show up in the npm registry.
+ - **style:** Cleanup & lint rule fixes.
+ Note that often it's better to just amend the previous commit if it introduced lint errors.
+ - **refactor:** Changes to the code structure without fixing bugs or adding features.
+ - **perf:** Performance optimizations.
+ - **test:** Fixing existing tests or adding missing ones.
+ Just like with **style**, if you add tests to a feature you just introduced in the previous commit,
+ consider keeping the tests and the feature in the same commit instead.
+ - **chore:** Changes to the project setup and tools, dependency bumps, house-keeping.
+* `<subject>`: A [good git commit message subject](http://chris.beams.io/posts/git-commit/#limit-50).
+ - Keep it brief. If possible the whole first line should have at most 50 characters.
+ - Use imperative mood. "Create" instead of "creates" or "created".
+ - No period (".") at the end.
+* `<body>`: Motivation for the change and any context required for understanding the choices made.
+ Just like the subject, it should use imperative mood.
+* `<references>`: Any URLs relevant to the PR go here.
+ Use one line per URL and prefix it with the kind of relationship, e.g. "Closes: " or "See: ".
+ If you are referencing an issue in your commit body or PR description,
+ never use `#123` but the full URL to the issue or PR you are referencing.
+ That way the reference is easy to resolve from the git history without having to "guess" the correct link
+ even if the commit got cherry-picked or merged into a different project.
+* `<footer>`: This part only applies if your commit introduces a breaking change.
+ It's important this is present, otherwise the major version will not increase.
+ See below for an example.
+
+##### Examples
+
+A feature that introduces a breaking change:
+
+```
+feat: Support --yes CLI option
+
+For existing projects all prompts can be inferred automatically.
+Manual confirmation for each default provides no value in that case.
+
+Closes https://github.com/my/project/issues/123
+
+BREAKING CHANGE: This removes support for interactive password entry.
+Users will have to login beforehand.
+```
+
+A simple bug fix:
+
+```
+fix: Handle multi-byte characters in search logic
+```
diff --git a/deps/node/deps/node-inspect/GOVERNANCE.md b/deps/node/deps/node-inspect/GOVERNANCE.md
new file mode 100644
index 00000000..20e333a2
--- /dev/null
+++ b/deps/node/deps/node-inspect/GOVERNANCE.md
@@ -0,0 +1,4 @@
+# node-inspect Project Governance
+
+The node-inspect project is governed by the Node.js Diagnostics WG as described
+at <https://github.com/nodejs/diagnostics/blob/master/GOVERNANCE.md>.
diff --git a/deps/node/deps/node-inspect/LICENSE b/deps/node/deps/node-inspect/LICENSE
new file mode 100644
index 00000000..d8d7f943
--- /dev/null
+++ b/deps/node/deps/node-inspect/LICENSE
@@ -0,0 +1,19 @@
+Copyright Node.js contributors. All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+IN THE SOFTWARE.
diff --git a/deps/node/deps/node-inspect/README.md b/deps/node/deps/node-inspect/README.md
new file mode 100644
index 00000000..b52cc188
--- /dev/null
+++ b/deps/node/deps/node-inspect/README.md
@@ -0,0 +1,29 @@
+# `node-inspect`
+
+```bash
+npm install --global node-inspect
+```
+
+For the old V8 debugger protocol,
+node has two options:
+
+1. `node --debug <file>`: Start `file` with remote debugging enabled.
+2. `node debug <file>`: Start an interactive CLI debugger for `<file>`.
+
+But for the Chrome inspector protocol,
+there's only one: `node --inspect <file>`.
+
+This project tries to provide the missing second option
+by re-implementing `node debug` against the new protocol.
+
+```
+Usage: node-inspect script.js
+ node-inspect <host>:<port>
+```
+
+#### References
+
+* [Debugger Documentation](https://nodejs.org/api/debugger.html)
+* [EPS: `node inspect` CLI debugger](https://github.com/nodejs/node-eps/pull/42)
+* [Debugger Protocol Viewer](https://chromedevtools.github.io/debugger-protocol-viewer/)
+* [Command Line API](https://developers.google.com/web/tools/chrome-devtools/debug/command-line/command-line-reference?hl=en)
diff --git a/deps/node/deps/node-inspect/appveyor.yml b/deps/node/deps/node-inspect/appveyor.yml
new file mode 100644
index 00000000..c25a2d01
--- /dev/null
+++ b/deps/node/deps/node-inspect/appveyor.yml
@@ -0,0 +1,13 @@
+environment:
+ nodejs_version: "6"
+
+install:
+- ps: Install-Product node $env:nodejs_version
+- npm install
+
+test_script:
+- node --version
+- npm --version
+- npm test
+
+build: off
diff --git a/deps/node/deps/node-inspect/cli.js b/deps/node/deps/node-inspect/cli.js
new file mode 100755
index 00000000..4856fd70
--- /dev/null
+++ b/deps/node/deps/node-inspect/cli.js
@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+require('./lib/cli.js');
diff --git a/deps/node/deps/node-inspect/examples/alive.js b/deps/node/deps/node-inspect/examples/alive.js
new file mode 100644
index 00000000..c8ad157b
--- /dev/null
+++ b/deps/node/deps/node-inspect/examples/alive.js
@@ -0,0 +1,5 @@
+let x = 0;
+function heartbeat() {
+ ++x;
+}
+setInterval(heartbeat, 50);
diff --git a/deps/node/deps/node-inspect/examples/backtrace.js b/deps/node/deps/node-inspect/examples/backtrace.js
new file mode 100644
index 00000000..f18b33ea
--- /dev/null
+++ b/deps/node/deps/node-inspect/examples/backtrace.js
@@ -0,0 +1,30 @@
+const { exports: moduleScoped } = module;
+
+function topFn(a, b = false) {
+ const l1 = a;
+ let t = typeof l1;
+ var v = t.length;
+ debugger;
+ return b || t || v || moduleScoped;
+}
+
+class Ctor {
+ constructor(options) {
+ this.options = options;
+ }
+
+ m() {
+ const mLocal = this.options;
+ topFn(this);
+ return mLocal;
+ }
+}
+
+(function () {
+ const theOptions = { x: 42 };
+ const arr = [theOptions];
+ arr.forEach(options => {
+ const obj = new Ctor(options);
+ return obj.m();
+ });
+}());
diff --git a/deps/node/deps/node-inspect/examples/break.js b/deps/node/deps/node-inspect/examples/break.js
new file mode 100644
index 00000000..d5f26578
--- /dev/null
+++ b/deps/node/deps/node-inspect/examples/break.js
@@ -0,0 +1,16 @@
+const x = 10;
+let name = 'World';
+name = 'Robin';
+function sayHello() {
+ if (x > 0) {
+ console.log(`Hello ${name}`);
+ }
+}
+sayHello();
+debugger;
+setTimeout(sayHello, 10);
+
+function otherFunction() {
+ console.log('x = %d', x);
+}
+setTimeout(otherFunction, 50);
diff --git a/deps/node/deps/node-inspect/examples/cjs/index.js b/deps/node/deps/node-inspect/examples/cjs/index.js
new file mode 100644
index 00000000..0ace6d9b
--- /dev/null
+++ b/deps/node/deps/node-inspect/examples/cjs/index.js
@@ -0,0 +1,5 @@
+const fourty = 40;
+const { add } = require('./other');
+
+const sum = add(fourty, 2);
+module.exports = sum;
diff --git a/deps/node/deps/node-inspect/examples/cjs/other.js b/deps/node/deps/node-inspect/examples/cjs/other.js
new file mode 100644
index 00000000..44a9a439
--- /dev/null
+++ b/deps/node/deps/node-inspect/examples/cjs/other.js
@@ -0,0 +1,3 @@
+exports.add = function add(a, b) {
+ return a + b;
+};
diff --git a/deps/node/deps/node-inspect/examples/empty.js b/deps/node/deps/node-inspect/examples/empty.js
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/deps/node/deps/node-inspect/examples/empty.js
diff --git a/deps/node/deps/node-inspect/examples/exceptions.js b/deps/node/deps/node-inspect/examples/exceptions.js
new file mode 100644
index 00000000..f57d48a4
--- /dev/null
+++ b/deps/node/deps/node-inspect/examples/exceptions.js
@@ -0,0 +1,10 @@
+let error = null;
+try {
+ throw new Error('Caught');
+} catch (e) {
+ error = e;
+}
+
+if (error) {
+ throw new Error('Uncaught');
+}
diff --git a/deps/node/deps/node-inspect/examples/three-lines.js b/deps/node/deps/node-inspect/examples/three-lines.js
new file mode 100644
index 00000000..c17c7c1d
--- /dev/null
+++ b/deps/node/deps/node-inspect/examples/three-lines.js
@@ -0,0 +1,3 @@
+let x = 1;
+x = x + 1;
+module.exports = x;
diff --git a/deps/node/deps/node-inspect/examples/use-strict.js b/deps/node/deps/node-inspect/examples/use-strict.js
new file mode 100644
index 00000000..9fe4b8f3
--- /dev/null
+++ b/deps/node/deps/node-inspect/examples/use-strict.js
@@ -0,0 +1,2 @@
+'use strict';
+console.log('first real line');
diff --git a/deps/node/deps/node-inspect/lib/_inspect.js b/deps/node/deps/node-inspect/lib/_inspect.js
new file mode 100644
index 00000000..305e4991
--- /dev/null
+++ b/deps/node/deps/node-inspect/lib/_inspect.js
@@ -0,0 +1,371 @@
+/*
+ * Copyright Node.js contributors. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+'use strict';
+const { spawn } = require('child_process');
+const { EventEmitter } = require('events');
+const net = require('net');
+const util = require('util');
+
+const runAsStandalone = typeof __dirname !== 'undefined';
+
+const [ InspectClient, createRepl ] =
+ runAsStandalone ?
+ // This copy of node-inspect is on-disk, relative paths make sense.
+ [
+ require('./internal/inspect_client'),
+ require('./internal/inspect_repl')
+ ] :
+ // This copy of node-inspect is built into the node executable.
+ [
+ require('node-inspect/lib/internal/inspect_client'),
+ require('node-inspect/lib/internal/inspect_repl')
+ ];
+
+const debuglog = util.debuglog('inspect');
+
+class StartupError extends Error {
+ constructor(message) {
+ super(message);
+ this.name = 'StartupError';
+ }
+}
+
+function portIsFree(host, port, timeout = 2000) {
+ if (port === 0) return Promise.resolve(); // Binding to a random port.
+
+ const retryDelay = 150;
+ let didTimeOut = false;
+
+ return new Promise((resolve, reject) => {
+ setTimeout(() => {
+ didTimeOut = true;
+ reject(new StartupError(
+ `Timeout (${timeout}) waiting for ${host}:${port} to be free`));
+ }, timeout);
+
+ function pingPort() {
+ if (didTimeOut) return;
+
+ const socket = net.connect(port, host);
+ let didRetry = false;
+ function retry() {
+ if (!didRetry && !didTimeOut) {
+ didRetry = true;
+ setTimeout(pingPort, retryDelay);
+ }
+ }
+
+ socket.on('error', (error) => {
+ if (error.code === 'ECONNREFUSED') {
+ resolve();
+ } else {
+ retry();
+ }
+ });
+ socket.on('connect', () => {
+ socket.destroy();
+ retry();
+ });
+ }
+ pingPort();
+ });
+}
+
+function runScript(script, scriptArgs, inspectHost, inspectPort, childPrint) {
+ return portIsFree(inspectHost, inspectPort)
+ .then(() => {
+ return new Promise((resolve) => {
+ const needDebugBrk = process.version.match(/^v(6|7)\./);
+ const args = (needDebugBrk ?
+ ['--inspect', `--debug-brk=${inspectPort}`] :
+ [`--inspect-brk=${inspectPort}`])
+ .concat([script], scriptArgs);
+ const child = spawn(process.execPath, args);
+ child.stdout.setEncoding('utf8');
+ child.stderr.setEncoding('utf8');
+ child.stdout.on('data', childPrint);
+ child.stderr.on('data', childPrint);
+
+ let output = '';
+ function waitForListenHint(text) {
+ output += text;
+ if (/Debugger listening on ws:\/\/\[?(.+?)\]?:(\d+)\//.test(output)) {
+ const host = RegExp.$1;
+ const port = Number.parseInt(RegExp.$2);
+ child.stderr.removeListener('data', waitForListenHint);
+ resolve([child, port, host]);
+ }
+ }
+
+ child.stderr.on('data', waitForListenHint);
+ });
+ });
+}
+
+function createAgentProxy(domain, client) {
+ const agent = new EventEmitter();
+ agent.then = (...args) => {
+ // TODO: potentially fetch the protocol and pretty-print it here.
+ const descriptor = {
+ [util.inspect.custom](depth, { stylize }) {
+ return stylize(`[Agent ${domain}]`, 'special');
+ },
+ };
+ return Promise.resolve(descriptor).then(...args);
+ };
+
+ return new Proxy(agent, {
+ get(target, name) {
+ if (name in target) return target[name];
+ return function callVirtualMethod(params) {
+ return client.callMethod(`${domain}.${name}`, params);
+ };
+ },
+ });
+}
+
+class NodeInspector {
+ constructor(options, stdin, stdout) {
+ this.options = options;
+ this.stdin = stdin;
+ this.stdout = stdout;
+
+ this.paused = true;
+ this.child = null;
+
+ if (options.script) {
+ this._runScript = runScript.bind(null,
+ options.script,
+ options.scriptArgs,
+ options.host,
+ options.port,
+ this.childPrint.bind(this));
+ } else {
+ this._runScript =
+ () => Promise.resolve([null, options.port, options.host]);
+ }
+
+ this.client = new InspectClient();
+
+ this.domainNames = ['Debugger', 'HeapProfiler', 'Profiler', 'Runtime'];
+ this.domainNames.forEach((domain) => {
+ this[domain] = createAgentProxy(domain, this.client);
+ });
+ this.handleDebugEvent = (fullName, params) => {
+ const [domain, name] = fullName.split('.');
+ if (domain in this) {
+ this[domain].emit(name, params);
+ }
+ };
+ this.client.on('debugEvent', this.handleDebugEvent);
+ const startRepl = createRepl(this);
+
+ // Handle all possible exits
+ process.on('exit', () => this.killChild());
+ process.once('SIGTERM', process.exit.bind(process, 0));
+ process.once('SIGHUP', process.exit.bind(process, 0));
+
+ this.run()
+ .then(() => startRepl())
+ .then((repl) => {
+ this.repl = repl;
+ this.repl.on('exit', () => {
+ process.exit(0);
+ });
+ this.paused = false;
+ })
+ .then(null, (error) => process.nextTick(() => { throw error; }));
+ }
+
+ suspendReplWhile(fn) {
+ if (this.repl) {
+ this.repl.rli.pause();
+ }
+ this.stdin.pause();
+ this.paused = true;
+ return new Promise((resolve) => {
+ resolve(fn());
+ }).then(() => {
+ this.paused = false;
+ if (this.repl) {
+ this.repl.rli.resume();
+ this.repl.displayPrompt();
+ }
+ this.stdin.resume();
+ }).then(null, (error) => process.nextTick(() => { throw error; }));
+ }
+
+ killChild() {
+ this.client.reset();
+ if (this.child) {
+ this.child.kill();
+ this.child = null;
+ }
+ }
+
+ run() {
+ this.killChild();
+
+ return this._runScript().then(([child, port, host]) => {
+ this.child = child;
+
+ let connectionAttempts = 0;
+ const attemptConnect = () => {
+ ++connectionAttempts;
+ debuglog('connection attempt #%d', connectionAttempts);
+ this.stdout.write('.');
+ return this.client.connect(port, host)
+ .then(() => {
+ debuglog('connection established');
+ this.stdout.write(' ok');
+ }, (error) => {
+ debuglog('connect failed', error);
+ // If it's failed to connect 10 times then print failed message
+ if (connectionAttempts >= 10) {
+ this.stdout.write(' failed to connect, please retry\n');
+ process.exit(1);
+ }
+
+ return new Promise((resolve) => setTimeout(resolve, 500))
+ .then(attemptConnect);
+ });
+ };
+
+ this.print(`connecting to ${host}:${port} ..`, true);
+ return attemptConnect();
+ });
+ }
+
+ clearLine() {
+ if (this.stdout.isTTY) {
+ this.stdout.cursorTo(0);
+ this.stdout.clearLine(1);
+ } else {
+ this.stdout.write('\b');
+ }
+ }
+
+ print(text, oneline = false) {
+ this.clearLine();
+ this.stdout.write(oneline ? text : `${text}\n`);
+ }
+
+ childPrint(text) {
+ this.print(
+ text.toString()
+ .split(/\r\n|\r|\n/g)
+ .filter((chunk) => !!chunk)
+ .map((chunk) => `< ${chunk}`)
+ .join('\n')
+ );
+ if (!this.paused) {
+ this.repl.displayPrompt(true);
+ }
+ if (/Waiting for the debugger to disconnect\.\.\.\n$/.test(text)) {
+ this.killChild();
+ }
+ }
+}
+
+function parseArgv([target, ...args]) {
+ let host = '127.0.0.1';
+ let port = 9229;
+ let isRemote = false;
+ let script = target;
+ let scriptArgs = args;
+
+ const hostMatch = target.match(/^([^:]+):(\d+)$/);
+ const portMatch = target.match(/^--port=(\d+)$/);
+
+ if (hostMatch) {
+ // Connecting to remote debugger
+ // `node-inspect localhost:9229`
+ host = hostMatch[1];
+ port = parseInt(hostMatch[2], 10);
+ isRemote = true;
+ script = null;
+ } else if (portMatch) {
+ // start debugee on custom port
+ // `node inspect --port=9230 script.js`
+ port = parseInt(portMatch[1], 10);
+ script = args[0];
+ scriptArgs = args.slice(1);
+ } else if (args.length === 1 && /^\d+$/.test(args[0]) && target === '-p') {
+ // Start debugger against a given pid
+ const pid = parseInt(args[0], 10);
+ try {
+ process._debugProcess(pid);
+ } catch (e) {
+ if (e.code === 'ESRCH') {
+ /* eslint-disable no-console */
+ console.error(`Target process: ${pid} doesn't exist.`);
+ /* eslint-enable no-console */
+ process.exit(1);
+ }
+ throw e;
+ }
+ script = null;
+ isRemote = true;
+ }
+
+ return {
+ host, port, isRemote, script, scriptArgs,
+ };
+}
+
+function startInspect(argv = process.argv.slice(2),
+ stdin = process.stdin,
+ stdout = process.stdout) {
+ /* eslint-disable no-console */
+ if (argv.length < 1) {
+ const invokedAs = runAsStandalone ?
+ 'node-inspect' :
+ `${process.argv0} ${process.argv[1]}`;
+
+ console.error(`Usage: ${invokedAs} script.js`);
+ console.error(` ${invokedAs} <host>:<port>`);
+ console.error(` ${invokedAs} -p <pid>`);
+ process.exit(1);
+ }
+
+ const options = parseArgv(argv);
+ const inspector = new NodeInspector(options, stdin, stdout);
+
+ stdin.resume();
+
+ function handleUnexpectedError(e) {
+ if (!(e instanceof StartupError)) {
+ console.error('There was an internal error in node-inspect. ' +
+ 'Please report this bug.');
+ console.error(e.message);
+ console.error(e.stack);
+ } else {
+ console.error(e.message);
+ }
+ if (inspector.child) inspector.child.kill();
+ process.exit(1);
+ }
+
+ process.on('uncaughtException', handleUnexpectedError);
+ /* eslint-enable no-console */
+}
+exports.start = startInspect;
diff --git a/deps/node/deps/node-inspect/lib/cli.js b/deps/node/deps/node-inspect/lib/cli.js
new file mode 100644
index 00000000..a4880df2
--- /dev/null
+++ b/deps/node/deps/node-inspect/lib/cli.js
@@ -0,0 +1,24 @@
+/*
+ * Copyright Node.js contributors. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+'use strict';
+// ~= NativeModule.require('_debugger').start();
+require('./_inspect').start();
diff --git a/deps/node/deps/node-inspect/lib/internal/inspect_client.js b/deps/node/deps/node-inspect/lib/internal/inspect_client.js
new file mode 100644
index 00000000..9b8529de
--- /dev/null
+++ b/deps/node/deps/node-inspect/lib/internal/inspect_client.js
@@ -0,0 +1,352 @@
+/*
+ * Copyright Node.js contributors. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+'use strict';
+const Buffer = require('buffer').Buffer;
+const crypto = require('crypto');
+const { EventEmitter } = require('events');
+const http = require('http');
+const URL = require('url');
+const util = require('util');
+
+const debuglog = util.debuglog('inspect');
+
+const kOpCodeText = 0x1;
+const kOpCodeClose = 0x8;
+
+const kFinalBit = 0x80;
+const kReserved1Bit = 0x40;
+const kReserved2Bit = 0x20;
+const kReserved3Bit = 0x10;
+const kOpCodeMask = 0xF;
+const kMaskBit = 0x80;
+const kPayloadLengthMask = 0x7F;
+
+const kMaxSingleBytePayloadLength = 125;
+const kMaxTwoBytePayloadLength = 0xFFFF;
+const kTwoBytePayloadLengthField = 126;
+const kEightBytePayloadLengthField = 127;
+const kMaskingKeyWidthInBytes = 4;
+
+function isEmpty(obj) {
+ return Object.keys(obj).length === 0;
+}
+
+function unpackError({ code, message, data }) {
+ const err = new Error(`${message} - ${data}`);
+ err.code = code;
+ Error.captureStackTrace(err, unpackError);
+ return err;
+}
+
+function encodeFrameHybi17(payload) {
+ var i;
+
+ const dataLength = payload.length;
+
+ let singleByteLength;
+ let additionalLength;
+ if (dataLength > kMaxTwoBytePayloadLength) {
+ singleByteLength = kEightBytePayloadLengthField;
+ additionalLength = Buffer.alloc(8);
+ let remaining = dataLength;
+ for (i = 0; i < 8; ++i) {
+ additionalLength[7 - i] = remaining & 0xFF;
+ remaining >>= 8;
+ }
+ } else if (dataLength > kMaxSingleBytePayloadLength) {
+ singleByteLength = kTwoBytePayloadLengthField;
+ additionalLength = Buffer.alloc(2);
+ additionalLength[0] = (dataLength & 0xFF00) >> 8;
+ additionalLength[1] = dataLength & 0xFF;
+ } else {
+ additionalLength = Buffer.alloc(0);
+ singleByteLength = dataLength;
+ }
+
+ const header = Buffer.from([
+ kFinalBit | kOpCodeText,
+ kMaskBit | singleByteLength,
+ ]);
+
+ const mask = Buffer.alloc(4);
+ const masked = Buffer.alloc(dataLength);
+ for (i = 0; i < dataLength; ++i) {
+ masked[i] = payload[i] ^ mask[i % kMaskingKeyWidthInBytes];
+ }
+
+ return Buffer.concat([header, additionalLength, mask, masked]);
+}
+
+function decodeFrameHybi17(data) {
+ const dataAvailable = data.length;
+ const notComplete = { closed: false, payload: null, rest: data };
+ let payloadOffset = 2;
+ if ((dataAvailable - payloadOffset) < 0) return notComplete;
+
+ const firstByte = data[0];
+ const secondByte = data[1];
+
+ const final = (firstByte & kFinalBit) !== 0;
+ const reserved1 = (firstByte & kReserved1Bit) !== 0;
+ const reserved2 = (firstByte & kReserved2Bit) !== 0;
+ const reserved3 = (firstByte & kReserved3Bit) !== 0;
+ const opCode = firstByte & kOpCodeMask;
+ const masked = (secondByte & kMaskBit) !== 0;
+ const compressed = reserved1;
+ if (compressed) {
+ throw new Error('Compressed frames not supported');
+ }
+ if (!final || reserved2 || reserved3) {
+ throw new Error('Only compression extension is supported');
+ }
+
+ if (masked) {
+ throw new Error('Masked server frame - not supported');
+ }
+
+ let closed = false;
+ switch (opCode) {
+ case kOpCodeClose:
+ closed = true;
+ break;
+ case kOpCodeText:
+ break;
+ default:
+ throw new Error(`Unsupported op code ${opCode}`);
+ }
+
+ let payloadLength = secondByte & kPayloadLengthMask;
+ switch (payloadLength) {
+ case kTwoBytePayloadLengthField:
+ payloadOffset += 2;
+ payloadLength = (data[2] << 8) + data[3];
+ break;
+
+ case kEightBytePayloadLengthField:
+ payloadOffset += 8;
+ payloadLength = 0;
+ for (var i = 0; i < 8; ++i) {
+ payloadLength <<= 8;
+ payloadLength |= data[2 + i];
+ }
+ break;
+
+ default:
+ // Nothing. We already have the right size.
+ }
+ if ((dataAvailable - payloadOffset - payloadLength) < 0) return notComplete;
+
+ const payloadEnd = payloadOffset + payloadLength;
+ return {
+ payload: data.slice(payloadOffset, payloadEnd),
+ rest: data.slice(payloadEnd),
+ closed,
+ };
+}
+
+class Client extends EventEmitter {
+ constructor() {
+ super();
+ this.handleChunk = this._handleChunk.bind(this);
+
+ this._port = undefined;
+ this._host = undefined;
+
+ this.reset();
+ }
+
+ _handleChunk(chunk) {
+ this._unprocessed = Buffer.concat([this._unprocessed, chunk]);
+
+ while (this._unprocessed.length > 2) {
+ const {
+ closed,
+ payload: payloadBuffer,
+ rest
+ } = decodeFrameHybi17(this._unprocessed);
+ this._unprocessed = rest;
+
+ if (closed) {
+ this.reset();
+ return;
+ }
+ if (payloadBuffer === null) break;
+
+ const payloadStr = payloadBuffer.toString();
+ debuglog('< %s', payloadStr);
+ const lastChar = payloadStr[payloadStr.length - 1];
+ if (payloadStr[0] !== '{' || lastChar !== '}') {
+ throw new Error(`Payload does not look like JSON: ${payloadStr}`);
+ }
+ let payload;
+ try {
+ payload = JSON.parse(payloadStr);
+ } catch (parseError) {
+ parseError.string = payloadStr;
+ throw parseError;
+ }
+
+ const { id, method, params, result, error } = payload;
+ if (id) {
+ const handler = this._pending[id];
+ if (handler) {
+ delete this._pending[id];
+ handler(error, result);
+ }
+ } else if (method) {
+ this.emit('debugEvent', method, params);
+ this.emit(method, params);
+ } else {
+ throw new Error(`Unsupported response: ${payloadStr}`);
+ }
+ }
+ }
+
+ reset() {
+ if (this._http) {
+ this._http.destroy();
+ }
+ this._http = null;
+ this._lastId = 0;
+ this._socket = null;
+ this._pending = {};
+ this._unprocessed = Buffer.alloc(0);
+ }
+
+ callMethod(method, params) {
+ return new Promise((resolve, reject) => {
+ if (!this._socket) {
+ reject(new Error('Use `run` to start the app again.'));
+ return;
+ }
+ const data = { id: ++this._lastId, method, params };
+ this._pending[data.id] = (error, result) => {
+ if (error) reject(unpackError(error));
+ else resolve(isEmpty(result) ? undefined : result);
+ };
+ const json = JSON.stringify(data);
+ debuglog('> %s', json);
+ this._socket.write(encodeFrameHybi17(Buffer.from(json)));
+ });
+ }
+
+ _fetchJSON(urlPath) {
+ return new Promise((resolve, reject) => {
+ const httpReq = http.get({
+ host: this._host,
+ port: this._port,
+ path: urlPath,
+ });
+
+ const chunks = [];
+
+ function onResponse(httpRes) {
+ function parseChunks() {
+ const resBody = Buffer.concat(chunks).toString();
+ if (httpRes.statusCode !== 200) {
+ reject(new Error(`Unexpected ${httpRes.statusCode}: ${resBody}`));
+ return;
+ }
+ try {
+ resolve(JSON.parse(resBody));
+ } catch (parseError) {
+ reject(new Error(`Response didn't contain JSON: ${resBody}`));
+ return;
+ }
+ }
+
+ httpRes.on('error', reject);
+ httpRes.on('data', (chunk) => chunks.push(chunk));
+ httpRes.on('end', parseChunks);
+ }
+
+ httpReq.on('error', reject);
+ httpReq.on('response', onResponse);
+ });
+ }
+
+ connect(port, host) {
+ this._port = port;
+ this._host = host;
+ return this._discoverWebsocketPath()
+ .then((urlPath) => this._connectWebsocket(urlPath));
+ }
+
+ _discoverWebsocketPath() {
+ return this._fetchJSON('/json')
+ .then(([{ webSocketDebuggerUrl }]) =>
+ URL.parse(webSocketDebuggerUrl).path);
+ }
+
+ _connectWebsocket(urlPath) {
+ this.reset();
+
+ const key1 = crypto.randomBytes(16).toString('base64');
+ debuglog('request websocket', key1);
+
+ const httpReq = this._http = http.request({
+ host: this._host,
+ port: this._port,
+ path: urlPath,
+ headers: {
+ Connection: 'Upgrade',
+ Upgrade: 'websocket',
+ 'Sec-WebSocket-Key': key1,
+ 'Sec-WebSocket-Version': '13',
+ },
+ });
+ httpReq.on('error', (e) => {
+ this.emit('error', e);
+ });
+ httpReq.on('response', (httpRes) => {
+ if (httpRes.statusCode >= 400) {
+ process.stderr.write(`Unexpected HTTP code: ${httpRes.statusCode}\n`);
+ httpRes.pipe(process.stderr);
+ } else {
+ httpRes.pipe(process.stderr);
+ }
+ });
+
+ const handshakeListener = (res, socket) => {
+ // TODO: we *could* validate res.headers[sec-websocket-accept]
+ debuglog('websocket upgrade');
+
+ this._socket = socket;
+ socket.on('data', this.handleChunk);
+ socket.on('close', () => {
+ this.emit('close');
+ });
+
+ this.emit('ready');
+ };
+
+ return new Promise((resolve, reject) => {
+ this.once('error', reject);
+ this.once('ready', resolve);
+
+ httpReq.on('upgrade', handshakeListener);
+ httpReq.end();
+ });
+ }
+}
+
+module.exports = Client;
diff --git a/deps/node/deps/node-inspect/lib/internal/inspect_repl.js b/deps/node/deps/node-inspect/lib/internal/inspect_repl.js
new file mode 100644
index 00000000..38fe4684
--- /dev/null
+++ b/deps/node/deps/node-inspect/lib/internal/inspect_repl.js
@@ -0,0 +1,1089 @@
+/*
+ * Copyright Node.js contributors. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+'use strict';
+const FS = require('fs');
+const Path = require('path');
+const Repl = require('repl');
+const util = require('util');
+const vm = require('vm');
+
+const debuglog = util.debuglog('inspect');
+
+const SHORTCUTS = {
+ cont: 'c',
+ next: 'n',
+ step: 's',
+ out: 'o',
+ backtrace: 'bt',
+ setBreakpoint: 'sb',
+ clearBreakpoint: 'cb',
+ run: 'r',
+};
+
+const HELP = `
+run, restart, r Run the application or reconnect
+kill Kill a running application or disconnect
+
+cont, c Resume execution
+next, n Continue to next line in current file
+step, s Step into, potentially entering a function
+out, o Step out, leaving the current function
+backtrace, bt Print the current backtrace
+list Print the source around the current line where execution
+ is currently paused
+
+setBreakpoint, sb Set a breakpoint
+clearBreakpoint, cb Clear a breakpoint
+breakpoints List all known breakpoints
+breakOnException Pause execution whenever an exception is thrown
+breakOnUncaught Pause execution whenever an exception isn't caught
+breakOnNone Don't pause on exceptions (this is the default)
+
+watch(expr) Start watching the given expression
+unwatch(expr) Stop watching an expression
+watchers Print all watched expressions and their current values
+
+exec(expr) Evaluate the expression and print the value
+repl Enter a debug repl that works like exec
+
+scripts List application scripts that are currently loaded
+scripts(true) List all scripts (including node-internals)
+
+profile Start CPU profiling session.
+profileEnd Stop current CPU profiling session.
+profiles Array of completed CPU profiling sessions.
+profiles[n].save(filepath = 'node.cpuprofile')
+ Save CPU profiling session to disk as JSON.
+
+takeHeapSnapshot(filepath = 'node.heapsnapshot')
+ Take a heap snapshot and save to disk as JSON.
+`.trim();
+
+const FUNCTION_NAME_PATTERN = /^(?:function\*? )?([^(\s]+)\(/;
+function extractFunctionName(description) {
+ const fnNameMatch = description.match(FUNCTION_NAME_PATTERN);
+ return fnNameMatch ? `: ${fnNameMatch[1]}` : '';
+}
+
+const NATIVES = process.binding('natives');
+function isNativeUrl(url) {
+ return url.replace('.js', '') in NATIVES || url === 'bootstrap_node.js';
+}
+
+function getRelativePath(filename) {
+ const dir = Path.join(Path.resolve(), 'x').slice(0, -1);
+
+ // Change path to relative, if possible
+ if (filename.indexOf(dir) === 0) {
+ return filename.slice(dir.length);
+ }
+ return filename;
+}
+
+function toCallback(promise, callback) {
+ function forward(...args) {
+ process.nextTick(() => callback(...args));
+ }
+ promise.then(forward.bind(null, null), forward);
+}
+
+// Adds spaces and prefix to number
+// maxN is a maximum number we should have space for
+function leftPad(n, prefix, maxN) {
+ const s = n.toString();
+ const nchars = Math.max(2, String(maxN).length) + 1;
+ const nspaces = nchars - s.length - 1;
+
+ return prefix + ' '.repeat(nspaces) + s;
+}
+
+function markSourceColumn(sourceText, position, useColors) {
+ if (!sourceText) return '';
+
+ const head = sourceText.slice(0, position);
+ let tail = sourceText.slice(position);
+
+ // Colourize char if stdout supports colours
+ if (useColors) {
+ tail = tail.replace(/(.+?)([^\w]|$)/, '\u001b[32m$1\u001b[39m$2');
+ }
+
+ // Return source line with coloured char at `position`
+ return [head, tail].join('');
+}
+
+function extractErrorMessage(stack) {
+ if (!stack) return '<unknown>';
+ const m = stack.match(/^\w+: ([^\n]+)/);
+ return m ? m[1] : stack;
+}
+
+function convertResultToError(result) {
+ const { className, description } = result;
+ const err = new Error(extractErrorMessage(description));
+ err.stack = description;
+ Object.defineProperty(err, 'name', { value: className });
+ return err;
+}
+
+class RemoteObject {
+ constructor(attributes) {
+ Object.assign(this, attributes);
+ if (this.type === 'number') {
+ this.value =
+ this.unserializableValue ? +this.unserializableValue : +this.value;
+ }
+ }
+
+ [util.inspect.custom](depth, opts) {
+ function formatProperty(prop) {
+ switch (prop.type) {
+ case 'string':
+ case 'undefined':
+ return util.inspect(prop.value, opts);
+
+ case 'number':
+ case 'boolean':
+ return opts.stylize(prop.value, prop.type);
+
+ case 'object':
+ case 'symbol':
+ if (prop.subtype === 'date') {
+ return util.inspect(new Date(prop.value), opts);
+ }
+ if (prop.subtype === 'array') {
+ return opts.stylize(prop.value, 'special');
+ }
+ return opts.stylize(prop.value, prop.subtype || 'special');
+
+ default:
+ return prop.value;
+ }
+ }
+ switch (this.type) {
+ case 'boolean':
+ case 'number':
+ case 'string':
+ case 'undefined':
+ return util.inspect(this.value, opts);
+
+ case 'symbol':
+ return opts.stylize(this.description, 'special');
+
+ case 'function': {
+ const fnName = extractFunctionName(this.description);
+ const formatted = `[${this.className}${fnName}]`;
+ return opts.stylize(formatted, 'special');
+ }
+
+ case 'object':
+ switch (this.subtype) {
+ case 'date':
+ return util.inspect(new Date(this.description), opts);
+
+ case 'null':
+ return util.inspect(null, opts);
+
+ case 'regexp':
+ return opts.stylize(this.description, 'regexp');
+
+ default:
+ break;
+ }
+ if (this.preview) {
+ const props = this.preview.properties
+ .map((prop, idx) => {
+ const value = formatProperty(prop);
+ if (prop.name === `${idx}`) return value;
+ return `${prop.name}: ${value}`;
+ });
+ if (this.preview.overflow) {
+ props.push('...');
+ }
+ const singleLine = props.join(', ');
+ const propString =
+ singleLine.length > 60 ? props.join(',\n ') : singleLine;
+
+ return this.subtype === 'array' ?
+ `[ ${propString} ]` : `{ ${propString} }`;
+ }
+ return this.description;
+
+ default:
+ return this.description;
+ }
+ }
+
+ static fromEvalResult({ result, wasThrown }) {
+ if (wasThrown) return convertResultToError(result);
+ return new RemoteObject(result);
+ }
+}
+
+class ScopeSnapshot {
+ constructor(scope, properties) {
+ Object.assign(this, scope);
+ this.properties = new Map(properties.map((prop) => {
+ const value = new RemoteObject(prop.value);
+ return [prop.name, value];
+ }));
+ this.completionGroup = properties.map((prop) => prop.name);
+ }
+
+ [util.inspect.custom](depth, opts) {
+ const type = `${this.type[0].toUpperCase()}${this.type.slice(1)}`;
+ const name = this.name ? `<${this.name}>` : '';
+ const prefix = `${type}${name} `;
+ return util.inspect(this.properties, opts)
+ .replace(/^Map /, prefix);
+ }
+}
+
+function copyOwnProperties(target, source) {
+ Object.getOwnPropertyNames(source).forEach((prop) => {
+ const descriptor = Object.getOwnPropertyDescriptor(source, prop);
+ Object.defineProperty(target, prop, descriptor);
+ });
+}
+
+function aliasProperties(target, mapping) {
+ Object.keys(mapping).forEach((key) => {
+ const descriptor = Object.getOwnPropertyDescriptor(target, key);
+ Object.defineProperty(target, mapping[key], descriptor);
+ });
+}
+
+function createRepl(inspector) {
+ const { Debugger, HeapProfiler, Profiler, Runtime } = inspector;
+
+ let repl; // eslint-disable-line prefer-const
+
+ // Things we want to keep around
+ const history = { control: [], debug: [] };
+ const watchedExpressions = [];
+ const knownBreakpoints = [];
+ let pauseOnExceptionState = 'none';
+ let lastCommand;
+
+ // Things we need to reset when the app restarts
+ let knownScripts;
+ let currentBacktrace;
+ let selectedFrame;
+ let exitDebugRepl;
+
+ function resetOnStart() {
+ knownScripts = {};
+ currentBacktrace = null;
+ selectedFrame = null;
+
+ if (exitDebugRepl) exitDebugRepl();
+ exitDebugRepl = null;
+ }
+ resetOnStart();
+
+ const INSPECT_OPTIONS = { colors: inspector.stdout.isTTY };
+ function inspect(value) {
+ return util.inspect(value, INSPECT_OPTIONS);
+ }
+
+ function print(value, oneline = false) {
+ const text = typeof value === 'string' ? value : inspect(value);
+ return inspector.print(text, oneline);
+ }
+
+ function getCurrentLocation() {
+ if (!selectedFrame) {
+ throw new Error('Requires execution to be paused');
+ }
+ return selectedFrame.location;
+ }
+
+ function isCurrentScript(script) {
+ return selectedFrame && getCurrentLocation().scriptId === script.scriptId;
+ }
+
+ function formatScripts(displayNatives = false) {
+ function isVisible(script) {
+ if (displayNatives) return true;
+ return !script.isNative || isCurrentScript(script);
+ }
+
+ return Object.keys(knownScripts)
+ .map((scriptId) => knownScripts[scriptId])
+ .filter(isVisible)
+ .map((script) => {
+ const isCurrent = isCurrentScript(script);
+ const { isNative, url } = script;
+ const name = `${getRelativePath(url)}${isNative ? ' <native>' : ''}`;
+ return `${isCurrent ? '*' : ' '} ${script.scriptId}: ${name}`;
+ })
+ .join('\n');
+ }
+ function listScripts(displayNatives = false) {
+ print(formatScripts(displayNatives));
+ }
+ listScripts[util.inspect.custom] = function listWithoutInternal() {
+ return formatScripts();
+ };
+
+ const profiles = [];
+ class Profile {
+ constructor(data) {
+ this.data = data;
+ }
+
+ static createAndRegister({ profile }) {
+ const p = new Profile(profile);
+ profiles.push(p);
+ return p;
+ }
+
+ [util.inspect.custom](depth, { stylize }) {
+ const { startTime, endTime } = this.data;
+ return stylize(`[Profile ${endTime - startTime}μs]`, 'special');
+ }
+
+ save(filename = 'node.cpuprofile') {
+ const absoluteFile = Path.resolve(filename);
+ const json = JSON.stringify(this.data);
+ FS.writeFileSync(absoluteFile, json);
+ print('Saved profile to ' + absoluteFile);
+ }
+ }
+
+ class SourceSnippet {
+ constructor(location, delta, scriptSource) {
+ Object.assign(this, location);
+ this.scriptSource = scriptSource;
+ this.delta = delta;
+ }
+
+ [util.inspect.custom](depth, options) {
+ const { scriptId, lineNumber, columnNumber, delta, scriptSource } = this;
+ const start = Math.max(1, lineNumber - delta + 1);
+ const end = lineNumber + delta + 1;
+
+ const lines = scriptSource.split('\n');
+ return lines.slice(start - 1, end).map((lineText, offset) => {
+ const i = start + offset;
+ const isCurrent = i === (lineNumber + 1);
+
+ const markedLine = isCurrent
+ ? markSourceColumn(lineText, columnNumber, options.colors)
+ : lineText;
+
+ let isBreakpoint = false;
+ knownBreakpoints.forEach(({ location }) => {
+ if (!location) return;
+ if (scriptId === location.scriptId &&
+ i === (location.lineNumber + 1)) {
+ isBreakpoint = true;
+ }
+ });
+
+ let prefixChar = ' ';
+ if (isCurrent) {
+ prefixChar = '>';
+ } else if (isBreakpoint) {
+ prefixChar = '*';
+ }
+ return `${leftPad(i, prefixChar, end)} ${markedLine}`;
+ }).join('\n');
+ }
+ }
+
+ function getSourceSnippet(location, delta = 5) {
+ const { scriptId } = location;
+ return Debugger.getScriptSource({ scriptId })
+ .then(({ scriptSource }) =>
+ new SourceSnippet(location, delta, scriptSource));
+ }
+
+ class CallFrame {
+ constructor(callFrame) {
+ Object.assign(this, callFrame);
+ }
+
+ loadScopes() {
+ return Promise.all(
+ this.scopeChain
+ .filter((scope) => scope.type !== 'global')
+ .map((scope) => {
+ const { objectId } = scope.object;
+ return Runtime.getProperties({
+ objectId,
+ generatePreview: true,
+ }).then(({ result }) => new ScopeSnapshot(scope, result));
+ })
+ );
+ }
+
+ list(delta = 5) {
+ return getSourceSnippet(this.location, delta);
+ }
+ }
+
+ class Backtrace extends Array {
+ [util.inspect.custom]() {
+ return this.map((callFrame, idx) => {
+ const {
+ location: { scriptId, lineNumber, columnNumber },
+ functionName
+ } = callFrame;
+ const name = functionName || '(anonymous)';
+
+ const script = knownScripts[scriptId];
+ const relativeUrl =
+ (script && getRelativePath(script.url)) || '<unknown>';
+ const frameLocation =
+ `${relativeUrl}:${lineNumber + 1}:${columnNumber}`;
+
+ return `#${idx} ${name} ${frameLocation}`;
+ }).join('\n');
+ }
+
+ static from(callFrames) {
+ return super.from(Array.from(callFrames).map((callFrame) => {
+ if (callFrame instanceof CallFrame) {
+ return callFrame;
+ }
+ return new CallFrame(callFrame);
+ }));
+ }
+ }
+
+ function prepareControlCode(input) {
+ if (input === '\n') return lastCommand;
+ // exec process.title => exec("process.title");
+ const match = input.match(/^\s*exec\s+([^\n]*)/);
+ if (match) {
+ lastCommand = `exec(${JSON.stringify(match[1])})`;
+ } else {
+ lastCommand = input;
+ }
+ return lastCommand;
+ }
+
+ function evalInCurrentContext(code) {
+ // Repl asked for scope variables
+ if (code === '.scope') {
+ if (!selectedFrame) {
+ return Promise.reject(new Error('Requires execution to be paused'));
+ }
+ return selectedFrame.loadScopes().then((scopes) => {
+ return scopes.map((scope) => scope.completionGroup);
+ });
+ }
+
+ if (selectedFrame) {
+ return Debugger.evaluateOnCallFrame({
+ callFrameId: selectedFrame.callFrameId,
+ expression: code,
+ objectGroup: 'node-inspect',
+ generatePreview: true,
+ }).then(RemoteObject.fromEvalResult);
+ }
+ return Runtime.evaluate({
+ expression: code,
+ objectGroup: 'node-inspect',
+ generatePreview: true,
+ }).then(RemoteObject.fromEvalResult);
+ }
+
+ function controlEval(input, context, filename, callback) {
+ debuglog('eval:', input);
+ function returnToCallback(error, result) {
+ debuglog('end-eval:', input, error);
+ callback(error, result);
+ }
+
+ try {
+ const code = prepareControlCode(input);
+ const result = vm.runInContext(code, context, filename);
+
+ if (result && typeof result.then === 'function') {
+ toCallback(result, returnToCallback);
+ return;
+ }
+ returnToCallback(null, result);
+ } catch (e) {
+ returnToCallback(e);
+ }
+ }
+
+ function debugEval(input, context, filename, callback) {
+ debuglog('eval:', input);
+ function returnToCallback(error, result) {
+ debuglog('end-eval:', input, error);
+ callback(error, result);
+ }
+
+ try {
+ const result = evalInCurrentContext(input);
+
+ if (result && typeof result.then === 'function') {
+ toCallback(result, returnToCallback);
+ return;
+ }
+ returnToCallback(null, result);
+ } catch (e) {
+ returnToCallback(e);
+ }
+ }
+
+ function formatWatchers(verbose = false) {
+ if (!watchedExpressions.length) {
+ return Promise.resolve('');
+ }
+
+ const inspectValue = (expr) =>
+ evalInCurrentContext(expr)
+ // .then(formatValue)
+ .catch((error) => `<${error.message}>`);
+ const lastIndex = watchedExpressions.length - 1;
+
+ return Promise.all(watchedExpressions.map(inspectValue))
+ .then((values) => {
+ const lines = watchedExpressions
+ .map((expr, idx) => {
+ const prefix = `${leftPad(idx, ' ', lastIndex)}: ${expr} =`;
+ const value = inspect(values[idx], { colors: true });
+ if (value.indexOf('\n') === -1) {
+ return `${prefix} ${value}`;
+ }
+ return `${prefix}\n ${value.split('\n').join('\n ')}`;
+ });
+ return lines.join('\n');
+ })
+ .then((valueList) => {
+ return verbose ? `Watchers:\n${valueList}\n` : valueList;
+ });
+ }
+
+ function watchers(verbose = false) {
+ return formatWatchers(verbose).then(print);
+ }
+
+ // List source code
+ function list(delta = 5) {
+ return selectedFrame.list(delta)
+ .then(null, (error) => {
+ print('You can\'t list source code right now');
+ throw error;
+ });
+ }
+
+ function handleBreakpointResolved({ breakpointId, location }) {
+ const script = knownScripts[location.scriptId];
+ const scriptUrl = script && script.url;
+ if (scriptUrl) {
+ Object.assign(location, { scriptUrl });
+ }
+ const isExisting = knownBreakpoints.some((bp) => {
+ if (bp.breakpointId === breakpointId) {
+ Object.assign(bp, { location });
+ return true;
+ }
+ return false;
+ });
+ if (!isExisting) {
+ knownBreakpoints.push({ breakpointId, location });
+ }
+ }
+
+ function listBreakpoints() {
+ if (!knownBreakpoints.length) {
+ print('No breakpoints yet');
+ return;
+ }
+
+ function formatLocation(location) {
+ if (!location) return '<unknown location>';
+ const script = knownScripts[location.scriptId];
+ const scriptUrl = script ? script.url : location.scriptUrl;
+ return `${getRelativePath(scriptUrl)}:${location.lineNumber + 1}`;
+ }
+ const breaklist = knownBreakpoints
+ .map((bp, idx) => `#${idx} ${formatLocation(bp.location)}`)
+ .join('\n');
+ print(breaklist);
+ }
+
+ function setBreakpoint(script, line, condition, silent) {
+ function registerBreakpoint({ breakpointId, actualLocation }) {
+ handleBreakpointResolved({ breakpointId, location: actualLocation });
+ if (actualLocation && actualLocation.scriptId) {
+ if (!silent) return getSourceSnippet(actualLocation, 5);
+ } else {
+ print(`Warning: script '${script}' was not loaded yet.`);
+ }
+ return undefined;
+ }
+
+ // setBreakpoint(): set breakpoint at current location
+ if (script === undefined) {
+ return Debugger
+ .setBreakpoint({ location: getCurrentLocation(), condition })
+ .then(registerBreakpoint);
+ }
+
+ // setBreakpoint(line): set breakpoint in current script at specific line
+ if (line === undefined && typeof script === 'number') {
+ const location = {
+ scriptId: getCurrentLocation().scriptId,
+ lineNumber: script - 1,
+ };
+ return Debugger.setBreakpoint({ location, condition })
+ .then(registerBreakpoint);
+ }
+
+ if (typeof script !== 'string') {
+ throw new TypeError(`setBreakpoint() expects a string, got ${script}`);
+ }
+
+ // setBreakpoint('fn()'): Break when a function is called
+ if (script.endsWith('()')) {
+ const debugExpr = `debug(${script.slice(0, -2)})`;
+ const debugCall = selectedFrame
+ ? Debugger.evaluateOnCallFrame({
+ callFrameId: selectedFrame.callFrameId,
+ expression: debugExpr,
+ includeCommandLineAPI: true,
+ })
+ : Runtime.evaluate({
+ expression: debugExpr,
+ includeCommandLineAPI: true,
+ });
+ return debugCall.then(({ result, wasThrown }) => {
+ if (wasThrown) return convertResultToError(result);
+ return undefined; // This breakpoint can't be removed the same way
+ });
+ }
+
+ // setBreakpoint('scriptname')
+ let scriptId = null;
+ let ambiguous = false;
+ if (knownScripts[script]) {
+ scriptId = script;
+ } else {
+ for (const id of Object.keys(knownScripts)) {
+ const scriptUrl = knownScripts[id].url;
+ if (scriptUrl && scriptUrl.indexOf(script) !== -1) {
+ if (scriptId !== null) {
+ ambiguous = true;
+ }
+ scriptId = id;
+ }
+ }
+ }
+
+ if (ambiguous) {
+ print('Script name is ambiguous');
+ return undefined;
+ }
+ if (line <= 0) {
+ print('Line should be a positive value');
+ return undefined;
+ }
+
+ if (scriptId !== null) {
+ const location = { scriptId, lineNumber: line - 1 };
+ return Debugger.setBreakpoint({ location, condition })
+ .then(registerBreakpoint);
+ }
+
+ const escapedPath = script.replace(/([/\\.?*()^${}|[\]])/g, '\\$1');
+ const urlRegex = `^(.*[\\/\\\\])?${escapedPath}$`;
+
+ return Debugger
+ .setBreakpointByUrl({ urlRegex, lineNumber: line - 1, condition })
+ .then((bp) => {
+ // TODO: handle bp.locations in case the regex matches existing files
+ if (!bp.location) { // Fake it for now.
+ Object.assign(bp, {
+ actualLocation: {
+ scriptUrl: `.*/${script}$`,
+ lineNumber: line - 1,
+ },
+ });
+ }
+ return registerBreakpoint(bp);
+ });
+ }
+
+ function clearBreakpoint(url, line) {
+ const breakpoint = knownBreakpoints.find(({ location }) => {
+ if (!location) return false;
+ const script = knownScripts[location.scriptId];
+ if (!script) return false;
+ return (
+ script.url.indexOf(url) !== -1 && (location.lineNumber + 1) === line
+ );
+ });
+ if (!breakpoint) {
+ print(`Could not find breakpoint at ${url}:${line}`);
+ return Promise.resolve();
+ }
+ return Debugger.removeBreakpoint({ breakpointId: breakpoint.breakpointId })
+ .then(() => {
+ const idx = knownBreakpoints.indexOf(breakpoint);
+ knownBreakpoints.splice(idx, 1);
+ });
+ }
+
+ function restoreBreakpoints() {
+ const lastBreakpoints = knownBreakpoints.slice();
+ knownBreakpoints.length = 0;
+ const newBreakpoints = lastBreakpoints
+ .filter(({ location }) => !!location.scriptUrl)
+ .map(({ location }) =>
+ setBreakpoint(location.scriptUrl, location.lineNumber + 1));
+ if (!newBreakpoints.length) return Promise.resolve();
+ return Promise.all(newBreakpoints).then((results) => {
+ print(`${results.length} breakpoints restored.`);
+ });
+ }
+
+ function setPauseOnExceptions(state) {
+ return Debugger.setPauseOnExceptions({ state })
+ .then(() => {
+ pauseOnExceptionState = state;
+ });
+ }
+
+ Debugger.on('paused', ({ callFrames, reason /* , hitBreakpoints */ }) => {
+ // Save execution context's data
+ currentBacktrace = Backtrace.from(callFrames);
+ selectedFrame = currentBacktrace[0];
+ const { scriptId, lineNumber } = selectedFrame.location;
+
+ const breakType = reason === 'other' ? 'break' : reason;
+ const script = knownScripts[scriptId];
+ const scriptUrl = script ? getRelativePath(script.url) : '[unknown]';
+
+ const header = `${breakType} in ${scriptUrl}:${lineNumber + 1}`;
+
+ inspector.suspendReplWhile(() =>
+ Promise.all([formatWatchers(true), selectedFrame.list(2)])
+ .then(([watcherList, context]) => {
+ if (watcherList) {
+ return `${watcherList}\n${inspect(context)}`;
+ }
+ return inspect(context);
+ }).then((breakContext) => {
+ print(`${header}\n${breakContext}`);
+ }));
+ });
+
+ function handleResumed() {
+ currentBacktrace = null;
+ selectedFrame = null;
+ }
+
+ Debugger.on('resumed', handleResumed);
+
+ Debugger.on('breakpointResolved', handleBreakpointResolved);
+
+ Debugger.on('scriptParsed', (script) => {
+ const { scriptId, url } = script;
+ if (url) {
+ knownScripts[scriptId] = Object.assign({
+ isNative: isNativeUrl(url),
+ }, script);
+ }
+ });
+
+ Profiler.on('consoleProfileFinished', ({ profile }) => {
+ Profile.createAndRegister({ profile });
+ print([
+ 'Captured new CPU profile.',
+ `Access it with profiles[${profiles.length - 1}]`
+ ].join('\n'));
+ });
+
+ function initializeContext(context) {
+ inspector.domainNames.forEach((domain) => {
+ Object.defineProperty(context, domain, {
+ value: inspector[domain],
+ enumerable: true,
+ configurable: true,
+ writeable: false,
+ });
+ });
+
+ copyOwnProperties(context, {
+ get help() {
+ print(HELP);
+ },
+
+ get run() {
+ return inspector.run();
+ },
+
+ get kill() {
+ return inspector.killChild();
+ },
+
+ get restart() {
+ return inspector.run();
+ },
+
+ get cont() {
+ handleResumed();
+ return Debugger.resume();
+ },
+
+ get next() {
+ handleResumed();
+ return Debugger.stepOver();
+ },
+
+ get step() {
+ handleResumed();
+ return Debugger.stepInto();
+ },
+
+ get out() {
+ handleResumed();
+ return Debugger.stepOut();
+ },
+
+ get pause() {
+ return Debugger.pause();
+ },
+
+ get backtrace() {
+ return currentBacktrace;
+ },
+
+ get breakpoints() {
+ return listBreakpoints();
+ },
+
+ exec(expr) {
+ return evalInCurrentContext(expr);
+ },
+
+ get profile() {
+ return Profiler.start();
+ },
+
+ get profileEnd() {
+ return Profiler.stop()
+ .then(Profile.createAndRegister);
+ },
+
+ get profiles() {
+ return profiles;
+ },
+
+ takeHeapSnapshot(filename = 'node.heapsnapshot') {
+ return new Promise((resolve, reject) => {
+ const absoluteFile = Path.resolve(filename);
+ const writer = FS.createWriteStream(absoluteFile);
+ let sizeWritten = 0;
+ function onProgress({ done, total, finished }) {
+ if (finished) {
+ print('Heap snaphost prepared.');
+ } else {
+ print(`Heap snapshot: ${done}/${total}`, true);
+ }
+ }
+ function onChunk({ chunk }) {
+ sizeWritten += chunk.length;
+ writer.write(chunk);
+ print(`Writing snapshot: ${sizeWritten}`, true);
+ }
+ function onResolve() {
+ writer.end(() => {
+ teardown();
+ print(`Wrote snapshot: ${absoluteFile}`);
+ resolve();
+ });
+ }
+ function onReject(error) {
+ teardown();
+ reject(error);
+ }
+ function teardown() {
+ HeapProfiler.removeListener(
+ 'reportHeapSnapshotProgress', onProgress);
+ HeapProfiler.removeListener('addHeapSnapshotChunk', onChunk);
+ }
+
+ HeapProfiler.on('reportHeapSnapshotProgress', onProgress);
+ HeapProfiler.on('addHeapSnapshotChunk', onChunk);
+
+ print('Heap snapshot: 0/0', true);
+ HeapProfiler.takeHeapSnapshot({ reportProgress: true })
+ .then(onResolve, onReject);
+ });
+ },
+
+ get watchers() {
+ return watchers();
+ },
+
+ watch(expr) {
+ watchedExpressions.push(expr);
+ },
+
+ unwatch(expr) {
+ const index = watchedExpressions.indexOf(expr);
+
+ // Unwatch by expression
+ // or
+ // Unwatch by watcher number
+ watchedExpressions.splice(index !== -1 ? index : +expr, 1);
+ },
+
+ get repl() {
+ // Don't display any default messages
+ const listeners = repl.rli.listeners('SIGINT').slice(0);
+ repl.rli.removeAllListeners('SIGINT');
+
+ const oldContext = repl.context;
+
+ exitDebugRepl = () => {
+ // Restore all listeners
+ process.nextTick(() => {
+ listeners.forEach((listener) => {
+ repl.rli.on('SIGINT', listener);
+ });
+ });
+
+ // Exit debug repl
+ repl.eval = controlEval;
+
+ // Swap history
+ history.debug = repl.rli.history;
+ repl.rli.history = history.control;
+
+ repl.context = oldContext;
+ repl.rli.setPrompt('debug> ');
+ repl.displayPrompt();
+
+ repl.rli.removeListener('SIGINT', exitDebugRepl);
+ repl.removeListener('exit', exitDebugRepl);
+
+ exitDebugRepl = null;
+ };
+
+ // Exit debug repl on SIGINT
+ repl.rli.on('SIGINT', exitDebugRepl);
+
+ // Exit debug repl on repl exit
+ repl.on('exit', exitDebugRepl);
+
+ // Set new
+ repl.eval = debugEval;
+ repl.context = {};
+
+ // Swap history
+ history.control = repl.rli.history;
+ repl.rli.history = history.debug;
+
+ repl.rli.setPrompt('> ');
+
+ print('Press Ctrl + C to leave debug repl');
+ repl.displayPrompt();
+ },
+
+ get version() {
+ return Runtime.evaluate({
+ expression: 'process.versions.v8',
+ contextId: 1,
+ returnByValue: true,
+ }).then(({ result }) => {
+ print(result.value);
+ });
+ },
+
+ scripts: listScripts,
+
+ setBreakpoint,
+ clearBreakpoint,
+ setPauseOnExceptions,
+ get breakOnException() {
+ return setPauseOnExceptions('all');
+ },
+ get breakOnUncaught() {
+ return setPauseOnExceptions('uncaught');
+ },
+ get breakOnNone() {
+ return setPauseOnExceptions('none');
+ },
+
+ list,
+ });
+ aliasProperties(context, SHORTCUTS);
+ }
+
+ function initAfterStart() {
+ const setupTasks = [
+ Runtime.enable(),
+ Profiler.enable(),
+ Profiler.setSamplingInterval({ interval: 100 }),
+ Debugger.enable(),
+ Debugger.setPauseOnExceptions({ state: 'none' }),
+ Debugger.setAsyncCallStackDepth({ maxDepth: 0 }),
+ Debugger.setBlackboxPatterns({ patterns: [] }),
+ Debugger.setPauseOnExceptions({ state: pauseOnExceptionState }),
+ restoreBreakpoints(),
+ Runtime.runIfWaitingForDebugger(),
+ ];
+ return Promise.all(setupTasks);
+ }
+
+ return function startRepl() {
+ inspector.client.on('close', () => {
+ resetOnStart();
+ });
+ inspector.client.on('ready', () => {
+ initAfterStart();
+ });
+
+ const replOptions = {
+ prompt: 'debug> ',
+ input: inspector.stdin,
+ output: inspector.stdout,
+ eval: controlEval,
+ useGlobal: false,
+ ignoreUndefined: true,
+ };
+
+ repl = Repl.start(replOptions); // eslint-disable-line prefer-const
+ initializeContext(repl.context);
+ repl.on('reset', initializeContext);
+
+ repl.defineCommand('interrupt', () => {
+ // We want this for testing purposes where sending CTRL-C can be tricky.
+ repl.rli.emit('SIGINT');
+ });
+
+ // Init once for the initial connection
+ initAfterStart();
+
+ return repl;
+ };
+}
+module.exports = createRepl;
diff --git a/deps/node/deps/node-inspect/package.json b/deps/node/deps/node-inspect/package.json
new file mode 100644
index 00000000..eddc14de
--- /dev/null
+++ b/deps/node/deps/node-inspect/package.json
@@ -0,0 +1,45 @@
+{
+ "name": "node-inspect",
+ "version": "1.11.5",
+ "description": "Node Inspect",
+ "license": "MIT",
+ "main": "lib/_inspect.js",
+ "bin": "cli.js",
+ "homepage": "https://github.com/nodejs/node-inspect",
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/nodejs/node-inspect"
+ },
+ "bugs": {
+ "url": "https://github.com/nodejs/node-inspect/issues"
+ },
+ "scripts": {
+ "pretest": "eslint --rulesdir=tools/eslint-rules lib test",
+ "test": "tap test",
+ "posttest": "nlm verify"
+ },
+ "nlm": {
+ "license": {
+ "files": [
+ "lib"
+ ]
+ }
+ },
+ "dependencies": {},
+ "devDependencies": {
+ "eslint": "^3.10.2",
+ "nlm": "^3.0.0",
+ "tap": "^10.7.0"
+ },
+ "author": {
+ "name": "Jan Krems",
+ "email": "jan.krems@gmail.com"
+ },
+ "files": [
+ "*.js",
+ "lib"
+ ],
+ "publishConfig": {
+ "registry": "https://registry.npmjs.org"
+ }
+}
diff --git a/deps/node/deps/node-inspect/test/cli/backtrace.test.js b/deps/node/deps/node-inspect/test/cli/backtrace.test.js
new file mode 100644
index 00000000..127ea56b
--- /dev/null
+++ b/deps/node/deps/node-inspect/test/cli/backtrace.test.js
@@ -0,0 +1,30 @@
+'use strict';
+const Path = require('path');
+
+const { test } = require('tap');
+
+const startCLI = require('./start-cli');
+
+test('display and navigate backtrace', (t) => {
+ const script = Path.join('examples', 'backtrace.js');
+ const cli = startCLI([script]);
+
+ function onFatal(error) {
+ cli.quit();
+ throw error;
+ }
+
+ return cli.waitForInitialBreak()
+ .then(() => cli.waitForPrompt())
+ .then(() => cli.stepCommand('c'))
+ .then(() => cli.command('bt'))
+ .then(() => {
+ t.match(cli.output, `#0 topFn ${script}:7:2`);
+ })
+ .then(() => cli.command('backtrace'))
+ .then(() => {
+ t.match(cli.output, `#0 topFn ${script}:7:2`);
+ })
+ .then(() => cli.quit())
+ .then(null, onFatal);
+});
diff --git a/deps/node/deps/node-inspect/test/cli/break.test.js b/deps/node/deps/node-inspect/test/cli/break.test.js
new file mode 100644
index 00000000..ce8c8d6d
--- /dev/null
+++ b/deps/node/deps/node-inspect/test/cli/break.test.js
@@ -0,0 +1,195 @@
+'use strict';
+const Path = require('path');
+
+const { test } = require('tap');
+
+const startCLI = require('./start-cli');
+
+test('stepping through breakpoints', (t) => {
+ const script = Path.join('examples', 'break.js');
+ const cli = startCLI([script]);
+
+ function onFatal(error) {
+ cli.quit();
+ throw error;
+ }
+
+ return cli.waitForInitialBreak()
+ .then(() => cli.waitForPrompt())
+ .then(() => {
+ t.match(
+ cli.output,
+ `break in ${script}:1`,
+ 'pauses in the first line of the script');
+ t.match(
+ cli.output,
+ /> 1 \(function \([^)]+\) \{ const x = 10;/,
+ 'shows the source and marks the current line');
+ })
+ .then(() => cli.stepCommand('n'))
+ .then(() => {
+ t.match(
+ cli.output,
+ `break in ${script}:2`,
+ 'pauses in next line of the script');
+ t.match(
+ cli.output,
+ '> 2 let name = \'World\';',
+ 'marks the 2nd line');
+ })
+ .then(() => cli.stepCommand('next'))
+ .then(() => {
+ t.match(
+ cli.output,
+ `break in ${script}:3`,
+ 'pauses in next line of the script');
+ t.match(
+ cli.output,
+ '> 3 name = \'Robin\';',
+ 'marks the 3nd line');
+ })
+ .then(() => cli.stepCommand('cont'))
+ .then(() => {
+ t.match(
+ cli.output,
+ `break in ${script}:10`,
+ 'pauses on the next breakpoint');
+ t.match(
+ cli.output,
+ '>10 debugger;',
+ 'marks the debugger line');
+ })
+
+ // Prepare additional breakpoints
+ .then(() => cli.command('sb("break.js", 6)'))
+ .then(() => t.notMatch(cli.output, 'Could not resolve breakpoint'))
+ .then(() => cli.command('sb("otherFunction()")'))
+ .then(() => cli.command('sb(16)'))
+ .then(() => t.notMatch(cli.output, 'Could not resolve breakpoint'))
+ .then(() => cli.command('breakpoints'))
+ .then(() => {
+ t.match(cli.output, `#0 ${script}:6`);
+ t.match(cli.output, `#1 ${script}:16`);
+ })
+
+ .then(() => cli.command('list()'))
+ .then(() => {
+ t.match(cli.output, '>10 debugger;', 'prints and marks current line');
+ t.strictDeepEqual(
+ cli.parseSourceLines(),
+ [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
+ 'prints 5 lines before and after');
+ })
+ .then(() => cli.command('list(2)'))
+ .then(() => {
+ t.match(cli.output, '>10 debugger;', 'prints and marks current line');
+ t.strictDeepEqual(
+ cli.parseSourceLines(),
+ [8, 9, 10, 11, 12],
+ 'prints 2 lines before and after');
+ })
+
+ .then(() => cli.stepCommand('s'))
+ .then(() => cli.stepCommand(''))
+ .then(() => {
+ t.match(
+ cli.output,
+ 'break in timers.js',
+ 'entered timers.js');
+ })
+ .then(() => cli.stepCommand('cont'))
+ .then(() => {
+ t.match(
+ cli.output,
+ `break in ${script}:16`,
+ 'found breakpoint we set above w/ line number only');
+ })
+ .then(() => cli.stepCommand('cont'))
+ .then(() => {
+ t.match(
+ cli.output,
+ `break in ${script}:6`,
+ 'found breakpoint we set above w/ line number & script');
+ })
+ .then(() => cli.stepCommand(''))
+ .then(() => {
+ t.match(
+ cli.output,
+ `debugCommand in ${script}:14`,
+ 'found function breakpoint we set above');
+ })
+ .then(() => cli.quit())
+ .then(null, onFatal);
+});
+
+test('sb before loading file', (t) => {
+ const script = Path.join('examples', 'cjs', 'index.js');
+ const otherScript = Path.join('examples', 'cjs', 'other.js');
+ const cli = startCLI([script]);
+
+ function onFatal(error) {
+ cli.quit();
+ throw error;
+ }
+
+ return cli.waitForInitialBreak()
+ .then(() => cli.waitForPrompt())
+ .then(() => cli.command('sb("other.js", 2)'))
+ .then(() => {
+ t.match(
+ cli.output,
+ 'not loaded yet',
+ 'warns that the script was not loaded yet');
+ })
+ .then(() => cli.stepCommand('cont'))
+ .then(() => {
+ t.match(
+ cli.output,
+ `break in ${otherScript}:2`,
+ 'found breakpoint in file that was not loaded yet');
+ })
+ .then(() => cli.quit())
+ .then(null, onFatal);
+});
+
+test('clearBreakpoint', (t) => {
+ const script = Path.join('examples', 'break.js');
+ const cli = startCLI([script]);
+
+ function onFatal(error) {
+ cli.quit();
+ throw error;
+ }
+
+ return cli.waitForInitialBreak()
+ .then(() => cli.waitForPrompt())
+ .then(() => cli.command('sb("break.js", 3)'))
+ .then(() => cli.command('sb("break.js", 9)'))
+ .then(() => cli.command('breakpoints'))
+ .then(() => {
+ t.match(cli.output, `#0 ${script}:3`);
+ t.match(cli.output, `#1 ${script}:9`);
+ })
+ .then(() => cli.command('clearBreakpoint("break.js", 4)'))
+ .then(() => {
+ t.match(cli.output, 'Could not find breakpoint');
+ })
+ .then(() => cli.command('clearBreakpoint("not-such-script.js", 3)'))
+ .then(() => {
+ t.match(cli.output, 'Could not find breakpoint');
+ })
+ .then(() => cli.command('clearBreakpoint("break.js", 3)'))
+ .then(() => cli.command('breakpoints'))
+ .then(() => {
+ t.match(cli.output, `#0 ${script}:9`);
+ })
+ .then(() => cli.stepCommand('cont'))
+ .then(() => {
+ t.match(
+ cli.output,
+ `break in ${script}:9`,
+ 'hits the 2nd breakpoint because the 1st was cleared');
+ })
+ .then(() => cli.quit())
+ .then(null, onFatal);
+});
diff --git a/deps/node/deps/node-inspect/test/cli/exceptions.test.js b/deps/node/deps/node-inspect/test/cli/exceptions.test.js
new file mode 100644
index 00000000..18b7f185
--- /dev/null
+++ b/deps/node/deps/node-inspect/test/cli/exceptions.test.js
@@ -0,0 +1,68 @@
+'use strict';
+const Path = require('path');
+
+const { test } = require('tap');
+
+const startCLI = require('./start-cli');
+
+test('break on (uncaught) exceptions', (t) => {
+ const script = Path.join('examples', 'exceptions.js');
+ const cli = startCLI([script]);
+
+ function onFatal(error) {
+ cli.quit();
+ throw error;
+ }
+
+ return cli.waitForInitialBreak()
+ .then(() => cli.waitForPrompt())
+ .then(() => {
+ t.match(cli.output, `break in ${script}:1`);
+ })
+ // making sure it will die by default:
+ .then(() => cli.command('c'))
+ // TODO: Remove FATAL ERROR once node doesn't show a FATAL ERROR anymore
+ .then(() => cli.waitFor(/disconnect|FATAL ERROR/))
+
+ // Next run: With `breakOnException` it pauses in both places
+ .then(() => cli.stepCommand('r'))
+ .then(() => cli.waitForInitialBreak())
+ .then(() => {
+ t.match(cli.output, `break in ${script}:1`);
+ })
+ .then(() => cli.command('breakOnException'))
+ .then(() => cli.stepCommand('c'))
+ .then(() => {
+ t.match(cli.output, `exception in ${script}:3`);
+ })
+ .then(() => cli.stepCommand('c'))
+ .then(() => {
+ t.match(cli.output, `exception in ${script}:9`);
+ })
+
+ // Next run: With `breakOnUncaught` it only pauses on the 2nd exception
+ .then(() => cli.command('breakOnUncaught'))
+ .then(() => cli.stepCommand('r')) // also, the setting survives the restart
+ .then(() => cli.waitForInitialBreak())
+ .then(() => {
+ t.match(cli.output, `break in ${script}:1`);
+ })
+ .then(() => cli.stepCommand('c'))
+ .then(() => {
+ t.match(cli.output, `exception in ${script}:9`);
+ })
+
+ // Next run: Back to the initial state! It should die again.
+ .then(() => cli.command('breakOnNone'))
+ .then(() => cli.stepCommand('r'))
+ .then(() => cli.waitForInitialBreak())
+ .then(() => {
+ t.match(cli.output, `break in ${script}:1`);
+ })
+ .then(() => cli.command('c'))
+ // TODO: Remove FATAL ERROR once node doesn't show a FATAL ERROR anymore
+ .then(() => cli.waitFor(/disconnect|FATAL ERROR/))
+
+ .then(() => cli.quit())
+ .then(null, onFatal);
+});
diff --git a/deps/node/deps/node-inspect/test/cli/exec.test.js b/deps/node/deps/node-inspect/test/cli/exec.test.js
new file mode 100644
index 00000000..acfd6e34
--- /dev/null
+++ b/deps/node/deps/node-inspect/test/cli/exec.test.js
@@ -0,0 +1,77 @@
+'use strict';
+const { test } = require('tap');
+
+const startCLI = require('./start-cli');
+
+test('examples/alive.js', (t) => {
+ const cli = startCLI(['examples/alive.js']);
+
+ function onFatal(error) {
+ cli.quit();
+ throw error;
+ }
+
+ return cli.waitForInitialBreak()
+ .then(() => cli.waitForPrompt())
+ .then(() => cli.command('exec [typeof heartbeat, typeof process.exit]'))
+ .then(() => {
+ t.match(cli.output, '[ \'function\', \'function\' ]', 'works w/o paren');
+ })
+ .then(() => cli.command('repl'))
+ .then(() => {
+ t.match(
+ cli.output,
+ 'Press Ctrl + C to leave debug repl\n> ',
+ 'shows hint for how to leave repl');
+ t.notMatch(cli.output, 'debug>', 'changes the repl style');
+ })
+ .then(() => cli.command('[typeof heartbeat, typeof process.exit]'))
+ .then(() => cli.waitFor(/function/))
+ .then(() => cli.waitForPrompt())
+ .then(() => {
+ t.match(
+ cli.output,
+ '[ \'function\', \'function\' ]', 'can evaluate in the repl');
+ t.match(cli.output, /> $/);
+ })
+ .then(() => cli.ctrlC())
+ .then(() => cli.waitFor(/debug> $/))
+ .then(() => cli.command('exec("[typeof heartbeat, typeof process.exit]")'))
+ .then(() => {
+ t.match(cli.output, '[ \'function\', \'function\' ]', 'works w/ paren');
+ })
+ .then(() => cli.command('cont'))
+ .then(() => cli.command('exec [typeof heartbeat, typeof process.exit]'))
+ .then(() => {
+ t.match(
+ cli.output,
+ '[ \'undefined\', \'function\' ]',
+ 'non-paused exec can see global but not module-scope values');
+ })
+ .then(() => cli.quit())
+ .then(null, onFatal);
+});
+
+test('exec .scope', (t) => {
+ const cli = startCLI(['examples/backtrace.js']);
+
+ function onFatal(error) {
+ cli.quit();
+ throw error;
+ }
+
+ return cli.waitForInitialBreak()
+ .then(() => cli.waitForPrompt())
+ .then(() => cli.stepCommand('c'))
+ .then(() => cli.command('exec .scope'))
+ .then(() => {
+ t.match(
+ cli.output,
+ '\'moduleScoped\'', 'displays closure from module body');
+ t.match(cli.output, '\'a\'', 'displays local / function arg');
+ t.match(cli.output, '\'l1\'', 'displays local scope');
+ t.notMatch(cli.output, '\'encodeURIComponent\'', 'omits global scope');
+ })
+ .then(() => cli.quit())
+ .then(null, onFatal);
+});
diff --git a/deps/node/deps/node-inspect/test/cli/heap-profiler.test.js b/deps/node/deps/node-inspect/test/cli/heap-profiler.test.js
new file mode 100644
index 00000000..ebd734e0
--- /dev/null
+++ b/deps/node/deps/node-inspect/test/cli/heap-profiler.test.js
@@ -0,0 +1,34 @@
+'use strict';
+const { test } = require('tap');
+const { readFileSync, unlinkSync } = require('fs');
+
+const startCLI = require('./start-cli');
+const filename = 'node.heapsnapshot';
+
+function cleanup() {
+ try {
+ unlinkSync(filename);
+ } catch (_) {
+ // Ignore.
+ }
+}
+
+cleanup();
+
+test('Heap profiler take snapshot', (t) => {
+ const cli = startCLI(['examples/empty.js']);
+
+ function onFatal(error) {
+ cli.quit();
+ throw error;
+ }
+
+ // Check that the snapshot is valid JSON.
+ return cli.waitForInitialBreak()
+ .then(() => cli.waitForPrompt())
+ .then(() => cli.command('takeHeapSnapshot()'))
+ .then(() => JSON.parse(readFileSync(filename, 'utf8')))
+ .then(() => cleanup())
+ .then(() => cli.quit())
+ .then(null, onFatal);
+});
diff --git a/deps/node/deps/node-inspect/test/cli/help.test.js b/deps/node/deps/node-inspect/test/cli/help.test.js
new file mode 100644
index 00000000..9f0c081b
--- /dev/null
+++ b/deps/node/deps/node-inspect/test/cli/help.test.js
@@ -0,0 +1,22 @@
+'use strict';
+const { test } = require('tap');
+
+const startCLI = require('./start-cli');
+
+test('examples/empty.js', (t) => {
+ const cli = startCLI(['examples/empty.js']);
+
+ function onFatal(error) {
+ cli.quit();
+ throw error;
+ }
+
+ return cli.waitForInitialBreak()
+ .then(() => cli.waitForPrompt())
+ .then(() => cli.command('help'))
+ .then(() => {
+ t.match(cli.output, /run, restart, r\s+/m);
+ })
+ .then(() => cli.quit())
+ .then(null, onFatal);
+});
diff --git a/deps/node/deps/node-inspect/test/cli/invalid-args.test.js b/deps/node/deps/node-inspect/test/cli/invalid-args.test.js
new file mode 100644
index 00000000..c1aaeb6a
--- /dev/null
+++ b/deps/node/deps/node-inspect/test/cli/invalid-args.test.js
@@ -0,0 +1,54 @@
+'use strict';
+const Path = require('path');
+const { createServer } = require('net');
+
+const { test } = require('tap');
+
+const startCLI = require('./start-cli');
+
+test('launch CLI w/o args', (t) => {
+ const cli = startCLI([]);
+ return cli.quit()
+ .then((code) => {
+ t.equal(code, 1, 'exits with non-zero exit code');
+ t.match(cli.output, /^Usage:/, 'Prints usage info');
+ });
+});
+
+test('launch w/ invalid host:port', (t) => {
+ const cli = startCLI(['localhost:914']);
+ return cli.quit()
+ .then((code) => {
+ t.match(
+ cli.output,
+ 'failed to connect',
+ 'Tells the user that the connection failed');
+ t.equal(code, 1, 'exits with non-zero exit code');
+ });
+});
+
+test('launch w/ unavailable port', async (t) => {
+ const blocker = createServer((socket) => socket.end());
+ const port = await new Promise((resolve, reject) => {
+ blocker.on('error', reject);
+ blocker.listen(0, '127.0.0.1', () => resolve(blocker.address().port));
+ });
+
+ try {
+ const script = Path.join('examples', 'three-lines.js');
+ const cli = startCLI([`--port=${port}`, script]);
+ const code = await cli.quit();
+
+ t.notMatch(
+ cli.output,
+ 'report this bug',
+ 'Omits message about reporting this as a bug');
+ t.match(
+ cli.output,
+ `waiting for 127.0.0.1:${port} to be free`,
+ 'Tells the user that the port wasn\'t available');
+ t.equal(code, 1, 'exits with non-zero exit code');
+ } finally {
+ blocker.close();
+ }
+});
diff --git a/deps/node/deps/node-inspect/test/cli/launch.test.js b/deps/node/deps/node-inspect/test/cli/launch.test.js
new file mode 100644
index 00000000..8808d47a
--- /dev/null
+++ b/deps/node/deps/node-inspect/test/cli/launch.test.js
@@ -0,0 +1,176 @@
+'use strict';
+const Path = require('path');
+
+const { test } = require('tap');
+
+const startCLI = require('./start-cli');
+
+test('custom port', (t) => {
+ const CUSTOM_PORT = '9230';
+ const script = Path.join('examples', 'three-lines.js');
+
+ const cli = startCLI([`--port=${CUSTOM_PORT}`, script]);
+
+ return cli.waitForInitialBreak()
+ .then(() => cli.waitForPrompt())
+ .then(() => {
+ t.match(cli.output, 'debug>', 'prints a prompt');
+ t.match(
+ cli.output,
+ new RegExp(`< Debugger listening on [^\n]*${CUSTOM_PORT}`),
+ 'forwards child output');
+ })
+ .then(() => cli.quit())
+ .then((code) => {
+ t.equal(code, 0, 'exits with success');
+ });
+});
+
+test('random port', (t) => {
+ const script = Path.join('examples', 'three-lines.js');
+
+ const cli = startCLI(['--port=0', script]);
+
+ return cli.waitForInitialBreak()
+ .then(() => cli.waitForPrompt())
+ .then(() => {
+ t.match(cli.output, 'debug>', 'prints a prompt');
+ t.match(
+ cli.output,
+ /< Debugger listening on /,
+ 'forwards child output');
+ })
+ .then(() => cli.quit())
+ .then((code) => {
+ t.equal(code, 0, 'exits with success');
+ });
+});
+
+test('random port with --inspect-port=0', (t) => {
+ const script = Path.join('examples', 'three-lines.js');
+
+ const cli = startCLI([script], ['--inspect-port=0']);
+
+ return cli.waitForInitialBreak()
+ .then(() => cli.waitForPrompt())
+ .then(() => {
+ t.match(cli.output, 'debug>', 'prints a prompt');
+ t.match(
+ cli.output,
+ /< Debugger listening on /,
+ 'forwards child output');
+ })
+ .then(() => cli.quit())
+ .then((code) => {
+ t.equal(code, 0, 'exits with success');
+ });
+});
+
+test('examples/three-lines.js', (t) => {
+ const script = Path.join('examples', 'three-lines.js');
+ const cli = startCLI([script]);
+
+ return cli.waitForInitialBreak()
+ .then(() => cli.waitForPrompt())
+ .then(() => {
+ t.match(cli.output, 'debug>', 'prints a prompt');
+ t.match(
+ cli.output,
+ /< Debugger listening on [^\n]*9229/,
+ 'forwards child output');
+ })
+ .then(() => cli.command('["hello", "world"].join(" ")'))
+ .then(() => {
+ t.match(cli.output, 'hello world', 'prints the result');
+ })
+ .then(() => cli.command(''))
+ .then(() => {
+ t.match(cli.output, 'hello world', 'repeats the last command on <enter>');
+ })
+ .then(() => cli.command('version'))
+ .then(() => {
+ t.match(cli.output, process.versions.v8, 'version prints the v8 version');
+ })
+ .then(() => cli.quit())
+ .then((code) => {
+ t.equal(code, 0, 'exits with success');
+ });
+});
+
+test('run after quit / restart', (t) => {
+ const script = Path.join('examples', 'three-lines.js');
+ const cli = startCLI([script]);
+
+ function onFatal(error) {
+ cli.quit();
+ throw error;
+ }
+
+ return cli.waitForInitialBreak()
+ .then(() => cli.waitForPrompt())
+ .then(() => cli.stepCommand('n'))
+ .then(() => {
+ t.match(
+ cli.output,
+ `break in ${script}:2`,
+ 'steps to the 2nd line');
+ })
+ .then(() => cli.command('cont'))
+ .then(() => cli.waitFor(/disconnect/))
+ .then(() => {
+ t.match(
+ cli.output,
+ 'Waiting for the debugger to disconnect',
+ 'the child was done');
+ })
+ .then(() => {
+ // On windows the socket won't close by itself
+ return cli.command('kill');
+ })
+ .then(() => cli.command('cont'))
+ .then(() => cli.waitFor(/start the app/))
+ .then(() => {
+ t.match(cli.output, 'Use `run` to start the app again');
+ })
+ .then(() => cli.stepCommand('run'))
+ .then(() => cli.waitForInitialBreak())
+ .then(() => cli.waitForPrompt())
+ .then(() => {
+ t.match(
+ cli.output,
+ `break in ${script}:1`,
+ 'is back at the beginning');
+ })
+ .then(() => cli.stepCommand('n'))
+ .then(() => {
+ t.match(
+ cli.output,
+ `break in ${script}:2`,
+ 'steps to the 2nd line');
+ })
+ .then(() => cli.stepCommand('restart'))
+ .then(() => cli.waitForInitialBreak())
+ .then(() => {
+ t.match(
+ cli.output,
+ `break in ${script}:1`,
+ 'is back at the beginning');
+ })
+ .then(() => cli.command('kill'))
+ .then(() => cli.command('cont'))
+ .then(() => cli.waitFor(/start the app/))
+ .then(() => {
+ t.match(cli.output, 'Use `run` to start the app again');
+ })
+ .then(() => cli.stepCommand('run'))
+ .then(() => cli.waitForInitialBreak())
+ .then(() => cli.waitForPrompt())
+ .then(() => {
+ t.match(
+ cli.output,
+ `break in ${script}:1`,
+ 'is back at the beginning');
+ })
+ .then(() => cli.quit())
+ .then(null, onFatal);
+});
diff --git a/deps/node/deps/node-inspect/test/cli/low-level.test.js b/deps/node/deps/node-inspect/test/cli/low-level.test.js
new file mode 100644
index 00000000..77e3fc2b
--- /dev/null
+++ b/deps/node/deps/node-inspect/test/cli/low-level.test.js
@@ -0,0 +1,34 @@
+'use strict';
+const { test } = require('tap');
+
+const startCLI = require('./start-cli');
+
+test('Debugger agent direct access', (t) => {
+ const cli = startCLI(['examples/three-lines.js']);
+ const scriptPattern = /^\* (\d+): examples(?:\/|\\)three-lines.js/;
+
+ function onFatal(error) {
+ cli.quit();
+ throw error;
+ }
+
+ return cli.waitForInitialBreak()
+ .then(() => cli.waitForPrompt())
+ .then(() => cli.command('scripts'))
+ .then(() => {
+ const [, scriptId] = cli.output.match(scriptPattern);
+ return cli.command(
+ `Debugger.getScriptSource({ scriptId: '${scriptId}' })`
+ );
+ })
+ .then(() => {
+ t.match(
+ cli.output,
+ /scriptSource: '\(function \(/);
+ t.match(
+ cli.output,
+ /let x = 1;/);
+ })
+ .then(() => cli.quit())
+ .then(null, onFatal);
+});
diff --git a/deps/node/deps/node-inspect/test/cli/pid.test.js b/deps/node/deps/node-inspect/test/cli/pid.test.js
new file mode 100644
index 00000000..15d7fdea
--- /dev/null
+++ b/deps/node/deps/node-inspect/test/cli/pid.test.js
@@ -0,0 +1,52 @@
+'use strict';
+const { spawn } = require('child_process');
+const Path = require('path');
+
+const { test } = require('tap');
+
+const startCLI = require('./start-cli');
+
+function launchTarget(...args) {
+ const childProc = spawn(process.execPath, args);
+ return Promise.resolve(childProc);
+}
+
+// process.debugPort is our proxy for "the version of node used to run this
+// test suite doesn't support SIGUSR1 for enabling --inspect for a process".
+const defaultsToOldProtocol = process.debugPort === 5858;
+
+test('examples/alive.js', { skip: defaultsToOldProtocol }, (t) => {
+ const script = Path.join('examples', 'alive.js');
+ let cli = null;
+ let target = null;
+
+ function cleanup(error) {
+ if (cli) {
+ cli.quit();
+ cli = null;
+ }
+ if (target) {
+ target.kill();
+ target = null;
+ }
+ if (error) throw error;
+ }
+
+ return launchTarget(script)
+ .then((childProc) => {
+ target = childProc;
+ cli = startCLI(['-p', `${target.pid}`]);
+ return cli.waitForPrompt();
+ })
+ .then(() => cli.command('sb("alive.js", 3)'))
+ .then(() => cli.waitFor(/break/))
+ .then(() => cli.waitForPrompt())
+ .then(() => {
+ t.match(
+ cli.output,
+ '> 3 ++x;',
+ 'marks the 3rd line');
+ })
+ .then(() => cleanup())
+ .then(null, cleanup);
+});
diff --git a/deps/node/deps/node-inspect/test/cli/preserve-breaks.test.js b/deps/node/deps/node-inspect/test/cli/preserve-breaks.test.js
new file mode 100644
index 00000000..94f61408
--- /dev/null
+++ b/deps/node/deps/node-inspect/test/cli/preserve-breaks.test.js
@@ -0,0 +1,64 @@
+'use strict';
+const Path = require('path');
+
+const { test } = require('tap');
+
+const startCLI = require('./start-cli');
+
+test('run after quit / restart', (t) => {
+ const script = Path.join('examples', 'three-lines.js');
+ const cli = startCLI([script]);
+
+ function onFatal(error) {
+ cli.quit();
+ throw error;
+ }
+
+ return cli.waitForInitialBreak()
+ .then(() => cli.waitForPrompt())
+ .then(() => cli.command('breakpoints'))
+ .then(() => {
+ t.match(cli.output, 'No breakpoints yet');
+ })
+ .then(() => cli.command('sb(2)'))
+ .then(() => cli.command('sb(3)'))
+ .then(() => cli.command('breakpoints'))
+ .then(() => {
+ t.match(cli.output, `#0 ${script}:2`);
+ t.match(cli.output, `#1 ${script}:3`);
+ })
+ .then(() => cli.stepCommand('c')) // hit line 2
+ .then(() => cli.stepCommand('c')) // hit line 3
+ .then(() => {
+ t.match(cli.output, `break in ${script}:3`);
+ })
+ .then(() => cli.command('restart'))
+ .then(() => cli.waitForInitialBreak())
+ .then(() => {
+ t.match(cli.output, `break in ${script}:1`);
+ })
+ .then(() => cli.stepCommand('c'))
+ .then(() => {
+ t.match(cli.output, `break in ${script}:2`);
+ })
+ .then(() => cli.stepCommand('c'))
+ .then(() => {
+ t.match(cli.output, `break in ${script}:3`);
+ })
+ .then(() => cli.command('breakpoints'))
+ .then(() => {
+ if (process.platform === 'aix') {
+ // TODO: There is a known issue on AIX where the breakpoints aren't
+ // properly resolved yet when we reach this point.
+ // Eventually that should be figured out but for now we don't want
+ // to fail builds because of it.
+ t.match(cli.output, /#0 [^\n]+three-lines\.js\$?:2/);
+ t.match(cli.output, /#1 [^\n]+three-lines\.js\$?:3/);
+ } else {
+ t.match(cli.output, `#0 ${script}:2`);
+ t.match(cli.output, `#1 ${script}:3`);
+ }
+ })
+ .then(() => cli.quit())
+ .then(null, onFatal);
+});
diff --git a/deps/node/deps/node-inspect/test/cli/profile.test.js b/deps/node/deps/node-inspect/test/cli/profile.test.js
new file mode 100644
index 00000000..0f900c5a
--- /dev/null
+++ b/deps/node/deps/node-inspect/test/cli/profile.test.js
@@ -0,0 +1,32 @@
+'use strict';
+const { test } = require('tap');
+
+const startCLI = require('./start-cli');
+
+function delay(ms) {
+ return new Promise((resolve) => setTimeout(resolve, ms));
+}
+
+test('profiles', (t) => {
+ const cli = startCLI(['examples/empty.js']);
+
+ function onFatal(error) {
+ cli.quit();
+ throw error;
+ }
+
+ return cli.waitForInitialBreak()
+ .then(() => cli.waitForPrompt())
+ .then(() => cli.command('exec console.profile()'))
+ .then(() => {
+ t.match(cli.output, 'undefined');
+ })
+ .then(() => cli.command('exec console.profileEnd()'))
+ .then(() => delay(250))
+ .then(() => {
+ t.match(cli.output, 'undefined');
+ t.match(cli.output, 'Captured new CPU profile.');
+ })
+ .then(() => cli.quit())
+ .then(null, onFatal);
+});
diff --git a/deps/node/deps/node-inspect/test/cli/scripts.test.js b/deps/node/deps/node-inspect/test/cli/scripts.test.js
new file mode 100644
index 00000000..1546b804
--- /dev/null
+++ b/deps/node/deps/node-inspect/test/cli/scripts.test.js
@@ -0,0 +1,43 @@
+'use strict';
+const Path = require('path');
+
+const { test } = require('tap');
+
+const startCLI = require('./start-cli');
+
+test('list scripts', (t) => {
+ const script = Path.join('examples', 'three-lines.js');
+ const cli = startCLI([script]);
+
+ function onFatal(error) {
+ cli.quit();
+ throw error;
+ }
+
+ return cli.waitForInitialBreak()
+ .then(() => cli.waitForPrompt())
+ .then(() => cli.command('scripts'))
+ .then(() => {
+ t.match(
+ cli.output,
+ /^\* \d+: examples(?:\/|\\)three-lines\.js/,
+ 'lists the user script');
+ t.notMatch(
+ cli.output,
+ /\d+: module\.js <native>/,
+ 'omits node-internal scripts');
+ })
+ .then(() => cli.command('scripts(true)'))
+ .then(() => {
+ t.match(
+ cli.output,
+ /\* \d+: examples(?:\/|\\)three-lines\.js/,
+ 'lists the user script');
+ t.match(
+ cli.output,
+ /\d+: module\.js <native>/,
+ 'includes node-internal scripts');
+ })
+ .then(() => cli.quit())
+ .then(null, onFatal);
+});
diff --git a/deps/node/deps/node-inspect/test/cli/start-cli.js b/deps/node/deps/node-inspect/test/cli/start-cli.js
new file mode 100644
index 00000000..b086dcd8
--- /dev/null
+++ b/deps/node/deps/node-inspect/test/cli/start-cli.js
@@ -0,0 +1,156 @@
+'use strict';
+const spawn = require('child_process').spawn;
+
+// This allows us to keep the helper inside of `test/` without tap warning
+// about "pending" test files.
+const tap = require('tap');
+tap.test('startCLI', (t) => t.end());
+
+const CLI =
+ process.env.USE_EMBEDDED_NODE_INSPECT === '1' ?
+ 'inspect' :
+ require.resolve('../../cli.js');
+
+const BREAK_MESSAGE = new RegExp('(?:' + [
+ 'assert', 'break', 'break on start', 'debugCommand',
+ 'exception', 'other', 'promiseRejection',
+].join('|') + ') in', 'i');
+
+function startCLI(args, flags = []) {
+ const child = spawn(process.execPath, [...flags, CLI, ...args]);
+ let isFirstStdoutChunk = true;
+
+ const outputBuffer = [];
+ function bufferOutput(chunk) {
+ if (isFirstStdoutChunk) {
+ isFirstStdoutChunk = false;
+ outputBuffer.push(chunk.replace(/^debug>\s*/, ''));
+ } else {
+ outputBuffer.push(chunk);
+ }
+ }
+
+ function getOutput() {
+ return outputBuffer.join('').toString()
+ .replace(/^[^\n]*?[\b]/mg, '');
+ }
+
+ child.stdout.setEncoding('utf8');
+ child.stdout.on('data', bufferOutput);
+ child.stderr.setEncoding('utf8');
+ child.stderr.on('data', bufferOutput);
+
+ if (process.env.VERBOSE === '1') {
+ child.stdout.pipe(process.stderr);
+ child.stderr.pipe(process.stderr);
+ }
+
+ return {
+ flushOutput() {
+ const output = this.output;
+ outputBuffer.length = 0;
+ return output;
+ },
+
+ waitFor(pattern, timeout = 2000) {
+ function checkPattern(str) {
+ if (Array.isArray(pattern)) {
+ return pattern.every((p) => p.test(str));
+ }
+ return pattern.test(str);
+ }
+
+ return new Promise((resolve, reject) => {
+ function checkOutput() {
+ if (checkPattern(getOutput())) {
+ tearDown(); // eslint-disable-line no-use-before-define
+ resolve();
+ }
+ }
+
+ function onChildExit() {
+ tearDown(); // eslint-disable-line no-use-before-define
+ reject(new Error(
+ `Child quit while waiting for ${pattern}; found: ${this.output}`));
+ }
+
+ const timer = setTimeout(() => {
+ tearDown(); // eslint-disable-line no-use-before-define
+ reject(new Error([
+ `Timeout (${timeout}) while waiting for ${pattern}`,
+ `found: ${this.output}`,
+ ].join('; ')));
+ }, timeout);
+
+ function tearDown() {
+ clearTimeout(timer);
+ child.stdout.removeListener('data', checkOutput);
+ child.removeListener('exit', onChildExit);
+ }
+
+ child.on('exit', onChildExit);
+ child.stdout.on('data', checkOutput);
+ checkOutput();
+ });
+ },
+
+ waitForPrompt(timeout = 2000) {
+ return this.waitFor(/>\s+$/, timeout);
+ },
+
+ waitForInitialBreak(timeout = 2000) {
+ return this.waitFor(/break (?:on start )?in/i, timeout)
+ .then(() => {
+ if (/Break on start/.test(this.output)) {
+ return this.command('next', false)
+ .then(() => this.waitFor(/break in/, timeout));
+ }
+ });
+ },
+
+ ctrlC() {
+ return this.command('.interrupt');
+ },
+
+ get output() {
+ return getOutput();
+ },
+
+ get rawOutput() {
+ return outputBuffer.join('').toString();
+ },
+
+ parseSourceLines() {
+ return getOutput().split('\n')
+ .map((line) => line.match(/(?:\*|>)?\s*(\d+)/))
+ .filter((match) => match !== null)
+ .map((match) => +match[1]);
+ },
+
+ command(input, flush = true) {
+ if (flush) {
+ this.flushOutput();
+ }
+ child.stdin.write(input);
+ child.stdin.write('\n');
+ return this.waitForPrompt();
+ },
+
+ stepCommand(input) {
+ this.flushOutput();
+ child.stdin.write(input);
+ child.stdin.write('\n');
+ return this
+ .waitFor(BREAK_MESSAGE)
+ .then(() => this.waitForPrompt());
+ },
+
+ quit() {
+ return new Promise((resolve) => {
+ child.stdin.end();
+ child.on('exit', resolve);
+ });
+ },
+ };
+}
+module.exports = startCLI;
diff --git a/deps/node/deps/node-inspect/test/cli/use-strict.test.js b/deps/node/deps/node-inspect/test/cli/use-strict.test.js
new file mode 100644
index 00000000..780802a5
--- /dev/null
+++ b/deps/node/deps/node-inspect/test/cli/use-strict.test.js
@@ -0,0 +1,27 @@
+'use strict';
+const Path = require('path');
+
+const { test } = require('tap');
+
+const startCLI = require('./start-cli');
+
+test('for whiles that starts with strict directive', (t) => {
+ const script = Path.join('examples', 'use-strict.js');
+ const cli = startCLI([script]);
+
+ function onFatal(error) {
+ cli.quit();
+ throw error;
+ }
+
+ return cli.waitForInitialBreak()
+ .then(() => cli.waitForPrompt())
+ .then(() => {
+ t.match(
+ cli.output,
+ /break in [^:]+:(?:1|2)[^\d]/,
+ 'pauses either on strict directive or first "real" line');
+ })
+ .then(() => cli.quit())
+ .then(null, onFatal);
+});
diff --git a/deps/node/deps/node-inspect/test/cli/watchers.test.js b/deps/node/deps/node-inspect/test/cli/watchers.test.js
new file mode 100644
index 00000000..46bcde19
--- /dev/null
+++ b/deps/node/deps/node-inspect/test/cli/watchers.test.js
@@ -0,0 +1,42 @@
+'use strict';
+const { test } = require('tap');
+
+const startCLI = require('./start-cli');
+
+test('stepping through breakpoints', (t) => {
+ const cli = startCLI(['examples/break.js']);
+
+ function onFatal(error) {
+ cli.quit();
+ throw error;
+ }
+
+ return cli.waitForInitialBreak()
+ .then(() => cli.waitForPrompt())
+ .then(() => cli.command('watch("x")'))
+ .then(() => cli.command('watch("\\"Hello\\"")'))
+ .then(() => cli.command('watch("42")'))
+ .then(() => cli.command('watch("NaN")'))
+ .then(() => cli.command('watch("true")'))
+ .then(() => cli.command('watch("[1, 2]")'))
+ .then(() => cli.command('watch("process.env")'))
+ .then(() => cli.command('watchers'))
+ .then(() => {
+ t.match(cli.output, 'x is not defined');
+ })
+ .then(() => cli.command('unwatch("42")'))
+ .then(() => cli.stepCommand('n'))
+ .then(() => {
+ t.match(cli.output, '0: x = 10');
+ t.match(cli.output, '1: "Hello" = \'Hello\'');
+ t.match(cli.output, '2: NaN = NaN');
+ t.match(cli.output, '3: true = true');
+ t.match(cli.output, '4: [1, 2] = [ 1, 2 ]');
+ t.match(
+ cli.output,
+ /5: process\.env =\n\s+\{[\s\S]+,\n\s+\.\.\. \}/,
+ 'shows "..." for process.env');
+ })
+ .then(() => cli.quit())
+ .then(null, onFatal);
+});
diff --git a/deps/node/deps/node-inspect/tools/eslint-rules/align-function-arguments.js b/deps/node/deps/node-inspect/tools/eslint-rules/align-function-arguments.js
new file mode 100644
index 00000000..01555248
--- /dev/null
+++ b/deps/node/deps/node-inspect/tools/eslint-rules/align-function-arguments.js
@@ -0,0 +1,76 @@
+/**
+ * @fileoverview Align arguments in multiline function calls
+ * @author Rich Trott
+ */
+'use strict';
+
+//------------------------------------------------------------------------------
+// Rule Definition
+//------------------------------------------------------------------------------
+
+function checkArgumentAlignment(context, node) {
+
+ function isNodeFirstInLine(node, byEndLocation) {
+ const firstToken = byEndLocation === true ? context.getLastToken(node, 1) :
+ context.getTokenBefore(node);
+ const startLine = byEndLocation === true ? node.loc.end.line :
+ node.loc.start.line;
+ const endLine = firstToken ? firstToken.loc.end.line : -1;
+
+ return startLine !== endLine;
+ }
+
+ if (node.arguments.length === 0)
+ return;
+
+ var msg = '';
+ const first = node.arguments[0];
+ var currentLine = first.loc.start.line;
+ const firstColumn = first.loc.start.column;
+
+ const ignoreTypes = [
+ 'ArrowFunctionExpression',
+ 'FunctionExpression',
+ 'ObjectExpression',
+ ];
+
+ const args = node.arguments;
+
+ // For now, don't bother trying to validate potentially complicating things
+ // like closures. Different people will have very different ideas and it's
+ // probably best to implement configuration options.
+ if (args.some((node) => { return ignoreTypes.indexOf(node.type) !== -1; })) {
+ return;
+ }
+
+ if (!isNodeFirstInLine(node)) {
+ return;
+ }
+
+ var misaligned;
+
+ args.slice(1).forEach((argument) => {
+ if (!misaligned) {
+ if (argument.loc.start.line === currentLine + 1) {
+ if (argument.loc.start.column !== firstColumn) {
+ if (isNodeFirstInLine(argument)) {
+ msg = 'Function argument in column ' +
+ `${argument.loc.start.column + 1}, ` +
+ `expected in ${firstColumn + 1}`;
+ misaligned = argument;
+ }
+ }
+ }
+ }
+ currentLine = argument.loc.start.line;
+ });
+
+ if (msg)
+ context.report(misaligned, msg);
+}
+
+module.exports = function(context) {
+ return {
+ 'CallExpression': (node) => checkArgumentAlignment(context, node)
+ };
+};
diff --git a/deps/node/deps/node-inspect/tools/eslint-rules/align-multiline-assignment.js b/deps/node/deps/node-inspect/tools/eslint-rules/align-multiline-assignment.js
new file mode 100644
index 00000000..80896b5e
--- /dev/null
+++ b/deps/node/deps/node-inspect/tools/eslint-rules/align-multiline-assignment.js
@@ -0,0 +1,68 @@
+/**
+ * @fileoverview Align multiline variable assignments
+ * @author Rich Trott
+ */
+'use strict';
+
+//------------------------------------------------------------------------------
+// Rule Definition
+//------------------------------------------------------------------------------
+function getBinaryExpressionStarts(binaryExpression, starts) {
+ function getStartsFromOneSide(side, starts) {
+ starts.push(side.loc.start);
+ if (side.type === 'BinaryExpression') {
+ starts = getBinaryExpressionStarts(side, starts);
+ }
+ return starts;
+ }
+
+ starts = getStartsFromOneSide(binaryExpression.left, starts);
+ starts = getStartsFromOneSide(binaryExpression.right, starts);
+ return starts;
+}
+
+function checkExpressionAlignment(expression) {
+ if (!expression)
+ return;
+
+ var msg = '';
+
+ switch (expression.type) {
+ case 'BinaryExpression':
+ var starts = getBinaryExpressionStarts(expression, []);
+ var startLine = starts[0].line;
+ const startColumn = starts[0].column;
+ starts.forEach((loc) => {
+ if (loc.line > startLine) {
+ startLine = loc.line;
+ if (loc.column !== startColumn) {
+ msg = 'Misaligned multiline assignment';
+ }
+ }
+ });
+ break;
+ }
+ return msg;
+}
+
+function testAssignment(context, node) {
+ const msg = checkExpressionAlignment(node.right);
+ if (msg)
+ context.report(node, msg);
+}
+
+function testDeclaration(context, node) {
+ node.declarations.forEach((declaration) => {
+ const msg = checkExpressionAlignment(declaration.init);
+ // const start = declaration.init.loc.start;
+ if (msg)
+ context.report(node, msg);
+ });
+}
+
+module.exports = function(context) {
+ return {
+ 'AssignmentExpression': (node) => testAssignment(context, node),
+ 'VariableDeclaration': (node) => testDeclaration(context, node)
+ };
+};
diff --git a/deps/node/deps/node-inspect/tools/eslint-rules/assert-fail-single-argument.js b/deps/node/deps/node-inspect/tools/eslint-rules/assert-fail-single-argument.js
new file mode 100644
index 00000000..4ce79023
--- /dev/null
+++ b/deps/node/deps/node-inspect/tools/eslint-rules/assert-fail-single-argument.js
@@ -0,0 +1,30 @@
+/**
+ * @fileoverview Prohibit use of a single argument only in `assert.fail()`. It
+ * is almost always an error.
+ * @author Rich Trott
+ */
+'use strict';
+
+//------------------------------------------------------------------------------
+// Rule Definition
+//------------------------------------------------------------------------------
+
+const msg = 'assert.fail() message should be third argument';
+
+function isAssert(node) {
+ return node.callee.object && node.callee.object.name === 'assert';
+}
+
+function isFail(node) {
+ return node.callee.property && node.callee.property.name === 'fail';
+}
+
+module.exports = function(context) {
+ return {
+ 'CallExpression': function(node) {
+ if (isAssert(node) && isFail(node) && node.arguments.length === 1) {
+ context.report(node, msg);
+ }
+ }
+ };
+};
diff --git a/deps/node/deps/node-inspect/tools/eslint-rules/buffer-constructor.js b/deps/node/deps/node-inspect/tools/eslint-rules/buffer-constructor.js
new file mode 100644
index 00000000..938598e8
--- /dev/null
+++ b/deps/node/deps/node-inspect/tools/eslint-rules/buffer-constructor.js
@@ -0,0 +1,25 @@
+/**
+ * @fileoverview Require use of new Buffer constructor methods in lib
+ * @author James M Snell
+ */
+'use strict';
+
+//------------------------------------------------------------------------------
+// Rule Definition
+//------------------------------------------------------------------------------
+const msg = 'Use of the Buffer() constructor has been deprecated. ' +
+ 'Please use either Buffer.alloc(), Buffer.allocUnsafe(), ' +
+ 'or Buffer.from()';
+
+function test(context, node) {
+ if (node.callee.name === 'Buffer') {
+ context.report(node, msg);
+ }
+}
+
+module.exports = function(context) {
+ return {
+ 'NewExpression': (node) => test(context, node),
+ 'CallExpression': (node) => test(context, node)
+ };
+};
diff --git a/deps/node/deps/node-inspect/tools/eslint-rules/new-with-error.js b/deps/node/deps/node-inspect/tools/eslint-rules/new-with-error.js
new file mode 100644
index 00000000..655f34bf
--- /dev/null
+++ b/deps/node/deps/node-inspect/tools/eslint-rules/new-with-error.js
@@ -0,0 +1,31 @@
+/**
+ * @fileoverview Require `throw new Error()` rather than `throw Error()`
+ * @author Rich Trott
+ */
+'use strict';
+
+//------------------------------------------------------------------------------
+// Rule Definition
+//------------------------------------------------------------------------------
+
+module.exports = function(context) {
+
+ var errorList = context.options.length !== 0 ? context.options : ['Error'];
+
+ return {
+ 'ThrowStatement': function(node) {
+ if (node.argument.type === 'CallExpression' &&
+ errorList.indexOf(node.argument.callee.name) !== -1) {
+ context.report(node, 'Use new keyword when throwing.');
+ }
+ }
+ };
+};
+
+module.exports.schema = {
+ 'type': 'array',
+ 'additionalItems': {
+ 'type': 'string'
+ },
+ 'uniqueItems': true
+};
diff --git a/deps/node/deps/node-inspect/tools/eslint-rules/no-let-in-for-declaration.js b/deps/node/deps/node-inspect/tools/eslint-rules/no-let-in-for-declaration.js
new file mode 100644
index 00000000..8b1a6783
--- /dev/null
+++ b/deps/node/deps/node-inspect/tools/eslint-rules/no-let-in-for-declaration.js
@@ -0,0 +1,46 @@
+/**
+ * @fileoverview Prohibit the use of `let` as the loop variable
+ * in the initialization of for, and the left-hand
+ * iterator in forIn and forOf loops.
+ *
+ * @author Jessica Quynh Tran
+ */
+
+'use strict';
+
+//------------------------------------------------------------------------------
+// Rule Definition
+//------------------------------------------------------------------------------
+
+module.exports = {
+ create(context) {
+
+ const msg = 'Use of `let` as the loop variable in a for-loop is ' +
+ 'not recommended. Please use `var` instead.';
+
+ /**
+ * Report function to test if the for-loop is declared using `let`.
+ */
+ function testForLoop(node) {
+ if (node.init && node.init.kind === 'let') {
+ context.report(node.init, msg);
+ }
+ }
+
+ /**
+ * Report function to test if the for-in or for-of loop
+ * is declared using `let`.
+ */
+ function testForInOfLoop(node) {
+ if (node.left && node.left.kind === 'let') {
+ context.report(node.left, msg);
+ }
+ }
+
+ return {
+ 'ForStatement': testForLoop,
+ 'ForInStatement': testForInOfLoop,
+ 'ForOfStatement': testForInOfLoop
+ };
+ }
+};
diff --git a/deps/node/deps/node-inspect/tools/eslint-rules/prefer-assert-methods.js b/deps/node/deps/node-inspect/tools/eslint-rules/prefer-assert-methods.js
new file mode 100644
index 00000000..fa345eb7
--- /dev/null
+++ b/deps/node/deps/node-inspect/tools/eslint-rules/prefer-assert-methods.js
@@ -0,0 +1,39 @@
+'use strict';
+
+function isAssert(node) {
+ return node.expression &&
+ node.expression.type === 'CallExpression' &&
+ node.expression.callee &&
+ node.expression.callee.name === 'assert';
+}
+
+function getFirstArg(expression) {
+ return expression.arguments && expression.arguments[0];
+}
+
+function parseError(method, op) {
+ return `'assert.${method}' should be used instead of '${op}'`;
+}
+
+const preferedAssertMethod = {
+ '===': 'strictEqual',
+ '!==': 'notStrictEqual',
+ '==': 'equal',
+ '!=': 'notEqual'
+};
+
+module.exports = function(context) {
+ return {
+ ExpressionStatement(node) {
+ if (isAssert(node)) {
+ const arg = getFirstArg(node.expression);
+ if (arg && arg.type === 'BinaryExpression') {
+ const assertMethod = preferedAssertMethod[arg.operator];
+ if (assertMethod) {
+ context.report(node, parseError(assertMethod, arg.operator));
+ }
+ }
+ }
+ }
+ };
+};
diff --git a/deps/node/deps/node-inspect/tools/eslint-rules/require-buffer.js b/deps/node/deps/node-inspect/tools/eslint-rules/require-buffer.js
new file mode 100644
index 00000000..c9818cb7
--- /dev/null
+++ b/deps/node/deps/node-inspect/tools/eslint-rules/require-buffer.js
@@ -0,0 +1,19 @@
+'use strict';
+
+module.exports = function(context) {
+ function flagIt(reference) {
+ const msg = 'Use const Buffer = require(\'buffer\').Buffer; ' +
+ 'at the beginning of this file';
+ context.report(reference.identifier, msg);
+ }
+
+ return {
+ 'Program:exit': function() {
+ const globalScope = context.getScope();
+ const variable = globalScope.set.get('Buffer');
+ if (variable) {
+ variable.references.forEach(flagIt);
+ }
+ }
+ };
+};
diff --git a/deps/node/deps/node-inspect/tools/eslint-rules/required-modules.js b/deps/node/deps/node-inspect/tools/eslint-rules/required-modules.js
new file mode 100644
index 00000000..3e4a8e8a
--- /dev/null
+++ b/deps/node/deps/node-inspect/tools/eslint-rules/required-modules.js
@@ -0,0 +1,99 @@
+/**
+ * @fileoverview Require usage of specified node modules.
+ * @author Rich Trott
+ */
+'use strict';
+
+var path = require('path');
+
+//------------------------------------------------------------------------------
+// Rule Definition
+//------------------------------------------------------------------------------
+
+module.exports = function(context) {
+ // trim required module names
+ var requiredModules = context.options;
+
+ var foundModules = [];
+
+ // if no modules are required we don't need to check the CallExpressions
+ if (requiredModules.length === 0) {
+ return {};
+ }
+
+ /**
+ * Function to check if a node is a string literal.
+ * @param {ASTNode} node The node to check.
+ * @returns {boolean} If the node is a string literal.
+ */
+ function isString(node) {
+ return node && node.type === 'Literal' && typeof node.value === 'string';
+ }
+
+ /**
+ * Function to check if a node is a require call.
+ * @param {ASTNode} node The node to check.
+ * @returns {boolean} If the node is a require call.
+ */
+ function isRequireCall(node) {
+ return node.callee.type === 'Identifier' && node.callee.name === 'require';
+ }
+
+ /**
+ * Function to check if a node has an argument that is a required module and
+ * return its name.
+ * @param {ASTNode} node The node to check
+ * @returns {undefined|String} required module name or undefined
+ */
+ function getRequiredModuleName(node) {
+ var moduleName;
+
+ // node has arguments and first argument is string
+ if (node.arguments.length && isString(node.arguments[0])) {
+ var argValue = path.basename(node.arguments[0].value.trim());
+
+ // check if value is in required modules array
+ if (requiredModules.indexOf(argValue) !== -1) {
+ moduleName = argValue;
+ }
+ }
+
+ return moduleName;
+ }
+
+ return {
+ 'CallExpression': function(node) {
+ if (isRequireCall(node)) {
+ var requiredModuleName = getRequiredModuleName(node);
+
+ if (requiredModuleName) {
+ foundModules.push(requiredModuleName);
+ }
+ }
+ },
+ 'Program:exit': function(node) {
+ if (foundModules.length < requiredModules.length) {
+ var missingModules = requiredModules.filter(
+ function(module) {
+ return foundModules.indexOf(module === -1);
+ }
+ );
+ missingModules.forEach(function(moduleName) {
+ context.report(
+ node,
+ 'Mandatory module "{{moduleName}}" must be loaded.',
+ { moduleName: moduleName }
+ );
+ });
+ }
+ }
+ };
+};
+
+module.exports.schema = {
+ 'type': 'array',
+ 'additionalItems': {
+ 'type': 'string'
+ },
+ 'uniqueItems': true
+};