diff options
author | Rich Trott <rtrott@gmail.com> | 2021-04-09 09:55:45 +0300 |
---|---|---|
committer | Richard Lau <rlau@redhat.com> | 2021-07-20 14:11:16 +0300 |
commit | a62826bbe69b86dc3c4cf59929f5d7c1b0984e44 (patch) | |
tree | d81900952244c3b4443935a5cb1ff6f27a2b13e1 /deps | |
parent | 193ea8fd912758879824f0b797fed847999e4826 (diff) |
test,debugger: migrate node-inspect tests to core
Migrate the node-inspect tests to core (where node-inspect code now
lives) and remove node-inspect from deps directory.
PR-URL: https://github.com/nodejs/node/pull/38161
Backport-PR-URL: https://github.com/nodejs/node/pull/38858
Refs: https://github.com/nodejs/node/discussions/36481
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Jan Krems <jan.krems@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Stephen Belanger <admin@stephenbelanger.com>
Reviewed-By: Gerhard Stöbich <deb2001-github@yahoo.de>
Reviewed-By: Michaël Zasso <targos@protonmail.com>
Diffstat (limited to 'deps')
53 files changed, 0 insertions, 4380 deletions
diff --git a/deps/node-inspect/.editorconfig b/deps/node-inspect/.editorconfig deleted file mode 100644 index beffa3084e7..00000000000 --- a/deps/node-inspect/.editorconfig +++ /dev/null @@ -1,11 +0,0 @@ -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-inspect/.eslintrc b/deps/node-inspect/.eslintrc deleted file mode 100644 index b6d45aa4996..00000000000 --- a/deps/node-inspect/.eslintrc +++ /dev/null @@ -1,147 +0,0 @@ -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-inspect/.github/workflows/ci.yml b/deps/node-inspect/.github/workflows/ci.yml deleted file mode 100644 index 968316a3477..00000000000 --- a/deps/node-inspect/.github/workflows/ci.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: Node CI - -on: [push, pull_request] - -jobs: - build: - - runs-on: ubuntu-latest - - strategy: - fail-fast: false - matrix: - node-version: - # See https://github.com/nodejs/node-inspect/pull/78 - # - 10.x - - 12.x - - 13.x - - steps: - - uses: actions/checkout@v2 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - name: npm install, build, and test - run: | - npm install - npm run build --if-present - npm test - env: - CI: true diff --git a/deps/node-inspect/.gitignore b/deps/node-inspect/.gitignore deleted file mode 100644 index 72e2c8c1801..00000000000 --- a/deps/node-inspect/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules/ -npm-debug.log -/tmp -/.vs diff --git a/deps/node-inspect/.npmrc b/deps/node-inspect/.npmrc deleted file mode 100644 index b7c8444fee5..00000000000 --- a/deps/node-inspect/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -registry=https://registry.npmjs.org -package-lock=false diff --git a/deps/node-inspect/.travis.yml b/deps/node-inspect/.travis.yml deleted file mode 100644 index 07418a91eb7..00000000000 --- a/deps/node-inspect/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -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-inspect/CHANGELOG.md b/deps/node-inspect/CHANGELOG.md deleted file mode 100644 index 73aeb4df93f..00000000000 --- a/deps/node-inspect/CHANGELOG.md +++ /dev/null @@ -1,296 +0,0 @@ -### 1.11.6 - -* fix: replace the deprecated "repl.cli" with "repl" - **[@oyyd](https://github.com/oyyd)** [#66](https://github.com/nodejs/node-inspect/pull/66) - - [`5c1d771`](https://github.com/nodejs/node-inspect/commit/5c1d7716523b73e26f98f4f594ee34b7daa920a0) **fix:** replace the deprecated "repl.cli" with "repl" - see: [26260](Refs: https://github.com/nodejs/node/pull/26260) -* Address regressions due to changes in node - **[@jkrems](https://github.com/jkrems)** [#67](https://github.com/nodejs/node-inspect/pull/67) - - [`5b3511e`](https://github.com/nodejs/node-inspect/commit/5b3511ef21d0eba8304d8b2fed33f33aae22f308) **fix:** Address regressions due to changes in node - - -### 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-inspect/CONTRIBUTING.md b/deps/node-inspect/CONTRIBUTING.md deleted file mode 100644 index 012d2947146..00000000000 --- a/deps/node-inspect/CONTRIBUTING.md +++ /dev/null @@ -1,181 +0,0 @@ -# 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-inspect/GOVERNANCE.md b/deps/node-inspect/GOVERNANCE.md deleted file mode 100644 index 20e333a247c..00000000000 --- a/deps/node-inspect/GOVERNANCE.md +++ /dev/null @@ -1,4 +0,0 @@ -# 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-inspect/LICENSE b/deps/node-inspect/LICENSE deleted file mode 100644 index d8d7f9437db..00000000000 --- a/deps/node-inspect/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -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-inspect/README.md b/deps/node-inspect/README.md deleted file mode 100644 index b52cc188a62..00000000000 --- a/deps/node-inspect/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# `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-inspect/appveyor.yml b/deps/node-inspect/appveyor.yml deleted file mode 100644 index c25a2d013aa..00000000000 --- a/deps/node-inspect/appveyor.yml +++ /dev/null @@ -1,13 +0,0 @@ -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-inspect/cli.js b/deps/node-inspect/cli.js deleted file mode 100755 index 4856fd706c4..00000000000 --- a/deps/node-inspect/cli.js +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env node -require('./lib/cli.js'); diff --git a/deps/node-inspect/examples/alive.js b/deps/node-inspect/examples/alive.js deleted file mode 100644 index c8ad157b452..00000000000 --- a/deps/node-inspect/examples/alive.js +++ /dev/null @@ -1,5 +0,0 @@ -let x = 0; -function heartbeat() { - ++x; -} -setInterval(heartbeat, 50); diff --git a/deps/node-inspect/examples/backtrace.js b/deps/node-inspect/examples/backtrace.js deleted file mode 100644 index f18b33ea558..00000000000 --- a/deps/node-inspect/examples/backtrace.js +++ /dev/null @@ -1,30 +0,0 @@ -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-inspect/examples/break.js b/deps/node-inspect/examples/break.js deleted file mode 100644 index d5f26578814..00000000000 --- a/deps/node-inspect/examples/break.js +++ /dev/null @@ -1,16 +0,0 @@ -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-inspect/examples/cjs/index.js b/deps/node-inspect/examples/cjs/index.js deleted file mode 100644 index 0ace6d9b785..00000000000 --- a/deps/node-inspect/examples/cjs/index.js +++ /dev/null @@ -1,5 +0,0 @@ -const fourty = 40; -const { add } = require('./other'); - -const sum = add(fourty, 2); -module.exports = sum; diff --git a/deps/node-inspect/examples/cjs/other.js b/deps/node-inspect/examples/cjs/other.js deleted file mode 100644 index 44a9a439bab..00000000000 --- a/deps/node-inspect/examples/cjs/other.js +++ /dev/null @@ -1,3 +0,0 @@ -exports.add = function add(a, b) { - return a + b; -}; diff --git a/deps/node-inspect/examples/empty.js b/deps/node-inspect/examples/empty.js deleted file mode 100644 index e69de29bb2d..00000000000 --- a/deps/node-inspect/examples/empty.js +++ /dev/null diff --git a/deps/node-inspect/examples/exceptions.js b/deps/node-inspect/examples/exceptions.js deleted file mode 100644 index f57d48a48df..00000000000 --- a/deps/node-inspect/examples/exceptions.js +++ /dev/null @@ -1,10 +0,0 @@ -let error = null; -try { - throw new Error('Caught'); -} catch (e) { - error = e; -} - -if (error) { - throw new Error('Uncaught'); -} diff --git a/deps/node-inspect/examples/three-lines.js b/deps/node-inspect/examples/three-lines.js deleted file mode 100644 index c17c7c1ddcf..00000000000 --- a/deps/node-inspect/examples/three-lines.js +++ /dev/null @@ -1,3 +0,0 @@ -let x = 1; -x = x + 1; -module.exports = x; diff --git a/deps/node-inspect/examples/use-strict.js b/deps/node-inspect/examples/use-strict.js deleted file mode 100644 index 9fe4b8f3b42..00000000000 --- a/deps/node-inspect/examples/use-strict.js +++ /dev/null @@ -1,2 +0,0 @@ -'use strict'; -console.log('first real line'); diff --git a/deps/node-inspect/lib/_inspect.js b/deps/node-inspect/lib/_inspect.js deleted file mode 100644 index aac278db0a8..00000000000 --- a/deps/node-inspect/lib/_inspect.js +++ /dev/null @@ -1,371 +0,0 @@ -/* - * 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 = 9999) { - 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.pause(); - } - this.stdin.pause(); - this.paused = true; - return new Promise((resolve) => { - resolve(fn()); - }).then(() => { - this.paused = false; - if (this.repl) { - this.repl.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-inspect/lib/cli.js b/deps/node-inspect/lib/cli.js deleted file mode 100644 index a4880df2d56..00000000000 --- a/deps/node-inspect/lib/cli.js +++ /dev/null @@ -1,24 +0,0 @@ -/* - * 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-inspect/lib/internal/inspect_client.js b/deps/node-inspect/lib/internal/inspect_client.js deleted file mode 100644 index 9b8529de21a..00000000000 --- a/deps/node-inspect/lib/internal/inspect_client.js +++ /dev/null @@ -1,352 +0,0 @@ -/* - * 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-inspect/lib/internal/inspect_repl.js b/deps/node-inspect/lib/internal/inspect_repl.js deleted file mode 100644 index bfbedf66a71..00000000000 --- a/deps/node-inspect/lib/internal/inspect_repl.js +++ /dev/null @@ -1,1108 +0,0 @@ -/* - * 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 fileURLToPath = require('url').fileURLToPath; - -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 PUBLIC_BUILTINS = require('module').builtinModules; -const NATIVES = PUBLIC_BUILTINS ? process.binding('natives') : {}; -function isNativeUrl(url) { - url = url.replace(/\.js$/, ''); - if (PUBLIC_BUILTINS) { - if (url.startsWith('internal/') || PUBLIC_BUILTINS.includes(url)) - return true; - } - - return url in NATIVES || url === 'bootstrap_node'; -} - -function getRelativePath(filenameOrURL) { - const dir = Path.join(Path.resolve(), 'x').slice(0, -1); - - const filename = filenameOrURL.startsWith('file://') ? - fileURLToPath(filenameOrURL) : filenameOrURL; - - // 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 */ }) => { - if (process.env.NODE_INSPECT_RESUME_ON_START === '1' && - reason === 'Break on start') { - debuglog('Paused on start, but NODE_INSPECT_RESUME_ON_START' + - ' environment variable is set to 1, resuming'); - inspector.client.callMethod('Debugger.resume'); - return; - } - - // 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.listeners('SIGINT').slice(0); - repl.removeAllListeners('SIGINT'); - - const oldContext = repl.context; - - exitDebugRepl = () => { - // Restore all listeners - process.nextTick(() => { - listeners.forEach((listener) => { - repl.on('SIGINT', listener); - }); - }); - - // Exit debug repl - repl.eval = controlEval; - - // Swap history - history.debug = repl.history; - repl.history = history.control; - - repl.context = oldContext; - repl.setPrompt('debug> '); - repl.displayPrompt(); - - repl.removeListener('SIGINT', exitDebugRepl); - repl.removeListener('exit', exitDebugRepl); - - exitDebugRepl = null; - }; - - // Exit debug repl on SIGINT - repl.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.history; - repl.history = history.debug; - - repl.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.emit('SIGINT'); - }); - - // Init once for the initial connection - initAfterStart(); - - return repl; - }; -} -module.exports = createRepl; diff --git a/deps/node-inspect/package.json b/deps/node-inspect/package.json deleted file mode 100644 index 925fb03f21a..00000000000 --- a/deps/node-inspect/package.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "node-inspect", - "version": "2.0.0", - "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": "^6.8.0", - "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-inspect/test/cli/address.test.js b/deps/node-inspect/test/cli/address.test.js deleted file mode 100644 index b55a2d078ea..00000000000 --- a/deps/node-inspect/test/cli/address.test.js +++ /dev/null @@ -1,73 +0,0 @@ -'use strict'; -const { spawn } = require('child_process'); -const Path = require('path'); -const { test } = require('tap'); - -const startCLI = require('./start-cli'); - -// NOTE(oyyd): We might want to import this regexp from "lib/_inspect.js"? -const kDebuggerMsgReg = /Debugger listening on ws:\/\/\[?(.+?)\]?:(\d+)\//; - -function launchTarget(...args) { - const childProc = spawn(process.execPath, args); - return new Promise((resolve, reject) => { - const onExit = () => { - reject(new Error('Child process exits unexpectly')); - }; - childProc.on('exit', onExit); - childProc.stderr.setEncoding('utf8'); - let data = ''; - childProc.stderr.on('data', (chunk) => { - data += chunk; - const ret = kDebuggerMsgReg.exec(data); - childProc.removeListener('exit', onExit); - if (ret) { - resolve({ - childProc, - host: ret[1], - port: ret[2], - }); - } - }); - }); -} - -// 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('--inspect=0', script) - .then(({ childProc, host, port }) => { - target = childProc; - cli = startCLI([`${host || '127.0.0.1'}:${port}`]); - 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-inspect/test/cli/backtrace.test.js b/deps/node-inspect/test/cli/backtrace.test.js deleted file mode 100644 index 127ea56bf85..00000000000 --- a/deps/node-inspect/test/cli/backtrace.test.js +++ /dev/null @@ -1,30 +0,0 @@ -'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-inspect/test/cli/break.test.js b/deps/node-inspect/test/cli/break.test.js deleted file mode 100644 index ff71a364815..00000000000 --- a/deps/node-inspect/test/cli/break.test.js +++ /dev/null @@ -1,195 +0,0 @@ -'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.breakInfo, - { filename: script, line: 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-inspect/test/cli/exceptions.test.js b/deps/node-inspect/test/cli/exceptions.test.js deleted file mode 100644 index 69d42d0a25b..00000000000 --- a/deps/node-inspect/test/cli/exceptions.test.js +++ /dev/null @@ -1,68 +0,0 @@ -'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.breakInfo, { filename: script, line: 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.breakInfo, { filename: script, line: 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.breakInfo, { filename: script, line: 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.breakInfo, { filename: script, line: 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-inspect/test/cli/exec.test.js b/deps/node-inspect/test/cli/exec.test.js deleted file mode 100644 index acfd6e34abb..00000000000 --- a/deps/node-inspect/test/cli/exec.test.js +++ /dev/null @@ -1,77 +0,0 @@ -'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-inspect/test/cli/heap-profiler.test.js b/deps/node-inspect/test/cli/heap-profiler.test.js deleted file mode 100644 index ebd734e03cb..00000000000 --- a/deps/node-inspect/test/cli/heap-profiler.test.js +++ /dev/null @@ -1,34 +0,0 @@ -'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-inspect/test/cli/help.test.js b/deps/node-inspect/test/cli/help.test.js deleted file mode 100644 index 9f0c081bdee..00000000000 --- a/deps/node-inspect/test/cli/help.test.js +++ /dev/null @@ -1,22 +0,0 @@ -'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-inspect/test/cli/invalid-args.test.js b/deps/node-inspect/test/cli/invalid-args.test.js deleted file mode 100644 index 86428a3ec27..00000000000 --- a/deps/node-inspect/test/cli/invalid-args.test.js +++ /dev/null @@ -1,54 +0,0 @@ -'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-inspect/test/cli/launch.test.js b/deps/node-inspect/test/cli/launch.test.js deleted file mode 100644 index c4ff3d855a8..00000000000 --- a/deps/node-inspect/test/cli/launch.test.js +++ /dev/null @@ -1,196 +0,0 @@ -'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.breakInfo, - { filename: script, line: 1 }, - 'is back at the beginning'); - }) - .then(() => cli.stepCommand('n')) - .then(() => { - t.match( - cli.breakInfo, - { filename: script, line: 2 }, - 'steps to the 2nd line'); - }) - .then(() => cli.stepCommand('restart')) - .then(() => cli.waitForInitialBreak()) - .then(() => { - t.match( - cli.breakInfo, - { filename: script, line: 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.breakInfo, - { filename: script, line: 1 }, - 'is back at the beginning'); - }) - .then(() => cli.quit()) - .then(null, onFatal); -}); - -test('auto-resume on start if the environment variable is defined', (t) => { - const script = Path.join('examples', 'break.js'); - - const cli = startCLI([script], [], { - env: { NODE_INSPECT_RESUME_ON_START: '1' } - }); - - return cli.waitForInitialBreak() - .then(() => { - t.match( - cli.breakInfo, - { filename: script, line: 10 }, - 'skips to the first breakpoint'); - }) - .then(() => cli.quit()) - .then((code) => { - t.equal(code, 0, 'exits with success'); - }); -}); diff --git a/deps/node-inspect/test/cli/low-level.test.js b/deps/node-inspect/test/cli/low-level.test.js deleted file mode 100644 index 2a413598256..00000000000 --- a/deps/node-inspect/test/cli/low-level.test.js +++ /dev/null @@ -1,34 +0,0 @@ -'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:[ \n]*'(?:\(function \(|let x = 1)/); - t.match( - cli.output, - /let x = 1;/); - }) - .then(() => cli.quit()) - .then(null, onFatal); -}); diff --git a/deps/node-inspect/test/cli/pid.test.js b/deps/node-inspect/test/cli/pid.test.js deleted file mode 100644 index 15d7fdeaa5f..00000000000 --- a/deps/node-inspect/test/cli/pid.test.js +++ /dev/null @@ -1,52 +0,0 @@ -'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-inspect/test/cli/preserve-breaks.test.js b/deps/node-inspect/test/cli/preserve-breaks.test.js deleted file mode 100644 index affa3ad975c..00000000000 --- a/deps/node-inspect/test/cli/preserve-breaks.test.js +++ /dev/null @@ -1,64 +0,0 @@ -'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.breakInfo, { filename: script, line: 3 }); - }) - .then(() => cli.command('restart')) - .then(() => cli.waitForInitialBreak()) - .then(() => { - t.match(cli.breakInfo, { filename: script, line: 1 }); - }) - .then(() => cli.stepCommand('c')) - .then(() => { - t.match(cli.breakInfo, { filename: script, line: 2 }); - }) - .then(() => cli.stepCommand('c')) - .then(() => { - t.match(cli.breakInfo, { filename: script, line: 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-inspect/test/cli/profile.test.js b/deps/node-inspect/test/cli/profile.test.js deleted file mode 100644 index 0f900c5a2b0..00000000000 --- a/deps/node-inspect/test/cli/profile.test.js +++ /dev/null @@ -1,32 +0,0 @@ -'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-inspect/test/cli/scripts.test.js b/deps/node-inspect/test/cli/scripts.test.js deleted file mode 100644 index f6e3f30dcaf..00000000000 --- a/deps/node-inspect/test/cli/scripts.test.js +++ /dev/null @@ -1,43 +0,0 @@ -'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+: buffer\.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+: buffer\.js <native>/, - 'includes node-internal scripts'); - }) - .then(() => cli.quit()) - .then(null, onFatal); -}); diff --git a/deps/node-inspect/test/cli/start-cli.js b/deps/node-inspect/test/cli/start-cli.js deleted file mode 100644 index 32c666c7647..00000000000 --- a/deps/node-inspect/test/cli/start-cli.js +++ /dev/null @@ -1,177 +0,0 @@ -'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 isPreBreak(output) { - return /Break on start/.test(output) && /1 \(function \(exports/.test(output); -} - -function startCLI(args, flags = [], spawnOpts = {}) { - const child = spawn(process.execPath, [...flags, CLI, ...args], spawnOpts); - 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 (isPreBreak(this.output)) { - return this.command('next', false) - .then(() => this.waitFor(/break in/, timeout)); - } - }); - }, - - get breakInfo() { - const output = this.output; - const breakMatch = - output.match(/break (?:on start )?in ([^\n]+):(\d+)\n/i); - - if (breakMatch === null) { - throw new Error( - `Could not find breakpoint info in ${JSON.stringify(output)}`); - } - return { filename: breakMatch[1], line: +breakMatch[2] }; - }, - - 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]); - }, - - writeLine(input, flush = true) { - if (flush) { - this.flushOutput(); - } - if (process.env.VERBOSE === '1') { - process.stderr.write(`< ${input}\n`); - } - child.stdin.write(input); - child.stdin.write('\n'); - }, - - command(input, flush = true) { - this.writeLine(input, flush); - return this.waitForPrompt(); - }, - - stepCommand(input) { - this.writeLine(input, true); - 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-inspect/test/cli/use-strict.test.js b/deps/node-inspect/test/cli/use-strict.test.js deleted file mode 100644 index c6dc8f31cd8..00000000000 --- a/deps/node-inspect/test/cli/use-strict.test.js +++ /dev/null @@ -1,28 +0,0 @@ -'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(() => { - const brk = cli.breakInfo; - t.match( - `${brk.line}`, - /^(1|2)$/, - 'pauses either on strict directive or first "real" line'); - }) - .then(() => cli.quit()) - .then(null, onFatal); -}); diff --git a/deps/node-inspect/test/cli/watchers.test.js b/deps/node-inspect/test/cli/watchers.test.js deleted file mode 100644 index 46bcde19a2a..00000000000 --- a/deps/node-inspect/test/cli/watchers.test.js +++ /dev/null @@ -1,42 +0,0 @@ -'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-inspect/tools/eslint-rules/align-function-arguments.js b/deps/node-inspect/tools/eslint-rules/align-function-arguments.js deleted file mode 100644 index 015552489a9..00000000000 --- a/deps/node-inspect/tools/eslint-rules/align-function-arguments.js +++ /dev/null @@ -1,76 +0,0 @@ -/** - * @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-inspect/tools/eslint-rules/align-multiline-assignment.js b/deps/node-inspect/tools/eslint-rules/align-multiline-assignment.js deleted file mode 100644 index 80896b5e962..00000000000 --- a/deps/node-inspect/tools/eslint-rules/align-multiline-assignment.js +++ /dev/null @@ -1,68 +0,0 @@ -/** - * @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-inspect/tools/eslint-rules/assert-fail-single-argument.js b/deps/node-inspect/tools/eslint-rules/assert-fail-single-argument.js deleted file mode 100644 index 4ce79023818..00000000000 --- a/deps/node-inspect/tools/eslint-rules/assert-fail-single-argument.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * @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-inspect/tools/eslint-rules/buffer-constructor.js b/deps/node-inspect/tools/eslint-rules/buffer-constructor.js deleted file mode 100644 index 938598e8dbf..00000000000 --- a/deps/node-inspect/tools/eslint-rules/buffer-constructor.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * @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-inspect/tools/eslint-rules/new-with-error.js b/deps/node-inspect/tools/eslint-rules/new-with-error.js deleted file mode 100644 index 655f34bf080..00000000000 --- a/deps/node-inspect/tools/eslint-rules/new-with-error.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * @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-inspect/tools/eslint-rules/no-let-in-for-declaration.js b/deps/node-inspect/tools/eslint-rules/no-let-in-for-declaration.js deleted file mode 100644 index 8b1a6783e07..00000000000 --- a/deps/node-inspect/tools/eslint-rules/no-let-in-for-declaration.js +++ /dev/null @@ -1,46 +0,0 @@ -/** - * @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-inspect/tools/eslint-rules/prefer-assert-methods.js b/deps/node-inspect/tools/eslint-rules/prefer-assert-methods.js deleted file mode 100644 index fa345eb7c3f..00000000000 --- a/deps/node-inspect/tools/eslint-rules/prefer-assert-methods.js +++ /dev/null @@ -1,39 +0,0 @@ -'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-inspect/tools/eslint-rules/require-buffer.js b/deps/node-inspect/tools/eslint-rules/require-buffer.js deleted file mode 100644 index c9818cb758f..00000000000 --- a/deps/node-inspect/tools/eslint-rules/require-buffer.js +++ /dev/null @@ -1,19 +0,0 @@ -'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-inspect/tools/eslint-rules/required-modules.js b/deps/node-inspect/tools/eslint-rules/required-modules.js deleted file mode 100644 index 3e4a8e8aadf..00000000000 --- a/deps/node-inspect/tools/eslint-rules/required-modules.js +++ /dev/null @@ -1,99 +0,0 @@ -/** - * @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 -}; |