diff --git a/doc/api/addons.md b/doc/api/addons.md index b029b1ef2b82c7..a906306b2cd1bc 100644 --- a/doc/api/addons.md +++ b/doc/api/addons.md @@ -457,7 +457,7 @@ in the Node-API are used. Creating and maintaining an addon that benefits from the ABI stability provided by Node-API carries with it certain -[implementation considerations](n-api.md#n_api_implications_of_abi_stability). +[implementation considerations][]. To use Node-API in the above "Hello world" example, replace the content of `hello.cc` with the following. All other instructions remain the same. @@ -1367,15 +1367,16 @@ console.log(result); [Electron]: https://electronjs.org/ [Embedder's Guide]: https://github.com/v8/v8/wiki/Embedder's%20Guide -[Linking to libraries included with Node.js]: #addons_linking_to_libraries_included_with_node_js +[Linking to libraries included with Node.js]: #linking-to-libraries-included-with-nodejs [Native Abstractions for Node.js]: https://github.com/nodejs/nan [V8]: https://v8.dev/ -[`Worker`]: worker_threads.md#worker_threads_class_worker +[`Worker`]: worker_threads.md#class-worker [bindings]: https://github.com/TooTallNate/node-bindings [download]: https://github.com/nodejs/node-addon-examples [examples]: https://github.com/nodejs/nan/tree/HEAD/examples/ +[implementation considerations]: n-api.md#implications-of-abi-stability [installation instructions]: https://github.com/nodejs/node-gyp#installation [libuv]: https://github.com/libuv/libuv [node-gyp]: https://github.com/nodejs/node-gyp -[require]: modules.md#modules_require_id +[require]: modules.md#requireid [v8-docs]: https://v8docs.nodesource.com/ diff --git a/doc/api/assert.md b/doc/api/assert.md index 439841f6f0013e..5215ea06816e3a 100644 --- a/doc/api/assert.md +++ b/doc/api/assert.md @@ -99,7 +99,7 @@ assert.deepEqual([[[1, 2, 3]], 4, 5], [[[1, 2, '3']], 4, 5]); To deactivate the colors, use the `NO_COLOR` or `NODE_DISABLE_COLORS` environment variables. This will also deactivate the colors in the REPL. For more on color support in terminal environments, read the tty -[getColorDepth()](tty.md#tty_writestream_getcolordepth_env) documentation. +[`getColorDepth()`][] documentation. ## Legacy assertion mode @@ -2420,34 +2420,35 @@ argument. [Object.prototype.toString()]: https://tc39.github.io/ecma262/#sec-object.prototype.tostring [SameValue Comparison]: https://tc39.github.io/ecma262/#sec-samevalue [Strict Equality Comparison]: https://tc39.github.io/ecma262/#sec-strict-equality-comparison -[`AssertionError`]: #assert_class_assert_assertionerror -[`CallTracker`]: #assert_class_assert_calltracker +[`AssertionError`]: #class-assertassertionerror +[`CallTracker`]: #class-assertcalltracker [`Class`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes -[`ERR_INVALID_RETURN_VALUE`]: errors.md#errors_err_invalid_return_value -[`Error.captureStackTrace`]: errors.md#errors_error_capturestacktrace_targetobject_constructoropt -[`Error`]: errors.md#errors_class_error +[`ERR_INVALID_RETURN_VALUE`]: errors.md#err_invalid_return_value +[`Error.captureStackTrace`]: errors.md#errorcapturestacktracetargetobject-constructoropt +[`Error`]: errors.md#class-error [`Map`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map [`Object.is()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is [`RegExp`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions [`Set`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set [`Symbol`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol -[`TypeError`]: errors.md#errors_class_typeerror +[`TypeError`]: errors.md#class-typeerror [`WeakMap`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap [`WeakSet`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet -[`assert.deepEqual()`]: #assert_assert_deepequal_actual_expected_message -[`assert.deepStrictEqual()`]: #assert_assert_deepstrictequal_actual_expected_message -[`assert.doesNotThrow()`]: #assert_assert_doesnotthrow_fn_error_message -[`assert.equal()`]: #assert_assert_equal_actual_expected_message -[`assert.notDeepEqual()`]: #assert_assert_notdeepequal_actual_expected_message -[`assert.notDeepStrictEqual()`]: #assert_assert_notdeepstrictequal_actual_expected_message -[`assert.notEqual()`]: #assert_assert_notequal_actual_expected_message -[`assert.notStrictEqual()`]: #assert_assert_notstrictequal_actual_expected_message -[`assert.ok()`]: #assert_assert_ok_value_message -[`assert.strictEqual()`]: #assert_assert_strictequal_actual_expected_message -[`assert.throws()`]: #assert_assert_throws_fn_error_message -[`process.on('exit')`]: process.md#process_event_exit -[`tracker.calls()`]: #assert_tracker_calls_fn_exact -[`tracker.verify()`]: #assert_tracker_verify +[`assert.deepEqual()`]: #assertdeepequalactual-expected-message +[`assert.deepStrictEqual()`]: #assertdeepstrictequalactual-expected-message +[`assert.doesNotThrow()`]: #assertdoesnotthrowfn-error-message +[`assert.equal()`]: #assertequalactual-expected-message +[`assert.notDeepEqual()`]: #assertnotdeepequalactual-expected-message +[`assert.notDeepStrictEqual()`]: #assertnotdeepstrictequalactual-expected-message +[`assert.notEqual()`]: #assertnotequalactual-expected-message +[`assert.notStrictEqual()`]: #assertnotstrictequalactual-expected-message +[`assert.ok()`]: #assertokvalue-message +[`assert.strictEqual()`]: #assertstrictequalactual-expected-message +[`assert.throws()`]: #assertthrowsfn-error-message +[`getColorDepth()`]: tty.md#writestreamgetcolordepthenv +[`process.on('exit')`]: process.md#event-exit +[`tracker.calls()`]: #trackercallsfn-exact +[`tracker.verify()`]: #trackerverify [enumerable "own" properties]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Enumerability_and_ownership_of_properties [prototype-spec]: https://tc39.github.io/ecma262/#sec-ordinary-object-internal-methods-and-internal-slots -[strict assertion mode]: #assert_strict_assertion_mode +[strict assertion mode]: #strict-assertion-mode diff --git a/doc/api/async_context.md b/doc/api/async_context.md index 391ed4c5459da1..7c949f65857920 100644 --- a/doc/api/async_context.md +++ b/doc/api/async_context.md @@ -786,8 +786,8 @@ const server = createServer((req, res) => { }).listen(3000); ``` -[`AsyncResource`]: #async_context_class_asyncresource -[`EventEmitter`]: events.md#events_class_eventemitter -[`Stream`]: stream.md#stream_stream -[`Worker`]: worker_threads.md#worker_threads_class_worker -[`util.promisify()`]: util.md#util_util_promisify_original +[`AsyncResource`]: #class-asyncresource +[`EventEmitter`]: events.md#class-eventemitter +[`Stream`]: stream.md#stream +[`Worker`]: worker_threads.md#class-worker +[`util.promisify()`]: util.md#utilpromisifyoriginal diff --git a/doc/api/async_hooks.md b/doc/api/async_hooks.md index 697910fb73a8a8..132f2a6bb2e910 100644 --- a/doc/api/async_hooks.md +++ b/doc/api/async_hooks.md @@ -841,14 +841,14 @@ The documentation for this class has moved [`AsyncResource`][]. The documentation for this class has moved [`AsyncLocalStorage`][]. -[Hook Callbacks]: #async_hooks_hook_callbacks +[Hook Callbacks]: #hook-callbacks [PromiseHooks]: https://docs.google.com/document/d/1rda3yKGHimKIhg5YeoAmCOtyURgsbTH_qaYR79FELlk/edit -[`AsyncLocalStorage`]: async_context.md#async_context_class_asynclocalstorage -[`AsyncResource`]: async_context.md#async_context_class_asyncresource -[`Worker`]: worker_threads.md#worker_threads_class_worker -[`after` callback]: #async_hooks_after_asyncid -[`before` callback]: #async_hooks_before_asyncid -[`destroy` callback]: #async_hooks_destroy_asyncid -[`init` callback]: #async_hooks_init_asyncid_type_triggerasyncid_resource -[`promiseResolve` callback]: #async_hooks_promiseresolve_asyncid -[promise execution tracking]: #async_hooks_promise_execution_tracking +[`AsyncLocalStorage`]: async_context.md#class-asynclocalstorage +[`AsyncResource`]: async_context.md#class-asyncresource +[`Worker`]: worker_threads.md#class-worker +[`after` callback]: #afterasyncid +[`before` callback]: #beforeasyncid +[`destroy` callback]: #destroyasyncid +[`init` callback]: #initasyncid-type-triggerasyncid-resource +[`promiseResolve` callback]: #promiseresolveasyncid +[promise execution tracking]: #promise-execution-tracking diff --git a/doc/api/buffer.md b/doc/api/buffer.md index 41d2cd89cb7ed0..c6f403a60b78a4 100644 --- a/doc/api/buffer.md +++ b/doc/api/buffer.md @@ -5195,19 +5195,19 @@ introducing security vulnerabilities into an application. [WHATWG Encoding Standard]: https://encoding.spec.whatwg.org/ [`ArrayBuffer`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer [`Blob`]: https://developer.mozilla.org/en-US/docs/Web/API/Blob -[`Buffer.alloc()`]: #buffer_static_method_buffer_alloc_size_fill_encoding -[`Buffer.allocUnsafe()`]: #buffer_static_method_buffer_allocunsafe_size -[`Buffer.allocUnsafeSlow()`]: #buffer_static_method_buffer_allocunsafeslow_size -[`Buffer.concat()`]: #buffer_static_method_buffer_concat_list_totallength -[`Buffer.from(array)`]: #buffer_static_method_buffer_from_array -[`Buffer.from(arrayBuf)`]: #buffer_static_method_buffer_from_arraybuffer_byteoffset_length -[`Buffer.from(buffer)`]: #buffer_static_method_buffer_from_buffer -[`Buffer.from(string)`]: #buffer_static_method_buffer_from_string_encoding -[`Buffer.poolSize`]: #buffer_class_property_buffer_poolsize +[`Buffer.alloc()`]: #static-method-bufferallocsize-fill-encoding +[`Buffer.allocUnsafe()`]: #static-method-bufferallocunsafesize +[`Buffer.allocUnsafeSlow()`]: #static-method-bufferallocunsafeslowsize +[`Buffer.concat()`]: #static-method-bufferconcatlist-totallength +[`Buffer.from(array)`]: #static-method-bufferfromarray +[`Buffer.from(arrayBuf)`]: #static-method-bufferfromarraybuffer-byteoffset-length +[`Buffer.from(buffer)`]: #static-method-bufferfrombuffer +[`Buffer.from(string)`]: #static-method-bufferfromstring-encoding +[`Buffer.poolSize`]: #class-property-bufferpoolsize [`DataView`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView -[`ERR_INVALID_ARG_VALUE`]: errors.md#ERR_INVALID_ARG_VALUE -[`ERR_INVALID_BUFFER_SIZE`]: errors.md#ERR_INVALID_BUFFER_SIZE -[`ERR_OUT_OF_RANGE`]: errors.md#ERR_OUT_OF_RANGE +[`ERR_INVALID_ARG_VALUE`]: errors.md#err_invalid_arg_value +[`ERR_INVALID_BUFFER_SIZE`]: errors.md#err_invalid_buffer_size +[`ERR_OUT_OF_RANGE`]: errors.md#err_out_of_range [`JSON.stringify()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify [`SharedArrayBuffer`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer [`String.prototype.indexOf()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf @@ -5219,20 +5219,20 @@ introducing security vulnerabilities into an application. [`TypedArray.prototype.subarray()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/subarray [`TypedArray`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray [`Uint8Array`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array -[`buf.buffer`]: #buffer_buf_buffer -[`buf.compare()`]: #buffer_buf_compare_target_targetstart_targetend_sourcestart_sourceend -[`buf.entries()`]: #buffer_buf_entries -[`buf.fill()`]: #buffer_buf_fill_value_offset_end_encoding -[`buf.indexOf()`]: #buffer_buf_indexof_value_byteoffset_encoding -[`buf.keys()`]: #buffer_buf_keys -[`buf.length`]: #buffer_buf_length -[`buf.slice()`]: #buffer_buf_slice_start_end -[`buf.toString()`]: #buffer_buf_tostring_encoding_start_end -[`buf.values()`]: #buffer_buf_values -[`buffer.constants.MAX_LENGTH`]: #buffer_buffer_constants_max_length -[`buffer.constants.MAX_STRING_LENGTH`]: #buffer_buffer_constants_max_string_length -[`buffer.kMaxLength`]: #buffer_buffer_kmaxlength -[`util.inspect()`]: util.md#util_util_inspect_object_options +[`buf.buffer`]: #bufbuffer +[`buf.compare()`]: #bufcomparetarget-targetstart-targetend-sourcestart-sourceend +[`buf.entries()`]: #bufentries +[`buf.fill()`]: #buffillvalue-offset-end-encoding +[`buf.indexOf()`]: #bufindexofvalue-byteoffset-encoding +[`buf.keys()`]: #bufkeys +[`buf.length`]: #buflength +[`buf.slice()`]: #bufslicestart-end +[`buf.toString()`]: #buftostringencoding-start-end +[`buf.values()`]: #bufvalues +[`buffer.constants.MAX_LENGTH`]: #bufferconstantsmax_length +[`buffer.constants.MAX_STRING_LENGTH`]: #bufferconstantsmax_string_length +[`buffer.kMaxLength`]: #bufferkmaxlength +[`util.inspect()`]: util.md#utilinspectobject-options [`v8::TypedArray::kMaxLength`]: https://v8.github.io/api/head/classv8_1_1TypedArray.html#a54a48f4373da0850663c4393d843b9b0 [base64url]: https://tools.ietf.org/html/rfc4648#section-5 [binary strings]: https://developer.mozilla.org/en-US/docs/Web/API/DOMString/Binary diff --git a/doc/api/child_process.md b/doc/api/child_process.md index dcec1f79eff078..4170bbb5296ae0 100644 --- a/doc/api/child_process.md +++ b/doc/api/child_process.md @@ -1772,42 +1772,42 @@ Therefore, this feature requires opting in by setting the `serialization` option to `'advanced'` when calling [`child_process.spawn()`][] or [`child_process.fork()`][]. -[Advanced serialization]: #child_process_advanced_serialization -[Default Windows shell]: #child_process_default_windows_shell +[Advanced serialization]: #advanced-serialization +[Default Windows shell]: #default-windows-shell [HTML structured clone algorithm]: https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm -[Shell requirements]: #child_process_shell_requirements -[Signal Events]: process.md#process_signal_events -[`'disconnect'`]: process.md#process_event_disconnect -[`'error'`]: #child_process_event_error -[`'exit'`]: #child_process_event_exit -[`'message'`]: process.md#process_event_message -[`ChildProcess`]: #child_process_class_childprocess -[`Error`]: errors.md#errors_class_error -[`EventEmitter`]: events.md#events_class_eventemitter -[`child_process.exec()`]: #child_process_child_process_exec_command_options_callback -[`child_process.execFile()`]: #child_process_child_process_execfile_file_args_options_callback -[`child_process.execFileSync()`]: #child_process_child_process_execfilesync_file_args_options -[`child_process.execSync()`]: #child_process_child_process_execsync_command_options -[`child_process.fork()`]: #child_process_child_process_fork_modulepath_args_options -[`child_process.spawn()`]: #child_process_child_process_spawn_command_args_options -[`child_process.spawnSync()`]: #child_process_child_process_spawnsync_command_args_options -[`maxBuffer` and Unicode]: #child_process_maxbuffer_and_unicode -[`net.Server`]: net.md#net_class_net_server -[`net.Socket`]: net.md#net_class_net_socket -[`options.detached`]: #child_process_options_detached -[`process.disconnect()`]: process.md#process_process_disconnect -[`process.env`]: process.md#process_process_env -[`process.execPath`]: process.md#process_process_execpath -[`process.send()`]: process.md#process_process_send_message_sendhandle_options_callback -[`stdio`]: #child_process_options_stdio -[`subprocess.connected`]: #child_process_subprocess_connected -[`subprocess.disconnect()`]: #child_process_subprocess_disconnect -[`subprocess.kill()`]: #child_process_subprocess_kill_signal -[`subprocess.send()`]: #child_process_subprocess_send_message_sendhandle_options_callback -[`subprocess.stderr`]: #child_process_subprocess_stderr -[`subprocess.stdin`]: #child_process_subprocess_stdin -[`subprocess.stdio`]: #child_process_subprocess_stdio -[`subprocess.stdout`]: #child_process_subprocess_stdout -[`util.promisify()`]: util.md#util_util_promisify_original -[synchronous counterparts]: #child_process_synchronous_process_creation -[v8.serdes]: v8.md#v8_serialization_api +[Shell requirements]: #shell-requirements +[Signal Events]: process.md#signal-events +[`'disconnect'`]: process.md#event-disconnect +[`'error'`]: #event-error +[`'exit'`]: #event-exit +[`'message'`]: process.md#event-message +[`ChildProcess`]: #class-childprocess +[`Error`]: errors.md#class-error +[`EventEmitter`]: events.md#class-eventemitter +[`child_process.exec()`]: #child_processexeccommand-options-callback +[`child_process.execFile()`]: #child_processexecfilefile-args-options-callback +[`child_process.execFileSync()`]: #child_processexecfilesyncfile-args-options +[`child_process.execSync()`]: #child_processexecsynccommand-options +[`child_process.fork()`]: #child_processforkmodulepath-args-options +[`child_process.spawn()`]: #child_processspawncommand-args-options +[`child_process.spawnSync()`]: #child_processspawnsynccommand-args-options +[`maxBuffer` and Unicode]: #maxbuffer-and-unicode +[`net.Server`]: net.md#class-netserver +[`net.Socket`]: net.md#class-netsocket +[`options.detached`]: #optionsdetached +[`process.disconnect()`]: process.md#processdisconnect +[`process.env`]: process.md#processenv +[`process.execPath`]: process.md#processexecpath +[`process.send()`]: process.md#processsendmessage-sendhandle-options-callback +[`stdio`]: #optionsstdio +[`subprocess.connected`]: #subprocessconnected +[`subprocess.disconnect()`]: #subprocessdisconnect +[`subprocess.kill()`]: #subprocesskillsignal +[`subprocess.send()`]: #subprocesssendmessage-sendhandle-options-callback +[`subprocess.stderr`]: #subprocessstderr +[`subprocess.stdin`]: #subprocessstdin +[`subprocess.stdio`]: #subprocessstdio +[`subprocess.stdout`]: #subprocessstdout +[`util.promisify()`]: util.md#utilpromisifyoriginal +[synchronous counterparts]: #synchronous-process-creation +[v8.serdes]: v8.md#serialization-api diff --git a/doc/api/cli.md b/doc/api/cli.md index 4523a532f5018f..32873f88d88995 100644 --- a/doc/api/cli.md +++ b/doc/api/cli.md @@ -137,7 +137,7 @@ Specify the directory where the CPU profiles generated by `--cpu-prof` will be placed. The default value is controlled by the -[--diagnostic-dir](#cli_diagnostic_dir_directory) command-line option. +[`--diagnostic-dir`][] command-line option. ### `--cpu-prof-interval` #### Warning: binding inspector to a public IP:port combination is insecure @@ -766,7 +767,7 @@ warning will be written to stderr instead. The `file` name may be an absolute path. If it is not, the default directory it will be written to is controlled by the -[--diagnostic-dir](#cli_diagnostic_dir_directory) command-line option. +[`--diagnostic-dir`]() command-line option. ### `--report-compact` + +Type: Documentation-only + +Move to {Stream} API instead, as the [`http.ClientRequest`][], +[`http.ServerResponse`][], and [`http.IncomingMessage`][] are all stream-based. +Check `stream.destroyed` instead of the `.aborted` property, and listen for +`'close'` instead of `'abort'`, `'aborted'` event. + +The `.aborted` property and `'abort'` event are only useful for detecting +`.abort()` calls. For closing a request early, use the Stream +`.destroy([error])` then check the `.destroyed` property and `'close'` event +should have the same effect. The receiving end should also check the +[`readable.readableEnded`][] value on [`http.IncomingMessage`][] to get whether +it was an aborted or graceful destroy. + +[Legacy URL API]: url.md#legacy-url-api [NIST SP 800-38D]: https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf [RFC 6066]: https://tools.ietf.org/html/rfc6066#section-3 -[WHATWG URL API]: url.md#url_the_whatwg_url_api -[`"exports"` or `"main"` entry]: packages.md#packages_main_entry_point_export -[`--pending-deprecation`]: cli.md#cli_pending_deprecation -[`--throw-deprecation`]: cli.md#cli_throw_deprecation -[`--unhandled-rejections`]: cli.md#cli_unhandled_rejections_mode -[`Buffer.allocUnsafeSlow(size)`]: buffer.md#buffer_static_method_buffer_allocunsafeslow_size -[`Buffer.from(array)`]: buffer.md#buffer_static_method_buffer_from_array -[`Buffer.from(buffer)`]: buffer.md#buffer_static_method_buffer_from_buffer -[`Buffer.isBuffer()`]: buffer.md#buffer_static_method_buffer_isbuffer_obj -[`Cipher`]: crypto.md#crypto_class_cipher -[`Decipher`]: crypto.md#crypto_class_decipher -[`REPLServer.clearBufferedCommand()`]: repl.md#repl_replserver_clearbufferedcommand -[`ReadStream.open()`]: fs.md#fs_class_fs_readstream -[`Server.getConnections()`]: net.md#net_server_getconnections_callback -[`Server.listen({fd: })`]: net.md#net_server_listen_handle_backlog_callback -[`SlowBuffer`]: buffer.md#buffer_class_slowbuffer -[`WriteStream.open()`]: fs.md#fs_class_fs_writestream +[WHATWG URL API]: url.md#the-whatwg-url-api +[`"exports"` or `"main"` entry]: packages.md#main-entry-point-export +[`--pending-deprecation`]: cli.md#--pending-deprecation +[`--throw-deprecation`]: cli.md#--throw-deprecation +[`--unhandled-rejections`]: cli.md#--unhandled-rejectionsmode +[`Buffer.allocUnsafeSlow(size)`]: buffer.md#static-method-bufferallocunsafeslowsize +[`Buffer.from(array)`]: buffer.md#static-method-bufferfromarray +[`Buffer.from(buffer)`]: buffer.md#static-method-bufferfrombuffer +[`Buffer.isBuffer()`]: buffer.md#static-method-bufferisbufferobj +[`Cipher`]: crypto.md#class-cipher +[`Decipher`]: crypto.md#class-decipher +[`REPLServer.clearBufferedCommand()`]: repl.md#replserverclearbufferedcommand +[`ReadStream.open()`]: fs.md#class-fsreadstream +[`Server.getConnections()`]: net.md#servergetconnectionscallback +[`Server.listen({fd: })`]: net.md#serverlistenhandle-backlog-callback +[`SlowBuffer`]: buffer.md#class-slowbuffer +[`WriteStream.open()`]: fs.md#class-fswritestream [`assert`]: assert.md -[`asyncResource.runInAsyncScope()`]: async_context.md#async_context_asyncresource_runinasyncscope_fn_thisarg_args +[`asyncResource.runInAsyncScope()`]: async_context.md#asyncresourceruninasyncscopefn-thisarg-args [`child_process`]: child_process.md -[`clearInterval()`]: timers.md#timers_clearinterval_timeout -[`clearTimeout()`]: timers.md#timers_cleartimeout_timeout -[`console.error()`]: console.md#console_console_error_data_args -[`console.log()`]: console.md#console_console_log_data_args -[`crypto.Certificate()` constructor]: crypto.md#crypto_legacy_api -[`crypto.DEFAULT_ENCODING`]: crypto.md#crypto_crypto_default_encoding -[`crypto.createCipher()`]: crypto.md#crypto_crypto_createcipher_algorithm_password_options -[`crypto.createCipheriv()`]: crypto.md#crypto_crypto_createcipheriv_algorithm_key_iv_options -[`crypto.createDecipher()`]: crypto.md#crypto_crypto_createdecipher_algorithm_password_options -[`crypto.createDecipheriv()`]: crypto.md#crypto_crypto_createdecipheriv_algorithm_key_iv_options -[`crypto.fips`]: crypto.md#crypto_crypto_fips -[`crypto.pbkdf2()`]: crypto.md#crypto_crypto_pbkdf2_password_salt_iterations_keylen_digest_callback -[`crypto.randomBytes()`]: crypto.md#crypto_crypto_randombytes_size_callback -[`crypto.scrypt()`]: crypto.md#crypto_crypto_scrypt_password_salt_keylen_options_callback -[`decipher.final()`]: crypto.md#crypto_decipher_final_outputencoding -[`decipher.setAuthTag()`]: crypto.md#crypto_decipher_setauthtag_buffer_encoding -[`dns.lookup()`]: domain.md#dns_dns_lookup_hostname_options_callback -[`dnsPromises.lookup()`]: domain.md#dns_dnspromises_lookup_hostname_options +[`clearInterval()`]: timers.md#clearintervaltimeout +[`clearTimeout()`]: timers.md#cleartimeouttimeout +[`console.error()`]: console.md#consoleerrordata-args +[`console.log()`]: console.md#consolelogdata-args +[`crypto.Certificate()` constructor]: crypto.md#legacy-api +[`crypto.DEFAULT_ENCODING`]: crypto.md#cryptodefault_encoding +[`crypto.createCipher()`]: crypto.md#cryptocreatecipheralgorithm-password-options +[`crypto.createCipheriv()`]: crypto.md#cryptocreatecipherivalgorithm-key-iv-options +[`crypto.createDecipher()`]: crypto.md#cryptocreatedecipheralgorithm-password-options +[`crypto.createDecipheriv()`]: crypto.md#cryptocreatedecipherivalgorithm-key-iv-options +[`crypto.fips`]: crypto.md#cryptofips +[`crypto.pbkdf2()`]: crypto.md#cryptopbkdf2password-salt-iterations-keylen-digest-callback +[`crypto.randomBytes()`]: crypto.md#cryptorandombytessize-callback +[`crypto.scrypt()`]: crypto.md#cryptoscryptpassword-salt-keylen-options-callback +[`decipher.final()`]: crypto.md#decipherfinaloutputencoding +[`decipher.setAuthTag()`]: crypto.md#deciphersetauthtagbuffer-encoding +[`dns.lookup()`]: dns.md#dnslookuphostname-options-callback +[`dnsPromises.lookup()`]: dns.md#dnspromiseslookuphostname-options [`domain`]: domain.md -[`ecdh.setPublicKey()`]: crypto.md#crypto_ecdh_setpublickey_publickey_encoding -[`emitter.listenerCount(eventName)`]: events.md#events_emitter_listenercount_eventname -[`events.listenerCount(emitter, eventName)`]: events.md#events_events_listenercount_emitter_eventname -[`fs.FileHandle`]: fs.md#fs_class_filehandle -[`fs.access()`]: fs.md#fs_fs_access_path_mode_callback -[`fs.createReadStream()`]: fs.md#fs_fs_createreadstream_path_options -[`fs.createWriteStream()`]: fs.md#fs_fs_createwritestream_path_options -[`fs.exists(path, callback)`]: fs.md#fs_fs_exists_path_callback -[`fs.lchmod(path, mode, callback)`]: fs.md#fs_fs_lchmod_path_mode_callback -[`fs.lchmodSync(path, mode)`]: fs.md#fs_fs_lchmodsync_path_mode -[`fs.lchown(path, uid, gid, callback)`]: fs.md#fs_fs_lchown_path_uid_gid_callback -[`fs.lchownSync(path, uid, gid)`]: fs.md#fs_fs_lchownsync_path_uid_gid -[`fs.read()`]: fs.md#fs_fs_read_fd_buffer_offset_length_position_callback -[`fs.readSync()`]: fs.md#fs_fs_readsync_fd_buffer_offset_length_position -[`fs.stat()`]: fs.md#fs_fs_stat_path_options_callback -[`http.get()`]: http.md#http_http_get_options_callback -[`http.request()`]: http.md#http_http_request_options_callback -[`https.get()`]: https.md#https_https_get_options_callback -[`https.request()`]: https.md#https_https_request_options_callback -[`message.connection`]: http.md#http_message_connection -[`message.socket`]: http.md#http_message_socket -[`module.createRequire()`]: module.md#module_module_createrequire_filename -[`os.networkInterfaces()`]: os.md#os_os_networkinterfaces -[`os.tmpdir()`]: os.md#os_os_tmpdir -[`process.env`]: process.md#process_process_env -[`process.mainModule`]: process.md#process_process_mainmodule +[`ecdh.setPublicKey()`]: crypto.md#ecdhsetpublickeypublickey-encoding +[`emitter.listenerCount(eventName)`]: events.md#emitterlistenercounteventname +[`events.listenerCount(emitter, eventName)`]: events.md#eventslistenercountemitter-eventname +[`fs.FileHandle`]: fs.md#class-filehandle +[`fs.access()`]: fs.md#fsaccesspath-mode-callback +[`fs.createReadStream()`]: fs.md#fscreatereadstreampath-options +[`fs.createWriteStream()`]: fs.md#fscreatewritestreampath-options +[`fs.exists(path, callback)`]: fs.md#fsexistspath-callback +[`fs.lchmod(path, mode, callback)`]: fs.md#fslchmodpath-mode-callback +[`fs.lchmodSync(path, mode)`]: fs.md#fslchmodsyncpath-mode +[`fs.lchown(path, uid, gid, callback)`]: fs.md#fslchownpath-uid-gid-callback +[`fs.lchownSync(path, uid, gid)`]: fs.md#fslchownsyncpath-uid-gid +[`fs.read()`]: fs.md#fsreadfd-buffer-offset-length-position-callback +[`fs.readSync()`]: fs.md#fsreadsyncfd-buffer-offset-length-position +[`fs.stat()`]: fs.md#fsstatpath-options-callback +[`http.ClientRequest`]: http.md#class-httpclientrequest +[`http.IncomingMessage`]: http.md#class-httpincomingmessage +[`http.ServerResponse`]: http.md#class-httpserverresponse +[`http.get()`]: http.md#httpgetoptions-callback +[`http.request()`]: http.md#httprequestoptions-callback +[`https.get()`]: https.md#httpsgetoptions-callback +[`https.request()`]: https.md#httpsrequestoptions-callback +[`message.connection`]: http.md#messageconnection +[`message.socket`]: http.md#messagesocket +[`module.createRequire()`]: module.md#modulecreaterequirefilename +[`os.networkInterfaces()`]: os.md#osnetworkinterfaces +[`os.tmpdir()`]: os.md#ostmpdir +[`process.env`]: process.md#processenv +[`process.mainModule`]: process.md#processmainmodule [`punycode`]: punycode.md -[`request.abort()`]: http.md#http_request_abort -[`request.connection`]: http.md#http_request_connection -[`request.destroy()`]: http.md#http_request_destroy_error -[`request.socket`]: http.md#http_request_socket -[`require.extensions`]: modules.md#modules_require_extensions -[`require.main`]: modules.md#modules_accessing_the_main_module -[`response.connection`]: http.md#http_response_connection -[`response.end()`]: http.md#http_response_end_data_encoding_callback -[`response.finished`]: http.md#http_response_finished -[`response.socket`]: http.md#http_response_socket -[`response.writableEnded`]: http.md#http_response_writableended -[`response.writableFinished`]: http.md#http_response_writablefinished -[`script.createCachedData()`]: vm.md#vm_script_createcacheddata -[`setInterval()`]: timers.md#timers_setinterval_callback_delay_args -[`setTimeout()`]: timers.md#timers_settimeout_callback_delay_args -[`socket.bufferSize`]: net.md#net_socket_buffersize -[`timeout.ref()`]: timers.md#timers_timeout_ref -[`timeout.refresh()`]: timers.md#timers_timeout_refresh -[`timeout.unref()`]: timers.md#timers_timeout_unref -[`tls.CryptoStream`]: tls.md#tls_class_tls_cryptostream -[`tls.SecureContext`]: tls.md#tls_tls_createsecurecontext_options -[`tls.SecurePair`]: tls.md#tls_class_tls_securepair -[`tls.TLSSocket`]: tls.md#tls_class_tls_tlssocket -[`tls.checkServerIdentity()`]: tls.md#tls_tls_checkserveridentity_hostname_cert -[`tls.createSecureContext()`]: tls.md#tls_tls_createsecurecontext_options -[`url.format()`]: url.md#url_url_format_urlobject -[`url.parse()`]: url.md#url_url_parse_urlstring_parsequerystring_slashesdenotehost -[`url.resolve()`]: url.md#url_url_resolve_from_to -[`util._extend()`]: util.md#util_util_extend_target_source -[`util.getSystemErrorName()`]: util.md#util_util_getsystemerrorname_err -[`util.inspect()`]: util.md#util_util_inspect_object_options -[`util.inspect.custom`]: util.md#util_util_inspect_custom -[`util.isArray()`]: util.md#util_util_isarray_object -[`util.isBoolean()`]: util.md#util_util_isboolean_object -[`util.isBuffer()`]: util.md#util_util_isbuffer_object -[`util.isDate()`]: util.md#util_util_isdate_object -[`util.isError()`]: util.md#util_util_iserror_object -[`util.isFunction()`]: util.md#util_util_isfunction_object -[`util.isNull()`]: util.md#util_util_isnull_object -[`util.isNullOrUndefined()`]: util.md#util_util_isnullorundefined_object -[`util.isNumber()`]: util.md#util_util_isnumber_object -[`util.isObject()`]: util.md#util_util_isobject_object -[`util.isPrimitive()`]: util.md#util_util_isprimitive_object -[`util.isRegExp()`]: util.md#util_util_isregexp_object -[`util.isString()`]: util.md#util_util_isstring_object -[`util.isSymbol()`]: util.md#util_util_issymbol_object -[`util.isUndefined()`]: util.md#util_util_isundefined_object -[`util.log()`]: util.md#util_util_log_string -[`util.types`]: util.md#util_util_types +[`readable.readableEnded`]: stream.md#readablereadableended +[`request.abort()`]: http.md#requestabort +[`request.connection`]: http.md#requestconnection +[`request.destroy()`]: http.md#requestdestroyerror +[`request.socket`]: http.md#requestsocket +[`require.extensions`]: modules.md#requireextensions +[`require.main`]: modules.md#accessing-the-main-module +[`response.connection`]: http.md#responseconnection +[`response.end()`]: http.md#responseenddata-encoding-callback +[`response.finished`]: http.md#responsefinished +[`response.socket`]: http.md#responsesocket +[`response.writableEnded`]: http.md#responsewritableended +[`response.writableFinished`]: http.md#responsewritablefinished +[`script.createCachedData()`]: vm.md#scriptcreatecacheddata +[`setInterval()`]: timers.md#setintervalcallback-delay-args +[`setTimeout()`]: timers.md#settimeoutcallback-delay-args +[`socket.bufferSize`]: net.md#socketbuffersize +[`timeout.ref()`]: timers.md#timeoutref +[`timeout.refresh()`]: timers.md#timeoutrefresh +[`timeout.unref()`]: timers.md#timeoutunref +[`tls.CryptoStream`]: tls.md#class-tlscryptostream +[`tls.SecureContext`]: tls.md#tlscreatesecurecontextoptions +[`tls.SecurePair`]: tls.md#class-tlssecurepair +[`tls.TLSSocket`]: tls.md#class-tlstlssocket +[`tls.checkServerIdentity()`]: tls.md#tlscheckserveridentityhostname-cert +[`tls.createSecureContext()`]: tls.md#tlscreatesecurecontextoptions +[`url.format()`]: url.md#urlformaturlobject +[`url.parse()`]: url.md#urlparseurlstring-parsequerystring-slashesdenotehost +[`url.resolve()`]: url.md#urlresolvefrom-to +[`util._extend()`]: util.md#util_extendtarget-source +[`util.getSystemErrorName()`]: util.md#utilgetsystemerrornameerr +[`util.inspect()`]: util.md#utilinspectobject-options +[`util.inspect.custom`]: util.md#utilinspectcustom +[`util.isArray()`]: util.md#utilisarrayobject +[`util.isBoolean()`]: util.md#utilisbooleanobject +[`util.isBuffer()`]: util.md#utilisbufferobject +[`util.isDate()`]: util.md#utilisdateobject +[`util.isError()`]: util.md#utiliserrorobject +[`util.isFunction()`]: util.md#utilisfunctionobject +[`util.isNull()`]: util.md#utilisnullobject +[`util.isNullOrUndefined()`]: util.md#utilisnullorundefinedobject +[`util.isNumber()`]: util.md#utilisnumberobject +[`util.isObject()`]: util.md#utilisobjectobject +[`util.isPrimitive()`]: util.md#utilisprimitiveobject +[`util.isRegExp()`]: util.md#utilisregexpobject +[`util.isString()`]: util.md#utilisstringobject +[`util.isSymbol()`]: util.md#utilissymbolobject +[`util.isUndefined()`]: util.md#utilisundefinedobject +[`util.log()`]: util.md#utillogstring +[`util.types`]: util.md#utiltypes [`util`]: util.md -[`worker.exitedAfterDisconnect`]: cluster.md#cluster_worker_exitedafterdisconnect -[`worker.terminate()`]: worker_threads.md#worker_threads_worker_terminate -[`writable.writableLength`]: stream.md#stream_writable_writablelength -[`zlib.bytesWritten`]: zlib.md#zlib_zlib_byteswritten -[alloc]: buffer.md#buffer_static_method_buffer_alloc_size_fill_encoding -[alloc_unsafe_size]: buffer.md#buffer_static_method_buffer_allocunsafe_size -[from_arraybuffer]: buffer.md#buffer_static_method_buffer_from_arraybuffer_byteoffset_length -[from_string_encoding]: buffer.md#buffer_static_method_buffer_from_string_encoding -[legacy `urlObject`]: url.md#url_legacy_urlobject -[static methods of `crypto.Certificate()`]: crypto.md#crypto_class_certificate -[subpath exports]: packages.md#packages_subpath_exports -[subpath folder mappings]: packages.md#packages_subpath_folder_mappings -[subpath imports]: packages.md#packages_subpath_imports -[subpath patterns]: packages.md#packages_subpath_patterns +[`worker.exitedAfterDisconnect`]: cluster.md#workerexitedafterdisconnect +[`worker.terminate()`]: worker_threads.md#workerterminate +[`writable.writableLength`]: stream.md#writablewritablelength +[`zlib.bytesWritten`]: zlib.md#zlibbyteswritten +[alloc]: buffer.md#static-method-bufferallocsize-fill-encoding +[alloc_unsafe_size]: buffer.md#static-method-bufferallocunsafesize +[from_arraybuffer]: buffer.md#static-method-bufferfromarraybuffer-byteoffset-length +[from_string_encoding]: buffer.md#static-method-bufferfromstring-encoding +[legacy `urlObject`]: url.md#legacy-urlobject +[static methods of `crypto.Certificate()`]: crypto.md#class-certificate +[subpath exports]: packages.md#subpath-exports +[subpath folder mappings]: packages.md#subpath-folder-mappings +[subpath imports]: packages.md#subpath-imports +[subpath patterns]: packages.md#subpath-patterns diff --git a/doc/api/dgram.md b/doc/api/dgram.md index 365c30c9ae64a7..da267926f37cd1 100644 --- a/doc/api/dgram.md +++ b/doc/api/dgram.md @@ -912,19 +912,19 @@ and `udp6` sockets). The bound address and port can be retrieved using [IPv6 Zone Indices]: https://en.wikipedia.org/wiki/IPv6_address#Scoped_literal_IPv6_addresses [RFC 4007]: https://tools.ietf.org/html/rfc4007 -[`'close'`]: #dgram_event_close -[`ERR_SOCKET_BAD_PORT`]: errors.md#errors_err_socket_bad_port -[`ERR_SOCKET_BUFFER_SIZE`]: errors.md#errors_err_socket_buffer_size -[`ERR_SOCKET_DGRAM_IS_CONNECTED`]: errors.md#errors_err_socket_dgram_is_connected -[`ERR_SOCKET_DGRAM_NOT_CONNECTED`]: errors.md#errors_err_socket_dgram_not_connected -[`Error`]: errors.md#errors_class_error -[`System Error`]: errors.md#errors_class_systemerror -[`close()`]: #dgram_socket_close_callback +[`'close'`]: #event-close +[`ERR_SOCKET_BAD_PORT`]: errors.md#err_socket_bad_port +[`ERR_SOCKET_BUFFER_SIZE`]: errors.md#err_socket_buffer_size +[`ERR_SOCKET_DGRAM_IS_CONNECTED`]: errors.md#err_socket_dgram_is_connected +[`ERR_SOCKET_DGRAM_NOT_CONNECTED`]: errors.md#err_socket_dgram_not_connected +[`Error`]: errors.md#class-error +[`System Error`]: errors.md#class-systemerror +[`close()`]: #socketclosecallback [`cluster`]: cluster.md -[`connect()`]: #dgram_socket_connect_port_address_callback -[`dgram.createSocket()`]: #dgram_dgram_createsocket_options_callback -[`dns.lookup()`]: dns.md#dns_dns_lookup_hostname_options_callback -[`socket.address().address`]: #dgram_socket_address -[`socket.address().port`]: #dgram_socket_address -[`socket.bind()`]: #dgram_socket_bind_port_address_callback -[byte length]: buffer.md#buffer_static_method_buffer_bytelength_string_encoding +[`connect()`]: #socketconnectport-address-callback +[`dgram.createSocket()`]: #dgramcreatesocketoptions-callback +[`dns.lookup()`]: dns.md#dnslookuphostname-options-callback +[`socket.address().address`]: #socketaddress +[`socket.address().port`]: #socketaddress +[`socket.bind()`]: #socketbindport-address-callback +[byte length]: buffer.md#static-method-bufferbytelengthstring-encoding diff --git a/doc/api/diagnostics_channel.md b/doc/api/diagnostics_channel.md index 1faa6bee24deb4..6c4ace3bbd615e 100644 --- a/doc/api/diagnostics_channel.md +++ b/doc/api/diagnostics_channel.md @@ -299,6 +299,6 @@ channel.subscribe(onMessage); channel.unsubscribe(onMessage); ``` -[`'uncaughtException'`]: process.md#process_event_uncaughtexception -[`channel.subscribe(onMessage)`]: #diagnostics_channel_channel_subscribe_onmessage -[`diagnostics_channel.channel(name)`]: #diagnostics_channel_diagnostics_channel_channel_name +[`'uncaughtException'`]: process.md#event-uncaughtexception +[`channel.subscribe(onMessage)`]: #channelsubscribeonmessage +[`diagnostics_channel.channel(name)`]: #diagnostics_channelchannelname diff --git a/doc/api/dns.md b/doc/api/dns.md index 59082c81a0977e..ac7f7156043184 100644 --- a/doc/api/dns.md +++ b/doc/api/dns.md @@ -328,7 +328,7 @@ records. The type and structure of individual results varies based on `rrtype`: | `'TXT'` | text records | {string[]} | [`dns.resolveTxt()`][] | On error, `err` is an [`Error`][] object, where `err.code` is one of the -[DNS error codes](#dns_error_codes). +[DNS error codes](). ## `dns.resolve4(hostname[, options], callback)` @@ -330,7 +338,7 @@ An `import` statement can reference an ES module or a CommonJS module. `import` statements are permitted only in ES modules, but dynamic [`import()`][] expressions are supported in CommonJS for loading ES modules. -When importing [CommonJS modules](#esm_commonjs_namespaces), the +When importing [CommonJS modules](#commonjs-namespaces), the `module.exports` object is provided as the default export. Named exports may be available, provided by static analysis as a convenience for better ecosystem compatibility. @@ -604,20 +612,29 @@ CommonJS modules loaded. * `specifier` {string} * `context` {Object} * `conditions` {string[]} - * `parentURL` {string} -* `defaultResolve` {Function} + * `parentURL` {string|undefined} +* `defaultResolve` {Function} The Node.js default resolver. * Returns: {Object} - * `url` {string} + * `format` {string|null|undefined} + `'builtin' | 'commonjs' | 'json' | 'module' | 'wasm'` + * `url` {string} The absolute url to the import target (such as `file://…`) The `resolve` hook returns the resolved file URL for a given module specifier -and parent URL. The module specifier is the string in an `import` statement or +and parent URL, and optionally its format (such as `'module'`) as a hint to the +`load` hook. If a format is specified, the `load` hook is ultimately responsible +for providing the final `format` value (and it is free to ignore the hint +provided by `resolve`); if `resolve` provides a `format`, a custom `load` +hook is required even if only to pass the value to the Node.js default `load` +hook. + +The module specifier is the string in an `import` statement or `import()` expression, and the parent URL is the URL of the module that imported this one, or `undefined` if this is the main entry point for the application. -The `conditions` property on the `context` is an array of conditions for -[Conditional exports][] that apply to this resolution request. They can be used -for looking up conditional mappings elsewhere or to modify the list when calling -the default resolution logic. +The `conditions` property in `context` is an array of conditions for +[package exports conditions][Conditional Exports] that apply to this resolution +request. They can be used for looking up conditional mappings elsewhere or to +modify the list when calling the default resolution logic. The current [package exports conditions][Conditional Exports] are always in the `context.conditions` array passed into the hook. To guarantee _default @@ -659,150 +676,108 @@ export async function resolve(specifier, context, defaultResolve) { } ``` -#### `getFormat(url, context, defaultGetFormat)` +#### `load(url, context, defaultLoad)` > Note: The loaders API is being redesigned. This hook may disappear or its > signature may change. Do not rely on the API described below. +> Note: In a previous version of this API, this was split across 3 separate, now +> deprecated, hooks (`getFormat`, `getSource`, and `transformSource`). + * `url` {string} * `context` {Object} -* `defaultGetFormat` {Function} + * `format` {string|null|undefined} The format optionally supplied by the + `resolve` hook. +* `defaultLoad` {Function} * Returns: {Object} * `format` {string} + * `source` {string|ArrayBuffer|TypedArray} -The `getFormat` hook provides a way to define a custom method of determining how -a URL should be interpreted. The `format` returned also affects what the -acceptable forms of source values are for a module when parsing. This can be one -of the following: +The `load` hook provides a way to define a custom method of determining how +a URL should be interpreted, retrieved, and parsed. -| `format` | Description | Acceptable Types For `source` Returned by `getSource` or `transformSource` | -| ------------ | ------------------------------ | -------------------------------------------------------------------------- | -| `'builtin'` | Load a Node.js builtin module | Not applicable | -| `'commonjs'` | Load a Node.js CommonJS module | Not applicable | -| `'json'` | Load a JSON file | { [`string`][], [`ArrayBuffer`][], [`TypedArray`][] } | -| `'module'` | Load an ES module | { [`string`][], [`ArrayBuffer`][], [`TypedArray`][] } | -| `'wasm'` | Load a WebAssembly module | { [`ArrayBuffer`][], [`TypedArray`][] } | +The final value of `format` must be one of the following: -Note: These types all correspond to classes defined in ECMAScript. +| `format` | Description | Acceptable types for `source` returned by `load` | +| ------------ | ------------------------------ | ----------------------------------------------------- | +| `'builtin'` | Load a Node.js builtin module | Not applicable | +| `'commonjs'` | Load a Node.js CommonJS module | Not applicable | +| `'json'` | Load a JSON file | { [`string`][], [`ArrayBuffer`][], [`TypedArray`][] } | +| `'module'` | Load an ES module | { [`string`][], [`ArrayBuffer`][], [`TypedArray`][] } | +| `'wasm'` | Load a WebAssembly module | { [`ArrayBuffer`][], [`TypedArray`][] } | -* The specific [`ArrayBuffer`][] object is a [`SharedArrayBuffer`][]. -* The specific [`TypedArray`][] object is a [`Uint8Array`][]. +The value of `source` is ignored for type `'builtin'` because currently it is +not possible to replace the value of a Node.js builtin (core) module. The value +of `source` is ignored for type `'commonjs'` because the CommonJS module loader +does not provide a mechanism for the ES module loader to override the +[CommonJS module return value](#commonjs-namespaces). This limitation might be +overcome in the future. -Note: If the source value of a text-based format (i.e., `'json'`, `'module'`) is -not a string, it is converted to a string using [`util.TextDecoder`][]. +> **Caveat**: The ESM `load` hook and namespaced exports from CommonJS modules +> are incompatible. Attempting to use them together will result in an empty +> object from the import. This may be addressed in the future. -```js -/** - * @param {string} url - * @param {Object} context (currently empty) - * @param {Function} defaultGetFormat - * @returns {Promise<{ format: string }>} - */ -export async function getFormat(url, context, defaultGetFormat) { - if (Math.random() > 0.5) { // Some condition. - // For some or all URLs, do some custom logic for determining format. - // Always return an object of the form {format: }, where the - // format is one of the strings in the preceding table. - return { - format: 'module', - }; - } - // Defer to Node.js for all other URLs. - return defaultGetFormat(url, context, defaultGetFormat); -} -``` - -#### `getSource(url, context, defaultGetSource)` +> Note: These types all correspond to classes defined in ECMAScript. -> Note: The loaders API is being redesigned. This hook may disappear or its -> signature may change. Do not rely on the API described below. +* The specific [`ArrayBuffer`][] object is a [`SharedArrayBuffer`][]. +* The specific [`TypedArray`][] object is a [`Uint8Array`][]. -* `url` {string} -* `context` {Object} - * `format` {string} -* `defaultGetSource` {Function} -* Returns: {Object} - * `source` {string|SharedArrayBuffer|Uint8Array} +If the source value of a text-based format (i.e., `'json'`, `'module'`) +is not a string, it is converted to a string using [`util.TextDecoder`][]. -The `getSource` hook provides a way to define a custom method for retrieving -the source code of an ES module specifier. This would allow a loader to -potentially avoid reading files from disk. +The `load` hook provides a way to define a custom method for retrieving the +source code of an ES module specifier. This would allow a loader to potentially +avoid reading files from disk. It could also be used to map an unrecognized +format to a supported one, for example `yaml` to `module`. ```js /** * @param {string} url - * @param {{ format: string }} context - * @param {Function} defaultGetSource - * @returns {Promise<{ source: !(string | SharedArrayBuffer | Uint8Array) }>} + * @param {{ + format: string, + }} context If resolve settled with a `format`, that value is included here. + * @param {Function} defaultLoad + * @returns {Promise<{ + format: !string, + source: !(string | ArrayBuffer | SharedArrayBuffer | Uint8Array), + }>} */ -export async function getSource(url, context, defaultGetSource) { +export async function load(url, context, defaultLoad) { const { format } = context; if (Math.random() > 0.5) { // Some condition. - // For some or all URLs, do some custom logic for retrieving the source. - // Always return an object of the form {source: }. + /* + For some or all URLs, do some custom logic for retrieving the source. + Always return an object of the form { + format: , + source: , + }. + */ return { + format, source: '...', }; } // Defer to Node.js for all other URLs. - return defaultGetSource(url, context, defaultGetSource); + return defaultLoad(url, context, defaultLoad); } ``` -#### `transformSource(source, context, defaultTransformSource)` - -> Note: The loaders API is being redesigned. This hook may disappear or its -> signature may change. Do not rely on the API described below. - -* `source` {string|SharedArrayBuffer|Uint8Array} -* `context` {Object} - * `format` {string} - * `url` {string} -* Returns: {Object} - * `source` {string|SharedArrayBuffer|Uint8Array} - -The `transformSource` hook provides a way to modify the source code of a loaded -ES module file after the source string has been loaded but before Node.js has -done anything with it. - -If this hook is used to convert unknown-to-Node.js file types into executable -JavaScript, a resolve hook is also necessary in order to register any -unknown-to-Node.js file extensions. See the [transpiler loader example][] below. - -```js -/** - * @param {!(string | SharedArrayBuffer | Uint8Array)} source - * @param {{ - * format: string, - * url: string, - * }} context - * @param {Function} defaultTransformSource - * @returns {Promise<{ source: !(string | SharedArrayBuffer | Uint8Array) }>} - */ -export async function transformSource(source, context, defaultTransformSource) { - const { url, format } = context; - if (Math.random() > 0.5) { // Some condition. - // For some or all URLs, do some custom logic for modifying the source. - // Always return an object of the form {source: }. - return { - source: '...', - }; - } - // Defer to Node.js for all other sources. - return defaultTransformSource(source, context, defaultTransformSource); -} -``` +In a more advanced scenario, this can also be used to transform an unsupported +source to a supported one (see [Examples](#examples) below). -#### `getGlobalPreloadCode()` +#### `globalPreload()` > Note: The loaders API is being redesigned. This hook may disappear or its > signature may change. Do not rely on the API described below. +> Note: In a previous version of this API, this hook was named +> `getGlobalPreloadCode`. + * Returns: {string} -Sometimes it might be necessary to run some code inside of the same global scope -that the application runs in. This hook allows the return of a string that is -run as sloppy-mode script on startup. +Sometimes it might be necessary to run some code inside of the same global +scope that the application runs in. This hook allows the return of a string +that is run as a sloppy-mode script on startup. Similar to how CommonJS wrappers work, the code runs in an implicit function scope. The only argument is a `require`-like function that can be used to load @@ -815,7 +790,7 @@ its own `require` using `module.createRequire()`. /** * @returns {string} Code to run before application startup */ -export function getGlobalPreloadCode() { +export function globalPreload() { return `\ globalThis.someInjectedProperty = 42; console.log('I just set some globals!'); @@ -867,19 +842,7 @@ export function resolve(specifier, context, defaultResolve) { return defaultResolve(specifier, context, defaultResolve); } -export function getFormat(url, context, defaultGetFormat) { - // This loader assumes all network-provided JavaScript is ES module code. - if (url.startsWith('https://')) { - return { - format: 'module' - }; - } - - // Let Node.js handle all other URLs. - return defaultGetFormat(url, context, defaultGetFormat); -} - -export function getSource(url, context, defaultGetSource) { +export function load(url, context, defaultLoad) { // For JavaScript to be loaded over the network, we need to fetch and // return it. if (url.startsWith('https://')) { @@ -887,13 +850,18 @@ export function getSource(url, context, defaultGetSource) { get(url, (res) => { let data = ''; res.on('data', (chunk) => data += chunk); - res.on('end', () => resolve({ source: data })); + res.on('end', () => resolve({ + // This example assumes all network-provided JavaScript is ES module + // code. + format: 'module', + source: data, + })); }).on('error', (err) => reject(err)); }); } // Let Node.js handle all other URLs. - return defaultGetSource(url, context, defaultGetSource); + return defaultLoad(url, context, defaultLoad); } ``` @@ -912,9 +880,9 @@ prints the current version of CoffeeScript per the module at the URL in #### Transpiler loader Sources that are in formats Node.js doesn’t understand can be converted into -JavaScript using the [`transformSource` hook][]. Before that hook gets called, -however, other hooks need to tell Node.js not to throw an error on unknown file -types; and to tell Node.js how to load this new file type. +JavaScript using the [`load` hook][load hook]. Before that hook gets called, +however, a [`resolve` hook][resolve hook] hook needs to tell Node.js not to +throw an error on unknown file types. This is less performant than transpiling source files before running Node.js; a transpiler loader should only be used for development and testing @@ -922,16 +890,21 @@ purposes. ```js // coffeescript-loader.mjs -import { URL, pathToFileURL } from 'url'; -import CoffeeScript from 'coffeescript'; +import { readFile } from 'fs/promises'; +import { readFileSync } from 'fs'; +import { createRequire } from 'module'; +import { dirname, extname, resolve as resolvePath } from 'path'; import { cwd } from 'process'; +import { fileURLToPath, pathToFileURL } from 'url'; -const baseURL = pathToFileURL(`${cwd()}/`).href; +import CoffeeScript from 'coffeescript'; + +const baseURL = pathToFileURL(`${cwd}/`).href; // CoffeeScript files end in .coffee, .litcoffee or .coffee.md. const extensionsRegex = /\.coffee$|\.litcoffee$|\.coffee\.md$/; -export function resolve(specifier, context, defaultResolve) { +export async function resolve(specifier, context, defaultResolve) { const { parentURL = baseURL } = context; // Node.js normally errors on unknown file extensions, so return a URL for @@ -946,31 +919,72 @@ export function resolve(specifier, context, defaultResolve) { return defaultResolve(specifier, context, defaultResolve); } -export function getFormat(url, context, defaultGetFormat) { +export async function load(url, context, defaultLoad) { // Now that we patched resolve to let CoffeeScript URLs through, we need to - // tell Node.js what format such URLs should be interpreted as. For the - // purposes of this loader, all CoffeeScript URLs are ES modules. + // tell Node.js what format such URLs should be interpreted as. Because + // CoffeeScript transpiles into JavaScript, it should be one of the two + // JavaScript formats: 'commonjs' or 'module'. if (extensionsRegex.test(url)) { + // CoffeeScript files can be either CommonJS or ES modules, so we want any + // CoffeeScript file to be treated by Node.js the same as a .js file at the + // same location. To determine how Node.js would interpret an arbitrary .js + // file, search up the file system for the nearest parent package.json file + // and read its "type" field. + const format = await getPackageType(url); + // When a hook returns a format of 'commonjs', `source` is be ignored. + // To handle CommonJS files, a handler needs to be registered with + // `require.extensions` in order to process the files with the CommonJS + // loader. Avoiding the need for a separate CommonJS handler is a future + // enhancement planned for ES module loaders. + if (format === 'commonjs') { + return { format }; + } + + const { source: rawSource } = await defaultLoad(url, { format }); + // This hook converts CoffeeScript source code into JavaScript source code + // for all imported CoffeeScript files. + const transformedSource = CoffeeScript.compile(rawSource.toString(), { + bare: true, + filename: url, + }); + return { - format: 'module' + format, + source: transformedSource, }; } // Let Node.js handle all other URLs. - return defaultGetFormat(url, context, defaultGetFormat); + return defaultLoad(url, context, defaultLoad); } -export function transformSource(source, context, defaultTransformSource) { - const { url, format } = context; - - if (extensionsRegex.test(url)) { - return { - source: CoffeeScript.compile(source, { bare: true }) - }; - } - - // Let Node.js handle all other sources. - return defaultTransformSource(source, context, defaultTransformSource); +async function getPackageType(url) { + // `url` is only a file path during the first iteration when passed the + // resolved url from the load() hook + // an actual file path from load() will contain a file extension as it's + // required by the spec + // this simple truthy check for whether `url` contains a file extension will + // work for most projects but does not cover some edge-cases (such as + // extension-less files or a url ending in a trailing space) + const isFilePath = !!extname(url); + // If it is a file path, get the directory it's in + const dir = isFilePath ? + dirname(fileURLToPath(url)) : + url; + // Compose a file path to a package.json in the same directory, + // which may or may not exist + const packagePath = resolvePath(dir, 'package.json'); + // Try to read the possibly nonexistent package.json + const type = await readFile(packagePath, { encoding: 'utf8' }) + .then((filestring) => JSON.parse(filestring).type) + .catch((err) => { + if (err?.code !== 'ENOENT') console.error(err); + }); + // Ff package.json existed and contained a `type` field with a value, voila + if (type) return type; + // Otherwise, (if not at the root) continue checking the next directory up + // If at the root, stop and return false + return dir.length > 1 && getPackageType(resolvePath(dir, '..')); } ``` @@ -1128,8 +1142,8 @@ The resolver can throw the following errors: > 1. Return **undefined**. > 1. If _pjson.name_ is equal to _packageName_, then > 1. Return the _resolved_ destructured value of the result of -> **PACKAGE_EXPORTS_RESOLVE**(_packageURL_, _subpath_, _pjson.exports_, -> _defaultConditions_). +> **PACKAGE_EXPORTS_RESOLVE**(_packageURL_, _packageSubpath_, +> _pjson.exports_, _defaultConditions_). > 1. Otherwise, return **undefined**. **PACKAGE_EXPORTS_RESOLVE**(_packageURL_, _subpath_, _exports_, _conditions_) @@ -1351,37 +1365,37 @@ success! [6.1.7 Array Index]: https://tc39.es/ecma262/#integer-index [CommonJS]: modules.md -[Conditional exports]: packages.md#packages_conditional_exports -[Core modules]: modules.md#modules_core_modules +[Conditional exports]: packages.md#conditional-exports +[Core modules]: modules.md#core-modules [Dynamic `import()`]: https://wiki.developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#Dynamic_Imports [ECMAScript Top-Level `await` proposal]: https://github.com/tc39/proposal-top-level-await/ [ES Module Integration Proposal for Web Assembly]: https://github.com/webassembly/esm-integration -[Node.js Module Resolution Algorithm]: #esm_resolver_algorithm_specification -[Terminology]: #esm_terminology +[Node.js Module Resolution Algorithm]: #resolver-algorithm-specification +[Terminology]: #terminology [URL]: https://url.spec.whatwg.org/ [WHATWG JSON modules specification]: https://html.spec.whatwg.org/#creating-a-json-module-script -[`"exports"`]: packages.md#packages_exports -[`"type"`]: packages.md#packages_type +[`"exports"`]: packages.md#exports +[`"type"`]: packages.md#type [`ArrayBuffer`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer [`SharedArrayBuffer`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer [`TypedArray`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray [`Uint8Array`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array [`data:` URLs]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs [`export`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export -[`import()`]: #esm_import_expressions -[`import.meta.resolve`]: #esm_import_meta_resolve_specifier_parent -[`import.meta.url`]: #esm_import_meta_url +[`import()`]: #import-expressions +[`import.meta.resolve`]: #importmetaresolvespecifier-parent +[`import.meta.url`]: #importmetaurl [`import`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import -[`module.createRequire()`]: module.md#module_module_createrequire_filename -[`module.syncBuiltinESMExports()`]: module.md#module_module_syncbuiltinesmexports -[`package.json`]: packages.md#packages_node_js_package_json_field_definitions -[`process.dlopen`]: process.md#process_process_dlopen_module_filename_flags +[`module.createRequire()`]: module.md#modulecreaterequirefilename +[`module.syncBuiltinESMExports()`]: module.md#modulesyncbuiltinesmexports +[`package.json`]: packages.md#nodejs-packagejson-field-definitions +[`process.dlopen`]: process.md#processdlopenmodule-filename-flags [`string`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String -[`transformSource` hook]: #esm_transformsource_source_context_defaulttransformsource -[`util.TextDecoder`]: util.md#util_class_util_textdecoder +[`util.TextDecoder`]: util.md#class-utiltextdecoder [cjs-module-lexer]: https://github.com/guybedford/cjs-module-lexer/tree/1.2.2 -[custom https loader]: #esm_https_loader +[custom https loader]: #https-loader +[load hook]: #loadurl-context-defaultload +[resolve hook]: #resolvespecifier-context-defaultresolve [special scheme]: https://url.spec.whatwg.org/#special-scheme [the official standard format]: https://tc39.github.io/ecma262/#sec-modules -[transpiler loader example]: #esm_transpiler_loader -[url.pathToFileURL]: url.md#url_url_pathtofileurl_path +[url.pathToFileURL]: url.md#urlpathtofileurlpath diff --git a/doc/api/events.md b/doc/api/events.md index c9c2e43353d7ba..b6a075f2a77a98 100644 --- a/doc/api/events.md +++ b/doc/api/events.md @@ -1624,20 +1624,20 @@ and `removeEventListener()` is that `removeListener()` will return a reference to the `EventTarget`. [WHATWG-EventTarget]: https://dom.spec.whatwg.org/#interface-eventtarget -[`--trace-warnings`]: cli.md#cli_trace_warnings +[`--trace-warnings`]: cli.md#--trace-warnings [`EventTarget` Web API]: https://dom.spec.whatwg.org/#eventtarget -[`EventTarget` error handling]: #events_eventtarget_error_handling +[`EventTarget` error handling]: #eventtarget-error-handling [`Event` Web API]: https://dom.spec.whatwg.org/#event [`domain`]: domain.md -[`emitter.listenerCount()`]: #events_emitter_listenercount_eventname -[`emitter.removeListener()`]: #events_emitter_removelistener_eventname_listener -[`emitter.setMaxListeners(n)`]: #events_emitter_setmaxlisteners_n -[`events.defaultMaxListeners`]: #events_events_defaultmaxlisteners -[`fs.ReadStream`]: fs.md#fs_class_fs_readstream -[`net.Server`]: net.md#net_class_net_server -[`process.on('warning')`]: process.md#process_event_warning -[capturerejections]: #events_capture_rejections_of_promises -[error]: #events_error_events -[rejection]: #events_emitter_symbol_for_nodejs_rejection_err_eventname_args -[rejectionsymbol]: #events_events_capturerejectionsymbol +[`emitter.listenerCount()`]: #emitterlistenercounteventname +[`emitter.removeListener()`]: #emitterremovelistenereventname-listener +[`emitter.setMaxListeners(n)`]: #emittersetmaxlistenersn +[`events.defaultMaxListeners`]: #eventsdefaultmaxlisteners +[`fs.ReadStream`]: fs.md#class-fsreadstream +[`net.Server`]: net.md#class-netserver +[`process.on('warning')`]: process.md#event-warning +[capturerejections]: #capture-rejections-of-promises +[error]: #error-events +[rejection]: #emittersymbolfornodejsrejectionerr-eventname-args +[rejectionsymbol]: #eventscapturerejectionsymbol [stream]: stream.md diff --git a/doc/api/fs.md b/doc/api/fs.md index c17b65fdd84b80..09489b76c3359b 100644 --- a/doc/api/fs.md +++ b/doc/api/fs.md @@ -6952,66 +6952,66 @@ A call to `fs.ftruncate()` or `filehandle.truncate()` can be used to reset the file contents. [#25741]: https://github.com/nodejs/node/issues/25741 -[Common System Errors]: errors.md#errors_common_system_errors -[File access constants]: #fs_file_access_constants +[Common System Errors]: errors.md#common-system-errors +[File access constants]: #file-access-constants [MDN-Date]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date [MDN-Number]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type [MSDN-Rel-Path]: https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file#fully-qualified-vs-relative-paths [MSDN-Using-Streams]: https://docs.microsoft.com/en-us/windows/desktop/FileIO/using-streams [Naming Files, Paths, and Namespaces]: https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file [`AHAFS`]: https://developer.ibm.com/articles/au-aix_event_infrastructure/ -[`Buffer.byteLength`]: buffer.md#buffer_static_method_buffer_bytelength_string_encoding +[`Buffer.byteLength`]: buffer.md#static-method-bufferbytelengthstring-encoding [`FSEvents`]: https://developer.apple.com/documentation/coreservices/file_system_events [`Number.MAX_SAFE_INTEGER`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER [`ReadDirectoryChangesW`]: https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-readdirectorychangesw -[`UV_THREADPOOL_SIZE`]: cli.md#cli_uv_threadpool_size_size +[`UV_THREADPOOL_SIZE`]: cli.md#uv_threadpool_sizesize [`event ports`]: https://illumos.org/man/port_create -[`filehandle.writeFile()`]: #fs_filehandle_writefile_data_options -[`fs.access()`]: #fs_fs_access_path_mode_callback -[`fs.chmod()`]: #fs_fs_chmod_path_mode_callback -[`fs.chown()`]: #fs_fs_chown_path_uid_gid_callback -[`fs.copyFile()`]: #fs_fs_copyfile_src_dest_mode_callback -[`fs.createReadStream()`]: #fs_fs_createreadstream_path_options -[`fs.createWriteStream()`]: #fs_fs_createwritestream_path_options -[`fs.exists()`]: #fs_fs_exists_path_callback -[`fs.fstat()`]: #fs_fs_fstat_fd_options_callback -[`fs.ftruncate()`]: #fs_fs_ftruncate_fd_len_callback -[`fs.futimes()`]: #fs_fs_futimes_fd_atime_mtime_callback -[`fs.lstat()`]: #fs_fs_lstat_path_options_callback -[`fs.lutimes()`]: #fs_fs_lutimes_path_atime_mtime_callback -[`fs.mkdir()`]: #fs_fs_mkdir_path_options_callback -[`fs.mkdtemp()`]: #fs_fs_mkdtemp_prefix_options_callback -[`fs.open()`]: #fs_fs_open_path_flags_mode_callback -[`fs.opendir()`]: #fs_fs_opendir_path_options_callback -[`fs.opendirSync()`]: #fs_fs_opendirsync_path_options -[`fs.read()`]: #fs_fs_read_fd_buffer_offset_length_position_callback -[`fs.readFile()`]: #fs_fs_readfile_path_options_callback -[`fs.readFileSync()`]: #fs_fs_readfilesync_path_options -[`fs.readdir()`]: #fs_fs_readdir_path_options_callback -[`fs.readdirSync()`]: #fs_fs_readdirsync_path_options -[`fs.readv()`]: #fs_fs_readv_fd_buffers_position_callback -[`fs.realpath()`]: #fs_fs_realpath_path_options_callback -[`fs.rm()`]: #fs_fs_rm_path_options_callback -[`fs.rmSync()`]: #fs_fs_rmsync_path_options -[`fs.rmdir()`]: #fs_fs_rmdir_path_options_callback -[`fs.stat()`]: #fs_fs_stat_path_options_callback -[`fs.symlink()`]: #fs_fs_symlink_target_path_type_callback -[`fs.utimes()`]: #fs_fs_utimes_path_atime_mtime_callback -[`fs.watch()`]: #fs_fs_watch_filename_options_listener -[`fs.write(fd, buffer...)`]: #fs_fs_write_fd_buffer_offset_length_position_callback -[`fs.write(fd, string...)`]: #fs_fs_write_fd_string_position_encoding_callback -[`fs.writeFile()`]: #fs_fs_writefile_file_data_options_callback -[`fs.writev()`]: #fs_fs_writev_fd_buffers_position_callback -[`fsPromises.open()`]: #fs_fspromises_open_path_flags_mode -[`fsPromises.opendir()`]: #fs_fspromises_opendir_path_options -[`fsPromises.rm()`]: #fs_fspromises_rm_path_options -[`fsPromises.stat()`]: #fs_fspromises_stat_path_options -[`fsPromises.utimes()`]: #fs_fspromises_utimes_path_atime_mtime +[`filehandle.writeFile()`]: #filehandlewritefiledata-options +[`fs.access()`]: #fsaccesspath-mode-callback +[`fs.chmod()`]: #fschmodpath-mode-callback +[`fs.chown()`]: #fschownpath-uid-gid-callback +[`fs.copyFile()`]: #fscopyfilesrc-dest-mode-callback +[`fs.createReadStream()`]: #fscreatereadstreampath-options +[`fs.createWriteStream()`]: #fscreatewritestreampath-options +[`fs.exists()`]: #fsexistspath-callback +[`fs.fstat()`]: #fsfstatfd-options-callback +[`fs.ftruncate()`]: #fsftruncatefd-len-callback +[`fs.futimes()`]: #fsfutimesfd-atime-mtime-callback +[`fs.lstat()`]: #fslstatpath-options-callback +[`fs.lutimes()`]: #fslutimespath-atime-mtime-callback +[`fs.mkdir()`]: #fsmkdirpath-options-callback +[`fs.mkdtemp()`]: #fsmkdtempprefix-options-callback +[`fs.open()`]: #fsopenpath-flags-mode-callback +[`fs.opendir()`]: #fsopendirpath-options-callback +[`fs.opendirSync()`]: #fsopendirsyncpath-options +[`fs.read()`]: #fsreadfd-buffer-offset-length-position-callback +[`fs.readFile()`]: #fsreadfilepath-options-callback +[`fs.readFileSync()`]: #fsreadfilesyncpath-options +[`fs.readdir()`]: #fsreaddirpath-options-callback +[`fs.readdirSync()`]: #fsreaddirsyncpath-options +[`fs.readv()`]: #fsreadvfd-buffers-position-callback +[`fs.realpath()`]: #fsrealpathpath-options-callback +[`fs.rm()`]: #fsrmpath-options-callback +[`fs.rmSync()`]: #fsrmsyncpath-options +[`fs.rmdir()`]: #fsrmdirpath-options-callback +[`fs.stat()`]: #fsstatpath-options-callback +[`fs.symlink()`]: #fssymlinktarget-path-type-callback +[`fs.utimes()`]: #fsutimespath-atime-mtime-callback +[`fs.watch()`]: #fswatchfilename-options-listener +[`fs.write(fd, buffer...)`]: #fswritefd-buffer-offset-length-position-callback +[`fs.write(fd, string...)`]: #fswritefd-string-position-encoding-callback +[`fs.writeFile()`]: #fswritefilefile-data-options-callback +[`fs.writev()`]: #fswritevfd-buffers-position-callback +[`fsPromises.open()`]: #fspromisesopenpath-flags-mode +[`fsPromises.opendir()`]: #fspromisesopendirpath-options +[`fsPromises.rm()`]: #fspromisesrmpath-options +[`fsPromises.stat()`]: #fspromisesstatpath-options +[`fsPromises.utimes()`]: #fspromisesutimespath-atime-mtime [`inotify(7)`]: https://man7.org/linux/man-pages/man7/inotify.7.html [`kqueue(2)`]: https://www.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2 -[`util.promisify()`]: util.md#util_util_promisify_original +[`util.promisify()`]: util.md#utilpromisifyoriginal [bigints]: https://tc39.github.io/proposal-bigint -[caveats]: #fs_caveats +[caveats]: #caveats [chcp]: https://ss64.com/nt/chcp.html [inode]: https://en.wikipedia.org/wiki/Inode -[support of file system `flags`]: #fs_file_system_flags +[support of file system `flags`]: #file-system-flags diff --git a/doc/api/globals.md b/doc/api/globals.md index 9be3efa9a70086..db071e2cb95dfb 100644 --- a/doc/api/globals.md +++ b/doc/api/globals.md @@ -415,31 +415,31 @@ The object that acts as the namespace for all W3C [Mozilla Developer Network][webassembly-mdn] for usage and compatibility. [`AbortController`]: https://developer.mozilla.org/en-US/docs/Web/API/AbortController -[`EventTarget` and `Event` API]: events.md#event-target-and-event-api -[`MessageChannel`]: worker_threads.md#worker_threads_class_messagechannel +[`EventTarget` and `Event` API]: events.md#eventtarget-and-event-api +[`MessageChannel`]: worker_threads.md#class-messagechannel [`MessageEvent`]: https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent/MessageEvent -[`MessagePort`]: worker_threads.md#worker_threads_class_messageport -[`TextDecoder`]: util.md#util_class_util_textdecoder -[`TextEncoder`]: util.md#util_class_util_textencoder -[`URLSearchParams`]: url.md#url_class_urlsearchparams -[`URL`]: url.md#url_class_url -[`__dirname`]: modules.md#modules_dirname -[`__filename`]: modules.md#modules_filename -[`buffer.atob()`]: buffer.md#buffer_buffer_atob_data -[`buffer.btoa()`]: buffer.md#buffer_buffer_btoa_data -[`clearImmediate`]: timers.md#timers_clearimmediate_immediate -[`clearInterval`]: timers.md#timers_clearinterval_timeout -[`clearTimeout`]: timers.md#timers_cleartimeout_timeout +[`MessagePort`]: worker_threads.md#class-messageport +[`TextDecoder`]: util.md#class-utiltextdecoder +[`TextEncoder`]: util.md#class-utiltextencoder +[`URLSearchParams`]: url.md#class-urlsearchparams +[`URL`]: url.md#class-url +[`__dirname`]: modules.md#__dirname +[`__filename`]: modules.md#__filename +[`buffer.atob()`]: buffer.md#bufferatobdata +[`buffer.btoa()`]: buffer.md#bufferbtoadata +[`clearImmediate`]: timers.md#clearimmediateimmediate +[`clearInterval`]: timers.md#clearintervaltimeout +[`clearTimeout`]: timers.md#cleartimeouttimeout [`console`]: console.md -[`exports`]: modules.md#modules_exports -[`module`]: modules.md#modules_module -[`perf_hooks.performance`]: perf_hooks.md#perf_hooks_perf_hooks_performance -[`process.nextTick()`]: process.md#process_process_nexttick_callback_args -[`process` object]: process.md#process_process -[`require()`]: modules.md#modules_require_id -[`setImmediate`]: timers.md#timers_setimmediate_callback_args -[`setInterval`]: timers.md#timers_setinterval_callback_delay_args -[`setTimeout`]: timers.md#timers_settimeout_callback_delay_args +[`exports`]: modules.md#exports +[`module`]: modules.md#module +[`perf_hooks.performance`]: perf_hooks.md#perf_hooksperformance +[`process.nextTick()`]: process.md#processnexttickcallback-args +[`process` object]: process.md#process +[`require()`]: modules.md#requireid +[`setImmediate`]: timers.md#setimmediatecallback-args +[`setInterval`]: timers.md#setintervalcallback-delay-args +[`setTimeout`]: timers.md#settimeoutcallback-delay-args [buffer section]: buffer.md [built-in objects]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects [module system documentation]: modules.md diff --git a/doc/api/http.md b/doc/api/http.md index 5b441248b7ed10..7abaa9bfed660f 100644 --- a/doc/api/http.md +++ b/doc/api/http.md @@ -60,7 +60,7 @@ for a given host and port, reusing a single socket connection for each until the queue is empty, at which time the socket is either destroyed or put into a pool where it is kept to be used again for requests to the same host and port. Whether it is destroyed or pooled depends on the -`keepAlive` [option](#http_new_agent_options). +`keepAlive` [option](#new-agentoptions). Pooled connections have TCP Keep-Alive enabled for them, but servers may still close idle connections, in which case they will be removed from the @@ -140,7 +140,7 @@ changes: options are respectively set to `false` and `Infinity`, in which case `Connection: close` will be used. **Default:** `false`. * `keepAliveMsecs` {number} When using the `keepAlive` option, specifies - the [initial delay](net.md#net_socket_setkeepalive_enable_initialdelay) + the [initial delay][] for TCP Keep-Alive packets. Ignored when the `keepAlive` option is `false` or `undefined`. **Default:** `1000`. * `maxSockets` {number} Maximum number of sockets to allow per host. @@ -405,8 +405,11 @@ body which has been transmitted are equal or not. ### Event: `'abort'` +> Stability: 0 - Deprecated. Listen for the `'close'` event instead. + Emitted when the request has been aborted by the client. This event is only emitted on the first call to `abort()`. @@ -562,7 +565,7 @@ added: v0.7.8 --> Emitted when the underlying socket times out from inactivity. This only notifies -that the socket has been idle. The request must be aborted manually. +that the socket has been idle. The request must be destroyed manually. See also: [`request.setTimeout()`][]. @@ -643,12 +646,15 @@ in the response to be dropped and the socket to be destroyed. ### `request.aborted` +> Stability: 0 - Deprecated. Check [`request.destroyed`][] instead. + * {boolean} The `request.aborted` property will be `true` if the request has @@ -1984,8 +1990,11 @@ may be reused multiple times in case of keep-alive. ### Event: `'aborted'` +> Stability: 0 - Deprecated. Listen for `'close'` event instead. + Emitted when the request has been aborted. ### Event: `'close'` @@ -1998,8 +2007,11 @@ Indicates that the underlying connection was closed. ### `message.aborted` +> Stability: 0 - Deprecated. Check `message.destroyed` from {stream.Readable}. + * {boolean} The `message.aborted` property will be `true` if the request has @@ -3194,73 +3206,75 @@ try { } ``` -[`'checkContinue'`]: #http_event_checkcontinue -[`'finish'`]: #http_event_finish -[`'request'`]: #http_event_request -[`'response'`]: #http_event_response -[`'upgrade'`]: #http_event_upgrade -[`--insecure-http-parser`]: cli.md#cli_insecure_http_parser -[`--max-http-header-size`]: cli.md#cli_max_http_header_size_size -[`Agent`]: #http_class_http_agent -[`Buffer.byteLength()`]: buffer.md#buffer_static_method_buffer_bytelength_string_encoding -[`Duplex`]: stream.md#stream_class_stream_duplex -[`HPE_HEADER_OVERFLOW`]: errors.md#errors_hpe_header_overflow -[`TypeError`]: errors.md#errors_class_typeerror -[`URL`]: url.md#url_the_whatwg_url_api -[`agent.createConnection()`]: #http_agent_createconnection_options_callback -[`agent.getName()`]: #http_agent_getname_options -[`destroy()`]: #http_agent_destroy -[`dns.lookup()`]: dns.md#dns_dns_lookup_hostname_options_callback -[`dns.lookup()` hints]: dns.md#dns_supported_getaddrinfo_flags -[`getHeader(name)`]: #http_request_getheader_name -[`http.Agent`]: #http_class_http_agent -[`http.ClientRequest`]: #http_class_http_clientrequest -[`http.IncomingMessage`]: #http_class_http_incomingmessage -[`http.ServerResponse`]: #http_class_http_serverresponse -[`http.Server`]: #http_class_http_server -[`http.get()`]: #http_http_get_options_callback -[`http.globalAgent`]: #http_http_globalagent -[`http.request()`]: #http_http_request_options_callback -[`message.headers`]: #http_message_headers -[`message.socket`]: #http_message_socket -[`net.Server.close()`]: net.md#net_server_close_callback -[`net.Server`]: net.md#net_class_net_server -[`net.Socket`]: net.md#net_class_net_socket -[`net.createConnection()`]: net.md#net_net_createconnection_options_connectlistener -[`new URL()`]: url.md#url_new_url_input_base -[`outgoingMessage.socket`]: #http_outgoingmessage_socket -[`removeHeader(name)`]: #http_request_removeheader_name -[`request.destroy()`]: #http_request_destroy_error -[`request.end()`]: #http_request_end_data_encoding_callback -[`request.flushHeaders()`]: #http_request_flushheaders -[`request.getHeader()`]: #http_request_getheader_name -[`request.setHeader()`]: #http_request_setheader_name_value -[`request.setTimeout()`]: #http_request_settimeout_timeout_callback -[`request.socket.getPeerCertificate()`]: tls.md#tls_tlssocket_getpeercertificate_detailed -[`request.socket`]: #http_request_socket -[`request.writableEnded`]: #http_request_writableended -[`request.writableFinished`]: #http_request_writablefinished -[`request.write(data, encoding)`]: #http_request_write_chunk_encoding_callback -[`response.end()`]: #http_response_end_data_encoding_callback -[`response.getHeader()`]: #http_response_getheader_name -[`response.setHeader()`]: #http_response_setheader_name_value -[`response.socket`]: #http_response_socket -[`response.writableEnded`]: #http_response_writableended -[`response.writableFinished`]: #http_response_writablefinished -[`response.write()`]: #http_response_write_chunk_encoding_callback -[`response.write(data, encoding)`]: #http_response_write_chunk_encoding_callback -[`response.writeContinue()`]: #http_response_writecontinue -[`response.writeHead()`]: #http_response_writehead_statuscode_statusmessage_headers -[`server.listen()`]: net.md#net_server_listen -[`server.timeout`]: #http_server_timeout -[`setHeader(name, value)`]: #http_request_setheader_name_value -[`socket.connect()`]: net.md#net_socket_connect_options_connectlistener -[`socket.setKeepAlive()`]: net.md#net_socket_setkeepalive_enable_initialdelay -[`socket.setNoDelay()`]: net.md#net_socket_setnodelay_nodelay -[`socket.setTimeout()`]: net.md#net_socket_settimeout_timeout_callback -[`socket.unref()`]: net.md#net_socket_unref -[`url.parse()`]: url.md#url_url_parse_urlstring_parsequerystring_slashesdenotehost -[`writable.cork()`]: stream.md#stream_writable_cork -[`writable.destroy()`]: stream.md#stream_writable_destroy_error -[`writable.destroyed`]: stream.md#stream_writable_destroyed -[`writable.uncork()`]: stream.md#stream_writable_uncork +[`'checkContinue'`]: #event-checkcontinue +[`'finish'`]: #event-finish +[`'request'`]: #event-request +[`'response'`]: #event-response +[`'upgrade'`]: #event-upgrade +[`--insecure-http-parser`]: cli.md#--insecure-http-parser +[`--max-http-header-size`]: cli.md#--max-http-header-sizesize +[`Agent`]: #class-httpagent +[`Buffer.byteLength()`]: buffer.md#static-method-bufferbytelengthstring-encoding +[`Duplex`]: stream.md#class-streamduplex +[`HPE_HEADER_OVERFLOW`]: errors.md#hpe_header_overflow +[`TypeError`]: errors.md#class-typeerror +[`URL`]: url.md#the-whatwg-url-api +[`agent.createConnection()`]: #agentcreateconnectionoptions-callback +[`agent.getName()`]: #agentgetnameoptions +[`destroy()`]: #agentdestroy +[`dns.lookup()`]: dns.md#dnslookuphostname-options-callback +[`dns.lookup()` hints]: dns.md#supported-getaddrinfo-flags +[`getHeader(name)`]: #requestgetheadername +[`http.Agent`]: #class-httpagent +[`http.ClientRequest`]: #class-httpclientrequest +[`http.IncomingMessage`]: #class-httpincomingmessage +[`http.ServerResponse`]: #class-httpserverresponse +[`http.Server`]: #class-httpserver +[`http.get()`]: #httpgetoptions-callback +[`http.globalAgent`]: #httpglobalagent +[`http.request()`]: #httprequestoptions-callback +[`message.headers`]: #messageheaders +[`message.socket`]: #messagesocket +[`net.Server.close()`]: net.md#serverclosecallback +[`net.Server`]: net.md#class-netserver +[`net.Socket`]: net.md#class-netsocket +[`net.createConnection()`]: net.md#netcreateconnectionoptions-connectlistener +[`new URL()`]: url.md#new-urlinput-base +[`outgoingMessage.socket`]: #outgoingmessagesocket +[`removeHeader(name)`]: #requestremoveheadername +[`request.destroy()`]: #requestdestroyerror +[`request.destroyed`]: #requestdestroyed +[`request.end()`]: #requestenddata-encoding-callback +[`request.flushHeaders()`]: #requestflushheaders +[`request.getHeader()`]: #requestgetheadername +[`request.setHeader()`]: #requestsetheadername-value +[`request.setTimeout()`]: #requestsettimeouttimeout-callback +[`request.socket.getPeerCertificate()`]: tls.md#tlssocketgetpeercertificatedetailed +[`request.socket`]: #requestsocket +[`request.writableEnded`]: #requestwritableended +[`request.writableFinished`]: #requestwritablefinished +[`request.write(data, encoding)`]: #requestwritechunk-encoding-callback +[`response.end()`]: #responseenddata-encoding-callback +[`response.getHeader()`]: #responsegetheadername +[`response.setHeader()`]: #responsesetheadername-value +[`response.socket`]: #responsesocket +[`response.writableEnded`]: #responsewritableended +[`response.writableFinished`]: #responsewritablefinished +[`response.write()`]: #responsewritechunk-encoding-callback +[`response.write(data, encoding)`]: #responsewritechunk-encoding-callback +[`response.writeContinue()`]: #responsewritecontinue +[`response.writeHead()`]: #responsewriteheadstatuscode-statusmessage-headers +[`server.listen()`]: net.md#serverlisten +[`server.timeout`]: #servertimeout +[`setHeader(name, value)`]: #requestsetheadername-value +[`socket.connect()`]: net.md#socketconnectoptions-connectlistener +[`socket.setKeepAlive()`]: net.md#socketsetkeepaliveenable-initialdelay +[`socket.setNoDelay()`]: net.md#socketsetnodelaynodelay +[`socket.setTimeout()`]: net.md#socketsettimeouttimeout-callback +[`socket.unref()`]: net.md#socketunref +[`url.parse()`]: url.md#urlparseurlstring-parsequerystring-slashesdenotehost +[`writable.cork()`]: stream.md#writablecork +[`writable.destroy()`]: stream.md#writabledestroyerror +[`writable.destroyed`]: stream.md#writabledestroyed +[`writable.uncork()`]: stream.md#writableuncork +[initial delay]: net.md#socketsetkeepaliveenable-initialdelay diff --git a/doc/api/http2.md b/doc/api/http2.md index 58081253229a83..bc03c14ef50ddd 100644 --- a/doc/api/http2.md +++ b/doc/api/http2.md @@ -3840,61 +3840,61 @@ if you don't use the compatibility API (or use `req.headers` directly), you need to implement any fall-back behavior yourself. [ALPN Protocol ID]: https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids -[ALPN negotiation]: #http2_alpn_negotiation -[Compatibility API]: #http2_compatibility_api +[ALPN negotiation]: #alpn-negotiation +[Compatibility API]: #compatibility-api [HTTP/1]: http.md [HTTP/2]: https://tools.ietf.org/html/rfc7540 -[HTTP/2 Headers Object]: #http2_headers_object -[HTTP/2 Settings Object]: #http2_settings_object +[HTTP/2 Headers Object]: #headers-object +[HTTP/2 Settings Object]: #settings-object [HTTP/2 Unencrypted]: https://http2.github.io/faq/#does-http2-require-encryption [HTTPS]: https.md [Performance Observer]: perf_hooks.md [RFC 7838]: https://tools.ietf.org/html/rfc7838 [RFC 8336]: https://tools.ietf.org/html/rfc8336 [RFC 8441]: https://tools.ietf.org/html/rfc8441 -[Sensitive headers]: #http2_sensitive_headers -[`'checkContinue'`]: #http2_event_checkcontinue -[`'connect'`]: #http2_event_connect -[`'request'`]: #http2_event_request -[`'unknownProtocol'`]: #http2_event_unknownprotocol -[`ClientHttp2Stream`]: #http2_class_clienthttp2stream -[`Duplex`]: stream.md#stream_class_stream_duplex -[`Http2ServerRequest`]: #http2_class_http2_http2serverrequest -[`Http2ServerResponse`]: #http2_class_http2_http2serverresponse -[`Http2Session` and Sockets]: #http2_http2session_and_sockets -[`Http2Session`'s `'stream'` event]: #http2_event_stream -[`Http2Stream`]: #http2_class_http2stream -[`ServerHttp2Stream`]: #http2_class_serverhttp2stream -[`TypeError`]: errors.md#errors_class_typeerror -[`http.ClientRequest#maxHeadersCount`]: http.md#http_request_maxheaderscount -[`http.Server#maxHeadersCount`]: http.md#http_server_maxheaderscount -[`http2.SecureServer`]: #http2_class_http2secureserver -[`http2.Server`]: #http2_class_http2server -[`http2.createSecureServer()`]: #http2_http2_createsecureserver_options_onrequesthandler -[`http2.createServer()`]: #http2_http2_createserver_options_onrequesthandler -[`http2session.close()`]: #http2_http2session_close_callback -[`http2stream.pushStream()`]: #http2_http2stream_pushstream_headers_options_callback -[`net.Server.close()`]: net.md#net_server_close_callback -[`net.Socket.bufferSize`]: net.md#net_socket_buffersize -[`net.Socket.prototype.ref()`]: net.md#net_socket_ref -[`net.Socket.prototype.unref()`]: net.md#net_socket_unref -[`net.Socket`]: net.md#net_class_net_socket -[`net.connect()`]: net.md#net_net_connect -[`net.createServer()`]: net.md#net_net_createserver_options_connectionlistener -[`request.authority`]: #http2_request_authority -[`request.socket.getPeerCertificate()`]: tls.md#tls_tlssocket_getpeercertificate_detailed -[`request.socket`]: #http2_request_socket -[`response.end()`]: #http2_response_end_data_encoding_callback -[`response.setHeader()`]: #http2_response_setheader_name_value -[`response.socket`]: #http2_response_socket -[`response.writableEnded`]: #http2_response_writableended -[`response.write()`]: #http2_response_write_chunk_encoding_callback -[`response.write(data, encoding)`]: http.md#http_response_write_chunk_encoding_callback -[`response.writeContinue()`]: #http2_response_writecontinue -[`response.writeHead()`]: #http2_response_writehead_statuscode_statusmessage_headers -[`tls.Server.close()`]: tls.md#tls_server_close_callback -[`tls.TLSSocket`]: tls.md#tls_class_tls_tlssocket -[`tls.connect()`]: tls.md#tls_tls_connect_options_callback -[`tls.createServer()`]: tls.md#tls_tls_createserver_options_secureconnectionlistener -[`writable.writableFinished`]: stream.md#stream_writable_writablefinished -[error code]: #http2_error_codes_for_rst_stream_and_goaway +[Sensitive headers]: #sensitive-headers +[`'checkContinue'`]: #event-checkcontinue +[`'connect'`]: #event-connect +[`'request'`]: #event-request +[`'unknownProtocol'`]: #event-unknownprotocol +[`ClientHttp2Stream`]: #class-clienthttp2stream +[`Duplex`]: stream.md#class-streamduplex +[`Http2ServerRequest`]: #class-http2http2serverrequest +[`Http2ServerResponse`]: #class-http2http2serverresponse +[`Http2Session` and Sockets]: #http2session-and-sockets +[`Http2Session`'s `'stream'` event]: #event-stream +[`Http2Stream`]: #class-http2stream +[`ServerHttp2Stream`]: #class-serverhttp2stream +[`TypeError`]: errors.md#class-typeerror +[`http.ClientRequest#maxHeadersCount`]: http.md#requestmaxheaderscount +[`http.Server#maxHeadersCount`]: http.md#servermaxheaderscount +[`http2.SecureServer`]: #class-http2secureserver +[`http2.Server`]: #class-http2server +[`http2.createSecureServer()`]: #http2createsecureserveroptions-onrequesthandler +[`http2.createServer()`]: #http2createserveroptions-onrequesthandler +[`http2session.close()`]: #http2sessionclosecallback +[`http2stream.pushStream()`]: #http2streampushstreamheaders-options-callback +[`net.Server.close()`]: net.md#serverclosecallback +[`net.Socket.bufferSize`]: net.md#socketbuffersize +[`net.Socket.prototype.ref()`]: net.md#socketref +[`net.Socket.prototype.unref()`]: net.md#socketunref +[`net.Socket`]: net.md#class-netsocket +[`net.connect()`]: net.md#netconnect +[`net.createServer()`]: net.md#netcreateserveroptions-connectionlistener +[`request.authority`]: #requestauthority +[`request.socket.getPeerCertificate()`]: tls.md#tlssocketgetpeercertificatedetailed +[`request.socket`]: #requestsocket +[`response.end()`]: #responseenddata-encoding-callback +[`response.setHeader()`]: #responsesetheadername-value +[`response.socket`]: #responsesocket +[`response.writableEnded`]: #responsewritableended +[`response.write()`]: #responsewritechunk-encoding-callback +[`response.write(data, encoding)`]: http.md#responsewritechunk-encoding-callback +[`response.writeContinue()`]: #responsewritecontinue +[`response.writeHead()`]: #responsewriteheadstatuscode-statusmessage-headers +[`tls.Server.close()`]: tls.md#serverclosecallback +[`tls.TLSSocket`]: tls.md#class-tlstlssocket +[`tls.connect()`]: tls.md#tlsconnectoptions-callback +[`tls.createServer()`]: tls.md#tlscreateserveroptions-secureconnectionlistener +[`writable.writableFinished`]: stream.md#writablewritablefinished +[error code]: #error-codes-for-rst_stream-and-goaway diff --git a/doc/api/https.md b/doc/api/https.md index ff057d23e5c38a..98a845994a78fa 100644 --- a/doc/api/https.md +++ b/doc/api/https.md @@ -462,29 +462,29 @@ statusCode: 200 headers: max-age=0; pin-sha256="WoiWRyIOVNa9ihaBciRSC7XHjliYS9VwUGOIud4PB18="; pin-sha256="RRM1dGqnDFsCJXBTHky16vi1obOlCgFFn/yOhI/y+ho="; pin-sha256="k2v657xBsOVe1PQRwOsHsw3bsGT2VzIqz5K+59sNQws="; pin-sha256="K87oWBWM9UZfyddvDfoxL+8lpNyoUB2ptGtn0fv6G2Q="; pin-sha256="IQBnNBEiFuhj+8x6X8XLgh01V9Ic5/V3IRQLNFFc7v4="; pin-sha256="iie1VXtL7HzAMF+/PVPR9xzT80kQxdZeJ+zduCB3uj0="; pin-sha256="LvRiGEjRqfzurezaWuj8Wie2gyHMrW5Q06LspMnox7A="; includeSubDomains ``` -[`Agent`]: #https_class_https_agent -[`Session Resumption`]: tls.md#tls_session_resumption -[`URL`]: url.md#url_the_whatwg_url_api -[`http.Agent(options)`]: http.md#http_new_agent_options -[`http.Agent`]: http.md#http_class_http_agent -[`http.ClientRequest`]: http.md#http_class_http_clientrequest -[`http.Server#headersTimeout`]: http.md#http_server_headerstimeout -[`http.Server#keepAliveTimeout`]: http.md#http_server_keepalivetimeout -[`http.Server#maxHeadersCount`]: http.md#http_server_maxheaderscount -[`http.Server#requestTimeout`]: http.md#http_server_requesttimeout -[`http.Server#setTimeout()`]: http.md#http_server_settimeout_msecs_callback -[`http.Server#timeout`]: http.md#http_server_timeout -[`http.Server`]: http.md#http_class_http_server -[`http.close()`]: http.md#http_server_close_callback -[`http.createServer()`]: http.md#http_http_createserver_options_requestlistener -[`http.get()`]: http.md#http_http_get_options_callback -[`http.request()`]: http.md#http_http_request_options_callback -[`https.Agent`]: #https_class_https_agent -[`https.request()`]: #https_https_request_options_callback -[`net.Server`]: net.md#net_class_net_server -[`new URL()`]: url.md#url_new_url_input_base -[`server.listen()`]: net.md#net_server_listen -[`tls.connect()`]: tls.md#tls_tls_connect_options_callback -[`tls.createSecureContext()`]: tls.md#tls_tls_createsecurecontext_options -[`tls.createServer()`]: tls.md#tls_tls_createserver_options_secureconnectionlistener +[`Agent`]: #class-httpsagent +[`Session Resumption`]: tls.md#session-resumption +[`URL`]: url.md#the-whatwg-url-api +[`http.Agent(options)`]: http.md#new-agentoptions +[`http.Agent`]: http.md#class-httpagent +[`http.ClientRequest`]: http.md#class-httpclientrequest +[`http.Server#headersTimeout`]: http.md#serverheaderstimeout +[`http.Server#keepAliveTimeout`]: http.md#serverkeepalivetimeout +[`http.Server#maxHeadersCount`]: http.md#servermaxheaderscount +[`http.Server#requestTimeout`]: http.md#serverrequesttimeout +[`http.Server#setTimeout()`]: http.md#serversettimeoutmsecs-callback +[`http.Server#timeout`]: http.md#servertimeout +[`http.Server`]: http.md#class-httpserver +[`http.close()`]: http.md#serverclosecallback +[`http.createServer()`]: http.md#httpcreateserveroptions-requestlistener +[`http.get()`]: http.md#httpgetoptions-callback +[`http.request()`]: http.md#httprequestoptions-callback +[`https.Agent`]: #class-httpsagent +[`https.request()`]: #httpsrequestoptions-callback +[`net.Server`]: net.md#class-netserver +[`new URL()`]: url.md#new-urlinput-base +[`server.listen()`]: net.md#serverlisten +[`tls.connect()`]: tls.md#tlsconnectoptions-callback +[`tls.createSecureContext()`]: tls.md#tlscreatesecurecontextoptions +[`tls.createServer()`]: tls.md#tlscreateserveroptions-secureconnectionlistener [sni wiki]: https://en.wikipedia.org/wiki/Server_Name_Indication diff --git a/doc/api/inspector.md b/doc/api/inspector.md index aa41556adc9a11..04b0283d8cc6b4 100644 --- a/doc/api/inspector.md +++ b/doc/api/inspector.md @@ -45,7 +45,7 @@ started. If wait is `true`, will block until a client has connected to the inspect port and flow control has been passed to the debugger client. -See the [security warning](cli.md#inspector_security) regarding the `host` +See the [security warning][] regarding the `host` parameter usage. ## `inspector.url()` @@ -243,4 +243,5 @@ session.post('HeapProfiler.takeHeapSnapshot', null, (err, r) => { [Chrome DevTools Protocol Viewer]: https://chromedevtools.github.io/devtools-protocol/v8/ [Heap Profiler]: https://chromedevtools.github.io/devtools-protocol/v8/HeapProfiler [`'Debugger.paused'`]: https://chromedevtools.github.io/devtools-protocol/v8/Debugger#event-paused -[`session.connect()`]: #inspector_session_connect +[`session.connect()`]: #sessionconnect +[security warning]: cli.md#warning-binding-inspector-to-a-public-ipport-combination-is-insecure diff --git a/doc/api/intl.md b/doc/api/intl.md index 9cacc922caa3fc..716047a7c39c9a 100644 --- a/doc/api/intl.md +++ b/doc/api/intl.md @@ -196,23 +196,23 @@ to be helpful: [ECMA-262]: https://tc39.github.io/ecma262/ [ECMA-402]: https://tc39.github.io/ecma402/ [ICU]: http://site.icu-project.org/ -[Legacy URL parser]: url.md#url_legacy_url_api -[REPL]: repl.md#repl_repl +[Legacy URL parser]: url.md#legacy-url-api +[REPL]: repl.md#repl [Test262]: https://github.com/tc39/test262/tree/HEAD/test/intl402 -[WHATWG URL parser]: url.md#url_the_whatwg_url_api -[`--icu-data-dir`]: cli.md#cli_icu_data_dir_file +[WHATWG URL parser]: url.md#the-whatwg-url-api +[`--icu-data-dir`]: cli.md#--icu-data-dirfile [`Date.prototype.toLocaleString()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString [`Intl.DateTimeFormat`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat [`Intl`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl -[`NODE_ICU_DATA`]: cli.md#cli_node_icu_data_file +[`NODE_ICU_DATA`]: cli.md#node_icu_datafile [`Number.prototype.toLocaleString()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString [`RegExp` Unicode Property Escapes]: https://github.com/tc39/proposal-regexp-unicode-property-escapes [`String.prototype.localeCompare()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare [`String.prototype.normalize()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize [`String.prototype.toLowerCase()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLowerCase [`String.prototype.toUpperCase()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toUpperCase -[`require('buffer').transcode()`]: buffer.md#buffer_buffer_transcode_source_fromenc_toenc -[`require('util').TextDecoder`]: util.md#util_class_util_textdecoder +[`require('buffer').transcode()`]: buffer.md#buffertranscodesource-fromenc-toenc +[`require('util').TextDecoder`]: util.md#class-utiltextdecoder [btest402]: https://github.com/srl295/btest402 [full-icu]: https://www.npmjs.com/package/full-icu [internationalized domain names]: https://en.wikipedia.org/wiki/Internationalized_domain_name diff --git a/doc/api/module.md b/doc/api/module.md index 28bad85bba6a66..519240841a644f 100644 --- a/doc/api/module.md +++ b/doc/api/module.md @@ -192,9 +192,9 @@ consists of the following keys: [CommonJS]: modules.md [ES Modules]: esm.md [Source map v3 format]: https://sourcemaps.info/spec.html#h.mofvlxcwqzej -[`--enable-source-maps`]: cli.md#cli_enable_source_maps -[`NODE_V8_COVERAGE=dir`]: cli.md#cli_node_v8_coverage_dir -[`SourceMap`]: #module_class_module_sourcemap -[`module`]: modules.md#modules_the_module_object -[module wrapper]: modules.md#modules_the_module_wrapper +[`--enable-source-maps`]: cli.md#--enable-source-maps +[`NODE_V8_COVERAGE=dir`]: cli.md#node_v8_coveragedir +[`SourceMap`]: #class-modulesourcemap +[`module`]: modules.md#the-module-object +[module wrapper]: modules.md#the-module-wrapper [source map include directives]: https://sourcemaps.info/spec.html#h.lmz475t4mvbx diff --git a/doc/api/modules.md b/doc/api/modules.md index b22018a230b5ed..a1cd0b95572886 100644 --- a/doc/api/modules.md +++ b/doc/api/modules.md @@ -32,7 +32,7 @@ The module `circle.js` has exported the functions `area()` and by specifying additional properties on the special `exports` object. Variables local to the module will be private, because the module is wrapped -in a function by Node.js (see [module wrapper](#modules_the_module_wrapper)). +in a function by Node.js (see [module wrapper](#the-module-wrapper)). In this example, the variable `PI` is private to `circle.js`. The `module.exports` property can be assigned a new value (such as a function @@ -99,7 +99,7 @@ package may itself have dependencies, and in some cases, these may even collide or form cyclic dependencies. Because Node.js looks up the `realpath` of any modules it loads (that is, it -resolves symlinks) and then [looks for their dependencies in `node_modules` folders](#modules_loading_from_node_modules_folders), +resolves symlinks) and then [looks for their dependencies in `node_modules` folders](#loading-from-node_modules-folders), this situation can be resolved with the following architecture: * `/usr/lib/node/foo/1.2.3/`: Contents of the `foo` package, version 1.2.3. @@ -438,7 +438,7 @@ Error: Cannot find module 'some-library' If the module identifier passed to `require()` is not a -[core](#modules_core_modules) module, and does not begin with `'/'`, `'../'`, or +[core](#core-modules) module, and does not begin with `'/'`, `'../'`, or `'./'`, then Node.js starts at the parent directory of the current module, and adds `/node_modules`, and attempts to load the module from that location. Node.js will not append `node_modules` to a path already ending in @@ -704,7 +704,7 @@ added: v0.1.17 The `Module` object representing the entry script loaded when the Node.js process launched. -See ["Accessing the main module"](#modules_accessing_the_main_module). +See ["Accessing the main module"](#accessing-the-main-module). In `entry.js` script: @@ -986,38 +986,38 @@ in order to be used. ## The `Module` object This section was moved to -[Modules: `module` core module](module.md#module_the_module_object). +[Modules: `module` core module](module.md#the-module-object). -* `module.builtinModules` -* `module.createRequire(filename)` -* `module.syncBuiltinESMExports()` +* `module.builtinModules` +* `module.createRequire(filename)` +* `module.syncBuiltinESMExports()` ## Source map v3 support This section was moved to -[Modules: `module` core module](module.md#module_source_map_v3_support). +[Modules: `module` core module](module.md#source-map-v3-support). -* `module.findSourceMap(path)` -* Class: `module.SourceMap` - * `new SourceMap(payload)` - * `sourceMap.payload` - * `sourceMap.findEntry(lineNumber, columnNumber)` +* `module.findSourceMap(path)` +* Class: `module.SourceMap` + * `new SourceMap(payload)` + * `sourceMap.payload` + * `sourceMap.findEntry(lineNumber, columnNumber)` [ECMAScript Modules]: esm.md -[GLOBAL_FOLDERS]: #modules_loading_from_the_global_folders -[`"main"`]: packages.md#packages_main -[`Error`]: errors.md#errors_class_error -[`__dirname`]: #modules_dirname -[`__filename`]: #modules_filename -[`module.children`]: #modules_module_children -[`module.id`]: #modules_module_id -[`module` object]: #modules_the_module_object -[`package.json`]: packages.md#packages_node_js_package_json_field_definitions -[`path.dirname()`]: path.md#path_path_dirname_path -[`require.main`]: #modules_require_main -[an error]: errors.md#errors_err_require_esm -[exports shortcut]: #modules_exports_shortcut -[module resolution]: #modules_all_together +[GLOBAL_FOLDERS]: #loading-from-the-global-folders +[`"main"`]: packages.md#main +[`Error`]: errors.md#class-error +[`__dirname`]: #__dirname +[`__filename`]: #__filename +[`module.children`]: #modulechildren +[`module.id`]: #moduleid +[`module` object]: #the-module-object +[`package.json`]: packages.md#nodejs-packagejson-field-definitions +[`path.dirname()`]: path.md#pathdirnamepath +[`require.main`]: #requiremain +[an error]: errors.md#err_require_esm +[exports shortcut]: #exports-shortcut +[module resolution]: #all-together [native addons]: addons.md diff --git a/doc/api/n-api.md b/doc/api/n-api.md index d879bbf94db615..6a32139283f4aa 100644 --- a/doc/api/n-api.md +++ b/doc/api/n-api.md @@ -6008,14 +6008,14 @@ the add-on's file name during loading. [CMake]: https://cmake.org [CMake.js]: https://github.com/cmake-js/cmake-js [ECMAScript Language Specification]: https://tc39.github.io/ecma262/ -[Error handling]: #n_api_error_handling +[Error handling]: #error-handling [GCC]: https://gcc.gnu.org [GYP]: https://gyp.gsrc.io [GitHub releases]: https://help.github.com/en/github/administering-a-repository/about-releases [LLVM]: https://llvm.org [Native Abstractions for Node.js]: https://github.com/nodejs/nan -[Object lifetime management]: #n_api_object_lifetime_management -[Object wrap]: #n_api_object_wrap +[Object lifetime management]: #object-lifetime-management +[Object wrap]: #object-wrap [Section 12.10.4]: https://tc39.github.io/ecma262/#sec-instanceofoperator [Section 12.5.5]: https://tc39.github.io/ecma262/#sec-typeof-operator [Section 19.2]: https://tc39.github.io/ecma262/#sec-function-objects @@ -6045,79 +6045,79 @@ the add-on's file name during loading. [Section 9.1.6]: https://tc39.github.io/ecma262/#sec-ordinary-object-internal-methods-and-internal-slots-defineownproperty-p-desc [Travis CI]: https://travis-ci.org [Visual Studio]: https://visualstudio.microsoft.com -[Working with JavaScript properties]: #n_api_working_with_javascript_properties +[Working with JavaScript properties]: #working-with-javascript-properties [Xcode]: https://developer.apple.com/xcode/ [`Number.MAX_SAFE_INTEGER`]: https://tc39.github.io/ecma262/#sec-number.max_safe_integer [`Number.MIN_SAFE_INTEGER`]: https://tc39.github.io/ecma262/#sec-number.min_safe_integer -[`Worker`]: worker_threads.md#worker_threads_class_worker -[`async_hooks.executionAsyncResource()`]: async_hooks.md#async_hooks_async_hooks_executionasyncresource -[`global`]: globals.md#globals_global -[`init` hooks]: async_hooks.md#async_hooks_init_asyncid_type_triggerasyncid_resource -[`napi_add_async_cleanup_hook`]: #n_api_napi_add_async_cleanup_hook -[`napi_add_env_cleanup_hook`]: #n_api_napi_add_env_cleanup_hook -[`napi_add_finalizer`]: #n_api_napi_add_finalizer -[`napi_async_cleanup_hook`]: #n_api_napi_async_cleanup_hook -[`napi_async_complete_callback`]: #n_api_napi_async_complete_callback -[`napi_async_destroy`]: #n_api_napi_async_destroy -[`napi_async_init`]: #n_api_napi_async_init -[`napi_callback`]: #n_api_napi_callback -[`napi_cancel_async_work`]: #n_api_napi_cancel_async_work -[`napi_close_callback_scope`]: #n_api_napi_close_callback_scope -[`napi_close_escapable_handle_scope`]: #n_api_napi_close_escapable_handle_scope -[`napi_close_handle_scope`]: #n_api_napi_close_handle_scope -[`napi_create_async_work`]: #n_api_napi_create_async_work -[`napi_create_error`]: #n_api_napi_create_error -[`napi_create_external_arraybuffer`]: #n_api_napi_create_external_arraybuffer -[`napi_create_range_error`]: #n_api_napi_create_range_error -[`napi_create_reference`]: #n_api_napi_create_reference -[`napi_create_type_error`]: #n_api_napi_create_type_error -[`napi_define_class`]: #n_api_napi_define_class -[`napi_delete_async_work`]: #n_api_napi_delete_async_work -[`napi_delete_reference`]: #n_api_napi_delete_reference -[`napi_escape_handle`]: #n_api_napi_escape_handle -[`napi_finalize`]: #n_api_napi_finalize -[`napi_get_and_clear_last_exception`]: #n_api_napi_get_and_clear_last_exception -[`napi_get_array_length`]: #n_api_napi_get_array_length -[`napi_get_element`]: #n_api_napi_get_element -[`napi_get_last_error_info`]: #n_api_napi_get_last_error_info -[`napi_get_property`]: #n_api_napi_get_property -[`napi_get_reference_value`]: #n_api_napi_get_reference_value -[`napi_get_value_external`]: #n_api_napi_get_value_external -[`napi_has_property`]: #n_api_napi_has_property -[`napi_instanceof`]: #n_api_napi_instanceof -[`napi_is_error`]: #n_api_napi_is_error -[`napi_is_exception_pending`]: #n_api_napi_is_exception_pending -[`napi_make_callback`]: #n_api_napi_make_callback -[`napi_open_callback_scope`]: #n_api_napi_open_callback_scope -[`napi_open_escapable_handle_scope`]: #n_api_napi_open_escapable_handle_scope -[`napi_open_handle_scope`]: #n_api_napi_open_handle_scope -[`napi_property_attributes`]: #n_api_napi_property_attributes -[`napi_property_descriptor`]: #n_api_napi_property_descriptor -[`napi_queue_async_work`]: #n_api_napi_queue_async_work -[`napi_reference_ref`]: #n_api_napi_reference_ref -[`napi_reference_unref`]: #n_api_napi_reference_unref -[`napi_remove_async_cleanup_hook`]: #n_api_napi_remove_async_cleanup_hook -[`napi_remove_env_cleanup_hook`]: #n_api_napi_remove_env_cleanup_hook -[`napi_set_instance_data`]: #n_api_napi_set_instance_data -[`napi_set_property`]: #n_api_napi_set_property -[`napi_threadsafe_function_call_js`]: #n_api_napi_threadsafe_function_call_js -[`napi_throw_error`]: #n_api_napi_throw_error -[`napi_throw_range_error`]: #n_api_napi_throw_range_error -[`napi_throw_type_error`]: #n_api_napi_throw_type_error -[`napi_throw`]: #n_api_napi_throw -[`napi_unwrap`]: #n_api_napi_unwrap -[`napi_wrap`]: #n_api_napi_wrap +[`Worker`]: worker_threads.md#class-worker +[`async_hooks.executionAsyncResource()`]: async_hooks.md#async_hooksexecutionasyncresource +[`global`]: globals.md#global +[`init` hooks]: async_hooks.md#initasyncid-type-triggerasyncid-resource +[`napi_add_async_cleanup_hook`]: #napi_add_async_cleanup_hook +[`napi_add_env_cleanup_hook`]: #napi_add_env_cleanup_hook +[`napi_add_finalizer`]: #napi_add_finalizer +[`napi_async_cleanup_hook`]: #napi_async_cleanup_hook +[`napi_async_complete_callback`]: #napi_async_complete_callback +[`napi_async_destroy`]: #napi_async_destroy +[`napi_async_init`]: #napi_async_init +[`napi_callback`]: #napi_callback +[`napi_cancel_async_work`]: #napi_cancel_async_work +[`napi_close_callback_scope`]: #napi_close_callback_scope +[`napi_close_escapable_handle_scope`]: #napi_close_escapable_handle_scope +[`napi_close_handle_scope`]: #napi_close_handle_scope +[`napi_create_async_work`]: #napi_create_async_work +[`napi_create_error`]: #napi_create_error +[`napi_create_external_arraybuffer`]: #napi_create_external_arraybuffer +[`napi_create_range_error`]: #napi_create_range_error +[`napi_create_reference`]: #napi_create_reference +[`napi_create_type_error`]: #napi_create_type_error +[`napi_define_class`]: #napi_define_class +[`napi_delete_async_work`]: #napi_delete_async_work +[`napi_delete_reference`]: #napi_delete_reference +[`napi_escape_handle`]: #napi_escape_handle +[`napi_finalize`]: #napi_finalize +[`napi_get_and_clear_last_exception`]: #napi_get_and_clear_last_exception +[`napi_get_array_length`]: #napi_get_array_length +[`napi_get_element`]: #napi_get_element +[`napi_get_last_error_info`]: #napi_get_last_error_info +[`napi_get_property`]: #napi_get_property +[`napi_get_reference_value`]: #napi_get_reference_value +[`napi_get_value_external`]: #napi_get_value_external +[`napi_has_property`]: #napi_has_property +[`napi_instanceof`]: #napi_instanceof +[`napi_is_error`]: #napi_is_error +[`napi_is_exception_pending`]: #napi_is_exception_pending +[`napi_make_callback`]: #napi_make_callback +[`napi_open_callback_scope`]: #napi_open_callback_scope +[`napi_open_escapable_handle_scope`]: #napi_open_escapable_handle_scope +[`napi_open_handle_scope`]: #napi_open_handle_scope +[`napi_property_attributes`]: #napi_property_attributes +[`napi_property_descriptor`]: #napi_property_descriptor +[`napi_queue_async_work`]: #napi_queue_async_work +[`napi_reference_ref`]: #napi_reference_ref +[`napi_reference_unref`]: #napi_reference_unref +[`napi_remove_async_cleanup_hook`]: #napi_remove_async_cleanup_hook +[`napi_remove_env_cleanup_hook`]: #napi_remove_env_cleanup_hook +[`napi_set_instance_data`]: #napi_set_instance_data +[`napi_set_property`]: #napi_set_property +[`napi_threadsafe_function_call_js`]: #napi_threadsafe_function_call_js +[`napi_throw_error`]: #napi_throw_error +[`napi_throw_range_error`]: #napi_throw_range_error +[`napi_throw_type_error`]: #napi_throw_type_error +[`napi_throw`]: #napi_throw +[`napi_unwrap`]: #napi_unwrap +[`napi_wrap`]: #napi_wrap [`node-addon-api`]: https://github.com/nodejs/node-addon-api [`node_api.h`]: https://github.com/nodejs/node/blob/HEAD/src/node_api.h -[`process.release`]: process.md#process_process_release +[`process.release`]: process.md#processrelease [`uv_ref`]: https://docs.libuv.org/en/v1.x/handle.html#c.uv_ref [`uv_unref`]: https://docs.libuv.org/en/v1.x/handle.html#c.uv_unref -[async_hooks `type`]: async_hooks.md#async_hooks_type -[context-aware addons]: addons.md#addons_context_aware_addons +[async_hooks `type`]: async_hooks.md#type +[context-aware addons]: addons.md#context-aware-addons [docs]: https://github.com/nodejs/node-addon-api#api-documentation [global scope]: globals.md [gyp-next]: https://github.com/nodejs/gyp-next -[module scope]: modules.md#modules_the_module_scope +[module scope]: modules.md#the-module-scope [node-gyp]: https://github.com/nodejs/node-gyp [node-pre-gyp]: https://github.com/mapbox/node-pre-gyp [prebuild]: https://github.com/prebuild/prebuild diff --git a/doc/api/net.md b/doc/api/net.md index a8b2f1e367359a..1b662f0502f1bc 100644 --- a/doc/api/net.md +++ b/doc/api/net.md @@ -310,7 +310,7 @@ Possible signatures: * [`server.listen(options[, callback])`][`server.listen(options)`] * [`server.listen(path[, backlog][, callback])`][`server.listen(path)`] for [IPC][] servers -* +* server.listen([port[, host[, backlog]]][, callback]) for TCP servers @@ -401,7 +401,7 @@ changes: If `port` is specified, it behaves the same as - + server.listen([port[, host[, backlog]]][, callback]). Otherwise, if `path` is specified, it behaves the same as [`server.listen(path[, backlog][, callback])`][`server.listen(path)`]. @@ -1411,58 +1411,58 @@ added: v0.3.0 Returns `true` if input is a version 6 IP address, otherwise returns `false`. -[IPC]: #net_ipc_support -[Identifying paths for IPC connections]: #net_identifying_paths_for_ipc_connections -[Readable Stream]: stream.md#stream_class_stream_readable -[`'close'`]: #net_event_close -[`'connect'`]: #net_event_connect -[`'connection'`]: #net_event_connection -[`'data'`]: #net_event_data -[`'drain'`]: #net_event_drain -[`'end'`]: #net_event_end -[`'error'`]: #net_event_error_1 -[`'listening'`]: #net_event_listening -[`'timeout'`]: #net_event_timeout -[`EventEmitter`]: events.md#events_class_eventemitter -[`child_process.fork()`]: child_process.md#child_process_child_process_fork_modulepath_args_options -[`dns.lookup()`]: dns.md#dns_dns_lookup_hostname_options_callback -[`dns.lookup()` hints]: dns.md#dns_supported_getaddrinfo_flags -[`net.Server`]: #net_class_net_server -[`net.Socket`]: #net_class_net_socket -[`net.connect()`]: #net_net_connect -[`net.connect(options)`]: #net_net_connect_options_connectlistener -[`net.connect(path)`]: #net_net_connect_path_connectlistener -[`net.connect(port, host)`]: #net_net_connect_port_host_connectlistener -[`net.createConnection()`]: #net_net_createconnection -[`net.createConnection(options)`]: #net_net_createconnection_options_connectlistener -[`net.createConnection(path)`]: #net_net_createconnection_path_connectlistener -[`net.createConnection(port, host)`]: #net_net_createconnection_port_host_connectlistener -[`net.createServer()`]: #net_net_createserver_options_connectionlistener -[`new net.Socket(options)`]: #net_new_net_socket_options -[`readable.setEncoding()`]: stream.md#stream_readable_setencoding_encoding -[`server.close()`]: #net_server_close_callback -[`server.listen()`]: #net_server_listen -[`server.listen(handle)`]: #net_server_listen_handle_backlog_callback -[`server.listen(options)`]: #net_server_listen_options_callback -[`server.listen(path)`]: #net_server_listen_path_backlog_callback +[IPC]: #ipc-support +[Identifying paths for IPC connections]: #identifying-paths-for-ipc-connections +[Readable Stream]: stream.md#class-streamreadable +[`'close'`]: #event-close +[`'connect'`]: #event-connect +[`'connection'`]: #event-connection +[`'data'`]: #event-data +[`'drain'`]: #event-drain +[`'end'`]: #event-end +[`'error'`]: #event-error_1 +[`'listening'`]: #event-listening +[`'timeout'`]: #event-timeout +[`EventEmitter`]: events.md#class-eventemitter +[`child_process.fork()`]: child_process.md#child_processforkmodulepath-args-options +[`dns.lookup()`]: dns.md#dnslookuphostname-options-callback +[`dns.lookup()` hints]: dns.md#supported-getaddrinfo-flags +[`net.Server`]: #class-netserver +[`net.Socket`]: #class-netsocket +[`net.connect()`]: #netconnect +[`net.connect(options)`]: #netconnectoptions-connectlistener +[`net.connect(path)`]: #netconnectpath-connectlistener +[`net.connect(port, host)`]: #netconnectport-host-connectlistener +[`net.createConnection()`]: #netcreateconnection +[`net.createConnection(options)`]: #netcreateconnectionoptions-connectlistener +[`net.createConnection(path)`]: #netcreateconnectionpath-connectlistener +[`net.createConnection(port, host)`]: #netcreateconnectionport-host-connectlistener +[`net.createServer()`]: #netcreateserveroptions-connectionlistener +[`new net.Socket(options)`]: #new-netsocketoptions +[`readable.setEncoding()`]: stream.md#readablesetencodingencoding +[`server.close()`]: #serverclosecallback +[`server.listen()`]: #serverlisten +[`server.listen(handle)`]: #serverlistenhandle-backlog-callback +[`server.listen(options)`]: #serverlistenoptions-callback +[`server.listen(path)`]: #serverlistenpath-backlog-callback [`socket(7)`]: https://man7.org/linux/man-pages/man7/socket.7.html -[`socket.connect()`]: #net_socket_connect -[`socket.connect(options)`]: #net_socket_connect_options_connectlistener -[`socket.connect(path)`]: #net_socket_connect_path_connectlistener -[`socket.connect(port)`]: #net_socket_connect_port_host_connectlistener -[`socket.connecting`]: #net_socket_connecting -[`socket.destroy()`]: #net_socket_destroy_error -[`socket.end()`]: #net_socket_end_data_encoding_callback -[`socket.pause()`]: #net_socket_pause -[`socket.resume()`]: #net_socket_resume -[`socket.setEncoding()`]: #net_socket_setencoding_encoding -[`socket.setTimeout()`]: #net_socket_settimeout_timeout_callback -[`socket.setTimeout(timeout)`]: #net_socket_settimeout_timeout_callback -[`writable.destroy()`]: stream.md#stream_writable_destroy_error -[`writable.destroyed`]: stream.md#stream_writable_destroyed -[`writable.end()`]: stream.md#stream_writable_end_chunk_encoding_callback -[`writable.writableLength`]: stream.md#stream_writable_writablelength +[`socket.connect()`]: #socketconnect +[`socket.connect(options)`]: #socketconnectoptions-connectlistener +[`socket.connect(path)`]: #socketconnectpath-connectlistener +[`socket.connect(port)`]: #socketconnectport-host-connectlistener +[`socket.connecting`]: #socketconnecting +[`socket.destroy()`]: #socketdestroyerror +[`socket.end()`]: #socketenddata-encoding-callback +[`socket.pause()`]: #socketpause +[`socket.resume()`]: #socketresume +[`socket.setEncoding()`]: #socketsetencodingencoding +[`socket.setTimeout()`]: #socketsettimeouttimeout-callback +[`socket.setTimeout(timeout)`]: #socketsettimeouttimeout-callback +[`writable.destroy()`]: stream.md#writabledestroyerror +[`writable.destroyed`]: stream.md#writabledestroyed +[`writable.end()`]: stream.md#writableendchunk-encoding-callback +[`writable.writableLength`]: stream.md#writablewritablelength [half-closed]: https://tools.ietf.org/html/rfc1122 -[stream_writable_write]: stream.md#stream_writable_write_chunk_encoding_callback +[stream_writable_write]: stream.md#writablewritechunk-encoding-callback [unspecified IPv4 address]: https://en.wikipedia.org/wiki/0.0.0.0 [unspecified IPv6 address]: https://en.wikipedia.org/wiki/IPv6_address#Unspecified_address diff --git a/doc/api/os.md b/doc/api/os.md index cde7d1354941de..85469a56293cc6 100644 --- a/doc/api/os.md +++ b/doc/api/os.md @@ -47,7 +47,7 @@ added: v6.3.0 Contains commonly used operating system-specific constants for error codes, process signals, and so on. The specific constants defined are described in -[OS constants](#os_os_constants_1). +[OS constants](#os-constants). ## `os.cpus()` ' + '

Describe Something in more detail here.

' }, @@ -103,18 +113,22 @@ const testData = [ { file: fixtures.path('document_with_links.md'), html: '

Usage and Example#' + - '

Usage#

node \\[options\\] index.js' + + 'href="#usage-and-example" id="usage-and-example">#' + + '

Usage#

node \\[options\\] index.js' + '

Please see the' + 'Command Line Optionsdocument for more information.

' + '

' + - 'Example' + - '#

An example of a' + + 'Example' + + '#

An example of a' + 'webserverwritten with Node.js which responds with' + '\'Hello, World!\':

' + '

See also#

Check' + + 'href="#see-also" id="see-also">#

Check' + 'out alsothis guide

' }, { diff --git a/test/es-module/test-esm-data-urls.js b/test/es-module/test-esm-data-urls.js index ba8bd4c95746c0..78cd01b4d55a12 100644 --- a/test/es-module/test-esm-data-urls.js +++ b/test/es-module/test-esm-data-urls.js @@ -99,7 +99,7 @@ function createBase64URL(mime, body) { await import(plainESMURL); common.mustNotCall()(); } catch (e) { - assert.strictEqual(e.code, 'ERR_INVALID_MODULE_SPECIFIER'); + assert.strictEqual(e.code, 'ERR_INVALID_URL'); } } { diff --git a/test/es-module/test-esm-example-loader.js b/test/es-module/test-esm-example-loader.mjs similarity index 100% rename from test/es-module/test-esm-example-loader.js rename to test/es-module/test-esm-example-loader.mjs diff --git a/test/es-module/test-esm-get-source-loader.mjs b/test/es-module/test-esm-get-source-loader.mjs deleted file mode 100644 index 66bac969a47d8f..00000000000000 --- a/test/es-module/test-esm-get-source-loader.mjs +++ /dev/null @@ -1,6 +0,0 @@ -// Flags: --experimental-loader ./test/fixtures/es-module-loaders/get-source.mjs -/* eslint-disable node-core/require-common-first, node-core/required-modules */ -import assert from 'assert'; -import { message } from '../fixtures/es-modules/message.mjs'; - -assert.strictEqual(message, 'WOOHOO!'); diff --git a/test/es-module/test-esm-loader-get-format.mjs b/test/es-module/test-esm-loader-get-format.mjs deleted file mode 100644 index 2a252439f91ce4..00000000000000 --- a/test/es-module/test-esm-loader-get-format.mjs +++ /dev/null @@ -1,12 +0,0 @@ -// Flags: --experimental-loader ./test/fixtures/es-module-loaders/loader-get-format.mjs -import { mustCall, mustNotCall } from '../common/index.mjs'; -import assert from 'assert'; - -import('../fixtures/es-modules/package-type-module/extension.unknown') -.then( - mustCall((ns) => { - assert.strictEqual(ns.default, 'unknown'); - }), - // Do not use .catch; want exclusive or - mustNotCall(() => {}) -); diff --git a/test/es-module/test-esm-loader-modulemap.js b/test/es-module/test-esm-loader-modulemap.js index 2d74cd385be52b..48443de4c270c6 100644 --- a/test/es-module/test-esm-loader-modulemap.js +++ b/test/es-module/test-esm-loader-modulemap.js @@ -7,7 +7,7 @@ require('../common'); const assert = require('assert'); -const { Loader } = require('internal/modules/esm/loader'); +const { ESMLoader } = require('internal/modules/esm/loader'); const ModuleMap = require('internal/modules/esm/module_map'); const ModuleJob = require('internal/modules/esm/module_job'); const createDynamicModule = require( @@ -15,7 +15,7 @@ const createDynamicModule = require( const stubModuleUrl = new URL('file://tmp/test'); const stubModule = createDynamicModule(['default'], stubModuleUrl); -const loader = new Loader(); +const loader = new ESMLoader(); const moduleMap = new ModuleMap(); const moduleJob = new ModuleJob(loader, stubModule.module, () => new Promise(() => {})); diff --git a/test/es-module/test-esm-loader-stringify-text.mjs b/test/es-module/test-esm-loader-stringify-text.mjs index ed9bd5069ebf1d..e66da9491b4cd2 100644 --- a/test/es-module/test-esm-loader-stringify-text.mjs +++ b/test/es-module/test-esm-loader-stringify-text.mjs @@ -12,6 +12,34 @@ import('test:ArrayBuffer').then( mustCall(), mustNotCall('Should accept ArrayBuffers'), ); +import('test:BigInt64Array').then( + mustCall(), + mustNotCall('Should accept BigInt64Array'), +); +import('test:BigUint64Array').then( + mustCall(), + mustNotCall('Should accept BigUint64Array'), +); +import('test:Float32Array').then( + mustCall(), + mustNotCall('Should accept Float32Array'), +); +import('test:Float64Array').then( + mustCall(), + mustNotCall('Should accept Float64Array'), +); +import('test:Int8Array').then( + mustCall(), + mustNotCall('Should accept Int8Array'), +); +import('test:Int16Array').then( + mustCall(), + mustNotCall('Should accept Int16Array'), +); +import('test:Int32Array').then( + mustCall(), + mustNotCall('Should accept Int32Array'), +); import('test:null').then( mustNotCall('Should not accept null'), mustCall((e) => { @@ -38,6 +66,18 @@ import('test:String').then( assert.strictEqual(e.code, 'ERR_INVALID_RETURN_PROPERTY_VALUE'); }) ); +import('test:Uint8ClampedArray').then( + mustCall(), + mustNotCall('Should accept Uint8ClampedArray'), +); +import('test:Uint16Array').then( + mustCall(), + mustNotCall('Should accept Uint16Array'), +); +import('test:Uint32Array').then( + mustCall(), + mustNotCall('Should accept Uint32Array'), +); import('test:Uint8Array').then( mustCall(), mustNotCall('Should accept Uint8Arrays'), diff --git a/test/es-module/test-esm-loader.mjs b/test/es-module/test-esm-loader.mjs new file mode 100644 index 00000000000000..e19a38cc4231b0 --- /dev/null +++ b/test/es-module/test-esm-loader.mjs @@ -0,0 +1,83 @@ +// Flags: --experimental-loader ./test/fixtures/es-module-loaders/hooks-custom.mjs +import '../common/index.mjs'; +import assert from 'assert'; + + +await assert.rejects( + import('nonexistent/file.mjs'), + { code: 'ERR_MODULE_NOT_FOUND' }, +); + +await assert.rejects( + import('../fixtures/es-modules/file.unknown'), + { code: 'ERR_UNKNOWN_FILE_EXTENSION' }, +); + +await assert.rejects( + import('esmHook/badReturnVal.mjs'), + { code: 'ERR_INVALID_RETURN_VALUE' }, +); + +// Nullish values are allowed; booleans are not +await assert.rejects( + import('esmHook/format.false'), + { code: 'ERR_INVALID_RETURN_PROPERTY_VALUE' }, +); +await assert.rejects( + import('esmHook/format.true'), + { code: 'ERR_INVALID_RETURN_PROPERTY_VALUE' }, +); + +await assert.rejects( + import('esmHook/badReturnFormatVal.mjs'), + { code: 'ERR_INVALID_RETURN_PROPERTY_VALUE' }, +); + +await assert.rejects( + import('esmHook/unsupportedReturnFormatVal.mjs'), + { code: 'ERR_UNKNOWN_MODULE_FORMAT' }, +); + +await assert.rejects( + import('esmHook/badReturnSourceVal.mjs'), + { code: 'ERR_INVALID_RETURN_PROPERTY_VALUE' }, +); + +await import('../fixtures/es-module-loaders/js-as-esm.js') +.then((parsedModule) => { + assert.strictEqual(typeof parsedModule, 'object'); + assert.strictEqual(parsedModule.namedExport, 'named-export'); +}); + +// The custom loader tells node .ext files are MJS +await import('../fixtures/es-modules/file.ext') +.then((parsedModule) => { + assert.strictEqual(typeof parsedModule, 'object'); + const { default: defaultExport } = parsedModule; + assert.strictEqual(typeof defaultExport, 'function'); + assert.strictEqual(defaultExport.name, 'iAmReal'); + assert.strictEqual(defaultExport(), true); +}); + +// The custom loader's resolve hook predetermines the format +await import('esmHook/preknownFormat.pre') +.then((parsedModule) => { + assert.strictEqual(typeof parsedModule, 'object'); + assert.strictEqual(parsedModule.default, 'hello world'); +}); + +// The custom loader provides source even though file does not actually exist +await import('esmHook/virtual.mjs') +.then((parsedModule) => { + assert.strictEqual(typeof parsedModule, 'object'); + assert.strictEqual(typeof parsedModule.default, 'undefined'); + assert.strictEqual(parsedModule.message, 'WOOHOO!'); +}); + +// Ensure custom loaders have separate context from userland +// hooks-custom.mjs also increments count (which starts at 0) +// if both share context, count here would be 2 +await import('../fixtures/es-modules/stateful.mjs') +.then(({ default: count }) => { + assert.strictEqual(count(), 1); +}); diff --git a/test/es-module/test-esm-resolve-hook.mjs b/test/es-module/test-esm-resolve-hook.mjs deleted file mode 100644 index 39b11e02739d4b..00000000000000 --- a/test/es-module/test-esm-resolve-hook.mjs +++ /dev/null @@ -1,8 +0,0 @@ -// Flags: --experimental-loader ./test/fixtures/es-module-loaders/js-loader.mjs -/* eslint-disable node-core/require-common-first, node-core/required-modules */ -import { namedExport } from '../fixtures/es-module-loaders/js-as-esm.js'; -import assert from 'assert'; -import ok from '../fixtures/es-modules/test-esm-ok.mjs'; - -assert(ok); -assert(namedExport); diff --git a/test/es-module/test-esm-transform-source-loader.mjs b/test/es-module/test-esm-transform-source-loader.mjs deleted file mode 100644 index e6d4affea495de..00000000000000 --- a/test/es-module/test-esm-transform-source-loader.mjs +++ /dev/null @@ -1,6 +0,0 @@ -// Flags: --experimental-loader ./test/fixtures/es-module-loaders/transform-source.mjs -/* eslint-disable node-core/require-common-first, node-core/required-modules */ -import assert from 'assert'; -import { message } from '../fixtures/es-modules/message.mjs'; - -assert.strictEqual(message, 'A MESSAGE'); diff --git a/test/fixtures/es-module-loaders/builtin-named-exports-loader.mjs b/test/fixtures/es-module-loaders/builtin-named-exports-loader.mjs index f06e9e90ff97c3..f206d7635b3f63 100644 --- a/test/fixtures/es-module-loaders/builtin-named-exports-loader.mjs +++ b/test/fixtures/es-module-loaders/builtin-named-exports-loader.mjs @@ -2,7 +2,7 @@ import module from 'module'; const GET_BUILTIN = `$__get_builtin_hole_${Date.now()}`; -export function getGlobalPreloadCode() { +export function globalPreload() { return `Object.defineProperty(globalThis, ${JSON.stringify(GET_BUILTIN)}, { value: (builtinName) => { return getBuiltin(builtinName); @@ -13,8 +13,9 @@ export function getGlobalPreloadCode() { `; } -export function resolve(specifier, context, defaultResolve) { - const def = defaultResolve(specifier, context); +export function resolve(specifier, context, next) { + const def = next(specifier, context); + if (def.url.startsWith('node:')) { return { url: `custom-${def.url}`, @@ -23,7 +24,7 @@ export function resolve(specifier, context, defaultResolve) { return def; } -export function getSource(url, context, defaultGetSource) { +export function load(url, context, next) { if (url.startsWith('custom-node:')) { const urlObj = new URL(url); return { @@ -31,14 +32,7 @@ export function getSource(url, context, defaultGetSource) { format: 'module', }; } - return defaultGetSource(url, context); -} - -export function getFormat(url, context, defaultGetFormat) { - if (url.startsWith('custom-node:')) { - return { format: 'module' }; - } - return defaultGetFormat(url, context, defaultGetFormat); + return next(url, context); } function generateBuiltinModule(builtinName) { diff --git a/test/fixtures/es-module-loaders/get-source.mjs b/test/fixtures/es-module-loaders/get-source.mjs deleted file mode 100644 index e5a9c65201aa28..00000000000000 --- a/test/fixtures/es-module-loaders/get-source.mjs +++ /dev/null @@ -1,10 +0,0 @@ -export async function getSource(url, { format }, defaultGetSource) { - if (url.endsWith('fixtures/es-modules/message.mjs')) { - // Oh, I’ve got that one in my cache! - return { - source: `export const message = 'Woohoo!'.toUpperCase();` - } - } else { - return defaultGetSource(url, {format}, defaultGetSource); - } -} diff --git a/test/fixtures/es-module-loaders/hooks-custom.mjs b/test/fixtures/es-module-loaders/hooks-custom.mjs new file mode 100644 index 00000000000000..59f49ff9e60c13 --- /dev/null +++ b/test/fixtures/es-module-loaders/hooks-custom.mjs @@ -0,0 +1,69 @@ +import count from '../es-modules/stateful.mjs'; + + +// Arbitrary instance of manipulating a module's internal state +// used to assert node-land and user-land have different contexts +count(); + +/** + * @param {string} url A fully resolved file url. + * @param {object} context Additional info. + * @param {function} next for now, next is defaultLoad a wrapper for + * defaultGetFormat + defaultGetSource + * @returns {{ format: string, source: (string|SharedArrayBuffer|Uint8Array) }} + */ +export function load(url, context, next) { + // Load all .js files as ESM, regardless of package scope + if (url.endsWith('.js')) return next(url, { + ...context, + format: 'module', + }); + + if (url.endsWith('.ext')) return next(url, { + ...context, + format: 'module', + }); + + if (url === 'esmHook/badReturnVal.mjs') return 'export function returnShouldBeObject() {}'; + + if (url === 'esmHook/badReturnFormatVal.mjs') return { + format: Array(0), + source: '', + } + if (url === 'esmHook/unsupportedReturnFormatVal.mjs') return { + format: 'foo', // Not one of the allowable inputs: no translator named 'foo' + source: '', + } + + if (url === 'esmHook/badReturnSourceVal.mjs') return { + format: 'module', + source: Array(0), + } + + if (url === 'esmHook/preknownFormat.pre') return { + format: context.format, + source: `const msg = 'hello world'; export default msg;` + }; + + if (url === 'esmHook/virtual.mjs') return { + format: 'module', + source: `export const message = 'Woohoo!'.toUpperCase();`, + }; + + return next(url, context, next); +} + +export function resolve(specifier, context, next) { + let format = ''; + + if (specifier === 'esmHook/format.false') format = false; + if (specifier === 'esmHook/format.true') format = true; + if (specifier === 'esmHook/preknownFormat.pre') format = 'module'; + + if (specifier.startsWith('esmHook')) return { + format, + url: specifier, + }; + + return next(specifier, context, next); +} diff --git a/test/fixtures/es-module-loaders/hooks-obsolete.mjs b/test/fixtures/es-module-loaders/hooks-obsolete.mjs new file mode 100644 index 00000000000000..9d12251923d7e9 --- /dev/null +++ b/test/fixtures/es-module-loaders/hooks-obsolete.mjs @@ -0,0 +1,22 @@ +export function dynamicInstantiate() {} +export function getFormat() {} +export function getSource() {} +export function transformSource() {} + + +export function load(url, context, next) { + if (url === 'whatever') return { + format: 'module', + source: '', + }; + + return next(url, context, next); +} + +export function resolve(specifier, context, next) { + if (specifier === 'whatever') return { + url: specifier, + }; + + return next(specifier, context, next); +} diff --git a/test/fixtures/es-module-loaders/js-loader.mjs b/test/fixtures/es-module-loaders/js-loader.mjs deleted file mode 100644 index 2f79475e77e269..00000000000000 --- a/test/fixtures/es-module-loaders/js-loader.mjs +++ /dev/null @@ -1,9 +0,0 @@ -export function getFormat(url, context, defaultGetFormat) { - // Load all .js files as ESM, regardless of package scope - if (url.endsWith('.js')) { - return { - format: 'module' - } - } - return defaultGetFormat(url, context, defaultGetFormat); -} diff --git a/test/fixtures/es-module-loaders/loader-invalid-format.mjs b/test/fixtures/es-module-loaders/loader-invalid-format.mjs index 55ae1cec8ee926..fc1b84658b76de 100644 --- a/test/fixtures/es-module-loaders/loader-invalid-format.mjs +++ b/test/fixtures/es-module-loaders/loader-invalid-format.mjs @@ -7,11 +7,12 @@ export async function resolve(specifier, { parentURL }, defaultResolve) { return defaultResolve(specifier, {parentURL}, defaultResolve); } -export function getFormat(url, context, defaultGetFormat) { +export async function load(url, context, next) { if (url === 'file:///asdf') { return { - format: 'esm' + format: 'esm', + source: '', } } - return defaultGetFormat(url, context, defaultGetFormat); + return next(url, context, next); } diff --git a/test/fixtures/es-module-loaders/loader-unknown-builtin-module.mjs b/test/fixtures/es-module-loaders/loader-unknown-builtin-module.mjs index 4ef089fd6eb3fd..1063f8dfd65f2f 100644 --- a/test/fixtures/es-module-loaders/loader-unknown-builtin-module.mjs +++ b/test/fixtures/es-module-loaders/loader-unknown-builtin-module.mjs @@ -1,17 +1,7 @@ -export async function resolve(specifier, { parentURL }, defaultResolve) { - if (specifier === 'unknown-builtin-module') { - return { - url: 'node:unknown-builtin-module' - }; - } - return defaultResolve(specifier, {parentURL}, defaultResolve); -} +export function resolve(specifier, context, next) { + if (specifier === 'unknown-builtin-module') return { + url: 'node:unknown-builtin-module' + }; -export async function getFormat(url, context, defaultGetFormat) { - if (url === 'node:unknown-builtin-module') { - return { - format: 'builtin' - }; - } - return defaultGetFormat(url, context, defaultGetFormat); + return next(specifier, context, next); } diff --git a/test/fixtures/es-module-loaders/string-sources.mjs b/test/fixtures/es-module-loaders/string-sources.mjs index 3133231208ce1e..180a356bc81478 100644 --- a/test/fixtures/es-module-loaders/string-sources.mjs +++ b/test/fixtures/es-module-loaders/string-sources.mjs @@ -2,29 +2,37 @@ const SOURCES = { __proto__: null, 'test:Array': ['1', '2'], // both `1,2` and `12` are valid ESM 'test:ArrayBuffer': new ArrayBuffer(0), + 'test:BigInt64Array': new BigInt64Array(0), + 'test:BigUint64Array': new BigUint64Array(0), + 'test:Float32Array': new Float32Array(0), + 'test:Float64Array': new Float64Array(0), + 'test:Int8Array': new Int8Array(0), + 'test:Int16Array': new Int16Array(0), + 'test:Int32Array': new Int32Array(0), 'test:null': null, 'test:Object': {}, 'test:SharedArrayBuffer': new SharedArrayBuffer(0), 'test:string': '', 'test:String': new String(''), 'test:Uint8Array': new Uint8Array(0), + 'test:Uint8ClampedArray': new Uint8ClampedArray(0), + 'test:Uint16Array': new Uint16Array(0), + 'test:Uint32Array': new Uint32Array(0), 'test:undefined': undefined, } -export function resolve(specifier, context, defaultFn) { +export function resolve(specifier, context, next) { if (specifier.startsWith('test:')) { return { url: specifier }; } - return defaultFn(specifier, context); + return next(specifier, context); } -export function getFormat(href, context, defaultFn) { + +export function load(href, context, next) { if (href.startsWith('test:')) { - return { format: 'module' }; + return { + format: 'module', + source: SOURCES[href], + }; } - return defaultFn(href, context); -} -export function getSource(href, context, defaultFn) { - if (href.startsWith('test:')) { - return { source: SOURCES[href] }; - } - return defaultFn(href, context); + return next(href, context); } diff --git a/test/fixtures/es-module-loaders/transform-source.mjs b/test/fixtures/es-module-loaders/transform-source.mjs deleted file mode 100644 index 25d983b64e62ca..00000000000000 --- a/test/fixtures/es-module-loaders/transform-source.mjs +++ /dev/null @@ -1,14 +0,0 @@ -export async function transformSource( - source, { url, format }, defaultTransformSource) { - if (format === 'module') { - if (typeof source !== 'string') { - source = new TextDecoder().decode(source); - } - return { - source: source.replace(`'A message';`, `'A message'.toUpperCase();`) - }; - } else { // source could be a buffer, e.g. for WASM - return defaultTransformSource( - source, {url, format}, defaultTransformSource); - } -} diff --git a/test/fixtures/es-modules/file.ext b/test/fixtures/es-modules/file.ext new file mode 100644 index 00000000000000..db07b384e169d8 --- /dev/null +++ b/test/fixtures/es-modules/file.ext @@ -0,0 +1,3 @@ +// fixtures/es-module-loader.mjs tells node to treat this file like ESM + +export default function iAmReal() { return true }; diff --git a/test/fixtures/es-modules/file.unknown b/test/fixtures/es-modules/file.unknown new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/test/fixtures/es-modules/stateful.mjs b/test/fixtures/es-modules/stateful.mjs new file mode 100644 index 00000000000000..745669c462e60d --- /dev/null +++ b/test/fixtures/es-modules/stateful.mjs @@ -0,0 +1,5 @@ +let counter = 0; + +export default function count() { + return ++counter; +} diff --git a/test/message/esm_display_syntax_error.mjs b/test/message/esm_display_syntax_error.mjs deleted file mode 100644 index 0b9a30c2d054f7..00000000000000 --- a/test/message/esm_display_syntax_error.mjs +++ /dev/null @@ -1,4 +0,0 @@ -// Flags: --no-harmony-top-level-await - -'use strict'; -await async () => 0; diff --git a/test/message/esm_display_syntax_error.out b/test/message/esm_display_syntax_error.out deleted file mode 100644 index f1b7ff4e2290ee..00000000000000 --- a/test/message/esm_display_syntax_error.out +++ /dev/null @@ -1,7 +0,0 @@ -file:///*/test/message/esm_display_syntax_error.mjs:4 -await async () => 0; -^^^^^ - -SyntaxError: Unexpected reserved word - at Loader.moduleStrategy (node:internal/modules/esm/translators:*:*) - at async link (node:internal/modules/esm/module_job:*:*) diff --git a/test/message/esm_display_syntax_error_import.out b/test/message/esm_display_syntax_error_import.out index ad906af431bf95..62607b93c7c593 100644 --- a/test/message/esm_display_syntax_error_import.out +++ b/test/message/esm_display_syntax_error_import.out @@ -4,6 +4,7 @@ file:///*/test/message/esm_display_syntax_error_import.mjs:5 SyntaxError: The requested module '../fixtures/es-module-loaders/module-named-exports.mjs' does not provide an export named 'notfound' at ModuleJob._instantiate (node:internal/modules/esm/module_job:*:*) at async ModuleJob.run (node:internal/modules/esm/module_job:*:*) - at async Loader.import (node:internal/modules/esm/loader:*:*) - at async Object.loadESM (node:internal/process/esm_loader:*:*) + at async Promise.all (index 0) + at async ESMLoader.import (node:internal/modules/esm/loader:*:*) + at async loadESM (node:internal/process/esm_loader:*:*) at async handleMainPromise (node:internal/modules/run_main:*:*) diff --git a/test/message/esm_display_syntax_error_import_module.out b/test/message/esm_display_syntax_error_import_module.out index 60a208d534af40..0ecb87a952e891 100644 --- a/test/message/esm_display_syntax_error_import_module.out +++ b/test/message/esm_display_syntax_error_import_module.out @@ -4,6 +4,7 @@ import { foo, notfound } from './module-named-exports.mjs'; SyntaxError: The requested module './module-named-exports.mjs' does not provide an export named 'notfound' at ModuleJob._instantiate (node:internal/modules/esm/module_job:*:*) at async ModuleJob.run (node:internal/modules/esm/module_job:*:*) - at async Loader.import (node:internal/modules/esm/loader:*:*) - at async Object.loadESM (node:internal/process/esm_loader:*:*) + at async Promise.all (index 0) + at async ESMLoader.import (node:internal/modules/esm/loader:*:*) + at async loadESM (node:internal/process/esm_loader:*:*) at async handleMainPromise (node:internal/modules/run_main:*:*) diff --git a/test/message/esm_display_syntax_error_module.out b/test/message/esm_display_syntax_error_module.out index fc0912a96c0d26..26dbf480239b9c 100644 --- a/test/message/esm_display_syntax_error_module.out +++ b/test/message/esm_display_syntax_error_module.out @@ -3,4 +3,5 @@ await async () => 0; ^^^^^^^^^^^^^ SyntaxError: Malformed arrow function parameter list - at Loader.moduleStrategy (node:internal/modules/esm/translators:*:*) + at ESMLoader.moduleStrategy (node:internal/modules/esm/translators:*:*) + at ESMLoader.moduleProvider (node:internal/modules/esm/loader:*:*) diff --git a/test/message/esm_loader_not_found.out b/test/message/esm_loader_not_found.out index 61b1623cdf176f..21d7ab3e44f205 100644 --- a/test/message/esm_loader_not_found.out +++ b/test/message/esm_loader_not_found.out @@ -7,12 +7,12 @@ Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'i-dont-exist' imported from * at new NodeError (node:internal/errors:*:*) at packageResolve (node:internal/modules/esm/resolve:*:*) at moduleResolve (node:internal/modules/esm/resolve:*:*) - at Loader.defaultResolve [as _resolve] (node:internal/modules/esm/resolve:*:*) - at Loader.resolve (node:internal/modules/esm/loader:*:*) - at Loader.getModuleJob (node:internal/modules/esm/loader:*:*) - at Loader.import (node:internal/modules/esm/loader:*:*) - at node:internal/process/esm_loader:*:* + at defaultResolve (node:internal/modules/esm/resolve:*:*) + at ESMLoader.resolve (node:internal/modules/esm/loader:*:*) + at ESMLoader.getModuleJob (node:internal/modules/esm/loader:*:*) + at ESMLoader.import (node:internal/modules/esm/loader:*:*) at initializeLoader (node:internal/process/esm_loader:*:*) - at Object.loadESM (node:internal/process/esm_loader:*:*) { + at loadESM (node:internal/process/esm_loader:*:*) + at runMainESM (node:internal/modules/run_main:*:*) { code: 'ERR_MODULE_NOT_FOUND' } diff --git a/test/message/esm_loader_not_found_cjs_hint_bare.out b/test/message/esm_loader_not_found_cjs_hint_bare.out index aaeed40ed60013..4a255ebf0b6972 100644 --- a/test/message/esm_loader_not_found_cjs_hint_bare.out +++ b/test/message/esm_loader_not_found_cjs_hint_bare.out @@ -7,9 +7,9 @@ Did you mean to import some_module/obj.js? at new NodeError (node:internal/errors:*:*) at finalizeResolution (node:internal/modules/esm/resolve:*:*) at moduleResolve (node:internal/modules/esm/resolve:*:*) - at Loader.defaultResolve [as _resolve] (node:internal/modules/esm/resolve:*:*) - at Loader.resolve (node:internal/modules/esm/loader:*:*) - at Loader.getModuleJob (node:internal/modules/esm/loader:*:*) + at defaultResolve (node:internal/modules/esm/resolve:*:*) + at ESMLoader.resolve (node:internal/modules/esm/loader:*:*) + at ESMLoader.getModuleJob (node:internal/modules/esm/loader:*:*) at ModuleWrap. (node:internal/modules/esm/module_job:*:*) at link (node:internal/modules/esm/module_job:*:*) { code: 'ERR_MODULE_NOT_FOUND' diff --git a/test/message/esm_loader_not_found_cjs_hint_relative.out b/test/message/esm_loader_not_found_cjs_hint_relative.out index 89b8d56133ce3a..817b4aa0724e8e 100644 --- a/test/message/esm_loader_not_found_cjs_hint_relative.out +++ b/test/message/esm_loader_not_found_cjs_hint_relative.out @@ -9,12 +9,12 @@ Did you mean to import ./test/common/fixtures.js? at new NodeError (node:internal/errors:*:*) at finalizeResolution (node:internal/modules/esm/resolve:*:*) at moduleResolve (node:internal/modules/esm/resolve:*:*) - at Loader.defaultResolve [as _resolve] (node:internal/modules/esm/resolve:*:*) - at Loader.resolve (node:internal/modules/esm/loader:*:*) - at Loader.getModuleJob (node:internal/modules/esm/loader:*:*) - at Loader.import (node:internal/modules/esm/loader:*:*) - at node:internal/process/esm_loader:*:* + at defaultResolve (node:internal/modules/esm/resolve:*:*) + at ESMLoader.resolve (node:internal/modules/esm/loader:*:*) + at ESMLoader.getModuleJob (node:internal/modules/esm/loader:*:*) + at ESMLoader.import (node:internal/modules/esm/loader:*:*) at initializeLoader (node:internal/process/esm_loader:*:*) - at Object.loadESM (node:internal/process/esm_loader:*:*) { + at loadESM (node:internal/process/esm_loader:*:*) + at runMainESM (node:internal/modules/run_main:*:*) { code: 'ERR_MODULE_NOT_FOUND' } diff --git a/test/message/esm_loader_syntax_error.out b/test/message/esm_loader_syntax_error.out index de6014add667bc..fb8a2030828a9d 100644 --- a/test/message/esm_loader_syntax_error.out +++ b/test/message/esm_loader_syntax_error.out @@ -5,5 +5,6 @@ await async () => 0; ^^^^^^^^^^^^^ SyntaxError: Malformed arrow function parameter list - at Loader.moduleStrategy (node:internal/modules/esm/translators:*:*) + at ESMLoader.moduleStrategy (node:internal/modules/esm/translators:*:*) + at ESMLoader.moduleProvider (node:internal/modules/esm/loader:*:*) at async link (node:internal/modules/esm/module_job:*:*) diff --git a/test/message/test-esm-loader-obsolete-hooks.mjs b/test/message/test-esm-loader-obsolete-hooks.mjs new file mode 100644 index 00000000000000..9a6a9c48057b40 --- /dev/null +++ b/test/message/test-esm-loader-obsolete-hooks.mjs @@ -0,0 +1,4 @@ +// Flags: --no-warnings --throw-deprecation --experimental-loader ./test/fixtures/es-module-loaders/hooks-obsolete.mjs +/* eslint-disable node-core/require-common-first, node-core/required-modules */ + +await import('whatever'); diff --git a/test/message/test-esm-loader-obsolete-hooks.out b/test/message/test-esm-loader-obsolete-hooks.out new file mode 100644 index 00000000000000..5099c9c8d8610b --- /dev/null +++ b/test/message/test-esm-loader-obsolete-hooks.out @@ -0,0 +1,10 @@ +node:internal/process/warning:* + throw warning; + ^ + +DeprecationWarning: Obsolete loader hook(s) supplied and will be ignored: dynamicInstantiate, getFormat, getSource, transformSource + at Function.pluckHooks (node:internal/modules/esm/loader:*:*) + at ESMLoader.addCustomLoaders (node:internal/modules/esm/loader:*:*) + at initializeLoader (node:internal/process/esm_loader:*:*) + at async loadESM (node:internal/process/esm_loader:*:*) + at async handleMainPromise (node:internal/modules/run_main:*:*) diff --git a/test/parallel/test-bootstrap-modules.js b/test/parallel/test-bootstrap-modules.js index bb77c7201b21d2..b68a262103c7e8 100644 --- a/test/parallel/test-bootstrap-modules.js +++ b/test/parallel/test-bootstrap-modules.js @@ -72,10 +72,10 @@ const expectedModules = new Set([ 'NativeModule internal/modules/esm/get_format', 'NativeModule internal/modules/esm/get_source', 'NativeModule internal/modules/esm/loader', + 'NativeModule internal/modules/esm/load', 'NativeModule internal/modules/esm/module_job', 'NativeModule internal/modules/esm/module_map', 'NativeModule internal/modules/esm/resolve', - 'NativeModule internal/modules/esm/transform_source', 'NativeModule internal/modules/esm/translators', 'NativeModule internal/process/esm_loader', 'NativeModule internal/options', diff --git a/test/parallel/test-no-harmony-top-level-await.mjs b/test/parallel/test-no-harmony-top-level-await.mjs deleted file mode 100644 index 5805af0e5ee265..00000000000000 --- a/test/parallel/test-no-harmony-top-level-await.mjs +++ /dev/null @@ -1,8 +0,0 @@ -// Flags: --no-harmony-top-level-await - -import { - mustCall, -} from '../common/index.mjs'; - -process.on('unhandledRejection', mustCall()); -Promise.reject(new Error('should not be fatal error')); diff --git a/test/parallel/test-webcrypto-ed25519-ed448.js b/test/parallel/test-webcrypto-ed25519-ed448.js index 8abca247738621..b18f3f9d3b4d44 100644 --- a/test/parallel/test-webcrypto-ed25519-ed448.js +++ b/test/parallel/test-webcrypto-ed25519-ed448.js @@ -1,3 +1,4 @@ +// Flags: --expose-internals 'use strict'; const common = require('../common'); @@ -11,6 +12,9 @@ const { webcrypto: { subtle } } = require('crypto'); +const { internalBinding } = require('internal/test/binding'); +const { DOMException } = internalBinding('messaging'); + async function generateKey(namedCurve) { return subtle.generateKey( { @@ -429,3 +433,53 @@ assert.rejects( } } } + +{ + // See: https://github.com/nodejs/node/pull/40300 + for (const namedCurve of ['NODE-ED25519', 'NODE-ED448']) { + assert.rejects( + (async () => { + const { privateKey } = await generateKey(namedCurve); + return subtle.sign( + { + name: namedCurve, + hash: 'SHA-256' + }, + privateKey, + Buffer.from('abc') + ); + })(), + (err) => { + assert.strictEqual(err.message, `Hash is not permitted for ${namedCurve}`); + assert(err instanceof DOMException); + return true; + }).then(common.mustCall()); + + assert.rejects( + (async () => { + const { publicKey, privateKey } = await generateKey(namedCurve); + const signature = await subtle.sign( + { + name: namedCurve, + }, + privateKey, + Buffer.from('abc') + ).catch(common.mustNotCall()); + + return subtle.verify( + { + name: namedCurve, + hash: 'SHA-256', + }, + publicKey, + signature, + Buffer.from('abc') + ); + })(), + (err) => { + assert.strictEqual(err.message, `Hash is not permitted for ${namedCurve}`); + assert(err instanceof DOMException); + return true; + }).then(common.mustCall()); + } +} diff --git a/test/wpt/status/url.json b/test/wpt/status/url.json index ab89356f82c805..812f7a9ffce237 100644 --- a/test/wpt/status/url.json +++ b/test/wpt/status/url.json @@ -1,7 +1,6 @@ { "toascii.window.js": { - "requires": ["small-icu"], - "skip": "TODO: port from .window.js" + "requires": ["small-icu"] }, "percent-encoding.window.js": { "requires": ["small-icu"], @@ -13,9 +12,6 @@ "urlencoded-parser.any.js": { "fail": "missing Request and Response" }, - "idlharness.any.js": { - "fail": "getter/setter names are wrong, etc." - }, "urlsearchparams-constructor.any.js": { "fail": "FormData is not defined" }, @@ -30,5 +26,8 @@ }, "url-setters-a-area.window.js": { "skip": "already tested in url-setters.any.js" + }, + "idlharness.any.js": { + "fail": "Fixed in a semver-major change: https://github.com/nodejs/node/pull/39752" } } diff --git a/test/wpt/test-url.js b/test/wpt/test-url.js index 4652bfd880cd76..f64189ea3f66d6 100644 --- a/test/wpt/test-url.js +++ b/test/wpt/test-url.js @@ -15,4 +15,13 @@ runner.setInitScript(` global.DOMException = DOMException; `); +runner.setScriptModifier((obj) => { + if (obj.filename.includes('toascii.window.js')) { + // `a` and `area` in `toascii.window.js` is for testing `Element` that + // created via `document.createElement`. So we need to ignore them and just + // test `URL`. + obj.code = obj.code.replace(/\["url", "a", "area"\]/, '[ "url" ]'); + } +}); +runner.pretendGlobalThisAs('Window'); runner.runJsTests(); diff --git a/tools/code_cache/mkcodecache.cc b/tools/code_cache/mkcodecache.cc index 3a1d0ee50e5078..9a0127184372bc 100644 --- a/tools/code_cache/mkcodecache.cc +++ b/tools/code_cache/mkcodecache.cc @@ -28,7 +28,6 @@ int main(int argc, char* argv[]) { #endif // _WIN32 v8::V8::SetFlagsFromString("--random_seed=42"); - v8::V8::SetFlagsFromString("--harmony-top-level-await"); if (argc < 2) { std::cerr << "Usage: " << argv[0] << " \n"; diff --git a/tools/doc/allhtml.mjs b/tools/doc/allhtml.mjs index 905ea5d3dd6c6f..8c2135dc8cbc8f 100644 --- a/tools/doc/allhtml.mjs +++ b/tools/doc/allhtml.mjs @@ -31,13 +31,31 @@ for (const link of toc.match(//g)) { // Split the doc. const match = /(<\/ul>\s*)?<\/\w+>\s*<\w+ id="apicontent">/.exec(data); + // Get module name + const moduleName = href.replace(/\.html$/, ''); + contents += data.slice(0, match.index) - .replace(/[\s\S]*?id="toc"[^>]*>\s*<\w+>.*?<\/\w+>\s*(
    \s*)?/, ''); + .replace(/[\s\S]*?id="toc"[^>]*>\s*<\w+>.*?<\/\w+>\s*(
') - .replace(/ { - return htmlFiles.includes(href) ? ' { + if (anchor !== id) throw new Error(`Mark does not match: ${anchor} should match ${id}`); + return ` { + return ` { + if (!htmlFiles.includes(href)) return match; + return `` + (noLinking ? '' : - '') + + '') + `${prefix} ${number}${noLinking ? '' : ''}` .replace(/\n/g, ' ') }); @@ -382,6 +382,7 @@ const DEPRECATION_HEADING_PATTERN = /^DEP\d+:/; export function buildToc({ filename, apilinks }) { return (tree, file) => { const idCounters = Object.create(null); + const legacyIdCounters = Object.create(null); let toc = ''; let depth = 0; @@ -399,7 +400,9 @@ export function buildToc({ filename, apilinks }) { const headingText = file.value.slice( node.children[0].position.start.offset, node.position.end.offset).trim(); - const id = getId(`${realFilename}_${headingText}`, idCounters); + const id = getId(headingText, idCounters); + // Use previous ID generator to create alias + const legacyId = getLegacyId(`${realFilename}_${headingText}`, legacyIdCounters); const isDeprecationHeading = DEPRECATION_HEADING_PATTERN.test(headingText); @@ -418,6 +421,9 @@ export function buildToc({ filename, apilinks }) { let anchor = `#`; + // Add alias anchor to preserve old links + anchor += ``; + if (realFilename === 'errors' && headingText.startsWith('ERR_')) { anchor += `#`; @@ -447,10 +453,25 @@ export function buildToc({ filename, apilinks }) { }; } +// ID generator that mirrors Github's heading anchor parser +const punctuation = /[^\w\- ]/g; +function getId(text, idCounters) { + text = text.toLowerCase() + .replace(punctuation, '') + .replace(/ /g, '-'); + if (idCounters[text] !== undefined) { + return `${text}_${++idCounters[text]}`; + } + idCounters[text] = 0; + return text; +} + +// This ID generator is purely to generate aliases +// so we can preserve old doc links const notAlphaNumerics = /[^a-z0-9]+/g; const edgeUnderscores = /^_+|_+$/g; const notAlphaStart = /^[^a-z]/; -function getId(text, idCounters) { +function getLegacyId(text, idCounters) { text = text.toLowerCase() .replace(notAlphaNumerics, '_') .replace(edgeUnderscores, '') diff --git a/tools/doc/links-mapper.json b/tools/doc/links-mapper.json index 158d72c7fe5822..7232539ca461f5 100644 --- a/tools/doc/links-mapper.json +++ b/tools/doc/links-mapper.json @@ -1,6 +1,6 @@ { "doc/api/synopsis.md": { - "command line options": "cli.html#cli_command_line_options", + "command line options": "cli.html#command-line-options", "web server": "http.html" } } \ No newline at end of file diff --git a/tools/doc/type-parser.mjs b/tools/doc/type-parser.mjs index fb396070266831..bcd95360ee6262 100644 --- a/tools/doc/type-parser.mjs +++ b/tools/doc/type-parser.mjs @@ -24,8 +24,8 @@ const customTypesMap = { 'this': `${jsDocPrefix}Reference/Operators/this`, - 'AbortController': 'globals.html#globals_class_abortcontroller', - 'AbortSignal': 'globals.html#globals_class_abortsignal', + 'AbortController': 'globals.html#class-abortcontroller', + 'AbortSignal': 'globals.html#class-abortsignal', 'ArrayBufferView': 'https://developer.mozilla.org/en-US/docs/Web/API/ArrayBufferView', @@ -42,11 +42,11 @@ const customTypesMap = { 'WebAssembly.Instance': `${jsDocPrefix}Reference/Global_Objects/WebAssembly/Instance`, - 'Blob': 'buffer.html#buffer_class_blob', + 'Blob': 'buffer.html#class-blob', 'BroadcastChannel': - 'worker_threads.html#worker_threads_class_broadcastchannel_' + - 'extends_eventtarget', + 'worker_threads.html#class-broadcastchannel-' + + 'extends-eventtarget', 'Iterable': `${jsDocPrefix}Reference/Iteration_protocols#The_iterable_protocol`, @@ -56,211 +56,211 @@ const customTypesMap = { 'Module Namespace Object': 'https://tc39.github.io/ecma262/#sec-module-namespace-exotic-objects', - 'AsyncHook': 'async_hooks.html#async_hooks_async_hooks_createhook_callbacks', - 'AsyncResource': 'async_hooks.html#async_hooks_class_asyncresource', - - 'brotli options': 'zlib.html#zlib_class_brotlioptions', - - 'Buffer': 'buffer.html#buffer_class_buffer', - - 'ChildProcess': 'child_process.html#child_process_class_childprocess', - - 'cluster.Worker': 'cluster.html#cluster_class_worker', - - 'Cipher': 'crypto.html#crypto_class_cipher', - 'Decipher': 'crypto.html#crypto_class_decipher', - 'DiffieHellman': 'crypto.html#crypto_class_diffiehellman', - 'DiffieHellmanGroup': 'crypto.html#crypto_class_diffiehellmangroup', - 'ECDH': 'crypto.html#crypto_class_ecdh', - 'Hash': 'crypto.html#crypto_class_hash', - 'Hmac': 'crypto.html#crypto_class_hmac', - 'KeyObject': 'crypto.html#crypto_class_keyobject', - 'Sign': 'crypto.html#crypto_class_sign', - 'Verify': 'crypto.html#crypto_class_verify', - 'crypto.constants': 'crypto.html#crypto_crypto_constants_1', - - 'CryptoKey': 'webcrypto.html#webcrypto_class_cryptokey', - 'CryptoKeyPair': 'webcrypto.html#webcrypto_class_cryptokeypair', - 'Crypto': 'webcrypto.html#webcrypto_class_crypto', - 'SubtleCrypto': 'webcrypto.html#webcrypto_class_subtlecrypto', - 'RsaOaepParams': 'webcrypto.html#webcrypto_class_rsaoaepparams', - 'AesCtrParams': 'webcrypto.html#webcrypto_class_aesctrparams', - 'AesCbcParams': 'webcrypto.html#webcrypto_class_aescbcparams', - 'AesGcmParams': 'webcrypto.html#webcrypto_class_aesgcmparams', - 'AesKwParams': 'webcrypto.html#webcrypto_class_aeskwparams', - 'EcdhKeyDeriveParams': 'webcrypto.html#webcrypto_class_ecdhkeyderiveparams', - 'HkdfParams': 'webcrypto.html#webcrypto_class_hkdfparams', - 'Pbkdf2Params': 'webcrypto.html#webcrypto_class_pbkdf2params', - 'HmacKeyGenParams': 'webcrypto.html#webcrypto_class_hmackeygenparams', - 'AesKeyGenParams': 'webcrypto.html#webcrypto_class_aeskeygenparams', + 'AsyncHook': 'async_hooks.html#async_hookscreatehookcallbacks', + 'AsyncResource': 'async_hooks.html#class-asyncresource', + + 'brotli options': 'zlib.html#class-brotlioptions', + + 'Buffer': 'buffer.html#class-buffer', + + 'ChildProcess': 'child_process.html#class-childprocess', + + 'cluster.Worker': 'cluster.html#class-worker', + + 'Cipher': 'crypto.html#class-cipher', + 'Decipher': 'crypto.html#class-decipher', + 'DiffieHellman': 'crypto.html#class-diffiehellman', + 'DiffieHellmanGroup': 'crypto.html#class-diffiehellmangroup', + 'ECDH': 'crypto.html#class-ecdh', + 'Hash': 'crypto.html#class-hash', + 'Hmac': 'crypto.html#class-hmac', + 'KeyObject': 'crypto.html#class-keyobject', + 'Sign': 'crypto.html#class-sign', + 'Verify': 'crypto.html#class-verify', + 'crypto.constants': 'crypto.html#cryptoconstants', + + 'CryptoKey': 'webcrypto.html#class-cryptokey', + 'CryptoKeyPair': 'webcrypto.html#class-cryptokeypair', + 'Crypto': 'webcrypto.html#class-crypto', + 'SubtleCrypto': 'webcrypto.html#class-subtlecrypto', + 'RsaOaepParams': 'webcrypto.html#class-rsaoaepparams', + 'AesCtrParams': 'webcrypto.html#class-aesctrparams', + 'AesCbcParams': 'webcrypto.html#class-aescbcparams', + 'AesGcmParams': 'webcrypto.html#class-aesgcmparams', + 'AesKwParams': 'webcrypto.html#class-aeskwparams', + 'EcdhKeyDeriveParams': 'webcrypto.html#class-ecdhkeyderiveparams', + 'HkdfParams': 'webcrypto.html#class-hkdfparams', + 'Pbkdf2Params': 'webcrypto.html#class-pbkdf2params', + 'HmacKeyGenParams': 'webcrypto.html#class-hmackeygenparams', + 'AesKeyGenParams': 'webcrypto.html#class-aeskeygenparams', 'RsaHashedKeyGenParams': - 'webcrypto.html#webcrypto_class_rsahashedkeygenparams', - 'EcKeyGenParams': 'webcrypto.html#webcrypto_class_eckeygenparams', + 'webcrypto.html#class-rsahashedkeygenparams', + 'EcKeyGenParams': 'webcrypto.html#class-eckeygenparams', 'RsaHashedImportParams': - 'webcrypto.html#webcrypto_class_rsahashedimportparams', - 'EcKeyImportParams': 'webcrypto.html#webcrypto_class_eckeyimportparams', - 'HmacImportParams': 'webcrypto.html#webcrypto_class_hmacimportparams', - 'AesImportParams': 'webcrypto.html#webcrypto_class_aesimportparams', - 'Pbkdf2ImportParams': 'webcrypto.html#webcrypto_class_pbkdf2importparams', - 'HmacParams': 'webcrypto.html#webcrypto_class_hmacparams', - 'EcdsaParams': 'webcrypto.html#webcrypto_class_ecdsaparams', - 'RsaPssParams': 'webcrypto.html#webcrypto_class_rsapssparams', - 'RsaSignParams': 'webcrypto.html#webcrypto_class_rsasignparams', - 'NodeDhImportParams': 'webcrypto.html#webcrypto_class_nodedhimportparams', - 'NodeDhKeyGenParams': 'webcrypto.html#webcrypto_class_nodedhkeygenparams', + 'webcrypto.html#class-rsahashedimportparams', + 'EcKeyImportParams': 'webcrypto.html#class-eckeyimportparams', + 'HmacImportParams': 'webcrypto.html#class-hmacimportparams', + 'AesImportParams': 'webcrypto.html#class-aesimportparams', + 'Pbkdf2ImportParams': 'webcrypto.html#class-pbkdf2importparams', + 'HmacParams': 'webcrypto.html#class-hmacparams', + 'EcdsaParams': 'webcrypto.html#class-ecdsaparams', + 'RsaPssParams': 'webcrypto.html#class-rsapssparams', + 'RsaSignParams': 'webcrypto.html#class-rsasignparams', + 'NodeDhImportParams': 'webcrypto.html#class-nodedhimportparams', + 'NodeDhKeyGenParams': 'webcrypto.html#class-nodedhkeygenparams', 'NodeDhDeriveBitsParams': - 'webcrypto.html#webcrypto_class_nodedhderivebitsparams', - 'NodeDsaImportParams': 'webcrypto.html#webcrypto_class_nodedsaimportparams', - 'NodeDsaKeyGenParams': 'webcrypto.html#webcrypto_class_nodedsakeygenparams', - 'NodeDsaSignParams': 'webcrypto.html#webcrypto_class_nodedsasignparams', + 'webcrypto.html#class-nodedhderivebitsparams', + 'NodeDsaImportParams': 'webcrypto.html#class-nodedsaimportparams', + 'NodeDsaKeyGenParams': 'webcrypto.html#class-nodedsakeygenparams', + 'NodeDsaSignParams': 'webcrypto.html#class-nodedsasignparams', 'NodeScryptImportParams': - 'webcrypto.html#webcrypto_class_nodescryptimportparams', - 'NodeScryptParams': 'webcrypto.html#webcrypto_class_nodescryptparams', + 'webcrypto.html#class-nodescryptimportparams', + 'NodeScryptParams': 'webcrypto.html#class-nodescryptparams', 'NodeEdKeyImportParams': - 'webcrypto.html#webcrypto_class_nodeedkeyimportparams', + 'webcrypto.html#class-nodeedkeyimportparams', 'NodeEdKeyGenParams': - 'webcrypto.html#webcrypto_class_nodeedkeygenparams', + 'webcrypto.html#class-nodeedkeygenparams', - 'dgram.Socket': 'dgram.html#dgram_class_dgram_socket', + 'dgram.Socket': 'dgram.html#class-dgramsocket', - 'Channel': 'diagnostics_channel.html#diagnostics_channel_class_channel', + 'Channel': 'diagnostics_channel.html#class-channel', - 'Domain': 'domain.html#domain_class_domain', + 'Domain': 'domain.html#class-domain', - 'errors.Error': 'errors.html#errors_class_error', + 'errors.Error': 'errors.html#class-error', - 'import.meta': 'esm.html#esm_import_meta', + 'import.meta': 'esm.html#importmeta', - 'EventEmitter': 'events.html#events_class_eventemitter', - 'EventTarget': 'events.html#events_class_eventtarget', - 'Event': 'events.html#events_class_event', - 'EventListener': 'events.html#events_event_listener', + 'EventEmitter': 'events.html#class-eventemitter', + 'EventTarget': 'events.html#class-eventtarget', + 'Event': 'events.html#class-event', + 'EventListener': 'events.html#event-listener', - 'FileHandle': 'fs.html#fs_class_filehandle', - 'fs.Dir': 'fs.html#fs_class_fs_dir', - 'fs.Dirent': 'fs.html#fs_class_fs_dirent', - 'fs.FSWatcher': 'fs.html#fs_class_fs_fswatcher', - 'fs.ReadStream': 'fs.html#fs_class_fs_readstream', - 'fs.Stats': 'fs.html#fs_class_fs_stats', - 'fs.StatWatcher': 'fs.html#fs_class_fs_statwatcher', - 'fs.WriteStream': 'fs.html#fs_class_fs_writestream', + 'FileHandle': 'fs.html#class-filehandle', + 'fs.Dir': 'fs.html#class-fsdir', + 'fs.Dirent': 'fs.html#class-fsdirent', + 'fs.FSWatcher': 'fs.html#class-fsfswatcher', + 'fs.ReadStream': 'fs.html#class-fsreadstream', + 'fs.Stats': 'fs.html#class-fsstats', + 'fs.StatWatcher': 'fs.html#class-fsstatwatcher', + 'fs.WriteStream': 'fs.html#class-fswritestream', - 'http.Agent': 'http.html#http_class_http_agent', - 'http.ClientRequest': 'http.html#http_class_http_clientrequest', - 'http.IncomingMessage': 'http.html#http_class_http_incomingmessage', - 'http.Server': 'http.html#http_class_http_server', - 'http.ServerResponse': 'http.html#http_class_http_serverresponse', + 'http.Agent': 'http.html#class-httpagent', + 'http.ClientRequest': 'http.html#class-httpclientrequest', + 'http.IncomingMessage': 'http.html#class-httpincomingmessage', + 'http.Server': 'http.html#class-httpserver', + 'http.ServerResponse': 'http.html#class-httpserverresponse', - 'ClientHttp2Session': 'http2.html#http2_class_clienthttp2session', - 'ClientHttp2Stream': 'http2.html#http2_class_clienthttp2stream', - 'HTTP/2 Headers Object': 'http2.html#http2_headers_object', - 'HTTP/2 Settings Object': 'http2.html#http2_settings_object', - 'http2.Http2ServerRequest': 'http2.html#http2_class_http2_http2serverrequest', + 'ClientHttp2Session': 'http2.html#class-clienthttp2session', + 'ClientHttp2Stream': 'http2.html#class-clienthttp2stream', + 'HTTP/2 Headers Object': 'http2.html#headers-object', + 'HTTP/2 Settings Object': 'http2.html#settings-object', + 'http2.Http2ServerRequest': 'http2.html#class-http2http2serverrequest', 'http2.Http2ServerResponse': - 'http2.html#http2_class_http2_http2serverresponse', - 'Http2SecureServer': 'http2.html#http2_class_http2secureserver', - 'Http2Server': 'http2.html#http2_class_http2server', - 'Http2Session': 'http2.html#http2_class_http2session', - 'Http2Stream': 'http2.html#http2_class_http2stream', - 'ServerHttp2Stream': 'http2.html#http2_class_serverhttp2stream', + 'http2.html#class-http2http2serverresponse', + 'Http2SecureServer': 'http2.html#class-http2secureserver', + 'Http2Server': 'http2.html#class-http2server', + 'Http2Session': 'http2.html#class-http2session', + 'Http2Stream': 'http2.html#class-http2stream', + 'ServerHttp2Stream': 'http2.html#class-serverhttp2stream', - 'https.Server': 'https.html#https_class_https_server', + 'https.Server': 'https.html#class-httpsserver', - 'module': 'modules.html#modules_the_module_object', + 'module': 'modules.html#the-module-object', 'module.SourceMap': - 'module.html#module_class_module_sourcemap', + 'module.html#class-modulesourcemap', - 'require': 'modules.html#modules_require_id', + 'require': 'modules.html#requireid', - 'Handle': 'net.html#net_server_listen_handle_backlog_callback', - 'net.BlockList': 'net.html#net_class_net_blocklist', - 'net.Server': 'net.html#net_class_net_server', - 'net.Socket': 'net.html#net_class_net_socket', - 'net.SocketAddress': 'net.html#net_class_net_socketaddress', + 'Handle': 'net.html#serverlistenhandle-backlog-callback', + 'net.BlockList': 'net.html#class-netblocklist', + 'net.Server': 'net.html#class-netserver', + 'net.Socket': 'net.html#class-netsocket', + 'net.SocketAddress': 'net.html#class-netsocketaddress', 'NodeEventTarget': - 'events.html#events_class_nodeeventtarget', + 'events.html#class-nodeeventtarget', - 'os.constants.dlopen': 'os.html#os_dlopen_constants', + 'os.constants.dlopen': 'os.html#dlopen-constants', - 'Histogram': 'perf_hooks.html#perf_hooks_class_histogram', + 'Histogram': 'perf_hooks.html#class-histogram', 'IntervalHistogram': - 'perf_hooks.html#perf_hooks_class_intervalhistogram_extends_histogram', + 'perf_hooks.html#class-intervalhistogram-extends-histogram', 'RecordableHistogram': - 'perf_hooks.html#perf_hooks_class_recordablehistogram_extends_histogram', - 'PerformanceEntry': 'perf_hooks.html#perf_hooks_class_performanceentry', + 'perf_hooks.html#class-recordablehistogram-extends-histogram', + 'PerformanceEntry': 'perf_hooks.html#class-performanceentry', 'PerformanceNodeTiming': - 'perf_hooks.html#perf_hooks_class_performancenodetiming', + 'perf_hooks.html#class-performancenodetiming', 'PerformanceObserver': - 'perf_hooks.html#perf_hooks_class_perf_hooks_performanceobserver', + 'perf_hooks.html#class-perf_hooksperformanceobserver', 'PerformanceObserverEntryList': - 'perf_hooks.html#perf_hooks_class_performanceobserverentrylist', + 'perf_hooks.html#class-performanceobserverentrylist', - 'readline.Interface': 'readline.html#readline_class_interface', + 'readline.Interface': 'readline.html#class-interface', - 'repl.REPLServer': 'repl.html#repl_class_replserver', + 'repl.REPLServer': 'repl.html#class-replserver', - 'Stream': 'stream.html#stream_stream', - 'stream.Duplex': 'stream.html#stream_class_stream_duplex', - 'stream.Readable': 'stream.html#stream_class_stream_readable', - 'stream.Transform': 'stream.html#stream_class_stream_transform', - 'stream.Writable': 'stream.html#stream_class_stream_writable', + 'Stream': 'stream.html#stream', + 'stream.Duplex': 'stream.html#class-streamduplex', + 'stream.Readable': 'stream.html#class-streamreadable', + 'stream.Transform': 'stream.html#class-streamtransform', + 'stream.Writable': 'stream.html#class-streamwritable', - 'Immediate': 'timers.html#timers_class_immediate', - 'Timeout': 'timers.html#timers_class_timeout', - 'Timer': 'timers.html#timers_timers', + 'Immediate': 'timers.html#class-immediate', + 'Timeout': 'timers.html#class-timeout', + 'Timer': 'timers.html#timers', - 'tls.SecureContext': 'tls.html#tls_tls_createsecurecontext_options', - 'tls.Server': 'tls.html#tls_class_tls_server', - 'tls.TLSSocket': 'tls.html#tls_class_tls_tlssocket', + 'tls.SecureContext': 'tls.html#tlscreatesecurecontextoptions', + 'tls.Server': 'tls.html#class-tlsserver', + 'tls.TLSSocket': 'tls.html#class-tlstlssocket', - 'Tracing': 'tracing.html#tracing_tracing_object', + 'Tracing': 'tracing.html#tracing-object', - 'URL': 'url.html#url_the_whatwg_url_api', - 'URLSearchParams': 'url.html#url_class_urlsearchparams', + 'URL': 'url.html#the-whatwg-url-api', + 'URLSearchParams': 'url.html#class-urlsearchparams', - 'vm.Module': 'vm.html#vm_class_vm_module', - 'vm.Script': 'vm.html#vm_class_vm_script', - 'vm.SourceTextModule': 'vm.html#vm_class_vm_sourcetextmodule', + 'vm.Module': 'vm.html#class-vmmodule', + 'vm.Script': 'vm.html#class-vmscript', + 'vm.SourceTextModule': 'vm.html#class-vmsourcetextmodule', - 'MessagePort': 'worker_threads.html#worker_threads_class_messageport', - 'Worker': 'worker_threads.html#worker_threads_class_worker', + 'MessagePort': 'worker_threads.html#class-messageport', + 'Worker': 'worker_threads.html#class-worker', - 'X509Certificate': 'crypto.html#crypto_class_x509certificate', + 'X509Certificate': 'crypto.html#class-x509certificate', - 'zlib options': 'zlib.html#zlib_class_options', + 'zlib options': 'zlib.html#class-options', 'ReadableStream': - 'webstreams.md#webstreamsapi_class_readablestream', + 'webstreams.md#class-readablestream', 'ReadableStreamDefaultReader': - 'webstreams.md#webstreamsapi_class_readablestreamdefaultreader', + 'webstreams.md#class-readablestreamdefaultreader', 'ReadableStreamBYOBReader': - 'webstreams.md#webstreamsapi_class_readablestreambyobreader', + 'webstreams.md#class-readablestreambyobreader', 'ReadableStreamDefaultController': - 'webstreams.md#webstreamsapi_class_readablestreamdefaultcontroller', + 'webstreams.md#class-readablestreamdefaultcontroller', 'ReadableByteStreamController': - 'webstreams.md#webstreamsapi_class_readablebytestreamcontroller', + 'webstreams.md#class-readablebytestreamcontroller', 'ReadableStreamBYOBRequest': - 'webstreams.md#webstreamsapi_class_readablestreambyobrequest', + 'webstreams.md#class-readablestreambyobrequest', 'WritableStream': - 'webstreams.md#webstreamsapi_class_writablestream', + 'webstreams.md#class-writablestream', 'WritableStreamDefaultWriter': - 'webstreams.md#webstreamsapi_class_writablestreamdefaultwriter', + 'webstreams.md#class-writablestreamdefaultwriter', 'WritableStreamDefaultController': - 'webstreams.md#webstreamsapi_class_writablestreamdefaultcontroller', + 'webstreams.md#class-writablestreamdefaultcontroller', 'TransformStream': - 'webstreams.md#webstreamsapi_class_transformstream', + 'webstreams.md#class-transformstream', 'TransformStreamDefaultController': - 'webstreams.md#webstreamsapi_class_transformstreamdefaultcontroller', + 'webstreams.md#class-transformstreamdefaultcontroller', 'ByteLengthQueuingStrategy': - 'webstreams.md#webstreamsapi_class_bytelengthqueuingstrategy', + 'webstreams.md#class-bytelengthqueuingstrategy', 'CountQueuingStrategy': - 'webstreams.md#webstreamsapi_class_countqueuingstrategy', + 'webstreams.md#class-countqueuingstrategy', 'TextEncoderStream': - 'webstreams.md#webstreamsapi_class_textencoderstream', + 'webstreams.md#class-textencoderstream', 'TextDecoderStream': - 'webstreams.md#webstreamsapi_class_textdecoderstream', + 'webstreams.md#class-textdecoderstream', }; const arrayPart = /(?:\[])+$/;