From 61661d015fcbcd86f2256f0a1962643248b49969 Mon Sep 17 00:00:00 2001 From: roberthicks Date: Thu, 13 Jun 2024 16:25:54 -0400 Subject: [PATCH] Adding error handling for 400 and 500 api errors. Added Artifactory Repository Name field to avoid calling repos that the pipeline doesn't have acces too. --- .gitignore | 1 - task/artifactory-api-helpers.js | 55 +- task/artifactory-api-helpers.ts | 183 +- task/node_modules/.bin/bunyan | 1 + task/node_modules/.bin/mkdirp | 1 + task/node_modules/.bin/ncp | 1 + task/node_modules/.bin/resolve | 1 + task/node_modules/.bin/rimraf | 1 + task/node_modules/.bin/semver | 1 + task/node_modules/.bin/shjs | 1 + task/node_modules/.bin/uuid | 1 + task/node_modules/.package-lock.json | 1022 + task/node_modules/@types/axios/README.md | 2 + task/node_modules/@types/axios/package.json | 14 + task/node_modules/@types/bunyan/LICENSE | 21 + task/node_modules/@types/bunyan/README.md | 15 + task/node_modules/@types/bunyan/index.d.ts | 296 + task/node_modules/@types/bunyan/package.json | 27 + .../node_modules/@types/concat-stream/LICENSE | 21 + .../@types/concat-stream/README.md | 37 + .../@types/concat-stream/index.d.ts | 17 + .../@types/concat-stream/package.json | 27 + task/node_modules/@types/form-data/README.md | 18 + task/node_modules/@types/form-data/index.d.ts | 26 + .../@types/form-data/package.json | 19 + .../@types/form-data/types-metadata.json | 29 + task/node_modules/@types/mocha/LICENSE | 21 + task/node_modules/@types/mocha/README.md | 15 + task/node_modules/@types/mocha/index.d.ts | 2916 +++ task/node_modules/@types/mocha/package.json | 55 + task/node_modules/@types/node/LICENSE | 21 + task/node_modules/@types/node/README.md | 15 + task/node_modules/@types/node/assert.d.ts | 996 + .../@types/node/assert/strict.d.ts | 8 + .../node_modules/@types/node/async_hooks.d.ts | 539 + task/node_modules/@types/node/buffer.d.ts | 2362 ++ .../@types/node/child_process.d.ts | 1540 ++ task/node_modules/@types/node/cluster.d.ts | 432 + task/node_modules/@types/node/console.d.ts | 415 + task/node_modules/@types/node/constants.d.ts | 19 + task/node_modules/@types/node/crypto.d.ts | 4456 ++++ task/node_modules/@types/node/dgram.d.ts | 586 + .../@types/node/diagnostics_channel.d.ts | 191 + task/node_modules/@types/node/dns.d.ts | 809 + .../@types/node/dns/promises.d.ts | 425 + task/node_modules/@types/node/dom-events.d.ts | 122 + task/node_modules/@types/node/domain.d.ts | 170 + task/node_modules/@types/node/events.d.ts | 879 + task/node_modules/@types/node/fs.d.ts | 4291 ++++ .../node_modules/@types/node/fs/promises.d.ts | 1239 ++ task/node_modules/@types/node/globals.d.ts | 385 + .../@types/node/globals.global.d.ts | 1 + task/node_modules/@types/node/http.d.ts | 1888 ++ task/node_modules/@types/node/http2.d.ts | 2382 ++ task/node_modules/@types/node/https.d.ts | 550 + task/node_modules/@types/node/index.d.ts | 88 + task/node_modules/@types/node/inspector.d.ts | 2747 +++ task/node_modules/@types/node/module.d.ts | 301 + task/node_modules/@types/node/net.d.ts | 949 + task/node_modules/@types/node/os.d.ts | 478 + task/node_modules/@types/node/package.json | 230 + task/node_modules/@types/node/path.d.ts | 191 + task/node_modules/@types/node/perf_hooks.d.ts | 639 + task/node_modules/@types/node/process.d.ts | 1539 ++ task/node_modules/@types/node/punycode.d.ts | 117 + .../node_modules/@types/node/querystring.d.ts | 141 + task/node_modules/@types/node/readline.d.ts | 539 + .../@types/node/readline/promises.d.ts | 150 + task/node_modules/@types/node/repl.d.ts | 430 + task/node_modules/@types/node/stream.d.ts | 1701 ++ .../@types/node/stream/consumers.d.ts | 12 + .../@types/node/stream/promises.d.ts | 83 + task/node_modules/@types/node/stream/web.d.ts | 350 + .../@types/node/string_decoder.d.ts | 67 + task/node_modules/@types/node/test.d.ts | 1382 ++ task/node_modules/@types/node/timers.d.ts | 240 + .../@types/node/timers/promises.d.ts | 93 + task/node_modules/@types/node/tls.d.ts | 1210 + .../@types/node/trace_events.d.ts | 182 + .../@types/node/ts4.8/assert.d.ts | 996 + .../@types/node/ts4.8/assert/strict.d.ts | 8 + .../@types/node/ts4.8/async_hooks.d.ts | 539 + .../@types/node/ts4.8/buffer.d.ts | 2362 ++ .../@types/node/ts4.8/child_process.d.ts | 1540 ++ .../@types/node/ts4.8/cluster.d.ts | 432 + .../@types/node/ts4.8/console.d.ts | 415 + .../@types/node/ts4.8/constants.d.ts | 19 + .../@types/node/ts4.8/crypto.d.ts | 4455 ++++ .../node_modules/@types/node/ts4.8/dgram.d.ts | 586 + .../node/ts4.8/diagnostics_channel.d.ts | 191 + task/node_modules/@types/node/ts4.8/dns.d.ts | 809 + .../@types/node/ts4.8/dns/promises.d.ts | 425 + .../@types/node/ts4.8/dom-events.d.ts | 122 + .../@types/node/ts4.8/domain.d.ts | 170 + .../@types/node/ts4.8/events.d.ts | 879 + task/node_modules/@types/node/ts4.8/fs.d.ts | 4291 ++++ .../@types/node/ts4.8/fs/promises.d.ts | 1239 ++ .../@types/node/ts4.8/globals.d.ts | 385 + .../@types/node/ts4.8/globals.global.d.ts | 1 + task/node_modules/@types/node/ts4.8/http.d.ts | 1888 ++ .../node_modules/@types/node/ts4.8/http2.d.ts | 2382 ++ .../node_modules/@types/node/ts4.8/https.d.ts | 550 + .../node_modules/@types/node/ts4.8/index.d.ts | 88 + .../@types/node/ts4.8/inspector.d.ts | 2747 +++ .../@types/node/ts4.8/module.d.ts | 301 + task/node_modules/@types/node/ts4.8/net.d.ts | 949 + task/node_modules/@types/node/ts4.8/os.d.ts | 478 + task/node_modules/@types/node/ts4.8/path.d.ts | 191 + .../@types/node/ts4.8/perf_hooks.d.ts | 639 + .../@types/node/ts4.8/process.d.ts | 1539 ++ .../@types/node/ts4.8/punycode.d.ts | 117 + .../@types/node/ts4.8/querystring.d.ts | 141 + .../@types/node/ts4.8/readline.d.ts | 539 + .../@types/node/ts4.8/readline/promises.d.ts | 150 + task/node_modules/@types/node/ts4.8/repl.d.ts | 430 + .../@types/node/ts4.8/stream.d.ts | 1701 ++ .../@types/node/ts4.8/stream/consumers.d.ts | 12 + .../@types/node/ts4.8/stream/promises.d.ts | 83 + .../@types/node/ts4.8/stream/web.d.ts | 350 + .../@types/node/ts4.8/string_decoder.d.ts | 67 + task/node_modules/@types/node/ts4.8/test.d.ts | 1382 ++ .../@types/node/ts4.8/timers.d.ts | 240 + .../@types/node/ts4.8/timers/promises.d.ts | 93 + task/node_modules/@types/node/ts4.8/tls.d.ts | 1210 + .../@types/node/ts4.8/trace_events.d.ts | 182 + task/node_modules/@types/node/ts4.8/tty.d.ts | 208 + task/node_modules/@types/node/ts4.8/url.d.ts | 927 + task/node_modules/@types/node/ts4.8/util.d.ts | 2183 ++ task/node_modules/@types/node/ts4.8/v8.d.ts | 635 + task/node_modules/@types/node/ts4.8/vm.d.ts | 903 + task/node_modules/@types/node/ts4.8/wasi.d.ts | 158 + .../@types/node/ts4.8/worker_threads.d.ts | 691 + task/node_modules/@types/node/ts4.8/zlib.d.ts | 517 + task/node_modules/@types/node/tty.d.ts | 208 + task/node_modules/@types/node/url.d.ts | 927 + task/node_modules/@types/node/util.d.ts | 2183 ++ task/node_modules/@types/node/v8.d.ts | 635 + task/node_modules/@types/node/vm.d.ts | 903 + task/node_modules/@types/node/wasi.d.ts | 158 + .../@types/node/worker_threads.d.ts | 691 + task/node_modules/@types/node/zlib.d.ts | 517 + task/node_modules/@types/q/LICENSE | 21 + task/node_modules/@types/q/README.md | 15 + task/node_modules/@types/q/index.d.ts | 625 + task/node_modules/@types/q/package.json | 45 + task/node_modules/@types/qs/LICENSE | 21 + task/node_modules/@types/qs/README.md | 75 + task/node_modules/@types/qs/index.d.ts | 56 + task/node_modules/@types/qs/package.json | 65 + task/node_modules/adm-zip/LICENSE | 21 + task/node_modules/adm-zip/README.md | 65 + task/node_modules/adm-zip/adm-zip.js | 786 + .../adm-zip/headers/entryHeader.js | 338 + task/node_modules/adm-zip/headers/index.js | 2 + .../adm-zip/headers/mainHeader.js | 130 + task/node_modules/adm-zip/methods/deflater.js | 33 + task/node_modules/adm-zip/methods/index.js | 3 + task/node_modules/adm-zip/methods/inflater.js | 31 + .../node_modules/adm-zip/methods/zipcrypto.js | 170 + task/node_modules/adm-zip/package.json | 48 + task/node_modules/adm-zip/util/constants.js | 142 + task/node_modules/adm-zip/util/errors.js | 35 + task/node_modules/adm-zip/util/fattr.js | 79 + task/node_modules/adm-zip/util/fileSystem.js | 11 + task/node_modules/adm-zip/util/index.js | 4 + task/node_modules/adm-zip/util/utils.js | 247 + task/node_modules/adm-zip/zipEntry.js | 333 + task/node_modules/adm-zip/zipFile.js | 384 + task/node_modules/agent-base/README.md | 145 + .../agent-base/dist/src/index.d.ts | 78 + .../node_modules/agent-base/dist/src/index.js | 203 + .../agent-base/dist/src/index.js.map | 1 + .../agent-base/dist/src/promisify.d.ts | 4 + .../agent-base/dist/src/promisify.js | 18 + .../agent-base/dist/src/promisify.js.map | 1 + task/node_modules/agent-base/package.json | 64 + task/node_modules/agent-base/src/index.ts | 345 + task/node_modules/agent-base/src/promisify.ts | 33 + task/node_modules/asap/CHANGES.md | 70 + task/node_modules/asap/LICENSE.md | 21 + task/node_modules/asap/README.md | 237 + task/node_modules/asap/asap.js | 65 + task/node_modules/asap/browser-asap.js | 66 + task/node_modules/asap/browser-raw.js | 223 + task/node_modules/asap/package.json | 58 + task/node_modules/asap/raw.js | 101 + task/node_modules/asynckit/LICENSE | 21 + task/node_modules/asynckit/README.md | 233 + task/node_modules/asynckit/bench.js | 76 + task/node_modules/asynckit/index.js | 6 + task/node_modules/asynckit/lib/abort.js | 29 + task/node_modules/asynckit/lib/async.js | 34 + task/node_modules/asynckit/lib/defer.js | 26 + task/node_modules/asynckit/lib/iterate.js | 75 + .../asynckit/lib/readable_asynckit.js | 91 + .../asynckit/lib/readable_parallel.js | 25 + .../asynckit/lib/readable_serial.js | 25 + .../asynckit/lib/readable_serial_ordered.js | 29 + task/node_modules/asynckit/lib/state.js | 37 + task/node_modules/asynckit/lib/streamify.js | 141 + task/node_modules/asynckit/lib/terminator.js | 29 + task/node_modules/asynckit/package.json | 63 + task/node_modules/asynckit/parallel.js | 43 + task/node_modules/asynckit/serial.js | 17 + task/node_modules/asynckit/serialOrdered.js | 75 + task/node_modules/asynckit/stream.js | 21 + task/node_modules/axios-retry/LICENSE | 13 + task/node_modules/axios-retry/README.md | 85 + .../axios-retry/dist/cjs/index.d.ts | 70 + .../axios-retry/dist/cjs/index.js | 164 + .../axios-retry/dist/cjs/package.json | 1 + .../axios-retry/dist/esm/index.d.ts | 70 + .../axios-retry/dist/esm/index.js | 139 + .../axios-retry/dist/esm/package.json | 1 + task/node_modules/axios-retry/package.json | 79 + task/node_modules/axios/CHANGELOG.md | 817 + task/node_modules/axios/LICENSE | 7 + task/node_modules/axios/MIGRATION_GUIDE.md | 3 + task/node_modules/axios/README.md | 1642 ++ task/node_modules/axios/SECURITY.md | 6 + task/node_modules/axios/dist/axios.js | 3062 +++ task/node_modules/axios/dist/axios.js.map | 1 + task/node_modules/axios/dist/axios.min.js | 2 + task/node_modules/axios/dist/axios.min.js.map | 1 + .../node_modules/axios/dist/browser/axios.cjs | 3237 +++ .../axios/dist/browser/axios.cjs.map | 1 + task/node_modules/axios/dist/esm/axios.js | 3260 +++ task/node_modules/axios/dist/esm/axios.js.map | 1 + task/node_modules/axios/dist/esm/axios.min.js | 2 + .../axios/dist/esm/axios.min.js.map | 1 + task/node_modules/axios/dist/node/axios.cjs | 4330 ++++ .../axios/dist/node/axios.cjs.map | 1 + task/node_modules/axios/index.d.cts | 542 + task/node_modules/axios/index.d.ts | 559 + task/node_modules/axios/index.js | 43 + .../node_modules/axios/lib/adapters/README.md | 37 + .../axios/lib/adapters/adapters.js | 77 + task/node_modules/axios/lib/adapters/http.js | 681 + task/node_modules/axios/lib/adapters/xhr.js | 260 + task/node_modules/axios/lib/axios.js | 89 + .../axios/lib/cancel/CancelToken.js | 121 + .../axios/lib/cancel/CanceledError.js | 25 + .../node_modules/axios/lib/cancel/isCancel.js | 5 + task/node_modules/axios/lib/core/Axios.js | 201 + .../node_modules/axios/lib/core/AxiosError.js | 100 + .../axios/lib/core/AxiosHeaders.js | 298 + .../axios/lib/core/InterceptorManager.js | 71 + task/node_modules/axios/lib/core/README.md | 8 + .../axios/lib/core/buildFullPath.js | 21 + .../axios/lib/core/dispatchRequest.js | 81 + .../axios/lib/core/mergeConfig.js | 106 + task/node_modules/axios/lib/core/settle.js | 27 + .../axios/lib/core/transformData.js | 28 + task/node_modules/axios/lib/defaults/index.js | 159 + .../axios/lib/defaults/transitional.js | 7 + task/node_modules/axios/lib/env/README.md | 3 + .../axios/lib/env/classes/FormData.js | 2 + task/node_modules/axios/lib/env/data.js | 1 + .../axios/lib/helpers/AxiosTransformStream.js | 191 + .../axios/lib/helpers/AxiosURLSearchParams.js | 58 + .../axios/lib/helpers/HttpStatusCode.js | 71 + task/node_modules/axios/lib/helpers/README.md | 7 + .../lib/helpers/ZlibHeaderTransformStream.js | 28 + task/node_modules/axios/lib/helpers/bind.js | 7 + .../axios/lib/helpers/buildURL.js | 63 + .../axios/lib/helpers/callbackify.js | 16 + .../axios/lib/helpers/combineURLs.js | 15 + .../node_modules/axios/lib/helpers/cookies.js | 42 + .../axios/lib/helpers/deprecatedMethod.js | 26 + .../axios/lib/helpers/formDataToJSON.js | 95 + .../axios/lib/helpers/formDataToStream.js | 111 + .../axios/lib/helpers/fromDataURI.js | 53 + .../axios/lib/helpers/isAbsoluteURL.js | 15 + .../axios/lib/helpers/isAxiosError.js | 14 + .../axios/lib/helpers/isURLSameOrigin.js | 67 + task/node_modules/axios/lib/helpers/null.js | 2 + .../axios/lib/helpers/parseHeaders.js | 55 + .../axios/lib/helpers/parseProtocol.js | 6 + .../axios/lib/helpers/readBlob.js | 15 + .../axios/lib/helpers/speedometer.js | 55 + task/node_modules/axios/lib/helpers/spread.js | 28 + .../axios/lib/helpers/throttle.js | 33 + .../axios/lib/helpers/toFormData.js | 219 + .../axios/lib/helpers/toURLEncodedForm.js | 18 + .../axios/lib/helpers/validator.js | 91 + .../lib/platform/browser/classes/Blob.js | 3 + .../lib/platform/browser/classes/FormData.js | 3 + .../browser/classes/URLSearchParams.js | 4 + .../axios/lib/platform/browser/index.js | 13 + .../axios/lib/platform/common/utils.js | 47 + task/node_modules/axios/lib/platform/index.js | 7 + .../lib/platform/node/classes/FormData.js | 3 + .../platform/node/classes/URLSearchParams.js | 4 + .../axios/lib/platform/node/index.js | 12 + task/node_modules/axios/lib/utils.js | 723 + .../axios/node_modules/form-data/License | 19 + .../node_modules/form-data/README.md.bak | 358 + .../axios/node_modules/form-data/Readme.md | 358 + .../axios/node_modules/form-data/index.d.ts | 62 + .../node_modules/form-data/lib/browser.js | 2 + .../node_modules/form-data/lib/form_data.js | 501 + .../node_modules/form-data/lib/populate.js | 10 + .../axios/node_modules/form-data/package.json | 68 + task/node_modules/axios/package.json | 218 + .../azure-pipelines-task-lib/LICENSE | 22 + .../azure-pipelines-task-lib/README.md | 74 + .../resources.resjson/de-DE/resources.resjson | 36 + .../resources.resjson/en-US/resources.resjson | 36 + .../resources.resjson/es-ES/resources.resjson | 36 + .../resources.resjson/fr-FR/resources.resjson | 36 + .../resources.resjson/it-IT/resources.resjson | 36 + .../resources.resjson/ja-JP/resources.resjson | 36 + .../resources.resjson/ko-KR/resources.resjson | 36 + .../resources.resjson/ru-RU/resources.resjson | 36 + .../resources.resjson/zh-CN/resources.resjson | 36 + .../resources.resjson/zh-TW/resources.resjson | 36 + .../ThirdPartyNotice.txt | 1116 + .../azure-pipelines-task-lib/internal.d.ts | 134 + .../azure-pipelines-task-lib/internal.js | 893 + .../azure-pipelines-task-lib/lib-mocker.d.ts | 17 + .../azure-pipelines-task-lib/lib-mocker.js | 199 + .../azure-pipelines-task-lib/lib.json | 38 + .../azure-pipelines-task-lib/mock-answer.d.ts | 61 + .../azure-pipelines-task-lib/mock-answer.js | 41 + .../azure-pipelines-task-lib/mock-run.d.ts | 44 + .../azure-pipelines-task-lib/mock-run.js | 92 + .../azure-pipelines-task-lib/mock-task.d.ts | 114 + .../azure-pipelines-task-lib/mock-task.js | 469 + .../azure-pipelines-task-lib/mock-test.d.ts | 34 + .../azure-pipelines-task-lib/mock-test.js | 436 + .../mock-toolrunner.d.ts | 47 + .../mock-toolrunner.js | 360 + .../azure-pipelines-task-lib/package.json | 49 + .../azure-pipelines-task-lib/task.d.ts | 763 + .../azure-pipelines-task-lib/task.js | 2103 ++ .../azure-pipelines-task-lib/taskcommand.d.ts | 10 + .../azure-pipelines-task-lib/taskcommand.js | 103 + .../azure-pipelines-task-lib/toolrunner.d.ts | 171 + .../azure-pipelines-task-lib/toolrunner.js | 1244 ++ .../azure-pipelines-task-lib/vault.d.ts | 10 + .../azure-pipelines-task-lib/vault.js | 71 + .../balanced-match/.github/FUNDING.yml | 2 + task/node_modules/balanced-match/LICENSE.md | 21 + task/node_modules/balanced-match/README.md | 97 + task/node_modules/balanced-match/index.js | 62 + task/node_modules/balanced-match/package.json | 48 + task/node_modules/bindings/LICENSE.md | 22 + task/node_modules/bindings/README.md | 98 + task/node_modules/bindings/bindings.js | 221 + task/node_modules/bindings/package.json | 28 + task/node_modules/brace-expansion/LICENSE | 21 + task/node_modules/brace-expansion/README.md | 129 + task/node_modules/brace-expansion/index.js | 201 + .../node_modules/brace-expansion/package.json | 47 + task/node_modules/buffer-from/LICENSE | 21 + task/node_modules/buffer-from/index.js | 72 + task/node_modules/buffer-from/package.json | 19 + task/node_modules/buffer-from/readme.md | 69 + task/node_modules/bunyan/CHANGES.md | 1377 ++ task/node_modules/bunyan/LICENSE.txt | 24 + task/node_modules/bunyan/README.md | 1380 ++ task/node_modules/bunyan/bin/bunyan | 1705 ++ task/node_modules/bunyan/lib/bunyan.js | 1629 ++ task/node_modules/bunyan/package.json | 49 + task/node_modules/call-bind/.eslintignore | 1 + task/node_modules/call-bind/.eslintrc | 16 + .../call-bind/.github/FUNDING.yml | 12 + task/node_modules/call-bind/.nycrc | 9 + task/node_modules/call-bind/CHANGELOG.md | 77 + task/node_modules/call-bind/LICENSE | 21 + task/node_modules/call-bind/README.md | 64 + task/node_modules/call-bind/callBound.js | 15 + task/node_modules/call-bind/index.js | 44 + task/node_modules/call-bind/package.json | 90 + task/node_modules/call-bind/test/callBound.js | 54 + task/node_modules/call-bind/test/index.js | 80 + task/node_modules/caseless/LICENSE | 28 + task/node_modules/caseless/README.md | 45 + task/node_modules/caseless/index.js | 67 + task/node_modules/caseless/package.json | 27 + task/node_modules/caseless/test.js | 67 + task/node_modules/combined-stream/License | 19 + task/node_modules/combined-stream/Readme.md | 138 + .../combined-stream/lib/combined_stream.js | 208 + .../node_modules/combined-stream/package.json | 25 + task/node_modules/combined-stream/yarn.lock | 17 + task/node_modules/concat-map/.travis.yml | 4 + task/node_modules/concat-map/LICENSE | 18 + task/node_modules/concat-map/README.markdown | 62 + task/node_modules/concat-map/example/map.js | 6 + task/node_modules/concat-map/index.js | 13 + task/node_modules/concat-map/package.json | 43 + task/node_modules/concat-map/test/map.js | 39 + task/node_modules/concat-stream/LICENSE | 24 + task/node_modules/concat-stream/index.js | 144 + task/node_modules/concat-stream/package.json | 55 + task/node_modules/concat-stream/readme.md | 102 + task/node_modules/core-util-is/LICENSE | 19 + task/node_modules/core-util-is/README.md | 3 + task/node_modules/core-util-is/lib/util.js | 107 + task/node_modules/core-util-is/package.json | 38 + task/node_modules/deasync/.github/FUNDING.yml | 12 + .../deasync/.github/workflows/npm_test.yml | 20 + task/node_modules/deasync/.travis.yml | 4 + task/node_modules/deasync/LICENSE | 9 + task/node_modules/deasync/README.md | 112 + task/node_modules/deasync/app.code-workspace | 10 + task/node_modules/deasync/bin/.gitattributes | 2 + .../bin/darwin-x64-node-0.10/deasync.node | Bin 0 -> 10344 bytes .../bin/darwin-x64-node-0.11/deasync.node | Bin 0 -> 10808 bytes .../bin/darwin-x64-node-0.12/deasync.node | Bin 0 -> 10848 bytes .../bin/darwin-x64-node-10/deasync.node | Bin 0 -> 23460 bytes .../bin/darwin-x64-node-11/deasync.node | Bin 0 -> 23460 bytes .../bin/darwin-x64-node-12/deasync.node | Bin 0 -> 23460 bytes .../bin/darwin-x64-node-13/deasync.node | Bin 0 -> 23460 bytes .../bin/darwin-x64-node-14/deasync.node | Bin 0 -> 27228 bytes .../bin/darwin-x64-node-15/deasync.node | Bin 0 -> 27660 bytes .../bin/darwin-x64-node-16/deasync.node | Bin 0 -> 43552 bytes .../bin/darwin-x64-node-17/deasync.node | Bin 0 -> 43552 bytes .../bin/darwin-x64-node-18/deasync.node | Bin 0 -> 43576 bytes .../bin/darwin-x64-node-19/deasync.node | Bin 0 -> 43224 bytes .../bin/darwin-x64-node-20/deasync.node | Bin 0 -> 43424 bytes .../bin/darwin-x64-node-21/deasync.node | Bin 0 -> 43424 bytes .../bin/darwin-x64-node-4/deasync.node | Bin 0 -> 11920 bytes .../bin/darwin-x64-node-5/deasync.node | Bin 0 -> 11920 bytes .../bin/darwin-x64-node-6/deasync.node | Bin 0 -> 13032 bytes .../bin/darwin-x64-node-7/deasync.node | Bin 0 -> 13088 bytes .../bin/darwin-x64-node-8/deasync.node | Bin 0 -> 13112 bytes .../bin/darwin-x64-node-9/deasync.node | Bin 0 -> 13104 bytes .../bin/linux-ia32-node-0.10/deasync.node | Bin 0 -> 7672 bytes .../bin/linux-ia32-node-0.11/deasync.node | Bin 0 -> 7914 bytes .../bin/linux-ia32-node-0.12/deasync.node | Bin 0 -> 7914 bytes .../bin/linux-ia32-node-10/deasync.node | Bin 0 -> 12852 bytes .../bin/linux-ia32-node-4/deasync.node | Bin 0 -> 12551 bytes .../bin/linux-ia32-node-5/deasync.node | Bin 0 -> 12551 bytes .../bin/linux-ia32-node-6/deasync.node | Bin 0 -> 12551 bytes .../bin/linux-ia32-node-7/deasync.node | Bin 0 -> 12832 bytes .../bin/linux-ia32-node-8/deasync.node | Bin 0 -> 12832 bytes .../bin/linux-ia32-node-9/deasync.node | Bin 0 -> 12832 bytes .../bin/linux-x64-node-0.10/deasync.node | Bin 0 -> 9580 bytes .../bin/linux-x64-node-0.11/deasync.node | Bin 0 -> 13407 bytes .../bin/linux-x64-node-0.12/deasync.node | Bin 0 -> 13384 bytes .../bin/linux-x64-node-10/deasync.node | Bin 0 -> 30336 bytes .../bin/linux-x64-node-11/deasync.node | Bin 0 -> 30448 bytes .../bin/linux-x64-node-12/deasync.node | Bin 0 -> 30448 bytes .../bin/linux-x64-node-13/deasync.node | Bin 0 -> 30448 bytes .../bin/linux-x64-node-14/deasync.node | Bin 0 -> 30336 bytes .../bin/linux-x64-node-15/deasync.node | Bin 0 -> 30600 bytes .../bin/linux-x64-node-16/deasync.node | Bin 0 -> 30600 bytes .../bin/linux-x64-node-17/deasync.node | Bin 0 -> 34704 bytes .../bin/linux-x64-node-18/deasync.node | Bin 0 -> 34352 bytes .../bin/linux-x64-node-19/deasync.node | Bin 0 -> 33432 bytes .../bin/linux-x64-node-20/deasync.node | Bin 0 -> 33496 bytes .../bin/linux-x64-node-21/deasync.node | Bin 0 -> 33496 bytes .../deasync/bin/linux-x64-node-4/deasync.node | Bin 0 -> 13989 bytes .../deasync/bin/linux-x64-node-5/deasync.node | Bin 0 -> 13989 bytes .../deasync/bin/linux-x64-node-6/deasync.node | Bin 0 -> 13989 bytes .../deasync/bin/linux-x64-node-7/deasync.node | Bin 0 -> 14014 bytes .../deasync/bin/linux-x64-node-8/deasync.node | Bin 0 -> 14014 bytes .../deasync/bin/linux-x64-node-9/deasync.node | Bin 0 -> 14014 bytes .../bin/win32-ia32-node-0.10/deasync.node | Bin 0 -> 33792 bytes .../bin/win32-ia32-node-0.11/deasync.node | Bin 0 -> 50176 bytes .../bin/win32-ia32-node-0.12/deasync.node | Bin 0 -> 50176 bytes .../bin/win32-ia32-node-10/deasync.node | Bin 0 -> 88064 bytes .../bin/win32-ia32-node-11/deasync.node | Bin 0 -> 88064 bytes .../bin/win32-ia32-node-12/deasync.node | Bin 0 -> 418816 bytes .../bin/win32-ia32-node-13/deasync.node | Bin 0 -> 418816 bytes .../bin/win32-ia32-node-14/deasync.node | Bin 0 -> 446976 bytes .../bin/win32-ia32-node-15/deasync.node | Bin 0 -> 94208 bytes .../bin/win32-ia32-node-16/deasync.node | Bin 0 -> 94208 bytes .../bin/win32-ia32-node-4/deasync.node | Bin 0 -> 106496 bytes .../bin/win32-ia32-node-5/deasync.node | Bin 0 -> 105984 bytes .../bin/win32-ia32-node-6/deasync.node | Bin 0 -> 101376 bytes .../bin/win32-ia32-node-7/deasync.node | Bin 0 -> 75776 bytes .../bin/win32-ia32-node-8/deasync.node | Bin 0 -> 75776 bytes .../bin/win32-ia32-node-9/deasync.node | Bin 0 -> 75776 bytes .../bin/win32-x64-node-0.10/deasync.node | Bin 0 -> 82432 bytes .../bin/win32-x64-node-0.11/deasync.node | Bin 0 -> 107008 bytes .../bin/win32-x64-node-0.12/deasync.node | Bin 0 -> 107008 bytes .../bin/win32-x64-node-10/deasync.node | Bin 0 -> 110592 bytes .../bin/win32-x64-node-11/deasync.node | Bin 0 -> 110592 bytes .../bin/win32-x64-node-12/deasync.node | Bin 0 -> 545792 bytes .../bin/win32-x64-node-13/deasync.node | Bin 0 -> 545792 bytes .../bin/win32-x64-node-14/deasync.node | Bin 0 -> 545792 bytes .../bin/win32-x64-node-15/deasync.node | Bin 0 -> 120320 bytes .../bin/win32-x64-node-16/deasync.node | Bin 0 -> 121344 bytes .../bin/win32-x64-node-17/deasync.node | Bin 0 -> 130048 bytes .../bin/win32-x64-node-18/deasync.node | Bin 0 -> 130560 bytes .../bin/win32-x64-node-19/deasync.node | Bin 0 -> 131584 bytes .../bin/win32-x64-node-20/deasync.node | Bin 0 -> 131584 bytes .../bin/win32-x64-node-21/deasync.node | Bin 0 -> 131584 bytes .../deasync/bin/win32-x64-node-4/deasync.node | Bin 0 -> 120832 bytes .../deasync/bin/win32-x64-node-5/deasync.node | Bin 0 -> 120320 bytes .../deasync/bin/win32-x64-node-6/deasync.node | Bin 0 -> 117248 bytes .../deasync/bin/win32-x64-node-7/deasync.node | Bin 0 -> 89600 bytes .../deasync/bin/win32-x64-node-8/deasync.node | Bin 0 -> 90112 bytes .../deasync/bin/win32-x64-node-9/deasync.node | Bin 0 -> 91648 bytes task/node_modules/deasync/binding.gyp | 39 + task/node_modules/deasync/build.js | 124 + task/node_modules/deasync/index.js | 73 + task/node_modules/deasync/package.json | 36 + task/node_modules/deasync/quick-test.js | 9 + task/node_modules/deasync/spec/app/exec.js | 4 + task/node_modules/deasync/spec/app/request.js | 22 + task/node_modules/deasync/spec/app/sleep.js | 5 + .../deasync/spec/app/worker-threads.js | 11 + task/node_modules/deasync/spec/index.js | 3 + task/node_modules/deasync/src/deasync.cc | 19 + task/node_modules/debug/LICENSE | 20 + task/node_modules/debug/README.md | 481 + task/node_modules/debug/package.json | 59 + task/node_modules/debug/src/browser.js | 269 + task/node_modules/debug/src/common.js | 274 + task/node_modules/debug/src/index.js | 10 + task/node_modules/debug/src/node.js | 263 + .../define-data-property/.eslintrc | 24 + .../define-data-property/.github/FUNDING.yml | 12 + task/node_modules/define-data-property/.nycrc | 13 + .../define-data-property/CHANGELOG.md | 41 + .../node_modules/define-data-property/LICENSE | 21 + .../define-data-property/README.md | 67 + .../define-data-property/index.d.ts | 3 + .../define-data-property/index.d.ts.map | 1 + .../define-data-property/index.js | 68 + .../define-data-property/package.json | 113 + .../define-data-property/test/index.js | 392 + .../define-data-property/tsconfig.json | 59 + task/node_modules/delayed-stream/.npmignore | 1 + task/node_modules/delayed-stream/License | 19 + task/node_modules/delayed-stream/Makefile | 7 + task/node_modules/delayed-stream/Readme.md | 141 + .../delayed-stream/lib/delayed_stream.js | 107 + task/node_modules/delayed-stream/package.json | 27 + task/node_modules/dtrace-provider/.gitmodules | 3 + task/node_modules/dtrace-provider/CHANGES.md | 116 + task/node_modules/dtrace-provider/LICENCE | 21 + task/node_modules/dtrace-provider/README.md | 230 + task/node_modules/dtrace-provider/binding.gyp | 35 + task/node_modules/dtrace-provider/build.sh | 86 + .../dtrace-provider/build/Makefile | 342 + .../dtrace-provider/build/Release/.deps/..d | 1 + .../.deps/Release/obj.target/ndtp.stamp.d | 1 + .../build/Release/obj.target/ndtp.stamp | 0 .../dtrace-provider/build/binding.Makefile | 6 + .../dtrace-provider/build/config.gypi | 385 + .../dtrace-provider/build/gyp-mac-tool | 772 + .../dtrace-provider/build/ndtp.target.mk | 48 + .../build/node_gyp_bins/python3 | 1 + .../dtrace-provider/dtrace-provider.js | 41 + .../dtrace-provider/libusdt/LICENCE | 21 + .../dtrace-provider/libusdt/Makefile | 158 + .../dtrace-provider/libusdt/README.md | 77 + .../dtrace-provider/libusdt/libusdt.a | Bin 0 -> 18808 bytes .../dtrace-provider/libusdt/test.pl | 116 + .../dtrace-provider/libusdt/test_mem_usage.c | 77 + .../dtrace-provider/libusdt/test_usdt.c | 87 + .../dtrace-provider/libusdt/usdt.c | 321 + .../dtrace-provider/libusdt/usdt.h | 61 + .../dtrace-provider/libusdt/usdt.o | Bin 0 -> 6000 bytes .../dtrace-provider/libusdt/usdt_dof.c | 126 + .../dtrace-provider/libusdt/usdt_dof.o | Bin 0 -> 2312 bytes .../dtrace-provider/libusdt/usdt_dof_file.c | 290 + .../dtrace-provider/libusdt/usdt_dof_file.o | Bin 0 -> 3208 bytes .../libusdt/usdt_dof_sections.c | 180 + .../libusdt/usdt_dof_sections.o | Bin 0 -> 2760 bytes .../dtrace-provider/libusdt/usdt_internal.h | 103 + .../dtrace-provider/libusdt/usdt_probe.c | 133 + .../dtrace-provider/libusdt/usdt_probe.o | Bin 0 -> 1768 bytes .../libusdt/usdt_tracepoints.o | Bin 0 -> 944 bytes .../libusdt/usdt_tracepoints_i386.s | 69 + .../libusdt/usdt_tracepoints_x86_64.s | 123 + .../node_modules/dtrace-provider/package.json | 33 + .../dtrace-provider/src/binding.gyp | 47 + .../build/DTraceProviderBindings.target.mk | 195 + .../dtrace-provider/src/build/Makefile | 342 + .../dtrace_provider.o.d.raw | 26 + .../src/build/binding.Makefile | 6 + .../dtrace-provider/src/build/config.gypi | 385 + .../dtrace-provider/src/build/gyp-mac-tool | 772 + .../src/build/node_gyp_bins/python3 | 1 + .../dtrace-provider/src/dtrace_argument.cc | 94 + .../dtrace-provider/src/dtrace_probe.cc | 110 + .../dtrace-provider/src/dtrace_provider.cc | 227 + .../dtrace-provider/src/dtrace_provider.h | 102 + .../dtrace-provider/suppress-error.js | 28 + task/node_modules/file-uri-to-path/.npmignore | 1 + .../node_modules/file-uri-to-path/.travis.yml | 30 + task/node_modules/file-uri-to-path/History.md | 21 + task/node_modules/file-uri-to-path/LICENSE | 20 + task/node_modules/file-uri-to-path/README.md | 74 + task/node_modules/file-uri-to-path/index.d.ts | 2 + task/node_modules/file-uri-to-path/index.js | 66 + .../file-uri-to-path/package.json | 32 + .../file-uri-to-path/test/test.js | 24 + .../file-uri-to-path/test/tests.json | 13 + task/node_modules/follow-redirects/LICENSE | 18 + task/node_modules/follow-redirects/README.md | 155 + task/node_modules/follow-redirects/debug.js | 15 + task/node_modules/follow-redirects/http.js | 1 + task/node_modules/follow-redirects/https.js | 1 + task/node_modules/follow-redirects/index.js | 672 + .../follow-redirects/package.json | 58 + task/node_modules/form-data/License | 19 + task/node_modules/form-data/README.md | 350 + task/node_modules/form-data/README.md.bak | 350 + task/node_modules/form-data/index.d.ts | 51 + task/node_modules/form-data/lib/browser.js | 2 + task/node_modules/form-data/lib/form_data.js | 483 + task/node_modules/form-data/lib/populate.js | 10 + task/node_modules/form-data/package.json | 68 + task/node_modules/fs.realpath/LICENSE | 43 + task/node_modules/fs.realpath/README.md | 33 + task/node_modules/fs.realpath/index.js | 66 + task/node_modules/fs.realpath/old.js | 303 + task/node_modules/fs.realpath/package.json | 26 + task/node_modules/function-bind/.eslintrc | 21 + .../function-bind/.github/FUNDING.yml | 12 + .../function-bind/.github/SECURITY.md | 3 + task/node_modules/function-bind/.nycrc | 13 + task/node_modules/function-bind/CHANGELOG.md | 136 + task/node_modules/function-bind/LICENSE | 20 + task/node_modules/function-bind/README.md | 46 + .../function-bind/implementation.js | 84 + task/node_modules/function-bind/index.js | 5 + task/node_modules/function-bind/package.json | 87 + .../node_modules/function-bind/test/.eslintrc | 9 + task/node_modules/function-bind/test/index.js | 252 + task/node_modules/get-intrinsic/.eslintrc | 38 + .../get-intrinsic/.github/FUNDING.yml | 12 + task/node_modules/get-intrinsic/.nycrc | 9 + task/node_modules/get-intrinsic/CHANGELOG.md | 125 + task/node_modules/get-intrinsic/LICENSE | 21 + task/node_modules/get-intrinsic/README.md | 71 + task/node_modules/get-intrinsic/index.js | 351 + task/node_modules/get-intrinsic/package.json | 93 + .../get-intrinsic/test/GetIntrinsic.js | 274 + task/node_modules/get-port/index.js | 28 + task/node_modules/get-port/license | 9 + task/node_modules/get-port/package.json | 44 + task/node_modules/get-port/readme.md | 64 + task/node_modules/glob/LICENSE | 21 + task/node_modules/glob/README.md | 378 + task/node_modules/glob/common.js | 238 + task/node_modules/glob/glob.js | 790 + .../glob/node_modules/minimatch/LICENSE | 15 + .../glob/node_modules/minimatch/README.md | 230 + .../glob/node_modules/minimatch/minimatch.js | 947 + .../glob/node_modules/minimatch/package.json | 33 + task/node_modules/glob/package.json | 55 + task/node_modules/glob/sync.js | 486 + task/node_modules/gopd/.eslintrc | 16 + task/node_modules/gopd/.github/FUNDING.yml | 12 + task/node_modules/gopd/CHANGELOG.md | 25 + task/node_modules/gopd/LICENSE | 21 + task/node_modules/gopd/README.md | 40 + task/node_modules/gopd/index.js | 16 + task/node_modules/gopd/package.json | 71 + task/node_modules/gopd/test/index.js | 35 + .../has-property-descriptors/.eslintrc | 13 + .../.github/FUNDING.yml | 12 + .../has-property-descriptors/.nycrc | 9 + .../has-property-descriptors/CHANGELOG.md | 27 + .../has-property-descriptors/LICENSE | 21 + .../has-property-descriptors/README.md | 43 + .../has-property-descriptors/index.js | 33 + .../has-property-descriptors/package.json | 77 + .../has-property-descriptors/test/index.js | 57 + task/node_modules/has-proto/.eslintrc | 5 + .../has-proto/.github/FUNDING.yml | 12 + task/node_modules/has-proto/CHANGELOG.md | 23 + task/node_modules/has-proto/LICENSE | 21 + task/node_modules/has-proto/README.md | 38 + task/node_modules/has-proto/index.js | 11 + task/node_modules/has-proto/package.json | 74 + task/node_modules/has-proto/test/index.js | 19 + task/node_modules/has-symbols/.eslintrc | 11 + .../has-symbols/.github/FUNDING.yml | 12 + task/node_modules/has-symbols/.nycrc | 9 + task/node_modules/has-symbols/CHANGELOG.md | 75 + task/node_modules/has-symbols/LICENSE | 21 + task/node_modules/has-symbols/README.md | 46 + task/node_modules/has-symbols/index.js | 13 + task/node_modules/has-symbols/package.json | 101 + task/node_modules/has-symbols/shams.js | 42 + task/node_modules/has-symbols/test/index.js | 22 + .../has-symbols/test/shams/core-js.js | 28 + .../test/shams/get-own-property-symbols.js | 28 + task/node_modules/has-symbols/test/tests.js | 56 + task/node_modules/hasown/.eslintrc | 5 + task/node_modules/hasown/.github/FUNDING.yml | 12 + task/node_modules/hasown/.nycrc | 13 + task/node_modules/hasown/CHANGELOG.md | 20 + task/node_modules/hasown/LICENSE | 21 + task/node_modules/hasown/README.md | 40 + task/node_modules/hasown/index.d.ts | 3 + task/node_modules/hasown/index.d.ts.map | 1 + task/node_modules/hasown/index.js | 8 + task/node_modules/hasown/package.json | 91 + task/node_modules/hasown/tsconfig.json | 49 + task/node_modules/http-basic/LICENSE | 19 + task/node_modules/http-basic/README.md | 97 + .../http-basic/lib/CachedResponse.d.ts | 9 + .../http-basic/lib/CachedResponse.js | 2 + .../http-basic/lib/CachedResponse.js.flow | 14 + .../node_modules/http-basic/lib/Callback.d.ts | 3 + task/node_modules/http-basic/lib/Callback.js | 2 + .../http-basic/lib/Callback.js.flow | 11 + .../http-basic/lib/FileCache.d.ts | 10 + task/node_modules/http-basic/lib/FileCache.js | 107 + .../http-basic/lib/FileCache.js.flow | 23 + task/node_modules/http-basic/lib/Headers.d.ts | 2 + task/node_modules/http-basic/lib/Headers.js | 2 + .../http-basic/lib/Headers.js.flow | 7 + .../node_modules/http-basic/lib/HttpVerb.d.ts | 2 + task/node_modules/http-basic/lib/HttpVerb.js | 2 + .../http-basic/lib/HttpVerb.js.flow | 15 + task/node_modules/http-basic/lib/ICache.d.ts | 8 + task/node_modules/http-basic/lib/ICache.js | 2 + .../http-basic/lib/ICache.js.flow | 19 + .../http-basic/lib/MemoryCache.d.ts | 8 + .../http-basic/lib/MemoryCache.js | 56 + .../http-basic/lib/MemoryCache.js.flow | 21 + task/node_modules/http-basic/lib/Options.d.ts | 25 + task/node_modules/http-basic/lib/Options.js | 2 + .../http-basic/lib/Options.js.flow | 49 + .../http-basic/lib/cache-control-utils.d.ts | 14 + .../http-basic/lib/cache-control-utils.js | 53 + .../lib/cache-control-utils.js.flow | 16 + .../http-basic/lib/cache-utils.d.ts | 6 + .../http-basic/lib/cache-utils.js | 44 + .../http-basic/lib/cache-utils.js.flow | 18 + task/node_modules/http-basic/lib/index.d.ts | 16 + task/node_modules/http-basic/lib/index.js | 380 + .../node_modules/http-basic/lib/index.js.flow | 31 + task/node_modules/http-basic/package.json | 51 + .../node_modules/http-response-object/LICENSE | 19 + .../http-response-object/README.md | 44 + .../http-response-object/lib/headers.d.ts | 3 + .../http-response-object/lib/headers.js | 2 + .../http-response-object/lib/headers.js.flow | 5 + .../http-response-object/lib/index.d.ts | 15 + .../http-response-object/lib/index.js | 60 + .../http-response-object/lib/index.js.flow | 22 + .../node_modules/@types/node/LICENSE | 21 + .../node_modules/@types/node/README.md | 16 + .../node_modules/@types/node/assert.d.ts | 99 + .../node_modules/@types/node/async_hooks.d.ts | 144 + .../node_modules/@types/node/base.d.ts | 19 + .../node_modules/@types/node/buffer.d.ts | 16 + .../@types/node/child_process.d.ts | 369 + .../node_modules/@types/node/cluster.d.ts | 260 + .../node_modules/@types/node/console.d.ts | 3 + .../node_modules/@types/node/constants.d.ts | 449 + .../node_modules/@types/node/crypto.d.ts | 613 + .../node_modules/@types/node/dgram.d.ts | 97 + .../node_modules/@types/node/dns.d.ts | 366 + .../node_modules/@types/node/domain.d.ts | 16 + .../node_modules/@types/node/events.d.ts | 30 + .../node_modules/@types/node/fs.d.ts | 2302 ++ .../node_modules/@types/node/globals.d.ts | 1066 + .../node_modules/@types/node/http.d.ts | 274 + .../node_modules/@types/node/http2.d.ts | 859 + .../node_modules/@types/node/https.d.ts | 51 + .../node_modules/@types/node/index.d.ts | 41 + .../node_modules/@types/node/inspector.d.ts | 3162 +++ .../node_modules/@types/node/module.d.ts | 3 + .../node_modules/@types/node/net.d.ts | 251 + .../node_modules/@types/node/os.d.ts | 254 + .../node_modules/@types/node/package.json | 181 + .../node_modules/@types/node/path.d.ts | 159 + .../node_modules/@types/node/perf_hooks.d.ts | 169 + .../node_modules/@types/node/process.d.ts | 3 + .../node_modules/@types/node/punycode.d.ts | 68 + .../node_modules/@types/node/querystring.d.ts | 17 + .../node_modules/@types/node/readline.d.ts | 143 + .../node_modules/@types/node/repl.d.ts | 380 + .../node_modules/@types/node/stream.d.ts | 313 + .../@types/node/string_decoder.d.ts | 9 + .../node_modules/@types/node/timers.d.ts | 16 + .../node_modules/@types/node/tls.d.ts | 459 + .../@types/node/trace_events.d.ts | 61 + .../@types/node/ts3.6/assert.d.ts | 73 + .../node_modules/@types/node/ts3.6/base.d.ts | 54 + .../node_modules/@types/node/ts3.6/index.d.ts | 6 + .../node_modules/@types/node/tty.d.ts | 17 + .../node_modules/@types/node/url.d.ts | 104 + .../node_modules/@types/node/util.d.ts | 187 + .../node_modules/@types/node/v8.d.ts | 28 + .../node_modules/@types/node/vm.d.ts | 81 + .../@types/node/worker_threads.d.ts | 124 + .../node_modules/@types/node/zlib.d.ts | 327 + .../http-response-object/package.json | 35 + task/node_modules/https-proxy-agent/README.md | 137 + .../https-proxy-agent/dist/agent.d.ts | 30 + .../https-proxy-agent/dist/agent.js | 177 + .../https-proxy-agent/dist/agent.js.map | 1 + .../https-proxy-agent/dist/index.d.ts | 23 + .../https-proxy-agent/dist/index.js | 14 + .../https-proxy-agent/dist/index.js.map | 1 + .../dist/parse-proxy-response.d.ts | 7 + .../dist/parse-proxy-response.js | 66 + .../dist/parse-proxy-response.js.map | 1 + .../https-proxy-agent/package.json | 56 + task/node_modules/inflight/LICENSE | 15 + task/node_modules/inflight/README.md | 37 + task/node_modules/inflight/inflight.js | 54 + task/node_modules/inflight/package.json | 29 + task/node_modules/inherits/LICENSE | 16 + task/node_modules/inherits/README.md | 42 + task/node_modules/inherits/inherits.js | 9 + .../node_modules/inherits/inherits_browser.js | 27 + task/node_modules/inherits/package.json | 29 + task/node_modules/interpret/CHANGELOG | 115 + task/node_modules/interpret/LICENSE | 22 + task/node_modules/interpret/README.md | 187 + task/node_modules/interpret/index.js | 168 + task/node_modules/interpret/mjs-stub.js | 1 + task/node_modules/interpret/package.json | 75 + task/node_modules/is-core-module/.eslintrc | 18 + task/node_modules/is-core-module/.nycrc | 9 + task/node_modules/is-core-module/CHANGELOG.md | 180 + task/node_modules/is-core-module/LICENSE | 20 + task/node_modules/is-core-module/README.md | 40 + task/node_modules/is-core-module/core.json | 158 + task/node_modules/is-core-module/index.js | 69 + task/node_modules/is-core-module/package.json | 73 + .../node_modules/is-core-module/test/index.js | 133 + task/node_modules/is-retry-allowed/index.d.ts | 22 + task/node_modules/is-retry-allowed/index.js | 39 + task/node_modules/is-retry-allowed/license | 10 + .../is-retry-allowed/package.json | 40 + task/node_modules/is-retry-allowed/readme.md | 46 + task/node_modules/isarray/.npmignore | 1 + task/node_modules/isarray/.travis.yml | 4 + task/node_modules/isarray/Makefile | 6 + task/node_modules/isarray/README.md | 60 + task/node_modules/isarray/component.json | 19 + task/node_modules/isarray/index.js | 5 + task/node_modules/isarray/package.json | 45 + task/node_modules/isarray/test.js | 20 + task/node_modules/mime-db/HISTORY.md | 507 + task/node_modules/mime-db/LICENSE | 23 + task/node_modules/mime-db/README.md | 100 + task/node_modules/mime-db/db.json | 8519 +++++++ task/node_modules/mime-db/index.js | 12 + task/node_modules/mime-db/package.json | 60 + task/node_modules/mime-types/HISTORY.md | 397 + task/node_modules/mime-types/LICENSE | 23 + task/node_modules/mime-types/README.md | 113 + task/node_modules/mime-types/index.js | 188 + task/node_modules/mime-types/package.json | 44 + task/node_modules/minimatch/LICENSE | 15 + task/node_modules/minimatch/README.md | 209 + task/node_modules/minimatch/minimatch.js | 952 + task/node_modules/minimatch/package.json | 30 + task/node_modules/minimist/.eslintrc | 29 + .../node_modules/minimist/.github/FUNDING.yml | 12 + task/node_modules/minimist/.nycrc | 14 + task/node_modules/minimist/CHANGELOG.md | 298 + task/node_modules/minimist/LICENSE | 18 + task/node_modules/minimist/README.md | 121 + task/node_modules/minimist/example/parse.js | 4 + task/node_modules/minimist/index.js | 263 + task/node_modules/minimist/package.json | 75 + task/node_modules/minimist/test/all_bool.js | 34 + task/node_modules/minimist/test/bool.js | 177 + task/node_modules/minimist/test/dash.js | 43 + .../minimist/test/default_bool.js | 37 + task/node_modules/minimist/test/dotted.js | 24 + task/node_modules/minimist/test/kv_short.js | 32 + task/node_modules/minimist/test/long.js | 33 + task/node_modules/minimist/test/num.js | 38 + task/node_modules/minimist/test/parse.js | 209 + .../minimist/test/parse_modified.js | 11 + task/node_modules/minimist/test/proto.js | 64 + task/node_modules/minimist/test/short.js | 69 + task/node_modules/minimist/test/stop_early.js | 17 + task/node_modules/minimist/test/unknown.js | 104 + task/node_modules/minimist/test/whitespace.js | 10 + task/node_modules/mkdirp/LICENSE | 21 + task/node_modules/mkdirp/bin/cmd.js | 33 + task/node_modules/mkdirp/bin/usage.txt | 12 + task/node_modules/mkdirp/index.js | 102 + task/node_modules/mkdirp/package.json | 33 + task/node_modules/mkdirp/readme.markdown | 100 + task/node_modules/moment/CHANGELOG.md | 996 + task/node_modules/moment/LICENSE | 22 + task/node_modules/moment/README.md | 55 + task/node_modules/moment/dist/locale/af.js | 71 + task/node_modules/moment/dist/locale/ar-dz.js | 156 + task/node_modules/moment/dist/locale/ar-kw.js | 55 + task/node_modules/moment/dist/locale/ar-ly.js | 171 + task/node_modules/moment/dist/locale/ar-ma.js | 56 + task/node_modules/moment/dist/locale/ar-ps.js | 112 + task/node_modules/moment/dist/locale/ar-sa.js | 105 + task/node_modules/moment/dist/locale/ar-tn.js | 55 + task/node_modules/moment/dist/locale/ar.js | 189 + task/node_modules/moment/dist/locale/az.js | 102 + task/node_modules/moment/dist/locale/be.js | 142 + task/node_modules/moment/dist/locale/bg.js | 87 + task/node_modules/moment/dist/locale/bm.js | 52 + task/node_modules/moment/dist/locale/bn-bd.js | 129 + task/node_modules/moment/dist/locale/bn.js | 119 + task/node_modules/moment/dist/locale/bo.js | 124 + task/node_modules/moment/dist/locale/br.js | 168 + task/node_modules/moment/dist/locale/bs.js | 160 + task/node_modules/moment/dist/locale/ca.js | 100 + task/node_modules/moment/dist/locale/cs.js | 181 + task/node_modules/moment/dist/locale/cv.js | 63 + task/node_modules/moment/dist/locale/cy.js | 98 + task/node_modules/moment/dist/locale/da.js | 53 + task/node_modules/moment/dist/locale/de-at.js | 79 + task/node_modules/moment/dist/locale/de-ch.js | 78 + task/node_modules/moment/dist/locale/de.js | 78 + task/node_modules/moment/dist/locale/dv.js | 90 + task/node_modules/moment/dist/locale/el.js | 106 + task/node_modules/moment/dist/locale/en-au.js | 68 + task/node_modules/moment/dist/locale/en-ca.js | 64 + task/node_modules/moment/dist/locale/en-gb.js | 68 + task/node_modules/moment/dist/locale/en-ie.js | 68 + task/node_modules/moment/dist/locale/en-il.js | 64 + task/node_modules/moment/dist/locale/en-in.js | 68 + task/node_modules/moment/dist/locale/en-nz.js | 68 + task/node_modules/moment/dist/locale/en-sg.js | 68 + task/node_modules/moment/dist/locale/eo.js | 68 + task/node_modules/moment/dist/locale/es-do.js | 108 + task/node_modules/moment/dist/locale/es-mx.js | 110 + task/node_modules/moment/dist/locale/es-us.js | 110 + task/node_modules/moment/dist/locale/es.js | 110 + task/node_modules/moment/dist/locale/et.js | 78 + task/node_modules/moment/dist/locale/eu.js | 65 + task/node_modules/moment/dist/locale/fa.js | 113 + task/node_modules/moment/dist/locale/fi.js | 124 + task/node_modules/moment/dist/locale/fil.js | 58 + task/node_modules/moment/dist/locale/fo.js | 57 + task/node_modules/moment/dist/locale/fr-ca.js | 70 + task/node_modules/moment/dist/locale/fr-ch.js | 74 + task/node_modules/moment/dist/locale/fr.js | 108 + task/node_modules/moment/dist/locale/fy.js | 75 + task/node_modules/moment/dist/locale/ga.js | 95 + task/node_modules/moment/dist/locale/gd.js | 95 + task/node_modules/moment/dist/locale/gl.js | 75 + .../moment/dist/locale/gom-deva.js | 126 + .../moment/dist/locale/gom-latn.js | 124 + task/node_modules/moment/dist/locale/gu.js | 122 + task/node_modules/moment/dist/locale/he.js | 94 + task/node_modules/moment/dist/locale/hi.js | 168 + task/node_modules/moment/dist/locale/hr.js | 156 + task/node_modules/moment/dist/locale/hu.js | 118 + task/node_modules/moment/dist/locale/hy-am.js | 94 + task/node_modules/moment/dist/locale/id.js | 76 + task/node_modules/moment/dist/locale/is.js | 140 + task/node_modules/moment/dist/locale/it-ch.js | 64 + task/node_modules/moment/dist/locale/it.js | 106 + task/node_modules/moment/dist/locale/ja.js | 148 + task/node_modules/moment/dist/locale/jv.js | 76 + task/node_modules/moment/dist/locale/ka.js | 92 + task/node_modules/moment/dist/locale/kk.js | 82 + task/node_modules/moment/dist/locale/km.js | 103 + task/node_modules/moment/dist/locale/kn.js | 124 + task/node_modules/moment/dist/locale/ko.js | 75 + .../node_modules/moment/dist/locale/ku-kmr.js | 121 + task/node_modules/moment/dist/locale/ku.js | 118 + task/node_modules/moment/dist/locale/ky.js | 84 + task/node_modules/moment/dist/locale/lb.js | 137 + task/node_modules/moment/dist/locale/lo.js | 66 + task/node_modules/moment/dist/locale/lt.js | 125 + task/node_modules/moment/dist/locale/lv.js | 94 + task/node_modules/moment/dist/locale/me.js | 117 + task/node_modules/moment/dist/locale/mi.js | 60 + task/node_modules/moment/dist/locale/mk.js | 85 + task/node_modules/moment/dist/locale/ml.js | 82 + task/node_modules/moment/dist/locale/mn.js | 100 + task/node_modules/moment/dist/locale/mr.js | 203 + task/node_modules/moment/dist/locale/ms-my.js | 76 + task/node_modules/moment/dist/locale/ms.js | 75 + task/node_modules/moment/dist/locale/mt.js | 56 + task/node_modules/moment/dist/locale/my.js | 91 + task/node_modules/moment/dist/locale/nb.js | 60 + task/node_modules/moment/dist/locale/ne.js | 121 + task/node_modules/moment/dist/locale/nl-be.js | 102 + task/node_modules/moment/dist/locale/nl.js | 104 + task/node_modules/moment/dist/locale/nn.js | 59 + .../node_modules/moment/dist/locale/oc-lnc.js | 85 + task/node_modules/moment/dist/locale/pa-in.js | 122 + task/node_modules/moment/dist/locale/pl.js | 140 + task/node_modules/moment/dist/locale/pt-br.js | 58 + task/node_modules/moment/dist/locale/pt.js | 63 + task/node_modules/moment/dist/locale/ro.js | 76 + task/node_modules/moment/dist/locale/ru.js | 213 + task/node_modules/moment/dist/locale/sd.js | 81 + task/node_modules/moment/dist/locale/se.js | 57 + task/node_modules/moment/dist/locale/si.js | 69 + task/node_modules/moment/dist/locale/sk.js | 145 + task/node_modules/moment/dist/locale/sl.js | 171 + task/node_modules/moment/dist/locale/sq.js | 65 + .../moment/dist/locale/sr-cyrl.js | 127 + task/node_modules/moment/dist/locale/sr.js | 129 + task/node_modules/moment/dist/locale/ss.js | 84 + task/node_modules/moment/dist/locale/sv.js | 68 + task/node_modules/moment/dist/locale/sw.js | 55 + task/node_modules/moment/dist/locale/ta.js | 131 + task/node_modules/moment/dist/locale/te.js | 88 + task/node_modules/moment/dist/locale/tet.js | 68 + task/node_modules/moment/dist/locale/tg.js | 117 + task/node_modules/moment/dist/locale/th.js | 65 + task/node_modules/moment/dist/locale/tk.js | 91 + task/node_modules/moment/dist/locale/tl-ph.js | 57 + task/node_modules/moment/dist/locale/tlh.js | 124 + task/node_modules/moment/dist/locale/tr.js | 106 + task/node_modules/moment/dist/locale/tzl.js | 89 + .../moment/dist/locale/tzm-latn.js | 54 + task/node_modules/moment/dist/locale/tzm.js | 54 + task/node_modules/moment/dist/locale/ug-cn.js | 111 + task/node_modules/moment/dist/locale/uk.js | 167 + task/node_modules/moment/dist/locale/ur.js | 82 + .../moment/dist/locale/uz-latn.js | 54 + task/node_modules/moment/dist/locale/uz.js | 51 + task/node_modules/moment/dist/locale/vi.js | 80 + .../moment/dist/locale/x-pseudo.js | 73 + task/node_modules/moment/dist/locale/yo.js | 53 + task/node_modules/moment/dist/locale/zh-cn.js | 120 + task/node_modules/moment/dist/locale/zh-hk.js | 101 + task/node_modules/moment/dist/locale/zh-mo.js | 100 + task/node_modules/moment/dist/locale/zh-tw.js | 99 + task/node_modules/moment/dist/moment.js | 5680 +++++ task/node_modules/moment/ender.js | 1 + task/node_modules/moment/locale/af.js | 82 + task/node_modules/moment/locale/ar-dz.js | 167 + task/node_modules/moment/locale/ar-kw.js | 66 + task/node_modules/moment/locale/ar-ly.js | 182 + task/node_modules/moment/locale/ar-ma.js | 67 + task/node_modules/moment/locale/ar-ps.js | 123 + task/node_modules/moment/locale/ar-sa.js | 116 + task/node_modules/moment/locale/ar-tn.js | 66 + task/node_modules/moment/locale/ar.js | 200 + task/node_modules/moment/locale/az.js | 113 + task/node_modules/moment/locale/be.js | 153 + task/node_modules/moment/locale/bg.js | 98 + task/node_modules/moment/locale/bm.js | 62 + task/node_modules/moment/locale/bn-bd.js | 140 + task/node_modules/moment/locale/bn.js | 130 + task/node_modules/moment/locale/bo.js | 135 + task/node_modules/moment/locale/br.js | 179 + task/node_modules/moment/locale/bs.js | 171 + task/node_modules/moment/locale/ca.js | 111 + task/node_modules/moment/locale/cs.js | 192 + task/node_modules/moment/locale/cv.js | 74 + task/node_modules/moment/locale/cy.js | 109 + task/node_modules/moment/locale/da.js | 64 + task/node_modules/moment/locale/de-at.js | 90 + task/node_modules/moment/locale/de-ch.js | 87 + task/node_modules/moment/locale/de.js | 89 + task/node_modules/moment/locale/dv.js | 101 + task/node_modules/moment/locale/el.js | 117 + task/node_modules/moment/locale/en-au.js | 79 + task/node_modules/moment/locale/en-ca.js | 75 + task/node_modules/moment/locale/en-gb.js | 79 + task/node_modules/moment/locale/en-ie.js | 79 + task/node_modules/moment/locale/en-il.js | 75 + task/node_modules/moment/locale/en-in.js | 79 + task/node_modules/moment/locale/en-nz.js | 79 + task/node_modules/moment/locale/en-sg.js | 79 + task/node_modules/moment/locale/eo.js | 79 + task/node_modules/moment/locale/es-do.js | 119 + task/node_modules/moment/locale/es-mx.js | 121 + task/node_modules/moment/locale/es-us.js | 121 + task/node_modules/moment/locale/es.js | 121 + task/node_modules/moment/locale/et.js | 89 + task/node_modules/moment/locale/eu.js | 76 + task/node_modules/moment/locale/fa.js | 124 + task/node_modules/moment/locale/fi.js | 135 + task/node_modules/moment/locale/fil.js | 69 + task/node_modules/moment/locale/fo.js | 68 + task/node_modules/moment/locale/fr-ca.js | 81 + task/node_modules/moment/locale/fr-ch.js | 85 + task/node_modules/moment/locale/fr.js | 119 + task/node_modules/moment/locale/fy.js | 86 + task/node_modules/moment/locale/ga.js | 106 + task/node_modules/moment/locale/gd.js | 106 + task/node_modules/moment/locale/gl.js | 86 + task/node_modules/moment/locale/gom-deva.js | 137 + task/node_modules/moment/locale/gom-latn.js | 135 + task/node_modules/moment/locale/gu.js | 133 + task/node_modules/moment/locale/he.js | 105 + task/node_modules/moment/locale/hi.js | 179 + task/node_modules/moment/locale/hr.js | 167 + task/node_modules/moment/locale/hu.js | 129 + task/node_modules/moment/locale/hy-am.js | 105 + task/node_modules/moment/locale/id.js | 87 + task/node_modules/moment/locale/is.js | 151 + task/node_modules/moment/locale/it-ch.js | 75 + task/node_modules/moment/locale/it.js | 117 + task/node_modules/moment/locale/ja.js | 159 + task/node_modules/moment/locale/jv.js | 87 + task/node_modules/moment/locale/ka.js | 103 + task/node_modules/moment/locale/kk.js | 93 + task/node_modules/moment/locale/km.js | 114 + task/node_modules/moment/locale/kn.js | 135 + task/node_modules/moment/locale/ko.js | 86 + task/node_modules/moment/locale/ku-kmr.js | 125 + task/node_modules/moment/locale/ku.js | 129 + task/node_modules/moment/locale/ky.js | 95 + task/node_modules/moment/locale/lb.js | 148 + task/node_modules/moment/locale/lo.js | 77 + task/node_modules/moment/locale/lt.js | 136 + task/node_modules/moment/locale/lv.js | 105 + task/node_modules/moment/locale/me.js | 128 + task/node_modules/moment/locale/mi.js | 71 + task/node_modules/moment/locale/mk.js | 97 + task/node_modules/moment/locale/ml.js | 93 + task/node_modules/moment/locale/mn.js | 111 + task/node_modules/moment/locale/mr.js | 214 + task/node_modules/moment/locale/ms-my.js | 87 + task/node_modules/moment/locale/ms.js | 86 + task/node_modules/moment/locale/mt.js | 67 + task/node_modules/moment/locale/my.js | 102 + task/node_modules/moment/locale/nb.js | 71 + task/node_modules/moment/locale/ne.js | 132 + task/node_modules/moment/locale/nl-be.js | 113 + task/node_modules/moment/locale/nl.js | 115 + task/node_modules/moment/locale/nn.js | 70 + task/node_modules/moment/locale/oc-lnc.js | 96 + task/node_modules/moment/locale/pa-in.js | 133 + task/node_modules/moment/locale/pl.js | 151 + task/node_modules/moment/locale/pt-br.js | 69 + task/node_modules/moment/locale/pt.js | 74 + task/node_modules/moment/locale/ro.js | 87 + task/node_modules/moment/locale/ru.js | 224 + task/node_modules/moment/locale/sd.js | 92 + task/node_modules/moment/locale/se.js | 68 + task/node_modules/moment/locale/si.js | 80 + task/node_modules/moment/locale/sk.js | 156 + task/node_modules/moment/locale/sl.js | 182 + task/node_modules/moment/locale/sq.js | 76 + task/node_modules/moment/locale/sr-cyrl.js | 138 + task/node_modules/moment/locale/sr.js | 140 + task/node_modules/moment/locale/ss.js | 95 + task/node_modules/moment/locale/sv.js | 79 + task/node_modules/moment/locale/sw.js | 66 + task/node_modules/moment/locale/ta.js | 142 + task/node_modules/moment/locale/te.js | 99 + task/node_modules/moment/locale/tet.js | 79 + task/node_modules/moment/locale/tg.js | 128 + task/node_modules/moment/locale/th.js | 76 + task/node_modules/moment/locale/tk.js | 102 + task/node_modules/moment/locale/tl-ph.js | 68 + task/node_modules/moment/locale/tlh.js | 135 + task/node_modules/moment/locale/tr.js | 117 + task/node_modules/moment/locale/tzl.js | 100 + task/node_modules/moment/locale/tzm-latn.js | 65 + task/node_modules/moment/locale/tzm.js | 65 + task/node_modules/moment/locale/ug-cn.js | 122 + task/node_modules/moment/locale/uk.js | 178 + task/node_modules/moment/locale/ur.js | 93 + task/node_modules/moment/locale/uz-latn.js | 65 + task/node_modules/moment/locale/uz.js | 62 + task/node_modules/moment/locale/vi.js | 91 + task/node_modules/moment/locale/x-pseudo.js | 84 + task/node_modules/moment/locale/yo.js | 64 + task/node_modules/moment/locale/zh-cn.js | 131 + task/node_modules/moment/locale/zh-hk.js | 112 + task/node_modules/moment/locale/zh-mo.js | 111 + task/node_modules/moment/locale/zh-tw.js | 110 + task/node_modules/moment/min/locales.js | 12800 +++++++++++ task/node_modules/moment/min/locales.min.js | 2 + .../moment/min/locales.min.js.map | 1 + .../moment/min/moment-with-locales.js | 18472 ++++++++++++++++ .../moment/min/moment-with-locales.min.js | 2 + .../moment/min/moment-with-locales.min.js.map | 1 + task/node_modules/moment/min/moment.min.js | 2 + .../node_modules/moment/min/moment.min.js.map | 1 + task/node_modules/moment/moment.d.ts | 796 + task/node_modules/moment/moment.js | 5688 +++++ task/node_modules/moment/package.js | 11 + task/node_modules/moment/package.json | 116 + .../moment/src/lib/create/check-overflow.js | 57 + .../moment/src/lib/create/date-from-array.js | 35 + .../moment/src/lib/create/from-anything.js | 117 + .../moment/src/lib/create/from-array.js | 187 + .../moment/src/lib/create/from-object.js | 20 + .../src/lib/create/from-string-and-array.js | 67 + .../src/lib/create/from-string-and-format.js | 135 + .../moment/src/lib/create/from-string.js | 258 + .../moment/src/lib/create/local.js | 5 + .../moment/src/lib/create/parsing-flags.js | 28 + .../node_modules/moment/src/lib/create/utc.js | 5 + .../moment/src/lib/create/valid.js | 51 + .../moment/src/lib/duration/abs.js | 18 + .../moment/src/lib/duration/add-subtract.js | 21 + .../moment/src/lib/duration/as.js | 76 + .../moment/src/lib/duration/bubble.js | 68 + .../moment/src/lib/duration/clone.js | 5 + .../moment/src/lib/duration/constructor.js | 42 + .../moment/src/lib/duration/create.js | 133 + .../moment/src/lib/duration/duration.js | 16 + .../moment/src/lib/duration/get.js | 27 + .../moment/src/lib/duration/humanize.js | 114 + .../moment/src/lib/duration/iso-string.js | 68 + .../moment/src/lib/duration/prototype.js | 78 + .../moment/src/lib/duration/valid.js | 55 + .../moment/src/lib/format/format.js | 104 + .../moment/src/lib/locale/base-config.js | 41 + .../moment/src/lib/locale/calendar.js | 15 + .../moment/src/lib/locale/constructor.js | 5 + task/node_modules/moment/src/lib/locale/en.js | 39 + .../moment/src/lib/locale/formats.js | 36 + .../moment/src/lib/locale/invalid.js | 5 + .../moment/src/lib/locale/lists.js | 93 + .../moment/src/lib/locale/locale.js | 45 + .../moment/src/lib/locale/locales.js | 249 + .../moment/src/lib/locale/ordinal.js | 8 + .../moment/src/lib/locale/pre-post-format.js | 3 + .../moment/src/lib/locale/prototype.js | 88 + .../moment/src/lib/locale/relative.js | 32 + .../node_modules/moment/src/lib/locale/set.js | 56 + .../moment/src/lib/moment/add-subtract.js | 61 + .../moment/src/lib/moment/calendar.js | 53 + .../moment/src/lib/moment/clone.js | 5 + .../moment/src/lib/moment/compare.js | 72 + .../moment/src/lib/moment/constructor.js | 80 + .../moment/src/lib/moment/creation-data.js | 9 + .../moment/src/lib/moment/diff.js | 79 + .../moment/src/lib/moment/format.js | 78 + .../moment/src/lib/moment/from.js | 20 + .../moment/src/lib/moment/get-set.js | 117 + .../moment/src/lib/moment/locale.js | 34 + .../moment/src/lib/moment/min-max.js | 62 + .../moment/src/lib/moment/moment.js | 28 + .../node_modules/moment/src/lib/moment/now.js | 3 + .../moment/src/lib/moment/prototype.js | 197 + .../moment/src/lib/moment/start-end-of.js | 164 + .../moment/src/lib/moment/to-type.js | 42 + task/node_modules/moment/src/lib/moment/to.js | 20 + .../moment/src/lib/moment/valid.js | 15 + .../moment/src/lib/parse/regex.js | 84 + .../moment/src/lib/parse/token.js | 36 + .../moment/src/lib/units/aliases.js | 75 + .../moment/src/lib/units/constants.js | 9 + .../moment/src/lib/units/day-of-month.js | 35 + .../moment/src/lib/units/day-of-week.js | 432 + .../moment/src/lib/units/day-of-year.js | 28 + task/node_modules/moment/src/lib/units/era.js | 293 + .../node_modules/moment/src/lib/units/hour.js | 152 + .../moment/src/lib/units/millisecond.js | 66 + .../moment/src/lib/units/minute.js | 24 + .../moment/src/lib/units/month.js | 340 + .../moment/src/lib/units/offset.js | 249 + .../moment/src/lib/units/priorities.js | 34 + .../moment/src/lib/units/quarter.js | 24 + .../moment/src/lib/units/second.js | 24 + .../moment/src/lib/units/timestamp.js | 20 + .../moment/src/lib/units/timezone.js | 16 + .../moment/src/lib/units/units.js | 20 + .../src/lib/units/week-calendar-utils.js | 66 + .../moment/src/lib/units/week-year.js | 128 + .../node_modules/moment/src/lib/units/week.js | 62 + .../node_modules/moment/src/lib/units/year.js | 75 + .../moment/src/lib/utils/abs-ceil.js | 7 + .../moment/src/lib/utils/abs-floor.js | 8 + .../moment/src/lib/utils/abs-round.js | 7 + .../moment/src/lib/utils/compare-arrays.js | 18 + .../moment/src/lib/utils/defaults.js | 10 + .../moment/src/lib/utils/deprecate.js | 69 + .../moment/src/lib/utils/extend.js | 19 + .../moment/src/lib/utils/has-own-prop.js | 3 + .../moment/src/lib/utils/hooks.js | 13 + .../moment/src/lib/utils/index-of.js | 18 + .../moment/src/lib/utils/is-array.js | 6 + .../moment/src/lib/utils/is-calendar-spec.js | 25 + .../moment/src/lib/utils/is-date.js | 6 + .../moment/src/lib/utils/is-function.js | 6 + .../moment/src/lib/utils/is-leap-year.js | 3 + .../moment/src/lib/utils/is-moment-input.js | 75 + .../moment/src/lib/utils/is-number.js | 6 + .../moment/src/lib/utils/is-object-empty.js | 15 + .../moment/src/lib/utils/is-object.js | 8 + .../moment/src/lib/utils/is-string.js | 3 + .../moment/src/lib/utils/is-undefined.js | 3 + .../node_modules/moment/src/lib/utils/keys.js | 20 + task/node_modules/moment/src/lib/utils/map.js | 9 + task/node_modules/moment/src/lib/utils/mod.js | 3 + .../node_modules/moment/src/lib/utils/some.js | 20 + .../moment/src/lib/utils/to-int.js | 12 + .../moment/src/lib/utils/zero-fill.js | 10 + task/node_modules/moment/src/locale/af.js | 71 + task/node_modules/moment/src/locale/ar-dz.js | 156 + task/node_modules/moment/src/locale/ar-kw.js | 55 + task/node_modules/moment/src/locale/ar-ly.js | 171 + task/node_modules/moment/src/locale/ar-ma.js | 56 + task/node_modules/moment/src/locale/ar-ps.js | 112 + task/node_modules/moment/src/locale/ar-sa.js | 105 + task/node_modules/moment/src/locale/ar-tn.js | 55 + task/node_modules/moment/src/locale/ar.js | 189 + task/node_modules/moment/src/locale/az.js | 102 + task/node_modules/moment/src/locale/be.js | 142 + task/node_modules/moment/src/locale/bg.js | 87 + task/node_modules/moment/src/locale/bm.js | 52 + task/node_modules/moment/src/locale/bn-bd.js | 129 + task/node_modules/moment/src/locale/bn.js | 119 + task/node_modules/moment/src/locale/bo.js | 124 + task/node_modules/moment/src/locale/br.js | 168 + task/node_modules/moment/src/locale/bs.js | 160 + task/node_modules/moment/src/locale/ca.js | 100 + task/node_modules/moment/src/locale/cs.js | 181 + task/node_modules/moment/src/locale/cv.js | 63 + task/node_modules/moment/src/locale/cy.js | 98 + task/node_modules/moment/src/locale/da.js | 53 + task/node_modules/moment/src/locale/de-at.js | 79 + task/node_modules/moment/src/locale/de-ch.js | 78 + task/node_modules/moment/src/locale/de.js | 78 + task/node_modules/moment/src/locale/dv.js | 90 + task/node_modules/moment/src/locale/el.js | 106 + task/node_modules/moment/src/locale/en-au.js | 68 + task/node_modules/moment/src/locale/en-ca.js | 64 + task/node_modules/moment/src/locale/en-gb.js | 68 + task/node_modules/moment/src/locale/en-ie.js | 68 + task/node_modules/moment/src/locale/en-il.js | 64 + task/node_modules/moment/src/locale/en-in.js | 68 + task/node_modules/moment/src/locale/en-nz.js | 68 + task/node_modules/moment/src/locale/en-sg.js | 68 + task/node_modules/moment/src/locale/eo.js | 68 + task/node_modules/moment/src/locale/es-do.js | 108 + task/node_modules/moment/src/locale/es-mx.js | 110 + task/node_modules/moment/src/locale/es-us.js | 110 + task/node_modules/moment/src/locale/es.js | 110 + task/node_modules/moment/src/locale/et.js | 78 + task/node_modules/moment/src/locale/eu.js | 65 + task/node_modules/moment/src/locale/fa.js | 113 + task/node_modules/moment/src/locale/fi.js | 124 + task/node_modules/moment/src/locale/fil.js | 58 + task/node_modules/moment/src/locale/fo.js | 57 + task/node_modules/moment/src/locale/fr-ca.js | 70 + task/node_modules/moment/src/locale/fr-ch.js | 74 + task/node_modules/moment/src/locale/fr.js | 108 + task/node_modules/moment/src/locale/fy.js | 75 + task/node_modules/moment/src/locale/ga.js | 95 + task/node_modules/moment/src/locale/gd.js | 95 + task/node_modules/moment/src/locale/gl.js | 75 + .../moment/src/locale/gom-deva.js | 126 + .../moment/src/locale/gom-latn.js | 124 + task/node_modules/moment/src/locale/gu.js | 122 + task/node_modules/moment/src/locale/he.js | 94 + task/node_modules/moment/src/locale/hi.js | 168 + task/node_modules/moment/src/locale/hr.js | 156 + task/node_modules/moment/src/locale/hu.js | 118 + task/node_modules/moment/src/locale/hy-am.js | 94 + task/node_modules/moment/src/locale/id.js | 76 + task/node_modules/moment/src/locale/is.js | 140 + task/node_modules/moment/src/locale/it-ch.js | 64 + task/node_modules/moment/src/locale/it.js | 106 + task/node_modules/moment/src/locale/ja.js | 148 + task/node_modules/moment/src/locale/jv.js | 76 + task/node_modules/moment/src/locale/ka.js | 92 + task/node_modules/moment/src/locale/kk.js | 82 + task/node_modules/moment/src/locale/km.js | 103 + task/node_modules/moment/src/locale/kn.js | 124 + task/node_modules/moment/src/locale/ko.js | 75 + task/node_modules/moment/src/locale/ku-kmr.js | 121 + task/node_modules/moment/src/locale/ku.js | 118 + task/node_modules/moment/src/locale/ky.js | 84 + task/node_modules/moment/src/locale/lb.js | 137 + task/node_modules/moment/src/locale/lo.js | 66 + task/node_modules/moment/src/locale/lt.js | 125 + task/node_modules/moment/src/locale/lv.js | 94 + task/node_modules/moment/src/locale/me.js | 117 + task/node_modules/moment/src/locale/mi.js | 60 + task/node_modules/moment/src/locale/mk.js | 85 + task/node_modules/moment/src/locale/ml.js | 82 + task/node_modules/moment/src/locale/mn.js | 100 + task/node_modules/moment/src/locale/mr.js | 203 + task/node_modules/moment/src/locale/ms-my.js | 76 + task/node_modules/moment/src/locale/ms.js | 75 + task/node_modules/moment/src/locale/mt.js | 56 + task/node_modules/moment/src/locale/my.js | 91 + task/node_modules/moment/src/locale/nb.js | 60 + task/node_modules/moment/src/locale/ne.js | 121 + task/node_modules/moment/src/locale/nl-be.js | 102 + task/node_modules/moment/src/locale/nl.js | 104 + task/node_modules/moment/src/locale/nn.js | 59 + task/node_modules/moment/src/locale/oc-lnc.js | 85 + task/node_modules/moment/src/locale/pa-in.js | 122 + task/node_modules/moment/src/locale/pl.js | 140 + task/node_modules/moment/src/locale/pt-br.js | 58 + task/node_modules/moment/src/locale/pt.js | 63 + task/node_modules/moment/src/locale/ro.js | 76 + task/node_modules/moment/src/locale/ru.js | 213 + task/node_modules/moment/src/locale/sd.js | 81 + task/node_modules/moment/src/locale/se.js | 57 + task/node_modules/moment/src/locale/si.js | 69 + task/node_modules/moment/src/locale/sk.js | 145 + task/node_modules/moment/src/locale/sl.js | 171 + task/node_modules/moment/src/locale/sq.js | 65 + .../node_modules/moment/src/locale/sr-cyrl.js | 127 + task/node_modules/moment/src/locale/sr.js | 129 + task/node_modules/moment/src/locale/ss.js | 84 + task/node_modules/moment/src/locale/sv.js | 68 + task/node_modules/moment/src/locale/sw.js | 55 + task/node_modules/moment/src/locale/ta.js | 131 + task/node_modules/moment/src/locale/te.js | 88 + task/node_modules/moment/src/locale/tet.js | 68 + task/node_modules/moment/src/locale/tg.js | 117 + task/node_modules/moment/src/locale/th.js | 65 + task/node_modules/moment/src/locale/tk.js | 91 + task/node_modules/moment/src/locale/tl-ph.js | 57 + task/node_modules/moment/src/locale/tlh.js | 124 + task/node_modules/moment/src/locale/tr.js | 106 + task/node_modules/moment/src/locale/tzl.js | 89 + .../moment/src/locale/tzm-latn.js | 54 + task/node_modules/moment/src/locale/tzm.js | 54 + task/node_modules/moment/src/locale/ug-cn.js | 111 + task/node_modules/moment/src/locale/uk.js | 167 + task/node_modules/moment/src/locale/ur.js | 82 + .../node_modules/moment/src/locale/uz-latn.js | 54 + task/node_modules/moment/src/locale/uz.js | 51 + task/node_modules/moment/src/locale/vi.js | 80 + .../moment/src/locale/x-pseudo.js | 73 + task/node_modules/moment/src/locale/yo.js | 53 + task/node_modules/moment/src/locale/zh-cn.js | 120 + task/node_modules/moment/src/locale/zh-hk.js | 101 + task/node_modules/moment/src/locale/zh-mo.js | 100 + task/node_modules/moment/src/locale/zh-tw.js | 99 + task/node_modules/moment/src/moment.js | 93 + .../moment/ts3.1-typings/moment.d.ts | 785 + task/node_modules/ms/index.js | 162 + task/node_modules/ms/license.md | 21 + task/node_modules/ms/package.json | 37 + task/node_modules/ms/readme.md | 60 + task/node_modules/mv/.npmignore | 1 + task/node_modules/mv/.travis.yml | 4 + task/node_modules/mv/LICENSE | 21 + task/node_modules/mv/README.md | 33 + task/node_modules/mv/index.js | 105 + task/node_modules/mv/package.json | 41 + task/node_modules/mv/test/a-file | 1 + .../mv/test/a-folder/another-file | 1 + .../mv/test/a-folder/another-folder/file3 | 1 + task/node_modules/mv/test/test.js | 151 + task/node_modules/nan/CHANGELOG.md | 553 + task/node_modules/nan/CMakeLists.txt | 138 + task/node_modules/nan/LICENSE.md | 9 + task/node_modules/nan/README.md | 456 + task/node_modules/nan/doc/asyncworker.md | 146 + task/node_modules/nan/doc/buffers.md | 54 + task/node_modules/nan/doc/callback.md | 76 + task/node_modules/nan/doc/converters.md | 41 + task/node_modules/nan/doc/errors.md | 226 + task/node_modules/nan/doc/json.md | 62 + task/node_modules/nan/doc/maybe_types.md | 583 + task/node_modules/nan/doc/methods.md | 672 + task/node_modules/nan/doc/new.md | 147 + task/node_modules/nan/doc/node_misc.md | 123 + task/node_modules/nan/doc/object_wrappers.md | 263 + task/node_modules/nan/doc/persistent.md | 296 + task/node_modules/nan/doc/scopes.md | 73 + task/node_modules/nan/doc/script.md | 58 + task/node_modules/nan/doc/string_bytes.md | 62 + task/node_modules/nan/doc/v8_internals.md | 199 + task/node_modules/nan/doc/v8_misc.md | 85 + task/node_modules/nan/include_dirs.js | 1 + task/node_modules/nan/nan.h | 2954 +++ task/node_modules/nan/nan_callbacks.h | 92 + task/node_modules/nan/nan_callbacks_12_inl.h | 520 + .../nan/nan_callbacks_pre_12_inl.h | 520 + task/node_modules/nan/nan_converters.h | 72 + task/node_modules/nan/nan_converters_43_inl.h | 68 + .../nan/nan_converters_pre_43_inl.h | 42 + .../nan/nan_define_own_property_helper.h | 29 + .../nan/nan_implementation_12_inl.h | 430 + .../nan/nan_implementation_pre_12_inl.h | 263 + task/node_modules/nan/nan_json.h | 166 + task/node_modules/nan/nan_maybe_43_inl.h | 356 + task/node_modules/nan/nan_maybe_pre_43_inl.h | 268 + task/node_modules/nan/nan_new.h | 340 + task/node_modules/nan/nan_object_wrap.h | 156 + task/node_modules/nan/nan_persistent_12_inl.h | 132 + .../nan/nan_persistent_pre_12_inl.h | 242 + task/node_modules/nan/nan_private.h | 73 + task/node_modules/nan/nan_scriptorigin.h | 76 + task/node_modules/nan/nan_string_bytes.h | 305 + .../nan/nan_typedarray_contents.h | 96 + task/node_modules/nan/nan_weak.h | 437 + task/node_modules/nan/package.json | 38 + task/node_modules/nan/tools/1to2.js | 412 + task/node_modules/nan/tools/README.md | 14 + task/node_modules/nan/tools/package.json | 19 + task/node_modules/ncp/.npmignore | 4 + task/node_modules/ncp/.travis.yml | 6 + task/node_modules/ncp/LICENSE.md | 21 + task/node_modules/ncp/README.md | 63 + task/node_modules/ncp/bin/ncp | 48 + task/node_modules/ncp/lib/ncp.js | 261 + task/node_modules/ncp/package.json | 30 + .../ncp/test/modified-files/out/a | 1 + .../ncp/test/modified-files/src/a | 1 + task/node_modules/ncp/test/ncp.js | 197 + .../ncp/test/regular-fixtures/src/a | 1 + .../ncp/test/regular-fixtures/src/b | 1 + .../ncp/test/regular-fixtures/src/c | 0 .../ncp/test/regular-fixtures/src/d | 0 .../ncp/test/regular-fixtures/src/e | 0 .../ncp/test/regular-fixtures/src/f | 0 .../ncp/test/regular-fixtures/src/sub/a | 1 + .../ncp/test/regular-fixtures/src/sub/b | 0 .../ncp/test/symlink-fixtures/src/dir/bar | 1 + .../ncp/test/symlink-fixtures/src/foo | 1 + .../node_modules/node-addon-api/.editorconfig | 8 + task/node_modules/node-addon-api/.travis.yml | 65 + task/node_modules/node-addon-api/CHANGELOG.md | 325 + .../node-addon-api/CODE_OF_CONDUCT.md | 4 + .../node-addon-api/CONTRIBUTING.md | 66 + task/node_modules/node-addon-api/LICENSE.md | 13 + task/node_modules/node-addon-api/README.md | 200 + task/node_modules/node-addon-api/appveyor.yml | 48 + task/node_modules/node-addon-api/doc/Doxyfile | 2450 ++ .../node-addon-api/doc/array_buffer.md | 129 + .../node-addon-api/doc/async_context.md | 76 + .../node-addon-api/doc/async_operations.md | 31 + .../node-addon-api/doc/async_worker.md | 397 + .../node-addon-api/doc/basic_types.md | 415 + .../node_modules/node-addon-api/doc/bigint.md | 92 + .../node-addon-api/doc/boolean.md | 64 + .../node_modules/node-addon-api/doc/buffer.md | 140 + .../node-addon-api/doc/callback_scope.md | 54 + .../node-addon-api/doc/callbackinfo.md | 97 + .../node-addon-api/doc/checker-tool.md | 32 + .../doc/class_property_descriptor.md | 118 + .../node-addon-api/doc/cmake-js.md | 19 + .../node-addon-api/doc/conversion-tool.md | 28 + .../node-addon-api/doc/creating_a_release.md | 62 + .../node-addon-api/doc/dataview.md | 244 + task/node_modules/node-addon-api/doc/env.md | 63 + task/node_modules/node-addon-api/doc/error.md | 115 + .../node-addon-api/doc/error_handling.md | 186 + .../doc/escapable_handle_scope.md | 82 + .../node-addon-api/doc/external.md | 59 + .../node-addon-api/doc/function.md | 294 + .../node-addon-api/doc/function_reference.md | 238 + .../node-addon-api/doc/generator.md | 13 + .../node-addon-api/doc/handle_scope.md | 65 + .../node-addon-api/doc/memory_management.md | 27 + .../node-addon-api/doc/node-gyp.md | 82 + .../node_modules/node-addon-api/doc/number.md | 163 + .../node_modules/node-addon-api/doc/object.md | 202 + .../doc/object_lifetime_management.md | 83 + .../node-addon-api/doc/object_reference.md | 117 + .../node-addon-api/doc/object_wrap.md | 546 + .../node-addon-api/doc/prebuild_tools.md | 16 + .../node-addon-api/doc/promises.md | 74 + .../node-addon-api/doc/property_descriptor.md | 231 + .../node-addon-api/doc/range_error.md | 59 + .../node-addon-api/doc/reference.md | 111 + task/node_modules/node-addon-api/doc/setup.md | 82 + .../node_modules/node-addon-api/doc/string.md | 89 + .../node_modules/node-addon-api/doc/symbol.md | 44 + .../node-addon-api/doc/threadsafe_function.md | 303 + .../node-addon-api/doc/type_error.md | 59 + .../node-addon-api/doc/typed_array.md | 74 + .../node-addon-api/doc/typed_array_of.md | 133 + task/node_modules/node-addon-api/doc/value.md | 269 + .../node-addon-api/doc/version_management.md | 43 + .../doc/working_with_javascript_values.md | 14 + .../node-addon-api/external-napi/node_api.h | 7 + task/node_modules/node-addon-api/index.js | 45 + .../node-addon-api/napi-inl.deprecated.h | 192 + task/node_modules/node-addon-api/napi-inl.h | 4097 ++++ task/node_modules/node-addon-api/napi.h | 2053 ++ task/node_modules/node-addon-api/package.json | 79 + .../node-addon-api/src/node_api.cc | 3655 +++ .../node-addon-api/src/node_api.gyp | 21 + .../node-addon-api/src/node_api.h | 588 + .../node-addon-api/src/node_api_types.h | 115 + .../node-addon-api/src/node_internals.cc | 142 + .../node-addon-api/src/node_internals.h | 157 + .../node_modules/node-addon-api/src/nothing.c | 0 .../node-addon-api/src/util-inl.h | 38 + task/node_modules/node-addon-api/src/util.h | 7 + .../node-addon-api/tools/README.md | 67 + .../node-addon-api/tools/check-napi.js | 100 + .../node-addon-api/tools/conversion.js | 313 + .../.github/workflows/nodeCI.yml | 22 + .../nodejs-file-downloader/CHANGELOG.md | 108 + .../nodejs-file-downloader/Download.js | 407 + .../nodejs-file-downloader/Downloader.js | 187 + .../nodejs-file-downloader/Downloader.td.ts | 40 + .../concurrency.test.js | 107 + .../fixtures/Desert.jpg | Bin 0 -> 23642 bytes .../fixtures/Hydrangeas.jpg | Bin 0 -> 26826 bytes .../nodejs-file-downloader/fixtures/Koala.jpg | Bin 0 -> 29051 bytes .../fixtures/Lighthouse.jpg | Bin 0 -> 21171 bytes .../nodejs-file-downloader/fixtures/buba.jpeg | Bin 0 -> 2339 bytes .../nodejs-file-downloader/main.test.js | 849 + .../nodejs-file-downloader/makeRequest.js | 110 + .../nodejs-file-downloader/package.json | 50 + .../nodejs-file-downloader/readme.md | 335 + .../nodejs-file-downloader/testServer.js | 209 + .../timeout-cancellation.test.js | 359 + .../utils/FileProcessor.js | 91 + .../nodejs-file-downloader/utils/delay.js | 12 + .../nodejs-file-downloader/utils/fileName.js | 111 + .../nodejs-file-downloader/utils/rpur.js | 73 + .../nodejs-file-downloader/utils/stream.js | 53 + .../nodejs-file-downloader/utils/string.js | 19 + .../nodejs-file-downloader/utils/url.js | 23 + task/node_modules/object-inspect/.eslintrc | 53 + .../object-inspect/.github/FUNDING.yml | 12 + task/node_modules/object-inspect/.nycrc | 13 + task/node_modules/object-inspect/CHANGELOG.md | 389 + task/node_modules/object-inspect/LICENSE | 21 + .../object-inspect/example/all.js | 23 + .../object-inspect/example/circular.js | 6 + .../node_modules/object-inspect/example/fn.js | 5 + .../object-inspect/example/inspect.js | 10 + task/node_modules/object-inspect/index.js | 524 + .../object-inspect/package-support.json | 20 + task/node_modules/object-inspect/package.json | 99 + .../object-inspect/readme.markdown | 86 + .../object-inspect/test-core-js.js | 26 + .../object-inspect/test/bigint.js | 58 + .../object-inspect/test/browser/dom.js | 15 + .../object-inspect/test/circular.js | 16 + task/node_modules/object-inspect/test/deep.js | 12 + .../object-inspect/test/element.js | 53 + task/node_modules/object-inspect/test/err.js | 48 + .../node_modules/object-inspect/test/fakes.js | 29 + task/node_modules/object-inspect/test/fn.js | 76 + .../object-inspect/test/global.js | 17 + task/node_modules/object-inspect/test/has.js | 15 + .../node_modules/object-inspect/test/holes.js | 15 + .../object-inspect/test/indent-option.js | 271 + .../object-inspect/test/inspect.js | 139 + .../object-inspect/test/lowbyte.js | 12 + .../object-inspect/test/number.js | 58 + .../object-inspect/test/quoteStyle.js | 17 + .../object-inspect/test/toStringTag.js | 40 + .../node_modules/object-inspect/test/undef.js | 12 + .../object-inspect/test/values.js | 211 + .../object-inspect/util.inspect.js | 1 + task/node_modules/once/LICENSE | 15 + task/node_modules/once/README.md | 79 + task/node_modules/once/once.js | 42 + task/node_modules/once/package.json | 33 + .../parse-cache-control/.npmignore | 1 + task/node_modules/parse-cache-control/LICENSE | 26 + .../parse-cache-control/README.md | 5 + .../node_modules/parse-cache-control/index.js | 37 + .../parse-cache-control/package.json | 22 + task/node_modules/parse-cache-control/test.js | 31 + task/node_modules/path-is-absolute/index.js | 20 + task/node_modules/path-is-absolute/license | 21 + .../path-is-absolute/package.json | 43 + task/node_modules/path-is-absolute/readme.md | 59 + task/node_modules/path-parse/LICENSE | 21 + task/node_modules/path-parse/README.md | 42 + task/node_modules/path-parse/index.js | 75 + task/node_modules/path-parse/package.json | 33 + .../process-nextick-args/index.js | 45 + .../process-nextick-args/license.md | 19 + .../process-nextick-args/package.json | 25 + .../process-nextick-args/readme.md | 18 + task/node_modules/promise/.jshintrc | 5 + task/node_modules/promise/LICENSE | 19 + task/node_modules/promise/Readme.md | 274 + task/node_modules/promise/build.js | 66 + task/node_modules/promise/core.js | 5 + task/node_modules/promise/domains/core.js | 213 + task/node_modules/promise/domains/done.js | 13 + .../promise/domains/es6-extensions.js | 186 + task/node_modules/promise/domains/finally.js | 16 + task/node_modules/promise/domains/index.js | 8 + .../promise/domains/node-extensions.js | 130 + .../promise/domains/rejection-tracking.js | 113 + .../promise/domains/synchronous.js | 62 + task/node_modules/promise/index.d.ts | 353 + task/node_modules/promise/index.js | 3 + task/node_modules/promise/index.js.flow | 52 + task/node_modules/promise/lib/core.js | 213 + task/node_modules/promise/lib/done.js | 13 + .../promise/lib/es6-extensions.js | 186 + task/node_modules/promise/lib/finally.js | 16 + task/node_modules/promise/lib/index.js | 8 + .../promise/lib/node-extensions.js | 130 + .../promise/lib/rejection-tracking.js | 113 + task/node_modules/promise/lib/synchronous.js | 62 + task/node_modules/promise/package.json | 35 + task/node_modules/promise/polyfill-done.js | 12 + task/node_modules/promise/polyfill.js | 10 + .../node_modules/promise/setimmediate/core.js | 213 + .../node_modules/promise/setimmediate/done.js | 13 + .../promise/setimmediate/es6-extensions.js | 186 + .../promise/setimmediate/finally.js | 16 + .../promise/setimmediate/index.js | 8 + .../promise/setimmediate/node-extensions.js | 130 + .../setimmediate/rejection-tracking.js | 113 + .../promise/setimmediate/synchronous.js | 62 + task/node_modules/promise/src/core.js | 213 + task/node_modules/promise/src/done.js | 13 + .../promise/src/es6-extensions.js | 186 + task/node_modules/promise/src/finally.js | 16 + task/node_modules/promise/src/index.js | 8 + .../promise/src/node-extensions.js | 130 + .../promise/src/rejection-tracking.js | 113 + task/node_modules/promise/src/synchronous.js | 62 + task/node_modules/proxy-from-env/.eslintrc | 29 + task/node_modules/proxy-from-env/.travis.yml | 10 + task/node_modules/proxy-from-env/LICENSE | 20 + task/node_modules/proxy-from-env/README.md | 131 + task/node_modules/proxy-from-env/index.js | 108 + task/node_modules/proxy-from-env/package.json | 34 + task/node_modules/proxy-from-env/test.js | 483 + task/node_modules/q/CHANGES.md | 800 + task/node_modules/q/LICENSE | 18 + task/node_modules/q/README.md | 874 + task/node_modules/q/package.json | 76 + task/node_modules/q/q.js | 2076 ++ task/node_modules/q/queue.js | 35 + task/node_modules/qs/.editorconfig | 43 + task/node_modules/qs/.eslintrc | 38 + task/node_modules/qs/.github/FUNDING.yml | 12 + task/node_modules/qs/.nycrc | 13 + task/node_modules/qs/CHANGELOG.md | 559 + task/node_modules/qs/LICENSE.md | 29 + task/node_modules/qs/README.md | 663 + task/node_modules/qs/dist/qs.js | 2087 ++ task/node_modules/qs/lib/formats.js | 23 + task/node_modules/qs/lib/index.js | 11 + task/node_modules/qs/lib/parse.js | 264 + task/node_modules/qs/lib/stringify.js | 320 + task/node_modules/qs/lib/utils.js | 252 + task/node_modules/qs/package.json | 80 + task/node_modules/qs/test/empty-keys-cases.js | 37 + task/node_modules/qs/test/parse.js | 898 + task/node_modules/qs/test/stringify.js | 972 + task/node_modules/qs/test/utils.js | 136 + task/node_modules/readable-stream/.travis.yml | 34 + .../readable-stream/CONTRIBUTING.md | 38 + .../readable-stream/GOVERNANCE.md | 136 + task/node_modules/readable-stream/LICENSE | 47 + task/node_modules/readable-stream/README.md | 58 + .../doc/wg-meetings/2015-01-30.md | 60 + .../readable-stream/duplex-browser.js | 1 + task/node_modules/readable-stream/duplex.js | 1 + .../readable-stream/lib/_stream_duplex.js | 131 + .../lib/_stream_passthrough.js | 47 + .../readable-stream/lib/_stream_readable.js | 1019 + .../readable-stream/lib/_stream_transform.js | 214 + .../readable-stream/lib/_stream_writable.js | 685 + .../lib/internal/streams/BufferList.js | 78 + .../lib/internal/streams/destroy.js | 84 + .../lib/internal/streams/stream-browser.js | 1 + .../lib/internal/streams/stream.js | 1 + .../node_modules/readable-stream/package.json | 52 + .../readable-stream/passthrough.js | 1 + .../readable-stream/readable-browser.js | 7 + task/node_modules/readable-stream/readable.js | 19 + .../node_modules/readable-stream/transform.js | 1 + .../readable-stream/writable-browser.js | 1 + task/node_modules/readable-stream/writable.js | 8 + task/node_modules/rechoir/.npmignore | 1 + task/node_modules/rechoir/.travis.yml | 24 + task/node_modules/rechoir/CHANGELOG | 38 + task/node_modules/rechoir/LICENSE | 22 + task/node_modules/rechoir/README.md | 42 + task/node_modules/rechoir/index.js | 59 + task/node_modules/rechoir/lib/extension.js | 11 + task/node_modules/rechoir/lib/normalize.js | 15 + task/node_modules/rechoir/lib/register.js | 15 + task/node_modules/rechoir/package.json | 88 + task/node_modules/resolve/.editorconfig | 37 + task/node_modules/resolve/.eslintrc | 65 + task/node_modules/resolve/.github/FUNDING.yml | 12 + task/node_modules/resolve/LICENSE | 21 + task/node_modules/resolve/SECURITY.md | 3 + task/node_modules/resolve/async.js | 3 + task/node_modules/resolve/bin/resolve | 50 + task/node_modules/resolve/example/async.js | 5 + task/node_modules/resolve/example/sync.js | 3 + task/node_modules/resolve/index.js | 6 + task/node_modules/resolve/lib/async.js | 329 + task/node_modules/resolve/lib/caller.js | 8 + task/node_modules/resolve/lib/core.js | 12 + task/node_modules/resolve/lib/core.json | 158 + task/node_modules/resolve/lib/homedir.js | 24 + task/node_modules/resolve/lib/is-core.js | 5 + .../resolve/lib/node-modules-paths.js | 42 + .../resolve/lib/normalize-options.js | 10 + task/node_modules/resolve/lib/sync.js | 208 + task/node_modules/resolve/package.json | 72 + task/node_modules/resolve/readme.markdown | 301 + task/node_modules/resolve/sync.js | 3 + task/node_modules/resolve/test/core.js | 88 + task/node_modules/resolve/test/dotdot.js | 29 + .../resolve/test/dotdot/abc/index.js | 2 + .../node_modules/resolve/test/dotdot/index.js | 1 + .../resolve/test/faulty_basedir.js | 29 + task/node_modules/resolve/test/filter.js | 34 + task/node_modules/resolve/test/filter_sync.js | 33 + task/node_modules/resolve/test/home_paths.js | 127 + .../resolve/test/home_paths_sync.js | 114 + task/node_modules/resolve/test/mock.js | 315 + task/node_modules/resolve/test/mock_sync.js | 214 + task/node_modules/resolve/test/module_dir.js | 56 + .../test/module_dir/xmodules/aaa/index.js | 1 + .../test/module_dir/ymodules/aaa/index.js | 1 + .../test/module_dir/zmodules/bbb/main.js | 1 + .../test/module_dir/zmodules/bbb/package.json | 3 + .../resolve/test/node-modules-paths.js | 143 + task/node_modules/resolve/test/node_path.js | 70 + .../resolve/test/node_path/x/aaa/index.js | 1 + .../resolve/test/node_path/x/ccc/index.js | 1 + .../resolve/test/node_path/y/bbb/index.js | 1 + .../resolve/test/node_path/y/ccc/index.js | 1 + task/node_modules/resolve/test/nonstring.js | 9 + task/node_modules/resolve/test/pathfilter.js | 75 + .../resolve/test/pathfilter/deep_ref/main.js | 0 task/node_modules/resolve/test/precedence.js | 23 + .../resolve/test/precedence/aaa.js | 1 + .../resolve/test/precedence/aaa/index.js | 1 + .../resolve/test/precedence/aaa/main.js | 1 + .../resolve/test/precedence/bbb.js | 1 + .../resolve/test/precedence/bbb/main.js | 1 + task/node_modules/resolve/test/resolver.js | 597 + .../resolve/test/resolver/baz/doom.js | 0 .../resolve/test/resolver/baz/package.json | 4 + .../resolve/test/resolver/baz/quux.js | 1 + .../resolve/test/resolver/browser_field/a.js | 0 .../resolve/test/resolver/browser_field/b.js | 0 .../test/resolver/browser_field/package.json | 5 + .../resolve/test/resolver/cup.coffee | 1 + .../resolve/test/resolver/dot_main/index.js | 1 + .../test/resolver/dot_main/package.json | 3 + .../test/resolver/dot_slash_main/index.js | 1 + .../test/resolver/dot_slash_main/package.json | 3 + .../resolve/test/resolver/false_main/index.js | 0 .../test/resolver/false_main/package.json | 4 + .../node_modules/resolve/test/resolver/foo.js | 1 + .../test/resolver/incorrect_main/index.js | 2 + .../test/resolver/incorrect_main/package.json | 3 + .../test/resolver/invalid_main/package.json | 7 + .../resolve/test/resolver/mug.coffee | 0 .../node_modules/resolve/test/resolver/mug.js | 0 .../test/resolver/multirepo/lerna.json | 6 + .../test/resolver/multirepo/package.json | 20 + .../multirepo/packages/package-a/index.js | 35 + .../multirepo/packages/package-a/package.json | 14 + .../multirepo/packages/package-b/index.js | 0 .../multirepo/packages/package-b/package.json | 14 + .../resolver/nested_symlinks/mylib/async.js | 26 + .../nested_symlinks/mylib/package.json | 15 + .../resolver/nested_symlinks/mylib/sync.js | 12 + .../test/resolver/other_path/lib/other-lib.js | 0 .../resolve/test/resolver/other_path/root.js | 0 .../resolve/test/resolver/quux/foo/index.js | 1 + .../resolve/test/resolver/same_names/foo.js | 1 + .../test/resolver/same_names/foo/index.js | 1 + .../resolver/symlinked/_/node_modules/foo.js | 0 .../symlinked/_/symlink_target/.gitkeep | 0 .../test/resolver/symlinked/package/bar.js | 1 + .../resolver/symlinked/package/package.json | 3 + .../test/resolver/without_basedir/main.js | 5 + .../resolve/test/resolver_sync.js | 730 + .../resolve/test/shadowed_core.js | 54 + .../shadowed_core/node_modules/util/index.js | 0 task/node_modules/resolve/test/subdirs.js | 13 + task/node_modules/resolve/test/symlinks.js | 176 + task/node_modules/rimraf/LICENSE | 15 + task/node_modules/rimraf/README.md | 43 + task/node_modules/rimraf/bin.js | 40 + .../rimraf/node_modules/glob/LICENSE | 15 + .../rimraf/node_modules/glob/README.md | 359 + .../rimraf/node_modules/glob/common.js | 226 + .../rimraf/node_modules/glob/glob.js | 765 + .../rimraf/node_modules/glob/package.json | 42 + .../rimraf/node_modules/glob/sync.js | 460 + task/node_modules/rimraf/package.json | 26 + task/node_modules/rimraf/rimraf.js | 333 + task/node_modules/safe-buffer/LICENSE | 21 + task/node_modules/safe-buffer/README.md | 584 + task/node_modules/safe-buffer/index.d.ts | 187 + task/node_modules/safe-buffer/index.js | 62 + task/node_modules/safe-buffer/package.json | 37 + .../safe-json-stringify/.idea/misc.xml | 6 + .../safe-json-stringify/.idea/modules.xml | 8 + .../.idea/safe-json-stringify.iml | 12 + .../safe-json-stringify/.idea/vcs.xml | 6 + .../safe-json-stringify/.idea/workspace.xml | 313 + .../safe-json-stringify/.travis.yml | 8 + .../safe-json-stringify/README.md | 105 + .../node_modules/safe-json-stringify/index.js | 65 + .../safe-json-stringify/package.json | 24 + .../sanitize-filename/.airtap.yml | 16 + .../sanitize-filename/.gitmodules | 3 + .../sanitize-filename/.travis.yml | 55 + task/node_modules/sanitize-filename/AUTHORS | 2 + .../sanitize-filename/Changelog.md | 6 + .../node_modules/sanitize-filename/LICENSE.md | 34 + task/node_modules/sanitize-filename/README.md | 103 + .../node_modules/sanitize-filename/index.d.ts | 8 + task/node_modules/sanitize-filename/index.js | 59 + .../sanitize-filename/package.json | 36 + task/node_modules/sanitize-filename/test.js | 305 + task/node_modules/semver/LICENSE | 15 + task/node_modules/semver/README.md | 412 + task/node_modules/semver/bin/semver | 160 + task/node_modules/semver/package.json | 38 + task/node_modules/semver/range.bnf | 16 + task/node_modules/semver/semver.js | 1525 ++ .../set-function-length/.eslintrc | 27 + .../set-function-length/.github/FUNDING.yml | 12 + task/node_modules/set-function-length/.nycrc | 13 + .../set-function-length/CHANGELOG.md | 41 + task/node_modules/set-function-length/LICENSE | 21 + .../set-function-length/README.md | 56 + task/node_modules/set-function-length/env.js | 19 + .../node_modules/set-function-length/index.js | 41 + .../set-function-length/package.json | 84 + task/node_modules/shelljs/CHANGELOG.md | 942 + task/node_modules/shelljs/LICENSE | 26 + task/node_modules/shelljs/README.md | 835 + task/node_modules/shelljs/bin/shjs | 48 + task/node_modules/shelljs/commands.js | 29 + task/node_modules/shelljs/global.js | 12 + task/node_modules/shelljs/make.js | 57 + task/node_modules/shelljs/package.json | 79 + task/node_modules/shelljs/plugin.js | 16 + task/node_modules/shelljs/shell.js | 156 + task/node_modules/shelljs/src/cat.js | 76 + task/node_modules/shelljs/src/cd.js | 39 + task/node_modules/shelljs/src/chmod.js | 216 + task/node_modules/shelljs/src/common.js | 468 + task/node_modules/shelljs/src/cp.js | 304 + task/node_modules/shelljs/src/dirs.js | 212 + task/node_modules/shelljs/src/echo.js | 63 + task/node_modules/shelljs/src/error.js | 15 + task/node_modules/shelljs/src/exec-child.js | 39 + task/node_modules/shelljs/src/exec.js | 226 + task/node_modules/shelljs/src/find.js | 61 + task/node_modules/shelljs/src/grep.js | 73 + task/node_modules/shelljs/src/head.js | 107 + task/node_modules/shelljs/src/ln.js | 73 + task/node_modules/shelljs/src/ls.js | 141 + task/node_modules/shelljs/src/mkdir.js | 100 + task/node_modules/shelljs/src/mv.js | 118 + task/node_modules/shelljs/src/popd.js | 1 + task/node_modules/shelljs/src/pushd.js | 1 + task/node_modules/shelljs/src/pwd.js | 16 + task/node_modules/shelljs/src/rm.js | 201 + task/node_modules/shelljs/src/sed.js | 87 + task/node_modules/shelljs/src/set.js | 56 + task/node_modules/shelljs/src/sort.js | 97 + task/node_modules/shelljs/src/tail.js | 80 + task/node_modules/shelljs/src/tempdir.js | 75 + task/node_modules/shelljs/src/test.js | 85 + task/node_modules/shelljs/src/to.js | 37 + task/node_modules/shelljs/src/toEnd.js | 36 + task/node_modules/shelljs/src/touch.js | 111 + task/node_modules/shelljs/src/uniq.js | 92 + task/node_modules/shelljs/src/which.js | 118 + task/node_modules/side-channel/.eslintignore | 1 + task/node_modules/side-channel/.eslintrc | 11 + .../side-channel/.github/FUNDING.yml | 12 + task/node_modules/side-channel/.nycrc | 13 + task/node_modules/side-channel/CHANGELOG.md | 65 + task/node_modules/side-channel/LICENSE | 21 + task/node_modules/side-channel/README.md | 2 + task/node_modules/side-channel/index.js | 124 + task/node_modules/side-channel/package.json | 67 + task/node_modules/side-channel/test/index.js | 78 + task/node_modules/string_decoder/.travis.yml | 50 + task/node_modules/string_decoder/LICENSE | 48 + task/node_modules/string_decoder/README.md | 47 + .../string_decoder/lib/string_decoder.js | 296 + task/node_modules/string_decoder/package.json | 31 + .../supports-preserve-symlinks-flag/.eslintrc | 14 + .../.github/FUNDING.yml | 12 + .../supports-preserve-symlinks-flag/.nycrc | 9 + .../CHANGELOG.md | 22 + .../supports-preserve-symlinks-flag/LICENSE | 21 + .../supports-preserve-symlinks-flag/README.md | 42 + .../browser.js | 3 + .../supports-preserve-symlinks-flag/index.js | 9 + .../package.json | 70 + .../test/index.js | 29 + task/node_modules/sync-request/.prettierrc | 5 + task/node_modules/sync-request/.travis.yml | 4 + task/node_modules/sync-request/LICENSE | 19 + task/node_modules/sync-request/README.md | 132 + .../sync-request/lib/FormData.d.ts | 11 + .../node_modules/sync-request/lib/FormData.js | 16 + .../sync-request/lib/FormData.js.flow | 17 + .../sync-request/lib/Options.d.ts | 18 + task/node_modules/sync-request/lib/Options.js | 2 + .../sync-request/lib/Options.js.flow | 27 + .../sync-request/lib/browser.d.ts | 7 + task/node_modules/sync-request/lib/browser.js | 69 + .../sync-request/lib/browser.js.flow | 16 + task/node_modules/sync-request/lib/index.d.ts | 8 + task/node_modules/sync-request/lib/index.js | 34 + .../sync-request/lib/index.js.flow | 19 + .../sync-request/lib/messages.d.ts | 13 + .../node_modules/sync-request/lib/messages.js | 2 + .../sync-request/lib/messages.js.flow | 17 + .../node_modules/sync-request/lib/worker.d.ts | 0 task/node_modules/sync-request/lib/worker.js | 33 + .../sync-request/lib/worker.js.flow | 2 + task/node_modules/sync-request/package.json | 49 + .../node_modules/sync-request/src/FormData.ts | 15 + task/node_modules/sync-request/src/Options.ts | 29 + task/node_modules/sync-request/src/browser.ts | 91 + task/node_modules/sync-request/src/index.ts | 32 + .../node_modules/sync-request/src/messages.ts | 13 + task/node_modules/sync-request/src/worker.ts | 24 + .../test/__snapshots__/external.test.js.snap | 57 + .../test/__snapshots__/internal.test.js.snap | 9 + .../sync-request/test/benchmark-server.js | 7 + .../sync-request/test/benchmark.js | 42 + .../sync-request/test/external.test.js | 54 + .../sync-request/test/fake-server.js | 42 + .../sync-request/test/internal.test.js | 61 + task/node_modules/sync-request/tsconfig.json | 8 + task/node_modules/sync-rpc/HISTORY.md | 5 + task/node_modules/sync-rpc/LICENSE.md | 21 + task/node_modules/sync-rpc/README.md | 43 + .../sync-rpc/lib/__tests__/index.test.js | 75 + task/node_modules/sync-rpc/lib/find-port.js | 11 + task/node_modules/sync-rpc/lib/index.js | 181 + .../sync-rpc/lib/json-buffer/LICENSE | 22 + .../sync-rpc/lib/json-buffer/README.md | 1 + .../sync-rpc/lib/json-buffer/index.js | 52 + task/node_modules/sync-rpc/lib/test-worker.js | 9 + task/node_modules/sync-rpc/lib/worker.js | 68 + task/node_modules/sync-rpc/package.json | 41 + task/node_modules/then-request/HISTORY.md | 79 + task/node_modules/then-request/LICENSE | 19 + task/node_modules/then-request/README.md | 135 + .../then-request/lib/Options.d.ts | 30 + task/node_modules/then-request/lib/Options.js | 2 + .../then-request/lib/Options.js.flow | 52 + .../then-request/lib/RequestFn.d.ts | 5 + .../then-request/lib/RequestFn.js | 2 + .../then-request/lib/RequestFn.js.flow | 14 + .../then-request/lib/ResponsePromise.d.ts | 9 + .../then-request/lib/ResponsePromise.js | 27 + .../then-request/lib/ResponsePromise.js.flow | 17 + .../then-request/lib/browser.d.ts | 13 + task/node_modules/then-request/lib/browser.js | 124 + .../then-request/lib/browser.js.flow | 21 + .../then-request/lib/handle-qs.d.ts | 3 + .../then-request/lib/handle-qs.js | 18 + .../then-request/lib/handle-qs.js.flow | 5 + task/node_modules/then-request/lib/index.d.ts | 13 + task/node_modules/then-request/lib/index.js | 176 + .../then-request/lib/index.js.flow | 21 + .../node_modules/@types/node/LICENSE | 21 + .../node_modules/@types/node/README.md | 16 + .../node_modules/@types/node/base.d.ts | 7386 ++++++ .../node_modules/@types/node/index.d.ts | 48 + .../node_modules/@types/node/inspector.d.ts | 2512 +++ .../node_modules/@types/node/package.json | 134 + task/node_modules/then-request/package.json | 58 + .../truncate-utf8-bytes/.gitmodules | 3 + .../truncate-utf8-bytes/.npmignore | 1 + .../truncate-utf8-bytes/.travis.yml | 12 + task/node_modules/truncate-utf8-bytes/AUTHORS | 2 + .../truncate-utf8-bytes/README.md | 27 + .../truncate-utf8-bytes/browser.js | 5 + .../node_modules/truncate-utf8-bytes/index.js | 5 + .../truncate-utf8-bytes/lib/truncate.js | 43 + .../truncate-utf8-bytes/package.json | 30 + task/node_modules/truncate-utf8-bytes/test.js | 75 + task/node_modules/typedarray/.travis.yml | 4 + task/node_modules/typedarray/LICENSE | 35 + .../node_modules/typedarray/example/tarray.js | 4 + task/node_modules/typedarray/index.js | 630 + task/node_modules/typedarray/package.json | 55 + task/node_modules/typedarray/readme.markdown | 61 + .../typedarray/test/server/undef_globals.js | 19 + task/node_modules/typedarray/test/tarray.js | 10 + task/node_modules/undici-types/README.md | 6 + task/node_modules/undici-types/agent.d.ts | 31 + task/node_modules/undici-types/api.d.ts | 43 + .../undici-types/balanced-pool.d.ts | 18 + task/node_modules/undici-types/cache.d.ts | 36 + task/node_modules/undici-types/client.d.ts | 97 + task/node_modules/undici-types/connector.d.ts | 34 + .../undici-types/content-type.d.ts | 21 + task/node_modules/undici-types/cookies.d.ts | 28 + .../undici-types/diagnostics-channel.d.ts | 67 + .../node_modules/undici-types/dispatcher.d.ts | 241 + task/node_modules/undici-types/errors.d.ts | 128 + task/node_modules/undici-types/fetch.d.ts | 209 + task/node_modules/undici-types/file.d.ts | 39 + .../node_modules/undici-types/filereader.d.ts | 54 + task/node_modules/undici-types/formdata.d.ts | 108 + .../undici-types/global-dispatcher.d.ts | 9 + .../undici-types/global-origin.d.ts | 7 + task/node_modules/undici-types/handlers.d.ts | 9 + task/node_modules/undici-types/header.d.ts | 4 + task/node_modules/undici-types/index.d.ts | 63 + .../undici-types/interceptors.d.ts | 5 + .../node_modules/undici-types/mock-agent.d.ts | 50 + .../undici-types/mock-client.d.ts | 25 + .../undici-types/mock-errors.d.ts | 12 + .../undici-types/mock-interceptor.d.ts | 93 + task/node_modules/undici-types/mock-pool.d.ts | 25 + task/node_modules/undici-types/package.json | 55 + task/node_modules/undici-types/patch.d.ts | 71 + .../node_modules/undici-types/pool-stats.d.ts | 19 + task/node_modules/undici-types/pool.d.ts | 28 + .../undici-types/proxy-agent.d.ts | 30 + task/node_modules/undici-types/readable.d.ts | 61 + task/node_modules/undici-types/webidl.d.ts | 220 + task/node_modules/undici-types/websocket.d.ts | 131 + .../node_modules/utf8-byte-length/.gitmodules | 3 + task/node_modules/utf8-byte-length/.npmignore | 1 + .../node_modules/utf8-byte-length/.travis.yml | 12 + task/node_modules/utf8-byte-length/AUTHORS | 2 + task/node_modules/utf8-byte-length/README.md | 28 + task/node_modules/utf8-byte-length/browser.js | 47 + task/node_modules/utf8-byte-length/index.js | 8 + .../utf8-byte-length/package.json | 26 + task/node_modules/utf8-byte-length/test.js | 67 + task/node_modules/util-deprecate/History.md | 16 + task/node_modules/util-deprecate/LICENSE | 24 + task/node_modules/util-deprecate/README.md | 53 + task/node_modules/util-deprecate/browser.js | 67 + task/node_modules/util-deprecate/node.js | 6 + task/node_modules/util-deprecate/package.json | 27 + task/node_modules/uuid/AUTHORS | 5 + task/node_modules/uuid/CHANGELOG.md | 119 + task/node_modules/uuid/LICENSE.md | 21 + task/node_modules/uuid/README.md | 276 + task/node_modules/uuid/bin/uuid | 65 + task/node_modules/uuid/index.js | 8 + task/node_modules/uuid/lib/bytesToUuid.js | 26 + task/node_modules/uuid/lib/md5-browser.js | 216 + task/node_modules/uuid/lib/md5.js | 25 + task/node_modules/uuid/lib/rng-browser.js | 34 + task/node_modules/uuid/lib/rng.js | 8 + task/node_modules/uuid/lib/sha1-browser.js | 89 + task/node_modules/uuid/lib/sha1.js | 25 + task/node_modules/uuid/lib/v35.js | 57 + task/node_modules/uuid/package.json | 49 + task/node_modules/uuid/v1.js | 109 + task/node_modules/uuid/v3.js | 4 + task/node_modules/uuid/v4.js | 29 + task/node_modules/uuid/v5.js | 3 + task/node_modules/wrappy/LICENSE | 15 + task/node_modules/wrappy/README.md | 36 + task/node_modules/wrappy/package.json | 29 + task/node_modules/wrappy/wrappy.js | 33 + task/task.json | 33 +- vss-extension-dev.json | 9 +- 2153 files changed, 380217 insertions(+), 91 deletions(-) create mode 120000 task/node_modules/.bin/bunyan create mode 120000 task/node_modules/.bin/mkdirp create mode 120000 task/node_modules/.bin/ncp create mode 120000 task/node_modules/.bin/resolve create mode 120000 task/node_modules/.bin/rimraf create mode 120000 task/node_modules/.bin/semver create mode 120000 task/node_modules/.bin/shjs create mode 120000 task/node_modules/.bin/uuid create mode 100644 task/node_modules/.package-lock.json create mode 100644 task/node_modules/@types/axios/README.md create mode 100644 task/node_modules/@types/axios/package.json create mode 100644 task/node_modules/@types/bunyan/LICENSE create mode 100644 task/node_modules/@types/bunyan/README.md create mode 100644 task/node_modules/@types/bunyan/index.d.ts create mode 100644 task/node_modules/@types/bunyan/package.json create mode 100755 task/node_modules/@types/concat-stream/LICENSE create mode 100755 task/node_modules/@types/concat-stream/README.md create mode 100755 task/node_modules/@types/concat-stream/index.d.ts create mode 100755 task/node_modules/@types/concat-stream/package.json create mode 100644 task/node_modules/@types/form-data/README.md create mode 100644 task/node_modules/@types/form-data/index.d.ts create mode 100644 task/node_modules/@types/form-data/package.json create mode 100644 task/node_modules/@types/form-data/types-metadata.json create mode 100644 task/node_modules/@types/mocha/LICENSE create mode 100644 task/node_modules/@types/mocha/README.md create mode 100644 task/node_modules/@types/mocha/index.d.ts create mode 100644 task/node_modules/@types/mocha/package.json create mode 100644 task/node_modules/@types/node/LICENSE create mode 100644 task/node_modules/@types/node/README.md create mode 100644 task/node_modules/@types/node/assert.d.ts create mode 100644 task/node_modules/@types/node/assert/strict.d.ts create mode 100644 task/node_modules/@types/node/async_hooks.d.ts create mode 100644 task/node_modules/@types/node/buffer.d.ts create mode 100644 task/node_modules/@types/node/child_process.d.ts create mode 100644 task/node_modules/@types/node/cluster.d.ts create mode 100644 task/node_modules/@types/node/console.d.ts create mode 100644 task/node_modules/@types/node/constants.d.ts create mode 100644 task/node_modules/@types/node/crypto.d.ts create mode 100644 task/node_modules/@types/node/dgram.d.ts create mode 100644 task/node_modules/@types/node/diagnostics_channel.d.ts create mode 100644 task/node_modules/@types/node/dns.d.ts create mode 100644 task/node_modules/@types/node/dns/promises.d.ts create mode 100644 task/node_modules/@types/node/dom-events.d.ts create mode 100644 task/node_modules/@types/node/domain.d.ts create mode 100644 task/node_modules/@types/node/events.d.ts create mode 100644 task/node_modules/@types/node/fs.d.ts create mode 100644 task/node_modules/@types/node/fs/promises.d.ts create mode 100644 task/node_modules/@types/node/globals.d.ts create mode 100644 task/node_modules/@types/node/globals.global.d.ts create mode 100644 task/node_modules/@types/node/http.d.ts create mode 100644 task/node_modules/@types/node/http2.d.ts create mode 100644 task/node_modules/@types/node/https.d.ts create mode 100644 task/node_modules/@types/node/index.d.ts create mode 100644 task/node_modules/@types/node/inspector.d.ts create mode 100644 task/node_modules/@types/node/module.d.ts create mode 100644 task/node_modules/@types/node/net.d.ts create mode 100644 task/node_modules/@types/node/os.d.ts create mode 100644 task/node_modules/@types/node/package.json create mode 100644 task/node_modules/@types/node/path.d.ts create mode 100644 task/node_modules/@types/node/perf_hooks.d.ts create mode 100644 task/node_modules/@types/node/process.d.ts create mode 100644 task/node_modules/@types/node/punycode.d.ts create mode 100644 task/node_modules/@types/node/querystring.d.ts create mode 100644 task/node_modules/@types/node/readline.d.ts create mode 100644 task/node_modules/@types/node/readline/promises.d.ts create mode 100644 task/node_modules/@types/node/repl.d.ts create mode 100644 task/node_modules/@types/node/stream.d.ts create mode 100644 task/node_modules/@types/node/stream/consumers.d.ts create mode 100644 task/node_modules/@types/node/stream/promises.d.ts create mode 100644 task/node_modules/@types/node/stream/web.d.ts create mode 100644 task/node_modules/@types/node/string_decoder.d.ts create mode 100644 task/node_modules/@types/node/test.d.ts create mode 100644 task/node_modules/@types/node/timers.d.ts create mode 100644 task/node_modules/@types/node/timers/promises.d.ts create mode 100644 task/node_modules/@types/node/tls.d.ts create mode 100644 task/node_modules/@types/node/trace_events.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/assert.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/assert/strict.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/async_hooks.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/buffer.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/child_process.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/cluster.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/console.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/constants.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/crypto.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/dgram.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/diagnostics_channel.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/dns.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/dns/promises.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/dom-events.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/domain.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/events.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/fs.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/fs/promises.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/globals.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/globals.global.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/http.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/http2.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/https.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/index.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/inspector.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/module.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/net.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/os.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/path.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/perf_hooks.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/process.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/punycode.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/querystring.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/readline.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/readline/promises.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/repl.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/stream.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/stream/consumers.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/stream/promises.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/stream/web.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/string_decoder.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/test.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/timers.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/timers/promises.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/tls.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/trace_events.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/tty.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/url.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/util.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/v8.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/vm.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/wasi.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/worker_threads.d.ts create mode 100644 task/node_modules/@types/node/ts4.8/zlib.d.ts create mode 100644 task/node_modules/@types/node/tty.d.ts create mode 100644 task/node_modules/@types/node/url.d.ts create mode 100644 task/node_modules/@types/node/util.d.ts create mode 100644 task/node_modules/@types/node/v8.d.ts create mode 100644 task/node_modules/@types/node/vm.d.ts create mode 100644 task/node_modules/@types/node/wasi.d.ts create mode 100644 task/node_modules/@types/node/worker_threads.d.ts create mode 100644 task/node_modules/@types/node/zlib.d.ts create mode 100644 task/node_modules/@types/q/LICENSE create mode 100644 task/node_modules/@types/q/README.md create mode 100644 task/node_modules/@types/q/index.d.ts create mode 100644 task/node_modules/@types/q/package.json create mode 100644 task/node_modules/@types/qs/LICENSE create mode 100644 task/node_modules/@types/qs/README.md create mode 100644 task/node_modules/@types/qs/index.d.ts create mode 100644 task/node_modules/@types/qs/package.json create mode 100644 task/node_modules/adm-zip/LICENSE create mode 100644 task/node_modules/adm-zip/README.md create mode 100644 task/node_modules/adm-zip/adm-zip.js create mode 100644 task/node_modules/adm-zip/headers/entryHeader.js create mode 100644 task/node_modules/adm-zip/headers/index.js create mode 100644 task/node_modules/adm-zip/headers/mainHeader.js create mode 100644 task/node_modules/adm-zip/methods/deflater.js create mode 100644 task/node_modules/adm-zip/methods/index.js create mode 100644 task/node_modules/adm-zip/methods/inflater.js create mode 100644 task/node_modules/adm-zip/methods/zipcrypto.js create mode 100644 task/node_modules/adm-zip/package.json create mode 100644 task/node_modules/adm-zip/util/constants.js create mode 100644 task/node_modules/adm-zip/util/errors.js create mode 100644 task/node_modules/adm-zip/util/fattr.js create mode 100644 task/node_modules/adm-zip/util/fileSystem.js create mode 100644 task/node_modules/adm-zip/util/index.js create mode 100644 task/node_modules/adm-zip/util/utils.js create mode 100644 task/node_modules/adm-zip/zipEntry.js create mode 100644 task/node_modules/adm-zip/zipFile.js create mode 100644 task/node_modules/agent-base/README.md create mode 100644 task/node_modules/agent-base/dist/src/index.d.ts create mode 100644 task/node_modules/agent-base/dist/src/index.js create mode 100644 task/node_modules/agent-base/dist/src/index.js.map create mode 100644 task/node_modules/agent-base/dist/src/promisify.d.ts create mode 100644 task/node_modules/agent-base/dist/src/promisify.js create mode 100644 task/node_modules/agent-base/dist/src/promisify.js.map create mode 100644 task/node_modules/agent-base/package.json create mode 100644 task/node_modules/agent-base/src/index.ts create mode 100644 task/node_modules/agent-base/src/promisify.ts create mode 100644 task/node_modules/asap/CHANGES.md create mode 100644 task/node_modules/asap/LICENSE.md create mode 100644 task/node_modules/asap/README.md create mode 100644 task/node_modules/asap/asap.js create mode 100644 task/node_modules/asap/browser-asap.js create mode 100644 task/node_modules/asap/browser-raw.js create mode 100644 task/node_modules/asap/package.json create mode 100644 task/node_modules/asap/raw.js create mode 100644 task/node_modules/asynckit/LICENSE create mode 100644 task/node_modules/asynckit/README.md create mode 100644 task/node_modules/asynckit/bench.js create mode 100644 task/node_modules/asynckit/index.js create mode 100644 task/node_modules/asynckit/lib/abort.js create mode 100644 task/node_modules/asynckit/lib/async.js create mode 100644 task/node_modules/asynckit/lib/defer.js create mode 100644 task/node_modules/asynckit/lib/iterate.js create mode 100644 task/node_modules/asynckit/lib/readable_asynckit.js create mode 100644 task/node_modules/asynckit/lib/readable_parallel.js create mode 100644 task/node_modules/asynckit/lib/readable_serial.js create mode 100644 task/node_modules/asynckit/lib/readable_serial_ordered.js create mode 100644 task/node_modules/asynckit/lib/state.js create mode 100644 task/node_modules/asynckit/lib/streamify.js create mode 100644 task/node_modules/asynckit/lib/terminator.js create mode 100644 task/node_modules/asynckit/package.json create mode 100644 task/node_modules/asynckit/parallel.js create mode 100644 task/node_modules/asynckit/serial.js create mode 100644 task/node_modules/asynckit/serialOrdered.js create mode 100644 task/node_modules/asynckit/stream.js create mode 100644 task/node_modules/axios-retry/LICENSE create mode 100644 task/node_modules/axios-retry/README.md create mode 100644 task/node_modules/axios-retry/dist/cjs/index.d.ts create mode 100644 task/node_modules/axios-retry/dist/cjs/index.js create mode 100644 task/node_modules/axios-retry/dist/cjs/package.json create mode 100644 task/node_modules/axios-retry/dist/esm/index.d.ts create mode 100644 task/node_modules/axios-retry/dist/esm/index.js create mode 100644 task/node_modules/axios-retry/dist/esm/package.json create mode 100644 task/node_modules/axios-retry/package.json create mode 100644 task/node_modules/axios/CHANGELOG.md create mode 100644 task/node_modules/axios/LICENSE create mode 100644 task/node_modules/axios/MIGRATION_GUIDE.md create mode 100644 task/node_modules/axios/README.md create mode 100644 task/node_modules/axios/SECURITY.md create mode 100644 task/node_modules/axios/dist/axios.js create mode 100644 task/node_modules/axios/dist/axios.js.map create mode 100644 task/node_modules/axios/dist/axios.min.js create mode 100644 task/node_modules/axios/dist/axios.min.js.map create mode 100644 task/node_modules/axios/dist/browser/axios.cjs create mode 100644 task/node_modules/axios/dist/browser/axios.cjs.map create mode 100644 task/node_modules/axios/dist/esm/axios.js create mode 100644 task/node_modules/axios/dist/esm/axios.js.map create mode 100644 task/node_modules/axios/dist/esm/axios.min.js create mode 100644 task/node_modules/axios/dist/esm/axios.min.js.map create mode 100644 task/node_modules/axios/dist/node/axios.cjs create mode 100644 task/node_modules/axios/dist/node/axios.cjs.map create mode 100644 task/node_modules/axios/index.d.cts create mode 100644 task/node_modules/axios/index.d.ts create mode 100644 task/node_modules/axios/index.js create mode 100644 task/node_modules/axios/lib/adapters/README.md create mode 100644 task/node_modules/axios/lib/adapters/adapters.js create mode 100755 task/node_modules/axios/lib/adapters/http.js create mode 100644 task/node_modules/axios/lib/adapters/xhr.js create mode 100644 task/node_modules/axios/lib/axios.js create mode 100644 task/node_modules/axios/lib/cancel/CancelToken.js create mode 100644 task/node_modules/axios/lib/cancel/CanceledError.js create mode 100644 task/node_modules/axios/lib/cancel/isCancel.js create mode 100644 task/node_modules/axios/lib/core/Axios.js create mode 100644 task/node_modules/axios/lib/core/AxiosError.js create mode 100644 task/node_modules/axios/lib/core/AxiosHeaders.js create mode 100644 task/node_modules/axios/lib/core/InterceptorManager.js create mode 100644 task/node_modules/axios/lib/core/README.md create mode 100644 task/node_modules/axios/lib/core/buildFullPath.js create mode 100644 task/node_modules/axios/lib/core/dispatchRequest.js create mode 100644 task/node_modules/axios/lib/core/mergeConfig.js create mode 100644 task/node_modules/axios/lib/core/settle.js create mode 100644 task/node_modules/axios/lib/core/transformData.js create mode 100644 task/node_modules/axios/lib/defaults/index.js create mode 100644 task/node_modules/axios/lib/defaults/transitional.js create mode 100644 task/node_modules/axios/lib/env/README.md create mode 100644 task/node_modules/axios/lib/env/classes/FormData.js create mode 100644 task/node_modules/axios/lib/env/data.js create mode 100644 task/node_modules/axios/lib/helpers/AxiosTransformStream.js create mode 100644 task/node_modules/axios/lib/helpers/AxiosURLSearchParams.js create mode 100644 task/node_modules/axios/lib/helpers/HttpStatusCode.js create mode 100644 task/node_modules/axios/lib/helpers/README.md create mode 100644 task/node_modules/axios/lib/helpers/ZlibHeaderTransformStream.js create mode 100644 task/node_modules/axios/lib/helpers/bind.js create mode 100644 task/node_modules/axios/lib/helpers/buildURL.js create mode 100644 task/node_modules/axios/lib/helpers/callbackify.js create mode 100644 task/node_modules/axios/lib/helpers/combineURLs.js create mode 100644 task/node_modules/axios/lib/helpers/cookies.js create mode 100644 task/node_modules/axios/lib/helpers/deprecatedMethod.js create mode 100644 task/node_modules/axios/lib/helpers/formDataToJSON.js create mode 100644 task/node_modules/axios/lib/helpers/formDataToStream.js create mode 100644 task/node_modules/axios/lib/helpers/fromDataURI.js create mode 100644 task/node_modules/axios/lib/helpers/isAbsoluteURL.js create mode 100644 task/node_modules/axios/lib/helpers/isAxiosError.js create mode 100644 task/node_modules/axios/lib/helpers/isURLSameOrigin.js create mode 100644 task/node_modules/axios/lib/helpers/null.js create mode 100644 task/node_modules/axios/lib/helpers/parseHeaders.js create mode 100644 task/node_modules/axios/lib/helpers/parseProtocol.js create mode 100644 task/node_modules/axios/lib/helpers/readBlob.js create mode 100644 task/node_modules/axios/lib/helpers/speedometer.js create mode 100644 task/node_modules/axios/lib/helpers/spread.js create mode 100644 task/node_modules/axios/lib/helpers/throttle.js create mode 100644 task/node_modules/axios/lib/helpers/toFormData.js create mode 100644 task/node_modules/axios/lib/helpers/toURLEncodedForm.js create mode 100644 task/node_modules/axios/lib/helpers/validator.js create mode 100644 task/node_modules/axios/lib/platform/browser/classes/Blob.js create mode 100644 task/node_modules/axios/lib/platform/browser/classes/FormData.js create mode 100644 task/node_modules/axios/lib/platform/browser/classes/URLSearchParams.js create mode 100644 task/node_modules/axios/lib/platform/browser/index.js create mode 100644 task/node_modules/axios/lib/platform/common/utils.js create mode 100644 task/node_modules/axios/lib/platform/index.js create mode 100644 task/node_modules/axios/lib/platform/node/classes/FormData.js create mode 100644 task/node_modules/axios/lib/platform/node/classes/URLSearchParams.js create mode 100644 task/node_modules/axios/lib/platform/node/index.js create mode 100644 task/node_modules/axios/lib/utils.js create mode 100644 task/node_modules/axios/node_modules/form-data/License create mode 100644 task/node_modules/axios/node_modules/form-data/README.md.bak create mode 100644 task/node_modules/axios/node_modules/form-data/Readme.md create mode 100644 task/node_modules/axios/node_modules/form-data/index.d.ts create mode 100644 task/node_modules/axios/node_modules/form-data/lib/browser.js create mode 100644 task/node_modules/axios/node_modules/form-data/lib/form_data.js create mode 100644 task/node_modules/axios/node_modules/form-data/lib/populate.js create mode 100644 task/node_modules/axios/node_modules/form-data/package.json create mode 100644 task/node_modules/axios/package.json create mode 100644 task/node_modules/azure-pipelines-task-lib/LICENSE create mode 100644 task/node_modules/azure-pipelines-task-lib/README.md create mode 100644 task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/de-DE/resources.resjson create mode 100644 task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/en-US/resources.resjson create mode 100644 task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/es-ES/resources.resjson create mode 100644 task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/fr-FR/resources.resjson create mode 100644 task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/it-IT/resources.resjson create mode 100644 task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/ja-JP/resources.resjson create mode 100644 task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/ko-KR/resources.resjson create mode 100644 task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/ru-RU/resources.resjson create mode 100644 task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/zh-CN/resources.resjson create mode 100644 task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/zh-TW/resources.resjson create mode 100644 task/node_modules/azure-pipelines-task-lib/ThirdPartyNotice.txt create mode 100644 task/node_modules/azure-pipelines-task-lib/internal.d.ts create mode 100644 task/node_modules/azure-pipelines-task-lib/internal.js create mode 100644 task/node_modules/azure-pipelines-task-lib/lib-mocker.d.ts create mode 100644 task/node_modules/azure-pipelines-task-lib/lib-mocker.js create mode 100644 task/node_modules/azure-pipelines-task-lib/lib.json create mode 100644 task/node_modules/azure-pipelines-task-lib/mock-answer.d.ts create mode 100644 task/node_modules/azure-pipelines-task-lib/mock-answer.js create mode 100644 task/node_modules/azure-pipelines-task-lib/mock-run.d.ts create mode 100644 task/node_modules/azure-pipelines-task-lib/mock-run.js create mode 100644 task/node_modules/azure-pipelines-task-lib/mock-task.d.ts create mode 100644 task/node_modules/azure-pipelines-task-lib/mock-task.js create mode 100644 task/node_modules/azure-pipelines-task-lib/mock-test.d.ts create mode 100644 task/node_modules/azure-pipelines-task-lib/mock-test.js create mode 100644 task/node_modules/azure-pipelines-task-lib/mock-toolrunner.d.ts create mode 100644 task/node_modules/azure-pipelines-task-lib/mock-toolrunner.js create mode 100644 task/node_modules/azure-pipelines-task-lib/package.json create mode 100644 task/node_modules/azure-pipelines-task-lib/task.d.ts create mode 100644 task/node_modules/azure-pipelines-task-lib/task.js create mode 100644 task/node_modules/azure-pipelines-task-lib/taskcommand.d.ts create mode 100644 task/node_modules/azure-pipelines-task-lib/taskcommand.js create mode 100644 task/node_modules/azure-pipelines-task-lib/toolrunner.d.ts create mode 100644 task/node_modules/azure-pipelines-task-lib/toolrunner.js create mode 100644 task/node_modules/azure-pipelines-task-lib/vault.d.ts create mode 100644 task/node_modules/azure-pipelines-task-lib/vault.js create mode 100644 task/node_modules/balanced-match/.github/FUNDING.yml create mode 100644 task/node_modules/balanced-match/LICENSE.md create mode 100644 task/node_modules/balanced-match/README.md create mode 100644 task/node_modules/balanced-match/index.js create mode 100644 task/node_modules/balanced-match/package.json create mode 100644 task/node_modules/bindings/LICENSE.md create mode 100644 task/node_modules/bindings/README.md create mode 100644 task/node_modules/bindings/bindings.js create mode 100644 task/node_modules/bindings/package.json create mode 100644 task/node_modules/brace-expansion/LICENSE create mode 100644 task/node_modules/brace-expansion/README.md create mode 100644 task/node_modules/brace-expansion/index.js create mode 100644 task/node_modules/brace-expansion/package.json create mode 100644 task/node_modules/buffer-from/LICENSE create mode 100644 task/node_modules/buffer-from/index.js create mode 100644 task/node_modules/buffer-from/package.json create mode 100644 task/node_modules/buffer-from/readme.md create mode 100644 task/node_modules/bunyan/CHANGES.md create mode 100644 task/node_modules/bunyan/LICENSE.txt create mode 100644 task/node_modules/bunyan/README.md create mode 100755 task/node_modules/bunyan/bin/bunyan create mode 100644 task/node_modules/bunyan/lib/bunyan.js create mode 100644 task/node_modules/bunyan/package.json create mode 100644 task/node_modules/call-bind/.eslintignore create mode 100644 task/node_modules/call-bind/.eslintrc create mode 100644 task/node_modules/call-bind/.github/FUNDING.yml create mode 100644 task/node_modules/call-bind/.nycrc create mode 100644 task/node_modules/call-bind/CHANGELOG.md create mode 100644 task/node_modules/call-bind/LICENSE create mode 100644 task/node_modules/call-bind/README.md create mode 100644 task/node_modules/call-bind/callBound.js create mode 100644 task/node_modules/call-bind/index.js create mode 100644 task/node_modules/call-bind/package.json create mode 100644 task/node_modules/call-bind/test/callBound.js create mode 100644 task/node_modules/call-bind/test/index.js create mode 100644 task/node_modules/caseless/LICENSE create mode 100644 task/node_modules/caseless/README.md create mode 100644 task/node_modules/caseless/index.js create mode 100644 task/node_modules/caseless/package.json create mode 100644 task/node_modules/caseless/test.js create mode 100644 task/node_modules/combined-stream/License create mode 100644 task/node_modules/combined-stream/Readme.md create mode 100644 task/node_modules/combined-stream/lib/combined_stream.js create mode 100644 task/node_modules/combined-stream/package.json create mode 100644 task/node_modules/combined-stream/yarn.lock create mode 100644 task/node_modules/concat-map/.travis.yml create mode 100644 task/node_modules/concat-map/LICENSE create mode 100644 task/node_modules/concat-map/README.markdown create mode 100644 task/node_modules/concat-map/example/map.js create mode 100644 task/node_modules/concat-map/index.js create mode 100644 task/node_modules/concat-map/package.json create mode 100644 task/node_modules/concat-map/test/map.js create mode 100644 task/node_modules/concat-stream/LICENSE create mode 100644 task/node_modules/concat-stream/index.js create mode 100644 task/node_modules/concat-stream/package.json create mode 100644 task/node_modules/concat-stream/readme.md create mode 100644 task/node_modules/core-util-is/LICENSE create mode 100644 task/node_modules/core-util-is/README.md create mode 100644 task/node_modules/core-util-is/lib/util.js create mode 100644 task/node_modules/core-util-is/package.json create mode 100644 task/node_modules/deasync/.github/FUNDING.yml create mode 100644 task/node_modules/deasync/.github/workflows/npm_test.yml create mode 100644 task/node_modules/deasync/.travis.yml create mode 100644 task/node_modules/deasync/LICENSE create mode 100644 task/node_modules/deasync/README.md create mode 100644 task/node_modules/deasync/app.code-workspace create mode 100644 task/node_modules/deasync/bin/.gitattributes create mode 100644 task/node_modules/deasync/bin/darwin-x64-node-0.10/deasync.node create mode 100644 task/node_modules/deasync/bin/darwin-x64-node-0.11/deasync.node create mode 100644 task/node_modules/deasync/bin/darwin-x64-node-0.12/deasync.node create mode 100644 task/node_modules/deasync/bin/darwin-x64-node-10/deasync.node create mode 100644 task/node_modules/deasync/bin/darwin-x64-node-11/deasync.node create mode 100644 task/node_modules/deasync/bin/darwin-x64-node-12/deasync.node create mode 100644 task/node_modules/deasync/bin/darwin-x64-node-13/deasync.node create mode 100644 task/node_modules/deasync/bin/darwin-x64-node-14/deasync.node create mode 100644 task/node_modules/deasync/bin/darwin-x64-node-15/deasync.node create mode 100644 task/node_modules/deasync/bin/darwin-x64-node-16/deasync.node create mode 100644 task/node_modules/deasync/bin/darwin-x64-node-17/deasync.node create mode 100644 task/node_modules/deasync/bin/darwin-x64-node-18/deasync.node create mode 100644 task/node_modules/deasync/bin/darwin-x64-node-19/deasync.node create mode 100644 task/node_modules/deasync/bin/darwin-x64-node-20/deasync.node create mode 100644 task/node_modules/deasync/bin/darwin-x64-node-21/deasync.node create mode 100644 task/node_modules/deasync/bin/darwin-x64-node-4/deasync.node create mode 100644 task/node_modules/deasync/bin/darwin-x64-node-5/deasync.node create mode 100644 task/node_modules/deasync/bin/darwin-x64-node-6/deasync.node create mode 100644 task/node_modules/deasync/bin/darwin-x64-node-7/deasync.node create mode 100644 task/node_modules/deasync/bin/darwin-x64-node-8/deasync.node create mode 100644 task/node_modules/deasync/bin/darwin-x64-node-9/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-ia32-node-0.10/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-ia32-node-0.11/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-ia32-node-0.12/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-ia32-node-10/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-ia32-node-4/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-ia32-node-5/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-ia32-node-6/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-ia32-node-7/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-ia32-node-8/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-ia32-node-9/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-x64-node-0.10/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-x64-node-0.11/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-x64-node-0.12/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-x64-node-10/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-x64-node-11/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-x64-node-12/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-x64-node-13/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-x64-node-14/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-x64-node-15/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-x64-node-16/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-x64-node-17/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-x64-node-18/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-x64-node-19/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-x64-node-20/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-x64-node-21/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-x64-node-4/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-x64-node-5/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-x64-node-6/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-x64-node-7/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-x64-node-8/deasync.node create mode 100644 task/node_modules/deasync/bin/linux-x64-node-9/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-ia32-node-0.10/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-ia32-node-0.11/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-ia32-node-0.12/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-ia32-node-10/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-ia32-node-11/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-ia32-node-12/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-ia32-node-13/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-ia32-node-14/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-ia32-node-15/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-ia32-node-16/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-ia32-node-4/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-ia32-node-5/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-ia32-node-6/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-ia32-node-7/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-ia32-node-8/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-ia32-node-9/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-x64-node-0.10/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-x64-node-0.11/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-x64-node-0.12/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-x64-node-10/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-x64-node-11/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-x64-node-12/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-x64-node-13/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-x64-node-14/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-x64-node-15/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-x64-node-16/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-x64-node-17/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-x64-node-18/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-x64-node-19/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-x64-node-20/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-x64-node-21/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-x64-node-4/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-x64-node-5/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-x64-node-6/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-x64-node-7/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-x64-node-8/deasync.node create mode 100644 task/node_modules/deasync/bin/win32-x64-node-9/deasync.node create mode 100644 task/node_modules/deasync/binding.gyp create mode 100644 task/node_modules/deasync/build.js create mode 100644 task/node_modules/deasync/index.js create mode 100644 task/node_modules/deasync/package.json create mode 100644 task/node_modules/deasync/quick-test.js create mode 100644 task/node_modules/deasync/spec/app/exec.js create mode 100644 task/node_modules/deasync/spec/app/request.js create mode 100644 task/node_modules/deasync/spec/app/sleep.js create mode 100644 task/node_modules/deasync/spec/app/worker-threads.js create mode 100644 task/node_modules/deasync/spec/index.js create mode 100644 task/node_modules/deasync/src/deasync.cc create mode 100644 task/node_modules/debug/LICENSE create mode 100644 task/node_modules/debug/README.md create mode 100644 task/node_modules/debug/package.json create mode 100644 task/node_modules/debug/src/browser.js create mode 100644 task/node_modules/debug/src/common.js create mode 100644 task/node_modules/debug/src/index.js create mode 100644 task/node_modules/debug/src/node.js create mode 100644 task/node_modules/define-data-property/.eslintrc create mode 100644 task/node_modules/define-data-property/.github/FUNDING.yml create mode 100644 task/node_modules/define-data-property/.nycrc create mode 100644 task/node_modules/define-data-property/CHANGELOG.md create mode 100644 task/node_modules/define-data-property/LICENSE create mode 100644 task/node_modules/define-data-property/README.md create mode 100644 task/node_modules/define-data-property/index.d.ts create mode 100644 task/node_modules/define-data-property/index.d.ts.map create mode 100644 task/node_modules/define-data-property/index.js create mode 100644 task/node_modules/define-data-property/package.json create mode 100644 task/node_modules/define-data-property/test/index.js create mode 100644 task/node_modules/define-data-property/tsconfig.json create mode 100644 task/node_modules/delayed-stream/.npmignore create mode 100644 task/node_modules/delayed-stream/License create mode 100644 task/node_modules/delayed-stream/Makefile create mode 100644 task/node_modules/delayed-stream/Readme.md create mode 100644 task/node_modules/delayed-stream/lib/delayed_stream.js create mode 100644 task/node_modules/delayed-stream/package.json create mode 100644 task/node_modules/dtrace-provider/.gitmodules create mode 100644 task/node_modules/dtrace-provider/CHANGES.md create mode 100644 task/node_modules/dtrace-provider/LICENCE create mode 100644 task/node_modules/dtrace-provider/README.md create mode 100644 task/node_modules/dtrace-provider/binding.gyp create mode 100644 task/node_modules/dtrace-provider/build.sh create mode 100644 task/node_modules/dtrace-provider/build/Makefile create mode 100644 task/node_modules/dtrace-provider/build/Release/.deps/..d create mode 100644 task/node_modules/dtrace-provider/build/Release/.deps/Release/obj.target/ndtp.stamp.d create mode 100644 task/node_modules/dtrace-provider/build/Release/obj.target/ndtp.stamp create mode 100644 task/node_modules/dtrace-provider/build/binding.Makefile create mode 100644 task/node_modules/dtrace-provider/build/config.gypi create mode 100755 task/node_modules/dtrace-provider/build/gyp-mac-tool create mode 100644 task/node_modules/dtrace-provider/build/ndtp.target.mk create mode 120000 task/node_modules/dtrace-provider/build/node_gyp_bins/python3 create mode 100644 task/node_modules/dtrace-provider/dtrace-provider.js create mode 100644 task/node_modules/dtrace-provider/libusdt/LICENCE create mode 100644 task/node_modules/dtrace-provider/libusdt/Makefile create mode 100644 task/node_modules/dtrace-provider/libusdt/README.md create mode 100644 task/node_modules/dtrace-provider/libusdt/libusdt.a create mode 100755 task/node_modules/dtrace-provider/libusdt/test.pl create mode 100644 task/node_modules/dtrace-provider/libusdt/test_mem_usage.c create mode 100644 task/node_modules/dtrace-provider/libusdt/test_usdt.c create mode 100644 task/node_modules/dtrace-provider/libusdt/usdt.c create mode 100644 task/node_modules/dtrace-provider/libusdt/usdt.h create mode 100644 task/node_modules/dtrace-provider/libusdt/usdt.o create mode 100644 task/node_modules/dtrace-provider/libusdt/usdt_dof.c create mode 100644 task/node_modules/dtrace-provider/libusdt/usdt_dof.o create mode 100644 task/node_modules/dtrace-provider/libusdt/usdt_dof_file.c create mode 100644 task/node_modules/dtrace-provider/libusdt/usdt_dof_file.o create mode 100644 task/node_modules/dtrace-provider/libusdt/usdt_dof_sections.c create mode 100644 task/node_modules/dtrace-provider/libusdt/usdt_dof_sections.o create mode 100644 task/node_modules/dtrace-provider/libusdt/usdt_internal.h create mode 100644 task/node_modules/dtrace-provider/libusdt/usdt_probe.c create mode 100644 task/node_modules/dtrace-provider/libusdt/usdt_probe.o create mode 100644 task/node_modules/dtrace-provider/libusdt/usdt_tracepoints.o create mode 100644 task/node_modules/dtrace-provider/libusdt/usdt_tracepoints_i386.s create mode 100644 task/node_modules/dtrace-provider/libusdt/usdt_tracepoints_x86_64.s create mode 100644 task/node_modules/dtrace-provider/package.json create mode 100644 task/node_modules/dtrace-provider/src/binding.gyp create mode 100644 task/node_modules/dtrace-provider/src/build/DTraceProviderBindings.target.mk create mode 100644 task/node_modules/dtrace-provider/src/build/Makefile create mode 100644 task/node_modules/dtrace-provider/src/build/Release/.deps/Release/obj.target/DTraceProviderBindings/dtrace_provider.o.d.raw create mode 100644 task/node_modules/dtrace-provider/src/build/binding.Makefile create mode 100644 task/node_modules/dtrace-provider/src/build/config.gypi create mode 100755 task/node_modules/dtrace-provider/src/build/gyp-mac-tool create mode 120000 task/node_modules/dtrace-provider/src/build/node_gyp_bins/python3 create mode 100644 task/node_modules/dtrace-provider/src/dtrace_argument.cc create mode 100644 task/node_modules/dtrace-provider/src/dtrace_probe.cc create mode 100644 task/node_modules/dtrace-provider/src/dtrace_provider.cc create mode 100644 task/node_modules/dtrace-provider/src/dtrace_provider.h create mode 100644 task/node_modules/dtrace-provider/suppress-error.js create mode 100644 task/node_modules/file-uri-to-path/.npmignore create mode 100644 task/node_modules/file-uri-to-path/.travis.yml create mode 100644 task/node_modules/file-uri-to-path/History.md create mode 100644 task/node_modules/file-uri-to-path/LICENSE create mode 100644 task/node_modules/file-uri-to-path/README.md create mode 100644 task/node_modules/file-uri-to-path/index.d.ts create mode 100644 task/node_modules/file-uri-to-path/index.js create mode 100644 task/node_modules/file-uri-to-path/package.json create mode 100644 task/node_modules/file-uri-to-path/test/test.js create mode 100644 task/node_modules/file-uri-to-path/test/tests.json create mode 100644 task/node_modules/follow-redirects/LICENSE create mode 100644 task/node_modules/follow-redirects/README.md create mode 100644 task/node_modules/follow-redirects/debug.js create mode 100644 task/node_modules/follow-redirects/http.js create mode 100644 task/node_modules/follow-redirects/https.js create mode 100644 task/node_modules/follow-redirects/index.js create mode 100644 task/node_modules/follow-redirects/package.json create mode 100644 task/node_modules/form-data/License create mode 100644 task/node_modules/form-data/README.md create mode 100644 task/node_modules/form-data/README.md.bak create mode 100644 task/node_modules/form-data/index.d.ts create mode 100644 task/node_modules/form-data/lib/browser.js create mode 100644 task/node_modules/form-data/lib/form_data.js create mode 100644 task/node_modules/form-data/lib/populate.js create mode 100644 task/node_modules/form-data/package.json create mode 100644 task/node_modules/fs.realpath/LICENSE create mode 100644 task/node_modules/fs.realpath/README.md create mode 100644 task/node_modules/fs.realpath/index.js create mode 100644 task/node_modules/fs.realpath/old.js create mode 100644 task/node_modules/fs.realpath/package.json create mode 100644 task/node_modules/function-bind/.eslintrc create mode 100644 task/node_modules/function-bind/.github/FUNDING.yml create mode 100644 task/node_modules/function-bind/.github/SECURITY.md create mode 100644 task/node_modules/function-bind/.nycrc create mode 100644 task/node_modules/function-bind/CHANGELOG.md create mode 100644 task/node_modules/function-bind/LICENSE create mode 100644 task/node_modules/function-bind/README.md create mode 100644 task/node_modules/function-bind/implementation.js create mode 100644 task/node_modules/function-bind/index.js create mode 100644 task/node_modules/function-bind/package.json create mode 100644 task/node_modules/function-bind/test/.eslintrc create mode 100644 task/node_modules/function-bind/test/index.js create mode 100644 task/node_modules/get-intrinsic/.eslintrc create mode 100644 task/node_modules/get-intrinsic/.github/FUNDING.yml create mode 100644 task/node_modules/get-intrinsic/.nycrc create mode 100644 task/node_modules/get-intrinsic/CHANGELOG.md create mode 100644 task/node_modules/get-intrinsic/LICENSE create mode 100644 task/node_modules/get-intrinsic/README.md create mode 100644 task/node_modules/get-intrinsic/index.js create mode 100644 task/node_modules/get-intrinsic/package.json create mode 100644 task/node_modules/get-intrinsic/test/GetIntrinsic.js create mode 100644 task/node_modules/get-port/index.js create mode 100644 task/node_modules/get-port/license create mode 100644 task/node_modules/get-port/package.json create mode 100644 task/node_modules/get-port/readme.md create mode 100644 task/node_modules/glob/LICENSE create mode 100644 task/node_modules/glob/README.md create mode 100644 task/node_modules/glob/common.js create mode 100644 task/node_modules/glob/glob.js create mode 100644 task/node_modules/glob/node_modules/minimatch/LICENSE create mode 100644 task/node_modules/glob/node_modules/minimatch/README.md create mode 100644 task/node_modules/glob/node_modules/minimatch/minimatch.js create mode 100644 task/node_modules/glob/node_modules/minimatch/package.json create mode 100644 task/node_modules/glob/package.json create mode 100644 task/node_modules/glob/sync.js create mode 100644 task/node_modules/gopd/.eslintrc create mode 100644 task/node_modules/gopd/.github/FUNDING.yml create mode 100644 task/node_modules/gopd/CHANGELOG.md create mode 100644 task/node_modules/gopd/LICENSE create mode 100644 task/node_modules/gopd/README.md create mode 100644 task/node_modules/gopd/index.js create mode 100644 task/node_modules/gopd/package.json create mode 100644 task/node_modules/gopd/test/index.js create mode 100644 task/node_modules/has-property-descriptors/.eslintrc create mode 100644 task/node_modules/has-property-descriptors/.github/FUNDING.yml create mode 100644 task/node_modules/has-property-descriptors/.nycrc create mode 100644 task/node_modules/has-property-descriptors/CHANGELOG.md create mode 100644 task/node_modules/has-property-descriptors/LICENSE create mode 100644 task/node_modules/has-property-descriptors/README.md create mode 100644 task/node_modules/has-property-descriptors/index.js create mode 100644 task/node_modules/has-property-descriptors/package.json create mode 100644 task/node_modules/has-property-descriptors/test/index.js create mode 100644 task/node_modules/has-proto/.eslintrc create mode 100644 task/node_modules/has-proto/.github/FUNDING.yml create mode 100644 task/node_modules/has-proto/CHANGELOG.md create mode 100644 task/node_modules/has-proto/LICENSE create mode 100644 task/node_modules/has-proto/README.md create mode 100644 task/node_modules/has-proto/index.js create mode 100644 task/node_modules/has-proto/package.json create mode 100644 task/node_modules/has-proto/test/index.js create mode 100644 task/node_modules/has-symbols/.eslintrc create mode 100644 task/node_modules/has-symbols/.github/FUNDING.yml create mode 100644 task/node_modules/has-symbols/.nycrc create mode 100644 task/node_modules/has-symbols/CHANGELOG.md create mode 100644 task/node_modules/has-symbols/LICENSE create mode 100644 task/node_modules/has-symbols/README.md create mode 100644 task/node_modules/has-symbols/index.js create mode 100644 task/node_modules/has-symbols/package.json create mode 100644 task/node_modules/has-symbols/shams.js create mode 100644 task/node_modules/has-symbols/test/index.js create mode 100644 task/node_modules/has-symbols/test/shams/core-js.js create mode 100644 task/node_modules/has-symbols/test/shams/get-own-property-symbols.js create mode 100644 task/node_modules/has-symbols/test/tests.js create mode 100644 task/node_modules/hasown/.eslintrc create mode 100644 task/node_modules/hasown/.github/FUNDING.yml create mode 100644 task/node_modules/hasown/.nycrc create mode 100644 task/node_modules/hasown/CHANGELOG.md create mode 100644 task/node_modules/hasown/LICENSE create mode 100644 task/node_modules/hasown/README.md create mode 100644 task/node_modules/hasown/index.d.ts create mode 100644 task/node_modules/hasown/index.d.ts.map create mode 100644 task/node_modules/hasown/index.js create mode 100644 task/node_modules/hasown/package.json create mode 100644 task/node_modules/hasown/tsconfig.json create mode 100644 task/node_modules/http-basic/LICENSE create mode 100644 task/node_modules/http-basic/README.md create mode 100644 task/node_modules/http-basic/lib/CachedResponse.d.ts create mode 100644 task/node_modules/http-basic/lib/CachedResponse.js create mode 100644 task/node_modules/http-basic/lib/CachedResponse.js.flow create mode 100644 task/node_modules/http-basic/lib/Callback.d.ts create mode 100644 task/node_modules/http-basic/lib/Callback.js create mode 100644 task/node_modules/http-basic/lib/Callback.js.flow create mode 100644 task/node_modules/http-basic/lib/FileCache.d.ts create mode 100644 task/node_modules/http-basic/lib/FileCache.js create mode 100644 task/node_modules/http-basic/lib/FileCache.js.flow create mode 100644 task/node_modules/http-basic/lib/Headers.d.ts create mode 100644 task/node_modules/http-basic/lib/Headers.js create mode 100644 task/node_modules/http-basic/lib/Headers.js.flow create mode 100644 task/node_modules/http-basic/lib/HttpVerb.d.ts create mode 100644 task/node_modules/http-basic/lib/HttpVerb.js create mode 100644 task/node_modules/http-basic/lib/HttpVerb.js.flow create mode 100644 task/node_modules/http-basic/lib/ICache.d.ts create mode 100644 task/node_modules/http-basic/lib/ICache.js create mode 100644 task/node_modules/http-basic/lib/ICache.js.flow create mode 100644 task/node_modules/http-basic/lib/MemoryCache.d.ts create mode 100644 task/node_modules/http-basic/lib/MemoryCache.js create mode 100644 task/node_modules/http-basic/lib/MemoryCache.js.flow create mode 100644 task/node_modules/http-basic/lib/Options.d.ts create mode 100644 task/node_modules/http-basic/lib/Options.js create mode 100644 task/node_modules/http-basic/lib/Options.js.flow create mode 100644 task/node_modules/http-basic/lib/cache-control-utils.d.ts create mode 100644 task/node_modules/http-basic/lib/cache-control-utils.js create mode 100644 task/node_modules/http-basic/lib/cache-control-utils.js.flow create mode 100644 task/node_modules/http-basic/lib/cache-utils.d.ts create mode 100644 task/node_modules/http-basic/lib/cache-utils.js create mode 100644 task/node_modules/http-basic/lib/cache-utils.js.flow create mode 100644 task/node_modules/http-basic/lib/index.d.ts create mode 100644 task/node_modules/http-basic/lib/index.js create mode 100644 task/node_modules/http-basic/lib/index.js.flow create mode 100644 task/node_modules/http-basic/package.json create mode 100644 task/node_modules/http-response-object/LICENSE create mode 100644 task/node_modules/http-response-object/README.md create mode 100644 task/node_modules/http-response-object/lib/headers.d.ts create mode 100644 task/node_modules/http-response-object/lib/headers.js create mode 100644 task/node_modules/http-response-object/lib/headers.js.flow create mode 100644 task/node_modules/http-response-object/lib/index.d.ts create mode 100644 task/node_modules/http-response-object/lib/index.js create mode 100644 task/node_modules/http-response-object/lib/index.js.flow create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/LICENSE create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/README.md create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/assert.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/async_hooks.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/base.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/buffer.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/child_process.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/cluster.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/console.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/constants.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/crypto.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/dgram.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/dns.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/domain.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/events.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/fs.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/globals.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/http.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/http2.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/https.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/index.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/inspector.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/module.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/net.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/os.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/package.json create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/path.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/perf_hooks.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/process.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/punycode.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/querystring.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/readline.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/repl.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/stream.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/string_decoder.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/timers.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/tls.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/trace_events.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/ts3.6/assert.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/ts3.6/base.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/ts3.6/index.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/tty.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/url.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/util.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/v8.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/vm.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/worker_threads.d.ts create mode 100755 task/node_modules/http-response-object/node_modules/@types/node/zlib.d.ts create mode 100644 task/node_modules/http-response-object/package.json create mode 100644 task/node_modules/https-proxy-agent/README.md create mode 100644 task/node_modules/https-proxy-agent/dist/agent.d.ts create mode 100644 task/node_modules/https-proxy-agent/dist/agent.js create mode 100644 task/node_modules/https-proxy-agent/dist/agent.js.map create mode 100644 task/node_modules/https-proxy-agent/dist/index.d.ts create mode 100644 task/node_modules/https-proxy-agent/dist/index.js create mode 100644 task/node_modules/https-proxy-agent/dist/index.js.map create mode 100644 task/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts create mode 100644 task/node_modules/https-proxy-agent/dist/parse-proxy-response.js create mode 100644 task/node_modules/https-proxy-agent/dist/parse-proxy-response.js.map create mode 100644 task/node_modules/https-proxy-agent/package.json create mode 100644 task/node_modules/inflight/LICENSE create mode 100644 task/node_modules/inflight/README.md create mode 100644 task/node_modules/inflight/inflight.js create mode 100644 task/node_modules/inflight/package.json create mode 100644 task/node_modules/inherits/LICENSE create mode 100644 task/node_modules/inherits/README.md create mode 100644 task/node_modules/inherits/inherits.js create mode 100644 task/node_modules/inherits/inherits_browser.js create mode 100644 task/node_modules/inherits/package.json create mode 100644 task/node_modules/interpret/CHANGELOG create mode 100644 task/node_modules/interpret/LICENSE create mode 100644 task/node_modules/interpret/README.md create mode 100644 task/node_modules/interpret/index.js create mode 100644 task/node_modules/interpret/mjs-stub.js create mode 100644 task/node_modules/interpret/package.json create mode 100644 task/node_modules/is-core-module/.eslintrc create mode 100644 task/node_modules/is-core-module/.nycrc create mode 100644 task/node_modules/is-core-module/CHANGELOG.md create mode 100644 task/node_modules/is-core-module/LICENSE create mode 100644 task/node_modules/is-core-module/README.md create mode 100644 task/node_modules/is-core-module/core.json create mode 100644 task/node_modules/is-core-module/index.js create mode 100644 task/node_modules/is-core-module/package.json create mode 100644 task/node_modules/is-core-module/test/index.js create mode 100644 task/node_modules/is-retry-allowed/index.d.ts create mode 100644 task/node_modules/is-retry-allowed/index.js create mode 100644 task/node_modules/is-retry-allowed/license create mode 100644 task/node_modules/is-retry-allowed/package.json create mode 100644 task/node_modules/is-retry-allowed/readme.md create mode 100644 task/node_modules/isarray/.npmignore create mode 100644 task/node_modules/isarray/.travis.yml create mode 100644 task/node_modules/isarray/Makefile create mode 100644 task/node_modules/isarray/README.md create mode 100644 task/node_modules/isarray/component.json create mode 100644 task/node_modules/isarray/index.js create mode 100644 task/node_modules/isarray/package.json create mode 100644 task/node_modules/isarray/test.js create mode 100644 task/node_modules/mime-db/HISTORY.md create mode 100644 task/node_modules/mime-db/LICENSE create mode 100644 task/node_modules/mime-db/README.md create mode 100644 task/node_modules/mime-db/db.json create mode 100644 task/node_modules/mime-db/index.js create mode 100644 task/node_modules/mime-db/package.json create mode 100644 task/node_modules/mime-types/HISTORY.md create mode 100644 task/node_modules/mime-types/LICENSE create mode 100644 task/node_modules/mime-types/README.md create mode 100644 task/node_modules/mime-types/index.js create mode 100644 task/node_modules/mime-types/package.json create mode 100644 task/node_modules/minimatch/LICENSE create mode 100644 task/node_modules/minimatch/README.md create mode 100644 task/node_modules/minimatch/minimatch.js create mode 100644 task/node_modules/minimatch/package.json create mode 100644 task/node_modules/minimist/.eslintrc create mode 100644 task/node_modules/minimist/.github/FUNDING.yml create mode 100644 task/node_modules/minimist/.nycrc create mode 100644 task/node_modules/minimist/CHANGELOG.md create mode 100644 task/node_modules/minimist/LICENSE create mode 100644 task/node_modules/minimist/README.md create mode 100644 task/node_modules/minimist/example/parse.js create mode 100644 task/node_modules/minimist/index.js create mode 100644 task/node_modules/minimist/package.json create mode 100644 task/node_modules/minimist/test/all_bool.js create mode 100644 task/node_modules/minimist/test/bool.js create mode 100644 task/node_modules/minimist/test/dash.js create mode 100644 task/node_modules/minimist/test/default_bool.js create mode 100644 task/node_modules/minimist/test/dotted.js create mode 100644 task/node_modules/minimist/test/kv_short.js create mode 100644 task/node_modules/minimist/test/long.js create mode 100644 task/node_modules/minimist/test/num.js create mode 100644 task/node_modules/minimist/test/parse.js create mode 100644 task/node_modules/minimist/test/parse_modified.js create mode 100644 task/node_modules/minimist/test/proto.js create mode 100644 task/node_modules/minimist/test/short.js create mode 100644 task/node_modules/minimist/test/stop_early.js create mode 100644 task/node_modules/minimist/test/unknown.js create mode 100644 task/node_modules/minimist/test/whitespace.js create mode 100644 task/node_modules/mkdirp/LICENSE create mode 100755 task/node_modules/mkdirp/bin/cmd.js create mode 100644 task/node_modules/mkdirp/bin/usage.txt create mode 100644 task/node_modules/mkdirp/index.js create mode 100644 task/node_modules/mkdirp/package.json create mode 100644 task/node_modules/mkdirp/readme.markdown create mode 100644 task/node_modules/moment/CHANGELOG.md create mode 100644 task/node_modules/moment/LICENSE create mode 100644 task/node_modules/moment/README.md create mode 100644 task/node_modules/moment/dist/locale/af.js create mode 100644 task/node_modules/moment/dist/locale/ar-dz.js create mode 100644 task/node_modules/moment/dist/locale/ar-kw.js create mode 100644 task/node_modules/moment/dist/locale/ar-ly.js create mode 100644 task/node_modules/moment/dist/locale/ar-ma.js create mode 100644 task/node_modules/moment/dist/locale/ar-ps.js create mode 100644 task/node_modules/moment/dist/locale/ar-sa.js create mode 100644 task/node_modules/moment/dist/locale/ar-tn.js create mode 100644 task/node_modules/moment/dist/locale/ar.js create mode 100644 task/node_modules/moment/dist/locale/az.js create mode 100644 task/node_modules/moment/dist/locale/be.js create mode 100644 task/node_modules/moment/dist/locale/bg.js create mode 100644 task/node_modules/moment/dist/locale/bm.js create mode 100644 task/node_modules/moment/dist/locale/bn-bd.js create mode 100644 task/node_modules/moment/dist/locale/bn.js create mode 100644 task/node_modules/moment/dist/locale/bo.js create mode 100644 task/node_modules/moment/dist/locale/br.js create mode 100644 task/node_modules/moment/dist/locale/bs.js create mode 100644 task/node_modules/moment/dist/locale/ca.js create mode 100644 task/node_modules/moment/dist/locale/cs.js create mode 100644 task/node_modules/moment/dist/locale/cv.js create mode 100644 task/node_modules/moment/dist/locale/cy.js create mode 100644 task/node_modules/moment/dist/locale/da.js create mode 100644 task/node_modules/moment/dist/locale/de-at.js create mode 100644 task/node_modules/moment/dist/locale/de-ch.js create mode 100644 task/node_modules/moment/dist/locale/de.js create mode 100644 task/node_modules/moment/dist/locale/dv.js create mode 100644 task/node_modules/moment/dist/locale/el.js create mode 100644 task/node_modules/moment/dist/locale/en-au.js create mode 100644 task/node_modules/moment/dist/locale/en-ca.js create mode 100644 task/node_modules/moment/dist/locale/en-gb.js create mode 100644 task/node_modules/moment/dist/locale/en-ie.js create mode 100644 task/node_modules/moment/dist/locale/en-il.js create mode 100644 task/node_modules/moment/dist/locale/en-in.js create mode 100644 task/node_modules/moment/dist/locale/en-nz.js create mode 100644 task/node_modules/moment/dist/locale/en-sg.js create mode 100644 task/node_modules/moment/dist/locale/eo.js create mode 100644 task/node_modules/moment/dist/locale/es-do.js create mode 100644 task/node_modules/moment/dist/locale/es-mx.js create mode 100644 task/node_modules/moment/dist/locale/es-us.js create mode 100644 task/node_modules/moment/dist/locale/es.js create mode 100644 task/node_modules/moment/dist/locale/et.js create mode 100644 task/node_modules/moment/dist/locale/eu.js create mode 100644 task/node_modules/moment/dist/locale/fa.js create mode 100644 task/node_modules/moment/dist/locale/fi.js create mode 100644 task/node_modules/moment/dist/locale/fil.js create mode 100644 task/node_modules/moment/dist/locale/fo.js create mode 100644 task/node_modules/moment/dist/locale/fr-ca.js create mode 100644 task/node_modules/moment/dist/locale/fr-ch.js create mode 100644 task/node_modules/moment/dist/locale/fr.js create mode 100644 task/node_modules/moment/dist/locale/fy.js create mode 100644 task/node_modules/moment/dist/locale/ga.js create mode 100644 task/node_modules/moment/dist/locale/gd.js create mode 100644 task/node_modules/moment/dist/locale/gl.js create mode 100644 task/node_modules/moment/dist/locale/gom-deva.js create mode 100644 task/node_modules/moment/dist/locale/gom-latn.js create mode 100644 task/node_modules/moment/dist/locale/gu.js create mode 100644 task/node_modules/moment/dist/locale/he.js create mode 100644 task/node_modules/moment/dist/locale/hi.js create mode 100644 task/node_modules/moment/dist/locale/hr.js create mode 100644 task/node_modules/moment/dist/locale/hu.js create mode 100644 task/node_modules/moment/dist/locale/hy-am.js create mode 100644 task/node_modules/moment/dist/locale/id.js create mode 100644 task/node_modules/moment/dist/locale/is.js create mode 100644 task/node_modules/moment/dist/locale/it-ch.js create mode 100644 task/node_modules/moment/dist/locale/it.js create mode 100644 task/node_modules/moment/dist/locale/ja.js create mode 100644 task/node_modules/moment/dist/locale/jv.js create mode 100644 task/node_modules/moment/dist/locale/ka.js create mode 100644 task/node_modules/moment/dist/locale/kk.js create mode 100644 task/node_modules/moment/dist/locale/km.js create mode 100644 task/node_modules/moment/dist/locale/kn.js create mode 100644 task/node_modules/moment/dist/locale/ko.js create mode 100644 task/node_modules/moment/dist/locale/ku-kmr.js create mode 100644 task/node_modules/moment/dist/locale/ku.js create mode 100644 task/node_modules/moment/dist/locale/ky.js create mode 100644 task/node_modules/moment/dist/locale/lb.js create mode 100644 task/node_modules/moment/dist/locale/lo.js create mode 100644 task/node_modules/moment/dist/locale/lt.js create mode 100644 task/node_modules/moment/dist/locale/lv.js create mode 100644 task/node_modules/moment/dist/locale/me.js create mode 100644 task/node_modules/moment/dist/locale/mi.js create mode 100644 task/node_modules/moment/dist/locale/mk.js create mode 100644 task/node_modules/moment/dist/locale/ml.js create mode 100644 task/node_modules/moment/dist/locale/mn.js create mode 100644 task/node_modules/moment/dist/locale/mr.js create mode 100644 task/node_modules/moment/dist/locale/ms-my.js create mode 100644 task/node_modules/moment/dist/locale/ms.js create mode 100644 task/node_modules/moment/dist/locale/mt.js create mode 100644 task/node_modules/moment/dist/locale/my.js create mode 100644 task/node_modules/moment/dist/locale/nb.js create mode 100644 task/node_modules/moment/dist/locale/ne.js create mode 100644 task/node_modules/moment/dist/locale/nl-be.js create mode 100644 task/node_modules/moment/dist/locale/nl.js create mode 100644 task/node_modules/moment/dist/locale/nn.js create mode 100644 task/node_modules/moment/dist/locale/oc-lnc.js create mode 100644 task/node_modules/moment/dist/locale/pa-in.js create mode 100644 task/node_modules/moment/dist/locale/pl.js create mode 100644 task/node_modules/moment/dist/locale/pt-br.js create mode 100644 task/node_modules/moment/dist/locale/pt.js create mode 100644 task/node_modules/moment/dist/locale/ro.js create mode 100644 task/node_modules/moment/dist/locale/ru.js create mode 100644 task/node_modules/moment/dist/locale/sd.js create mode 100644 task/node_modules/moment/dist/locale/se.js create mode 100644 task/node_modules/moment/dist/locale/si.js create mode 100644 task/node_modules/moment/dist/locale/sk.js create mode 100644 task/node_modules/moment/dist/locale/sl.js create mode 100644 task/node_modules/moment/dist/locale/sq.js create mode 100644 task/node_modules/moment/dist/locale/sr-cyrl.js create mode 100644 task/node_modules/moment/dist/locale/sr.js create mode 100644 task/node_modules/moment/dist/locale/ss.js create mode 100644 task/node_modules/moment/dist/locale/sv.js create mode 100644 task/node_modules/moment/dist/locale/sw.js create mode 100644 task/node_modules/moment/dist/locale/ta.js create mode 100644 task/node_modules/moment/dist/locale/te.js create mode 100644 task/node_modules/moment/dist/locale/tet.js create mode 100644 task/node_modules/moment/dist/locale/tg.js create mode 100644 task/node_modules/moment/dist/locale/th.js create mode 100644 task/node_modules/moment/dist/locale/tk.js create mode 100644 task/node_modules/moment/dist/locale/tl-ph.js create mode 100644 task/node_modules/moment/dist/locale/tlh.js create mode 100644 task/node_modules/moment/dist/locale/tr.js create mode 100644 task/node_modules/moment/dist/locale/tzl.js create mode 100644 task/node_modules/moment/dist/locale/tzm-latn.js create mode 100644 task/node_modules/moment/dist/locale/tzm.js create mode 100644 task/node_modules/moment/dist/locale/ug-cn.js create mode 100644 task/node_modules/moment/dist/locale/uk.js create mode 100644 task/node_modules/moment/dist/locale/ur.js create mode 100644 task/node_modules/moment/dist/locale/uz-latn.js create mode 100644 task/node_modules/moment/dist/locale/uz.js create mode 100644 task/node_modules/moment/dist/locale/vi.js create mode 100644 task/node_modules/moment/dist/locale/x-pseudo.js create mode 100644 task/node_modules/moment/dist/locale/yo.js create mode 100644 task/node_modules/moment/dist/locale/zh-cn.js create mode 100644 task/node_modules/moment/dist/locale/zh-hk.js create mode 100644 task/node_modules/moment/dist/locale/zh-mo.js create mode 100644 task/node_modules/moment/dist/locale/zh-tw.js create mode 100644 task/node_modules/moment/dist/moment.js create mode 100644 task/node_modules/moment/ender.js create mode 100644 task/node_modules/moment/locale/af.js create mode 100644 task/node_modules/moment/locale/ar-dz.js create mode 100644 task/node_modules/moment/locale/ar-kw.js create mode 100644 task/node_modules/moment/locale/ar-ly.js create mode 100644 task/node_modules/moment/locale/ar-ma.js create mode 100644 task/node_modules/moment/locale/ar-ps.js create mode 100644 task/node_modules/moment/locale/ar-sa.js create mode 100644 task/node_modules/moment/locale/ar-tn.js create mode 100644 task/node_modules/moment/locale/ar.js create mode 100644 task/node_modules/moment/locale/az.js create mode 100644 task/node_modules/moment/locale/be.js create mode 100644 task/node_modules/moment/locale/bg.js create mode 100644 task/node_modules/moment/locale/bm.js create mode 100644 task/node_modules/moment/locale/bn-bd.js create mode 100644 task/node_modules/moment/locale/bn.js create mode 100644 task/node_modules/moment/locale/bo.js create mode 100644 task/node_modules/moment/locale/br.js create mode 100644 task/node_modules/moment/locale/bs.js create mode 100644 task/node_modules/moment/locale/ca.js create mode 100644 task/node_modules/moment/locale/cs.js create mode 100644 task/node_modules/moment/locale/cv.js create mode 100644 task/node_modules/moment/locale/cy.js create mode 100644 task/node_modules/moment/locale/da.js create mode 100644 task/node_modules/moment/locale/de-at.js create mode 100644 task/node_modules/moment/locale/de-ch.js create mode 100644 task/node_modules/moment/locale/de.js create mode 100644 task/node_modules/moment/locale/dv.js create mode 100644 task/node_modules/moment/locale/el.js create mode 100644 task/node_modules/moment/locale/en-au.js create mode 100644 task/node_modules/moment/locale/en-ca.js create mode 100644 task/node_modules/moment/locale/en-gb.js create mode 100644 task/node_modules/moment/locale/en-ie.js create mode 100644 task/node_modules/moment/locale/en-il.js create mode 100644 task/node_modules/moment/locale/en-in.js create mode 100644 task/node_modules/moment/locale/en-nz.js create mode 100644 task/node_modules/moment/locale/en-sg.js create mode 100644 task/node_modules/moment/locale/eo.js create mode 100644 task/node_modules/moment/locale/es-do.js create mode 100644 task/node_modules/moment/locale/es-mx.js create mode 100644 task/node_modules/moment/locale/es-us.js create mode 100644 task/node_modules/moment/locale/es.js create mode 100644 task/node_modules/moment/locale/et.js create mode 100644 task/node_modules/moment/locale/eu.js create mode 100644 task/node_modules/moment/locale/fa.js create mode 100644 task/node_modules/moment/locale/fi.js create mode 100644 task/node_modules/moment/locale/fil.js create mode 100644 task/node_modules/moment/locale/fo.js create mode 100644 task/node_modules/moment/locale/fr-ca.js create mode 100644 task/node_modules/moment/locale/fr-ch.js create mode 100644 task/node_modules/moment/locale/fr.js create mode 100644 task/node_modules/moment/locale/fy.js create mode 100644 task/node_modules/moment/locale/ga.js create mode 100644 task/node_modules/moment/locale/gd.js create mode 100644 task/node_modules/moment/locale/gl.js create mode 100644 task/node_modules/moment/locale/gom-deva.js create mode 100644 task/node_modules/moment/locale/gom-latn.js create mode 100644 task/node_modules/moment/locale/gu.js create mode 100644 task/node_modules/moment/locale/he.js create mode 100644 task/node_modules/moment/locale/hi.js create mode 100644 task/node_modules/moment/locale/hr.js create mode 100644 task/node_modules/moment/locale/hu.js create mode 100644 task/node_modules/moment/locale/hy-am.js create mode 100644 task/node_modules/moment/locale/id.js create mode 100644 task/node_modules/moment/locale/is.js create mode 100644 task/node_modules/moment/locale/it-ch.js create mode 100644 task/node_modules/moment/locale/it.js create mode 100644 task/node_modules/moment/locale/ja.js create mode 100644 task/node_modules/moment/locale/jv.js create mode 100644 task/node_modules/moment/locale/ka.js create mode 100644 task/node_modules/moment/locale/kk.js create mode 100644 task/node_modules/moment/locale/km.js create mode 100644 task/node_modules/moment/locale/kn.js create mode 100644 task/node_modules/moment/locale/ko.js create mode 100644 task/node_modules/moment/locale/ku-kmr.js create mode 100644 task/node_modules/moment/locale/ku.js create mode 100644 task/node_modules/moment/locale/ky.js create mode 100644 task/node_modules/moment/locale/lb.js create mode 100644 task/node_modules/moment/locale/lo.js create mode 100644 task/node_modules/moment/locale/lt.js create mode 100644 task/node_modules/moment/locale/lv.js create mode 100644 task/node_modules/moment/locale/me.js create mode 100644 task/node_modules/moment/locale/mi.js create mode 100644 task/node_modules/moment/locale/mk.js create mode 100644 task/node_modules/moment/locale/ml.js create mode 100644 task/node_modules/moment/locale/mn.js create mode 100644 task/node_modules/moment/locale/mr.js create mode 100644 task/node_modules/moment/locale/ms-my.js create mode 100644 task/node_modules/moment/locale/ms.js create mode 100644 task/node_modules/moment/locale/mt.js create mode 100644 task/node_modules/moment/locale/my.js create mode 100644 task/node_modules/moment/locale/nb.js create mode 100644 task/node_modules/moment/locale/ne.js create mode 100644 task/node_modules/moment/locale/nl-be.js create mode 100644 task/node_modules/moment/locale/nl.js create mode 100644 task/node_modules/moment/locale/nn.js create mode 100644 task/node_modules/moment/locale/oc-lnc.js create mode 100644 task/node_modules/moment/locale/pa-in.js create mode 100644 task/node_modules/moment/locale/pl.js create mode 100644 task/node_modules/moment/locale/pt-br.js create mode 100644 task/node_modules/moment/locale/pt.js create mode 100644 task/node_modules/moment/locale/ro.js create mode 100644 task/node_modules/moment/locale/ru.js create mode 100644 task/node_modules/moment/locale/sd.js create mode 100644 task/node_modules/moment/locale/se.js create mode 100644 task/node_modules/moment/locale/si.js create mode 100644 task/node_modules/moment/locale/sk.js create mode 100644 task/node_modules/moment/locale/sl.js create mode 100644 task/node_modules/moment/locale/sq.js create mode 100644 task/node_modules/moment/locale/sr-cyrl.js create mode 100644 task/node_modules/moment/locale/sr.js create mode 100644 task/node_modules/moment/locale/ss.js create mode 100644 task/node_modules/moment/locale/sv.js create mode 100644 task/node_modules/moment/locale/sw.js create mode 100644 task/node_modules/moment/locale/ta.js create mode 100644 task/node_modules/moment/locale/te.js create mode 100644 task/node_modules/moment/locale/tet.js create mode 100644 task/node_modules/moment/locale/tg.js create mode 100644 task/node_modules/moment/locale/th.js create mode 100644 task/node_modules/moment/locale/tk.js create mode 100644 task/node_modules/moment/locale/tl-ph.js create mode 100644 task/node_modules/moment/locale/tlh.js create mode 100644 task/node_modules/moment/locale/tr.js create mode 100644 task/node_modules/moment/locale/tzl.js create mode 100644 task/node_modules/moment/locale/tzm-latn.js create mode 100644 task/node_modules/moment/locale/tzm.js create mode 100644 task/node_modules/moment/locale/ug-cn.js create mode 100644 task/node_modules/moment/locale/uk.js create mode 100644 task/node_modules/moment/locale/ur.js create mode 100644 task/node_modules/moment/locale/uz-latn.js create mode 100644 task/node_modules/moment/locale/uz.js create mode 100644 task/node_modules/moment/locale/vi.js create mode 100644 task/node_modules/moment/locale/x-pseudo.js create mode 100644 task/node_modules/moment/locale/yo.js create mode 100644 task/node_modules/moment/locale/zh-cn.js create mode 100644 task/node_modules/moment/locale/zh-hk.js create mode 100644 task/node_modules/moment/locale/zh-mo.js create mode 100644 task/node_modules/moment/locale/zh-tw.js create mode 100644 task/node_modules/moment/min/locales.js create mode 100644 task/node_modules/moment/min/locales.min.js create mode 100644 task/node_modules/moment/min/locales.min.js.map create mode 100644 task/node_modules/moment/min/moment-with-locales.js create mode 100644 task/node_modules/moment/min/moment-with-locales.min.js create mode 100644 task/node_modules/moment/min/moment-with-locales.min.js.map create mode 100644 task/node_modules/moment/min/moment.min.js create mode 100644 task/node_modules/moment/min/moment.min.js.map create mode 100644 task/node_modules/moment/moment.d.ts create mode 100644 task/node_modules/moment/moment.js create mode 100644 task/node_modules/moment/package.js create mode 100644 task/node_modules/moment/package.json create mode 100644 task/node_modules/moment/src/lib/create/check-overflow.js create mode 100644 task/node_modules/moment/src/lib/create/date-from-array.js create mode 100644 task/node_modules/moment/src/lib/create/from-anything.js create mode 100644 task/node_modules/moment/src/lib/create/from-array.js create mode 100644 task/node_modules/moment/src/lib/create/from-object.js create mode 100644 task/node_modules/moment/src/lib/create/from-string-and-array.js create mode 100644 task/node_modules/moment/src/lib/create/from-string-and-format.js create mode 100644 task/node_modules/moment/src/lib/create/from-string.js create mode 100644 task/node_modules/moment/src/lib/create/local.js create mode 100644 task/node_modules/moment/src/lib/create/parsing-flags.js create mode 100644 task/node_modules/moment/src/lib/create/utc.js create mode 100644 task/node_modules/moment/src/lib/create/valid.js create mode 100644 task/node_modules/moment/src/lib/duration/abs.js create mode 100644 task/node_modules/moment/src/lib/duration/add-subtract.js create mode 100644 task/node_modules/moment/src/lib/duration/as.js create mode 100644 task/node_modules/moment/src/lib/duration/bubble.js create mode 100644 task/node_modules/moment/src/lib/duration/clone.js create mode 100644 task/node_modules/moment/src/lib/duration/constructor.js create mode 100644 task/node_modules/moment/src/lib/duration/create.js create mode 100644 task/node_modules/moment/src/lib/duration/duration.js create mode 100644 task/node_modules/moment/src/lib/duration/get.js create mode 100644 task/node_modules/moment/src/lib/duration/humanize.js create mode 100644 task/node_modules/moment/src/lib/duration/iso-string.js create mode 100644 task/node_modules/moment/src/lib/duration/prototype.js create mode 100644 task/node_modules/moment/src/lib/duration/valid.js create mode 100644 task/node_modules/moment/src/lib/format/format.js create mode 100644 task/node_modules/moment/src/lib/locale/base-config.js create mode 100644 task/node_modules/moment/src/lib/locale/calendar.js create mode 100644 task/node_modules/moment/src/lib/locale/constructor.js create mode 100644 task/node_modules/moment/src/lib/locale/en.js create mode 100644 task/node_modules/moment/src/lib/locale/formats.js create mode 100644 task/node_modules/moment/src/lib/locale/invalid.js create mode 100644 task/node_modules/moment/src/lib/locale/lists.js create mode 100644 task/node_modules/moment/src/lib/locale/locale.js create mode 100644 task/node_modules/moment/src/lib/locale/locales.js create mode 100644 task/node_modules/moment/src/lib/locale/ordinal.js create mode 100644 task/node_modules/moment/src/lib/locale/pre-post-format.js create mode 100644 task/node_modules/moment/src/lib/locale/prototype.js create mode 100644 task/node_modules/moment/src/lib/locale/relative.js create mode 100644 task/node_modules/moment/src/lib/locale/set.js create mode 100644 task/node_modules/moment/src/lib/moment/add-subtract.js create mode 100644 task/node_modules/moment/src/lib/moment/calendar.js create mode 100644 task/node_modules/moment/src/lib/moment/clone.js create mode 100644 task/node_modules/moment/src/lib/moment/compare.js create mode 100644 task/node_modules/moment/src/lib/moment/constructor.js create mode 100644 task/node_modules/moment/src/lib/moment/creation-data.js create mode 100644 task/node_modules/moment/src/lib/moment/diff.js create mode 100644 task/node_modules/moment/src/lib/moment/format.js create mode 100644 task/node_modules/moment/src/lib/moment/from.js create mode 100644 task/node_modules/moment/src/lib/moment/get-set.js create mode 100644 task/node_modules/moment/src/lib/moment/locale.js create mode 100644 task/node_modules/moment/src/lib/moment/min-max.js create mode 100644 task/node_modules/moment/src/lib/moment/moment.js create mode 100644 task/node_modules/moment/src/lib/moment/now.js create mode 100644 task/node_modules/moment/src/lib/moment/prototype.js create mode 100644 task/node_modules/moment/src/lib/moment/start-end-of.js create mode 100644 task/node_modules/moment/src/lib/moment/to-type.js create mode 100644 task/node_modules/moment/src/lib/moment/to.js create mode 100644 task/node_modules/moment/src/lib/moment/valid.js create mode 100644 task/node_modules/moment/src/lib/parse/regex.js create mode 100644 task/node_modules/moment/src/lib/parse/token.js create mode 100644 task/node_modules/moment/src/lib/units/aliases.js create mode 100644 task/node_modules/moment/src/lib/units/constants.js create mode 100644 task/node_modules/moment/src/lib/units/day-of-month.js create mode 100644 task/node_modules/moment/src/lib/units/day-of-week.js create mode 100644 task/node_modules/moment/src/lib/units/day-of-year.js create mode 100644 task/node_modules/moment/src/lib/units/era.js create mode 100644 task/node_modules/moment/src/lib/units/hour.js create mode 100644 task/node_modules/moment/src/lib/units/millisecond.js create mode 100644 task/node_modules/moment/src/lib/units/minute.js create mode 100644 task/node_modules/moment/src/lib/units/month.js create mode 100644 task/node_modules/moment/src/lib/units/offset.js create mode 100644 task/node_modules/moment/src/lib/units/priorities.js create mode 100644 task/node_modules/moment/src/lib/units/quarter.js create mode 100644 task/node_modules/moment/src/lib/units/second.js create mode 100644 task/node_modules/moment/src/lib/units/timestamp.js create mode 100644 task/node_modules/moment/src/lib/units/timezone.js create mode 100644 task/node_modules/moment/src/lib/units/units.js create mode 100644 task/node_modules/moment/src/lib/units/week-calendar-utils.js create mode 100644 task/node_modules/moment/src/lib/units/week-year.js create mode 100644 task/node_modules/moment/src/lib/units/week.js create mode 100644 task/node_modules/moment/src/lib/units/year.js create mode 100644 task/node_modules/moment/src/lib/utils/abs-ceil.js create mode 100644 task/node_modules/moment/src/lib/utils/abs-floor.js create mode 100644 task/node_modules/moment/src/lib/utils/abs-round.js create mode 100644 task/node_modules/moment/src/lib/utils/compare-arrays.js create mode 100644 task/node_modules/moment/src/lib/utils/defaults.js create mode 100644 task/node_modules/moment/src/lib/utils/deprecate.js create mode 100644 task/node_modules/moment/src/lib/utils/extend.js create mode 100644 task/node_modules/moment/src/lib/utils/has-own-prop.js create mode 100644 task/node_modules/moment/src/lib/utils/hooks.js create mode 100644 task/node_modules/moment/src/lib/utils/index-of.js create mode 100644 task/node_modules/moment/src/lib/utils/is-array.js create mode 100644 task/node_modules/moment/src/lib/utils/is-calendar-spec.js create mode 100644 task/node_modules/moment/src/lib/utils/is-date.js create mode 100644 task/node_modules/moment/src/lib/utils/is-function.js create mode 100644 task/node_modules/moment/src/lib/utils/is-leap-year.js create mode 100644 task/node_modules/moment/src/lib/utils/is-moment-input.js create mode 100644 task/node_modules/moment/src/lib/utils/is-number.js create mode 100644 task/node_modules/moment/src/lib/utils/is-object-empty.js create mode 100644 task/node_modules/moment/src/lib/utils/is-object.js create mode 100644 task/node_modules/moment/src/lib/utils/is-string.js create mode 100644 task/node_modules/moment/src/lib/utils/is-undefined.js create mode 100644 task/node_modules/moment/src/lib/utils/keys.js create mode 100644 task/node_modules/moment/src/lib/utils/map.js create mode 100644 task/node_modules/moment/src/lib/utils/mod.js create mode 100644 task/node_modules/moment/src/lib/utils/some.js create mode 100644 task/node_modules/moment/src/lib/utils/to-int.js create mode 100644 task/node_modules/moment/src/lib/utils/zero-fill.js create mode 100644 task/node_modules/moment/src/locale/af.js create mode 100644 task/node_modules/moment/src/locale/ar-dz.js create mode 100644 task/node_modules/moment/src/locale/ar-kw.js create mode 100644 task/node_modules/moment/src/locale/ar-ly.js create mode 100644 task/node_modules/moment/src/locale/ar-ma.js create mode 100644 task/node_modules/moment/src/locale/ar-ps.js create mode 100644 task/node_modules/moment/src/locale/ar-sa.js create mode 100644 task/node_modules/moment/src/locale/ar-tn.js create mode 100644 task/node_modules/moment/src/locale/ar.js create mode 100644 task/node_modules/moment/src/locale/az.js create mode 100644 task/node_modules/moment/src/locale/be.js create mode 100644 task/node_modules/moment/src/locale/bg.js create mode 100644 task/node_modules/moment/src/locale/bm.js create mode 100644 task/node_modules/moment/src/locale/bn-bd.js create mode 100644 task/node_modules/moment/src/locale/bn.js create mode 100644 task/node_modules/moment/src/locale/bo.js create mode 100644 task/node_modules/moment/src/locale/br.js create mode 100644 task/node_modules/moment/src/locale/bs.js create mode 100644 task/node_modules/moment/src/locale/ca.js create mode 100644 task/node_modules/moment/src/locale/cs.js create mode 100644 task/node_modules/moment/src/locale/cv.js create mode 100644 task/node_modules/moment/src/locale/cy.js create mode 100644 task/node_modules/moment/src/locale/da.js create mode 100644 task/node_modules/moment/src/locale/de-at.js create mode 100644 task/node_modules/moment/src/locale/de-ch.js create mode 100644 task/node_modules/moment/src/locale/de.js create mode 100644 task/node_modules/moment/src/locale/dv.js create mode 100644 task/node_modules/moment/src/locale/el.js create mode 100644 task/node_modules/moment/src/locale/en-au.js create mode 100644 task/node_modules/moment/src/locale/en-ca.js create mode 100644 task/node_modules/moment/src/locale/en-gb.js create mode 100644 task/node_modules/moment/src/locale/en-ie.js create mode 100644 task/node_modules/moment/src/locale/en-il.js create mode 100644 task/node_modules/moment/src/locale/en-in.js create mode 100644 task/node_modules/moment/src/locale/en-nz.js create mode 100644 task/node_modules/moment/src/locale/en-sg.js create mode 100644 task/node_modules/moment/src/locale/eo.js create mode 100644 task/node_modules/moment/src/locale/es-do.js create mode 100644 task/node_modules/moment/src/locale/es-mx.js create mode 100644 task/node_modules/moment/src/locale/es-us.js create mode 100644 task/node_modules/moment/src/locale/es.js create mode 100644 task/node_modules/moment/src/locale/et.js create mode 100644 task/node_modules/moment/src/locale/eu.js create mode 100644 task/node_modules/moment/src/locale/fa.js create mode 100644 task/node_modules/moment/src/locale/fi.js create mode 100644 task/node_modules/moment/src/locale/fil.js create mode 100644 task/node_modules/moment/src/locale/fo.js create mode 100644 task/node_modules/moment/src/locale/fr-ca.js create mode 100644 task/node_modules/moment/src/locale/fr-ch.js create mode 100644 task/node_modules/moment/src/locale/fr.js create mode 100644 task/node_modules/moment/src/locale/fy.js create mode 100644 task/node_modules/moment/src/locale/ga.js create mode 100644 task/node_modules/moment/src/locale/gd.js create mode 100644 task/node_modules/moment/src/locale/gl.js create mode 100644 task/node_modules/moment/src/locale/gom-deva.js create mode 100644 task/node_modules/moment/src/locale/gom-latn.js create mode 100644 task/node_modules/moment/src/locale/gu.js create mode 100644 task/node_modules/moment/src/locale/he.js create mode 100644 task/node_modules/moment/src/locale/hi.js create mode 100644 task/node_modules/moment/src/locale/hr.js create mode 100644 task/node_modules/moment/src/locale/hu.js create mode 100644 task/node_modules/moment/src/locale/hy-am.js create mode 100644 task/node_modules/moment/src/locale/id.js create mode 100644 task/node_modules/moment/src/locale/is.js create mode 100644 task/node_modules/moment/src/locale/it-ch.js create mode 100644 task/node_modules/moment/src/locale/it.js create mode 100644 task/node_modules/moment/src/locale/ja.js create mode 100644 task/node_modules/moment/src/locale/jv.js create mode 100644 task/node_modules/moment/src/locale/ka.js create mode 100644 task/node_modules/moment/src/locale/kk.js create mode 100644 task/node_modules/moment/src/locale/km.js create mode 100644 task/node_modules/moment/src/locale/kn.js create mode 100644 task/node_modules/moment/src/locale/ko.js create mode 100644 task/node_modules/moment/src/locale/ku-kmr.js create mode 100644 task/node_modules/moment/src/locale/ku.js create mode 100644 task/node_modules/moment/src/locale/ky.js create mode 100644 task/node_modules/moment/src/locale/lb.js create mode 100644 task/node_modules/moment/src/locale/lo.js create mode 100644 task/node_modules/moment/src/locale/lt.js create mode 100644 task/node_modules/moment/src/locale/lv.js create mode 100644 task/node_modules/moment/src/locale/me.js create mode 100644 task/node_modules/moment/src/locale/mi.js create mode 100644 task/node_modules/moment/src/locale/mk.js create mode 100644 task/node_modules/moment/src/locale/ml.js create mode 100644 task/node_modules/moment/src/locale/mn.js create mode 100644 task/node_modules/moment/src/locale/mr.js create mode 100644 task/node_modules/moment/src/locale/ms-my.js create mode 100644 task/node_modules/moment/src/locale/ms.js create mode 100644 task/node_modules/moment/src/locale/mt.js create mode 100644 task/node_modules/moment/src/locale/my.js create mode 100644 task/node_modules/moment/src/locale/nb.js create mode 100644 task/node_modules/moment/src/locale/ne.js create mode 100644 task/node_modules/moment/src/locale/nl-be.js create mode 100644 task/node_modules/moment/src/locale/nl.js create mode 100644 task/node_modules/moment/src/locale/nn.js create mode 100644 task/node_modules/moment/src/locale/oc-lnc.js create mode 100644 task/node_modules/moment/src/locale/pa-in.js create mode 100644 task/node_modules/moment/src/locale/pl.js create mode 100644 task/node_modules/moment/src/locale/pt-br.js create mode 100644 task/node_modules/moment/src/locale/pt.js create mode 100644 task/node_modules/moment/src/locale/ro.js create mode 100644 task/node_modules/moment/src/locale/ru.js create mode 100644 task/node_modules/moment/src/locale/sd.js create mode 100644 task/node_modules/moment/src/locale/se.js create mode 100644 task/node_modules/moment/src/locale/si.js create mode 100644 task/node_modules/moment/src/locale/sk.js create mode 100644 task/node_modules/moment/src/locale/sl.js create mode 100644 task/node_modules/moment/src/locale/sq.js create mode 100644 task/node_modules/moment/src/locale/sr-cyrl.js create mode 100644 task/node_modules/moment/src/locale/sr.js create mode 100644 task/node_modules/moment/src/locale/ss.js create mode 100644 task/node_modules/moment/src/locale/sv.js create mode 100644 task/node_modules/moment/src/locale/sw.js create mode 100644 task/node_modules/moment/src/locale/ta.js create mode 100644 task/node_modules/moment/src/locale/te.js create mode 100644 task/node_modules/moment/src/locale/tet.js create mode 100644 task/node_modules/moment/src/locale/tg.js create mode 100644 task/node_modules/moment/src/locale/th.js create mode 100644 task/node_modules/moment/src/locale/tk.js create mode 100644 task/node_modules/moment/src/locale/tl-ph.js create mode 100644 task/node_modules/moment/src/locale/tlh.js create mode 100644 task/node_modules/moment/src/locale/tr.js create mode 100644 task/node_modules/moment/src/locale/tzl.js create mode 100644 task/node_modules/moment/src/locale/tzm-latn.js create mode 100644 task/node_modules/moment/src/locale/tzm.js create mode 100644 task/node_modules/moment/src/locale/ug-cn.js create mode 100644 task/node_modules/moment/src/locale/uk.js create mode 100644 task/node_modules/moment/src/locale/ur.js create mode 100644 task/node_modules/moment/src/locale/uz-latn.js create mode 100644 task/node_modules/moment/src/locale/uz.js create mode 100644 task/node_modules/moment/src/locale/vi.js create mode 100644 task/node_modules/moment/src/locale/x-pseudo.js create mode 100644 task/node_modules/moment/src/locale/yo.js create mode 100644 task/node_modules/moment/src/locale/zh-cn.js create mode 100644 task/node_modules/moment/src/locale/zh-hk.js create mode 100644 task/node_modules/moment/src/locale/zh-mo.js create mode 100644 task/node_modules/moment/src/locale/zh-tw.js create mode 100644 task/node_modules/moment/src/moment.js create mode 100644 task/node_modules/moment/ts3.1-typings/moment.d.ts create mode 100644 task/node_modules/ms/index.js create mode 100644 task/node_modules/ms/license.md create mode 100644 task/node_modules/ms/package.json create mode 100644 task/node_modules/ms/readme.md create mode 100644 task/node_modules/mv/.npmignore create mode 100644 task/node_modules/mv/.travis.yml create mode 100644 task/node_modules/mv/LICENSE create mode 100644 task/node_modules/mv/README.md create mode 100644 task/node_modules/mv/index.js create mode 100644 task/node_modules/mv/package.json create mode 100644 task/node_modules/mv/test/a-file create mode 100644 task/node_modules/mv/test/a-folder/another-file create mode 100644 task/node_modules/mv/test/a-folder/another-folder/file3 create mode 100644 task/node_modules/mv/test/test.js create mode 100644 task/node_modules/nan/CHANGELOG.md create mode 100644 task/node_modules/nan/CMakeLists.txt create mode 100644 task/node_modules/nan/LICENSE.md create mode 100644 task/node_modules/nan/README.md create mode 100644 task/node_modules/nan/doc/asyncworker.md create mode 100644 task/node_modules/nan/doc/buffers.md create mode 100644 task/node_modules/nan/doc/callback.md create mode 100644 task/node_modules/nan/doc/converters.md create mode 100644 task/node_modules/nan/doc/errors.md create mode 100644 task/node_modules/nan/doc/json.md create mode 100644 task/node_modules/nan/doc/maybe_types.md create mode 100644 task/node_modules/nan/doc/methods.md create mode 100644 task/node_modules/nan/doc/new.md create mode 100644 task/node_modules/nan/doc/node_misc.md create mode 100644 task/node_modules/nan/doc/object_wrappers.md create mode 100644 task/node_modules/nan/doc/persistent.md create mode 100644 task/node_modules/nan/doc/scopes.md create mode 100644 task/node_modules/nan/doc/script.md create mode 100644 task/node_modules/nan/doc/string_bytes.md create mode 100644 task/node_modules/nan/doc/v8_internals.md create mode 100644 task/node_modules/nan/doc/v8_misc.md create mode 100644 task/node_modules/nan/include_dirs.js create mode 100644 task/node_modules/nan/nan.h create mode 100644 task/node_modules/nan/nan_callbacks.h create mode 100644 task/node_modules/nan/nan_callbacks_12_inl.h create mode 100644 task/node_modules/nan/nan_callbacks_pre_12_inl.h create mode 100644 task/node_modules/nan/nan_converters.h create mode 100644 task/node_modules/nan/nan_converters_43_inl.h create mode 100644 task/node_modules/nan/nan_converters_pre_43_inl.h create mode 100644 task/node_modules/nan/nan_define_own_property_helper.h create mode 100644 task/node_modules/nan/nan_implementation_12_inl.h create mode 100644 task/node_modules/nan/nan_implementation_pre_12_inl.h create mode 100644 task/node_modules/nan/nan_json.h create mode 100644 task/node_modules/nan/nan_maybe_43_inl.h create mode 100644 task/node_modules/nan/nan_maybe_pre_43_inl.h create mode 100644 task/node_modules/nan/nan_new.h create mode 100644 task/node_modules/nan/nan_object_wrap.h create mode 100644 task/node_modules/nan/nan_persistent_12_inl.h create mode 100644 task/node_modules/nan/nan_persistent_pre_12_inl.h create mode 100644 task/node_modules/nan/nan_private.h create mode 100644 task/node_modules/nan/nan_scriptorigin.h create mode 100644 task/node_modules/nan/nan_string_bytes.h create mode 100644 task/node_modules/nan/nan_typedarray_contents.h create mode 100644 task/node_modules/nan/nan_weak.h create mode 100644 task/node_modules/nan/package.json create mode 100755 task/node_modules/nan/tools/1to2.js create mode 100644 task/node_modules/nan/tools/README.md create mode 100644 task/node_modules/nan/tools/package.json create mode 100644 task/node_modules/ncp/.npmignore create mode 100644 task/node_modules/ncp/.travis.yml create mode 100644 task/node_modules/ncp/LICENSE.md create mode 100644 task/node_modules/ncp/README.md create mode 100755 task/node_modules/ncp/bin/ncp create mode 100644 task/node_modules/ncp/lib/ncp.js create mode 100644 task/node_modules/ncp/package.json create mode 100644 task/node_modules/ncp/test/modified-files/out/a create mode 100644 task/node_modules/ncp/test/modified-files/src/a create mode 100644 task/node_modules/ncp/test/ncp.js create mode 100644 task/node_modules/ncp/test/regular-fixtures/src/a create mode 100644 task/node_modules/ncp/test/regular-fixtures/src/b create mode 100644 task/node_modules/ncp/test/regular-fixtures/src/c create mode 100644 task/node_modules/ncp/test/regular-fixtures/src/d create mode 100644 task/node_modules/ncp/test/regular-fixtures/src/e create mode 100644 task/node_modules/ncp/test/regular-fixtures/src/f create mode 100644 task/node_modules/ncp/test/regular-fixtures/src/sub/a create mode 100644 task/node_modules/ncp/test/regular-fixtures/src/sub/b create mode 100644 task/node_modules/ncp/test/symlink-fixtures/src/dir/bar create mode 100644 task/node_modules/ncp/test/symlink-fixtures/src/foo create mode 100644 task/node_modules/node-addon-api/.editorconfig create mode 100644 task/node_modules/node-addon-api/.travis.yml create mode 100644 task/node_modules/node-addon-api/CHANGELOG.md create mode 100644 task/node_modules/node-addon-api/CODE_OF_CONDUCT.md create mode 100644 task/node_modules/node-addon-api/CONTRIBUTING.md create mode 100644 task/node_modules/node-addon-api/LICENSE.md create mode 100644 task/node_modules/node-addon-api/README.md create mode 100644 task/node_modules/node-addon-api/appveyor.yml create mode 100644 task/node_modules/node-addon-api/doc/Doxyfile create mode 100644 task/node_modules/node-addon-api/doc/array_buffer.md create mode 100644 task/node_modules/node-addon-api/doc/async_context.md create mode 100644 task/node_modules/node-addon-api/doc/async_operations.md create mode 100644 task/node_modules/node-addon-api/doc/async_worker.md create mode 100644 task/node_modules/node-addon-api/doc/basic_types.md create mode 100644 task/node_modules/node-addon-api/doc/bigint.md create mode 100644 task/node_modules/node-addon-api/doc/boolean.md create mode 100644 task/node_modules/node-addon-api/doc/buffer.md create mode 100644 task/node_modules/node-addon-api/doc/callback_scope.md create mode 100644 task/node_modules/node-addon-api/doc/callbackinfo.md create mode 100644 task/node_modules/node-addon-api/doc/checker-tool.md create mode 100644 task/node_modules/node-addon-api/doc/class_property_descriptor.md create mode 100644 task/node_modules/node-addon-api/doc/cmake-js.md create mode 100644 task/node_modules/node-addon-api/doc/conversion-tool.md create mode 100644 task/node_modules/node-addon-api/doc/creating_a_release.md create mode 100644 task/node_modules/node-addon-api/doc/dataview.md create mode 100644 task/node_modules/node-addon-api/doc/env.md create mode 100644 task/node_modules/node-addon-api/doc/error.md create mode 100644 task/node_modules/node-addon-api/doc/error_handling.md create mode 100644 task/node_modules/node-addon-api/doc/escapable_handle_scope.md create mode 100644 task/node_modules/node-addon-api/doc/external.md create mode 100644 task/node_modules/node-addon-api/doc/function.md create mode 100644 task/node_modules/node-addon-api/doc/function_reference.md create mode 100644 task/node_modules/node-addon-api/doc/generator.md create mode 100644 task/node_modules/node-addon-api/doc/handle_scope.md create mode 100644 task/node_modules/node-addon-api/doc/memory_management.md create mode 100644 task/node_modules/node-addon-api/doc/node-gyp.md create mode 100644 task/node_modules/node-addon-api/doc/number.md create mode 100644 task/node_modules/node-addon-api/doc/object.md create mode 100644 task/node_modules/node-addon-api/doc/object_lifetime_management.md create mode 100644 task/node_modules/node-addon-api/doc/object_reference.md create mode 100644 task/node_modules/node-addon-api/doc/object_wrap.md create mode 100644 task/node_modules/node-addon-api/doc/prebuild_tools.md create mode 100644 task/node_modules/node-addon-api/doc/promises.md create mode 100644 task/node_modules/node-addon-api/doc/property_descriptor.md create mode 100644 task/node_modules/node-addon-api/doc/range_error.md create mode 100644 task/node_modules/node-addon-api/doc/reference.md create mode 100644 task/node_modules/node-addon-api/doc/setup.md create mode 100644 task/node_modules/node-addon-api/doc/string.md create mode 100644 task/node_modules/node-addon-api/doc/symbol.md create mode 100644 task/node_modules/node-addon-api/doc/threadsafe_function.md create mode 100644 task/node_modules/node-addon-api/doc/type_error.md create mode 100644 task/node_modules/node-addon-api/doc/typed_array.md create mode 100644 task/node_modules/node-addon-api/doc/typed_array_of.md create mode 100644 task/node_modules/node-addon-api/doc/value.md create mode 100644 task/node_modules/node-addon-api/doc/version_management.md create mode 100644 task/node_modules/node-addon-api/doc/working_with_javascript_values.md create mode 100644 task/node_modules/node-addon-api/external-napi/node_api.h create mode 100644 task/node_modules/node-addon-api/index.js create mode 100644 task/node_modules/node-addon-api/napi-inl.deprecated.h create mode 100644 task/node_modules/node-addon-api/napi-inl.h create mode 100644 task/node_modules/node-addon-api/napi.h create mode 100644 task/node_modules/node-addon-api/package.json create mode 100644 task/node_modules/node-addon-api/src/node_api.cc create mode 100644 task/node_modules/node-addon-api/src/node_api.gyp create mode 100644 task/node_modules/node-addon-api/src/node_api.h create mode 100644 task/node_modules/node-addon-api/src/node_api_types.h create mode 100644 task/node_modules/node-addon-api/src/node_internals.cc create mode 100644 task/node_modules/node-addon-api/src/node_internals.h create mode 100644 task/node_modules/node-addon-api/src/nothing.c create mode 100644 task/node_modules/node-addon-api/src/util-inl.h create mode 100644 task/node_modules/node-addon-api/src/util.h create mode 100644 task/node_modules/node-addon-api/tools/README.md create mode 100644 task/node_modules/node-addon-api/tools/check-napi.js create mode 100755 task/node_modules/node-addon-api/tools/conversion.js create mode 100644 task/node_modules/nodejs-file-downloader/.github/workflows/nodeCI.yml create mode 100644 task/node_modules/nodejs-file-downloader/CHANGELOG.md create mode 100644 task/node_modules/nodejs-file-downloader/Download.js create mode 100644 task/node_modules/nodejs-file-downloader/Downloader.js create mode 100644 task/node_modules/nodejs-file-downloader/Downloader.td.ts create mode 100644 task/node_modules/nodejs-file-downloader/concurrency.test.js create mode 100644 task/node_modules/nodejs-file-downloader/fixtures/Desert.jpg create mode 100644 task/node_modules/nodejs-file-downloader/fixtures/Hydrangeas.jpg create mode 100644 task/node_modules/nodejs-file-downloader/fixtures/Koala.jpg create mode 100644 task/node_modules/nodejs-file-downloader/fixtures/Lighthouse.jpg create mode 100644 task/node_modules/nodejs-file-downloader/fixtures/buba.jpeg create mode 100644 task/node_modules/nodejs-file-downloader/main.test.js create mode 100644 task/node_modules/nodejs-file-downloader/makeRequest.js create mode 100644 task/node_modules/nodejs-file-downloader/package.json create mode 100644 task/node_modules/nodejs-file-downloader/readme.md create mode 100644 task/node_modules/nodejs-file-downloader/testServer.js create mode 100644 task/node_modules/nodejs-file-downloader/timeout-cancellation.test.js create mode 100644 task/node_modules/nodejs-file-downloader/utils/FileProcessor.js create mode 100644 task/node_modules/nodejs-file-downloader/utils/delay.js create mode 100644 task/node_modules/nodejs-file-downloader/utils/fileName.js create mode 100644 task/node_modules/nodejs-file-downloader/utils/rpur.js create mode 100644 task/node_modules/nodejs-file-downloader/utils/stream.js create mode 100644 task/node_modules/nodejs-file-downloader/utils/string.js create mode 100644 task/node_modules/nodejs-file-downloader/utils/url.js create mode 100644 task/node_modules/object-inspect/.eslintrc create mode 100644 task/node_modules/object-inspect/.github/FUNDING.yml create mode 100644 task/node_modules/object-inspect/.nycrc create mode 100644 task/node_modules/object-inspect/CHANGELOG.md create mode 100644 task/node_modules/object-inspect/LICENSE create mode 100644 task/node_modules/object-inspect/example/all.js create mode 100644 task/node_modules/object-inspect/example/circular.js create mode 100644 task/node_modules/object-inspect/example/fn.js create mode 100644 task/node_modules/object-inspect/example/inspect.js create mode 100644 task/node_modules/object-inspect/index.js create mode 100644 task/node_modules/object-inspect/package-support.json create mode 100644 task/node_modules/object-inspect/package.json create mode 100644 task/node_modules/object-inspect/readme.markdown create mode 100644 task/node_modules/object-inspect/test-core-js.js create mode 100644 task/node_modules/object-inspect/test/bigint.js create mode 100644 task/node_modules/object-inspect/test/browser/dom.js create mode 100644 task/node_modules/object-inspect/test/circular.js create mode 100644 task/node_modules/object-inspect/test/deep.js create mode 100644 task/node_modules/object-inspect/test/element.js create mode 100644 task/node_modules/object-inspect/test/err.js create mode 100644 task/node_modules/object-inspect/test/fakes.js create mode 100644 task/node_modules/object-inspect/test/fn.js create mode 100644 task/node_modules/object-inspect/test/global.js create mode 100644 task/node_modules/object-inspect/test/has.js create mode 100644 task/node_modules/object-inspect/test/holes.js create mode 100644 task/node_modules/object-inspect/test/indent-option.js create mode 100644 task/node_modules/object-inspect/test/inspect.js create mode 100644 task/node_modules/object-inspect/test/lowbyte.js create mode 100644 task/node_modules/object-inspect/test/number.js create mode 100644 task/node_modules/object-inspect/test/quoteStyle.js create mode 100644 task/node_modules/object-inspect/test/toStringTag.js create mode 100644 task/node_modules/object-inspect/test/undef.js create mode 100644 task/node_modules/object-inspect/test/values.js create mode 100644 task/node_modules/object-inspect/util.inspect.js create mode 100644 task/node_modules/once/LICENSE create mode 100644 task/node_modules/once/README.md create mode 100644 task/node_modules/once/once.js create mode 100644 task/node_modules/once/package.json create mode 100644 task/node_modules/parse-cache-control/.npmignore create mode 100644 task/node_modules/parse-cache-control/LICENSE create mode 100644 task/node_modules/parse-cache-control/README.md create mode 100644 task/node_modules/parse-cache-control/index.js create mode 100644 task/node_modules/parse-cache-control/package.json create mode 100644 task/node_modules/parse-cache-control/test.js create mode 100644 task/node_modules/path-is-absolute/index.js create mode 100644 task/node_modules/path-is-absolute/license create mode 100644 task/node_modules/path-is-absolute/package.json create mode 100644 task/node_modules/path-is-absolute/readme.md create mode 100644 task/node_modules/path-parse/LICENSE create mode 100644 task/node_modules/path-parse/README.md create mode 100644 task/node_modules/path-parse/index.js create mode 100644 task/node_modules/path-parse/package.json create mode 100644 task/node_modules/process-nextick-args/index.js create mode 100644 task/node_modules/process-nextick-args/license.md create mode 100644 task/node_modules/process-nextick-args/package.json create mode 100644 task/node_modules/process-nextick-args/readme.md create mode 100644 task/node_modules/promise/.jshintrc create mode 100644 task/node_modules/promise/LICENSE create mode 100644 task/node_modules/promise/Readme.md create mode 100644 task/node_modules/promise/build.js create mode 100644 task/node_modules/promise/core.js create mode 100644 task/node_modules/promise/domains/core.js create mode 100644 task/node_modules/promise/domains/done.js create mode 100644 task/node_modules/promise/domains/es6-extensions.js create mode 100644 task/node_modules/promise/domains/finally.js create mode 100644 task/node_modules/promise/domains/index.js create mode 100644 task/node_modules/promise/domains/node-extensions.js create mode 100644 task/node_modules/promise/domains/rejection-tracking.js create mode 100644 task/node_modules/promise/domains/synchronous.js create mode 100644 task/node_modules/promise/index.d.ts create mode 100644 task/node_modules/promise/index.js create mode 100644 task/node_modules/promise/index.js.flow create mode 100644 task/node_modules/promise/lib/core.js create mode 100644 task/node_modules/promise/lib/done.js create mode 100644 task/node_modules/promise/lib/es6-extensions.js create mode 100644 task/node_modules/promise/lib/finally.js create mode 100644 task/node_modules/promise/lib/index.js create mode 100644 task/node_modules/promise/lib/node-extensions.js create mode 100644 task/node_modules/promise/lib/rejection-tracking.js create mode 100644 task/node_modules/promise/lib/synchronous.js create mode 100644 task/node_modules/promise/package.json create mode 100644 task/node_modules/promise/polyfill-done.js create mode 100644 task/node_modules/promise/polyfill.js create mode 100644 task/node_modules/promise/setimmediate/core.js create mode 100644 task/node_modules/promise/setimmediate/done.js create mode 100644 task/node_modules/promise/setimmediate/es6-extensions.js create mode 100644 task/node_modules/promise/setimmediate/finally.js create mode 100644 task/node_modules/promise/setimmediate/index.js create mode 100644 task/node_modules/promise/setimmediate/node-extensions.js create mode 100644 task/node_modules/promise/setimmediate/rejection-tracking.js create mode 100644 task/node_modules/promise/setimmediate/synchronous.js create mode 100644 task/node_modules/promise/src/core.js create mode 100644 task/node_modules/promise/src/done.js create mode 100644 task/node_modules/promise/src/es6-extensions.js create mode 100644 task/node_modules/promise/src/finally.js create mode 100644 task/node_modules/promise/src/index.js create mode 100644 task/node_modules/promise/src/node-extensions.js create mode 100644 task/node_modules/promise/src/rejection-tracking.js create mode 100644 task/node_modules/promise/src/synchronous.js create mode 100644 task/node_modules/proxy-from-env/.eslintrc create mode 100644 task/node_modules/proxy-from-env/.travis.yml create mode 100644 task/node_modules/proxy-from-env/LICENSE create mode 100644 task/node_modules/proxy-from-env/README.md create mode 100644 task/node_modules/proxy-from-env/index.js create mode 100644 task/node_modules/proxy-from-env/package.json create mode 100644 task/node_modules/proxy-from-env/test.js create mode 100644 task/node_modules/q/CHANGES.md create mode 100644 task/node_modules/q/LICENSE create mode 100644 task/node_modules/q/README.md create mode 100644 task/node_modules/q/package.json create mode 100644 task/node_modules/q/q.js create mode 100644 task/node_modules/q/queue.js create mode 100644 task/node_modules/qs/.editorconfig create mode 100644 task/node_modules/qs/.eslintrc create mode 100644 task/node_modules/qs/.github/FUNDING.yml create mode 100644 task/node_modules/qs/.nycrc create mode 100644 task/node_modules/qs/CHANGELOG.md create mode 100644 task/node_modules/qs/LICENSE.md create mode 100644 task/node_modules/qs/README.md create mode 100644 task/node_modules/qs/dist/qs.js create mode 100644 task/node_modules/qs/lib/formats.js create mode 100644 task/node_modules/qs/lib/index.js create mode 100644 task/node_modules/qs/lib/parse.js create mode 100644 task/node_modules/qs/lib/stringify.js create mode 100644 task/node_modules/qs/lib/utils.js create mode 100644 task/node_modules/qs/package.json create mode 100644 task/node_modules/qs/test/empty-keys-cases.js create mode 100644 task/node_modules/qs/test/parse.js create mode 100644 task/node_modules/qs/test/stringify.js create mode 100644 task/node_modules/qs/test/utils.js create mode 100644 task/node_modules/readable-stream/.travis.yml create mode 100644 task/node_modules/readable-stream/CONTRIBUTING.md create mode 100644 task/node_modules/readable-stream/GOVERNANCE.md create mode 100644 task/node_modules/readable-stream/LICENSE create mode 100644 task/node_modules/readable-stream/README.md create mode 100644 task/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md create mode 100644 task/node_modules/readable-stream/duplex-browser.js create mode 100644 task/node_modules/readable-stream/duplex.js create mode 100644 task/node_modules/readable-stream/lib/_stream_duplex.js create mode 100644 task/node_modules/readable-stream/lib/_stream_passthrough.js create mode 100644 task/node_modules/readable-stream/lib/_stream_readable.js create mode 100644 task/node_modules/readable-stream/lib/_stream_transform.js create mode 100644 task/node_modules/readable-stream/lib/_stream_writable.js create mode 100644 task/node_modules/readable-stream/lib/internal/streams/BufferList.js create mode 100644 task/node_modules/readable-stream/lib/internal/streams/destroy.js create mode 100644 task/node_modules/readable-stream/lib/internal/streams/stream-browser.js create mode 100644 task/node_modules/readable-stream/lib/internal/streams/stream.js create mode 100644 task/node_modules/readable-stream/package.json create mode 100644 task/node_modules/readable-stream/passthrough.js create mode 100644 task/node_modules/readable-stream/readable-browser.js create mode 100644 task/node_modules/readable-stream/readable.js create mode 100644 task/node_modules/readable-stream/transform.js create mode 100644 task/node_modules/readable-stream/writable-browser.js create mode 100644 task/node_modules/readable-stream/writable.js create mode 100644 task/node_modules/rechoir/.npmignore create mode 100644 task/node_modules/rechoir/.travis.yml create mode 100644 task/node_modules/rechoir/CHANGELOG create mode 100644 task/node_modules/rechoir/LICENSE create mode 100644 task/node_modules/rechoir/README.md create mode 100644 task/node_modules/rechoir/index.js create mode 100644 task/node_modules/rechoir/lib/extension.js create mode 100644 task/node_modules/rechoir/lib/normalize.js create mode 100644 task/node_modules/rechoir/lib/register.js create mode 100644 task/node_modules/rechoir/package.json create mode 100644 task/node_modules/resolve/.editorconfig create mode 100644 task/node_modules/resolve/.eslintrc create mode 100644 task/node_modules/resolve/.github/FUNDING.yml create mode 100644 task/node_modules/resolve/LICENSE create mode 100644 task/node_modules/resolve/SECURITY.md create mode 100644 task/node_modules/resolve/async.js create mode 100755 task/node_modules/resolve/bin/resolve create mode 100644 task/node_modules/resolve/example/async.js create mode 100644 task/node_modules/resolve/example/sync.js create mode 100644 task/node_modules/resolve/index.js create mode 100644 task/node_modules/resolve/lib/async.js create mode 100644 task/node_modules/resolve/lib/caller.js create mode 100644 task/node_modules/resolve/lib/core.js create mode 100644 task/node_modules/resolve/lib/core.json create mode 100644 task/node_modules/resolve/lib/homedir.js create mode 100644 task/node_modules/resolve/lib/is-core.js create mode 100644 task/node_modules/resolve/lib/node-modules-paths.js create mode 100644 task/node_modules/resolve/lib/normalize-options.js create mode 100644 task/node_modules/resolve/lib/sync.js create mode 100644 task/node_modules/resolve/package.json create mode 100644 task/node_modules/resolve/readme.markdown create mode 100644 task/node_modules/resolve/sync.js create mode 100644 task/node_modules/resolve/test/core.js create mode 100644 task/node_modules/resolve/test/dotdot.js create mode 100644 task/node_modules/resolve/test/dotdot/abc/index.js create mode 100644 task/node_modules/resolve/test/dotdot/index.js create mode 100644 task/node_modules/resolve/test/faulty_basedir.js create mode 100644 task/node_modules/resolve/test/filter.js create mode 100644 task/node_modules/resolve/test/filter_sync.js create mode 100644 task/node_modules/resolve/test/home_paths.js create mode 100644 task/node_modules/resolve/test/home_paths_sync.js create mode 100644 task/node_modules/resolve/test/mock.js create mode 100644 task/node_modules/resolve/test/mock_sync.js create mode 100644 task/node_modules/resolve/test/module_dir.js create mode 100644 task/node_modules/resolve/test/module_dir/xmodules/aaa/index.js create mode 100644 task/node_modules/resolve/test/module_dir/ymodules/aaa/index.js create mode 100644 task/node_modules/resolve/test/module_dir/zmodules/bbb/main.js create mode 100644 task/node_modules/resolve/test/module_dir/zmodules/bbb/package.json create mode 100644 task/node_modules/resolve/test/node-modules-paths.js create mode 100644 task/node_modules/resolve/test/node_path.js create mode 100644 task/node_modules/resolve/test/node_path/x/aaa/index.js create mode 100644 task/node_modules/resolve/test/node_path/x/ccc/index.js create mode 100644 task/node_modules/resolve/test/node_path/y/bbb/index.js create mode 100644 task/node_modules/resolve/test/node_path/y/ccc/index.js create mode 100644 task/node_modules/resolve/test/nonstring.js create mode 100644 task/node_modules/resolve/test/pathfilter.js create mode 100644 task/node_modules/resolve/test/pathfilter/deep_ref/main.js create mode 100644 task/node_modules/resolve/test/precedence.js create mode 100644 task/node_modules/resolve/test/precedence/aaa.js create mode 100644 task/node_modules/resolve/test/precedence/aaa/index.js create mode 100644 task/node_modules/resolve/test/precedence/aaa/main.js create mode 100644 task/node_modules/resolve/test/precedence/bbb.js create mode 100644 task/node_modules/resolve/test/precedence/bbb/main.js create mode 100644 task/node_modules/resolve/test/resolver.js create mode 100644 task/node_modules/resolve/test/resolver/baz/doom.js create mode 100644 task/node_modules/resolve/test/resolver/baz/package.json create mode 100644 task/node_modules/resolve/test/resolver/baz/quux.js create mode 100644 task/node_modules/resolve/test/resolver/browser_field/a.js create mode 100644 task/node_modules/resolve/test/resolver/browser_field/b.js create mode 100644 task/node_modules/resolve/test/resolver/browser_field/package.json create mode 100644 task/node_modules/resolve/test/resolver/cup.coffee create mode 100644 task/node_modules/resolve/test/resolver/dot_main/index.js create mode 100644 task/node_modules/resolve/test/resolver/dot_main/package.json create mode 100644 task/node_modules/resolve/test/resolver/dot_slash_main/index.js create mode 100644 task/node_modules/resolve/test/resolver/dot_slash_main/package.json create mode 100644 task/node_modules/resolve/test/resolver/false_main/index.js create mode 100644 task/node_modules/resolve/test/resolver/false_main/package.json create mode 100644 task/node_modules/resolve/test/resolver/foo.js create mode 100644 task/node_modules/resolve/test/resolver/incorrect_main/index.js create mode 100644 task/node_modules/resolve/test/resolver/incorrect_main/package.json create mode 100644 task/node_modules/resolve/test/resolver/invalid_main/package.json create mode 100644 task/node_modules/resolve/test/resolver/mug.coffee create mode 100644 task/node_modules/resolve/test/resolver/mug.js create mode 100644 task/node_modules/resolve/test/resolver/multirepo/lerna.json create mode 100644 task/node_modules/resolve/test/resolver/multirepo/package.json create mode 100644 task/node_modules/resolve/test/resolver/multirepo/packages/package-a/index.js create mode 100644 task/node_modules/resolve/test/resolver/multirepo/packages/package-a/package.json create mode 100644 task/node_modules/resolve/test/resolver/multirepo/packages/package-b/index.js create mode 100644 task/node_modules/resolve/test/resolver/multirepo/packages/package-b/package.json create mode 100644 task/node_modules/resolve/test/resolver/nested_symlinks/mylib/async.js create mode 100644 task/node_modules/resolve/test/resolver/nested_symlinks/mylib/package.json create mode 100644 task/node_modules/resolve/test/resolver/nested_symlinks/mylib/sync.js create mode 100644 task/node_modules/resolve/test/resolver/other_path/lib/other-lib.js create mode 100644 task/node_modules/resolve/test/resolver/other_path/root.js create mode 100644 task/node_modules/resolve/test/resolver/quux/foo/index.js create mode 100644 task/node_modules/resolve/test/resolver/same_names/foo.js create mode 100644 task/node_modules/resolve/test/resolver/same_names/foo/index.js create mode 100644 task/node_modules/resolve/test/resolver/symlinked/_/node_modules/foo.js create mode 100644 task/node_modules/resolve/test/resolver/symlinked/_/symlink_target/.gitkeep create mode 100644 task/node_modules/resolve/test/resolver/symlinked/package/bar.js create mode 100644 task/node_modules/resolve/test/resolver/symlinked/package/package.json create mode 100644 task/node_modules/resolve/test/resolver/without_basedir/main.js create mode 100644 task/node_modules/resolve/test/resolver_sync.js create mode 100644 task/node_modules/resolve/test/shadowed_core.js create mode 100644 task/node_modules/resolve/test/shadowed_core/node_modules/util/index.js create mode 100644 task/node_modules/resolve/test/subdirs.js create mode 100644 task/node_modules/resolve/test/symlinks.js create mode 100644 task/node_modules/rimraf/LICENSE create mode 100644 task/node_modules/rimraf/README.md create mode 100755 task/node_modules/rimraf/bin.js create mode 100644 task/node_modules/rimraf/node_modules/glob/LICENSE create mode 100644 task/node_modules/rimraf/node_modules/glob/README.md create mode 100644 task/node_modules/rimraf/node_modules/glob/common.js create mode 100644 task/node_modules/rimraf/node_modules/glob/glob.js create mode 100644 task/node_modules/rimraf/node_modules/glob/package.json create mode 100644 task/node_modules/rimraf/node_modules/glob/sync.js create mode 100644 task/node_modules/rimraf/package.json create mode 100644 task/node_modules/rimraf/rimraf.js create mode 100644 task/node_modules/safe-buffer/LICENSE create mode 100644 task/node_modules/safe-buffer/README.md create mode 100644 task/node_modules/safe-buffer/index.d.ts create mode 100644 task/node_modules/safe-buffer/index.js create mode 100644 task/node_modules/safe-buffer/package.json create mode 100644 task/node_modules/safe-json-stringify/.idea/misc.xml create mode 100644 task/node_modules/safe-json-stringify/.idea/modules.xml create mode 100644 task/node_modules/safe-json-stringify/.idea/safe-json-stringify.iml create mode 100644 task/node_modules/safe-json-stringify/.idea/vcs.xml create mode 100644 task/node_modules/safe-json-stringify/.idea/workspace.xml create mode 100644 task/node_modules/safe-json-stringify/.travis.yml create mode 100644 task/node_modules/safe-json-stringify/README.md create mode 100644 task/node_modules/safe-json-stringify/index.js create mode 100644 task/node_modules/safe-json-stringify/package.json create mode 100644 task/node_modules/sanitize-filename/.airtap.yml create mode 100644 task/node_modules/sanitize-filename/.gitmodules create mode 100644 task/node_modules/sanitize-filename/.travis.yml create mode 100644 task/node_modules/sanitize-filename/AUTHORS create mode 100644 task/node_modules/sanitize-filename/Changelog.md create mode 100644 task/node_modules/sanitize-filename/LICENSE.md create mode 100644 task/node_modules/sanitize-filename/README.md create mode 100644 task/node_modules/sanitize-filename/index.d.ts create mode 100644 task/node_modules/sanitize-filename/index.js create mode 100644 task/node_modules/sanitize-filename/package.json create mode 100644 task/node_modules/sanitize-filename/test.js create mode 100644 task/node_modules/semver/LICENSE create mode 100644 task/node_modules/semver/README.md create mode 100755 task/node_modules/semver/bin/semver create mode 100644 task/node_modules/semver/package.json create mode 100644 task/node_modules/semver/range.bnf create mode 100644 task/node_modules/semver/semver.js create mode 100644 task/node_modules/set-function-length/.eslintrc create mode 100644 task/node_modules/set-function-length/.github/FUNDING.yml create mode 100644 task/node_modules/set-function-length/.nycrc create mode 100644 task/node_modules/set-function-length/CHANGELOG.md create mode 100644 task/node_modules/set-function-length/LICENSE create mode 100644 task/node_modules/set-function-length/README.md create mode 100644 task/node_modules/set-function-length/env.js create mode 100644 task/node_modules/set-function-length/index.js create mode 100644 task/node_modules/set-function-length/package.json create mode 100644 task/node_modules/shelljs/CHANGELOG.md create mode 100644 task/node_modules/shelljs/LICENSE create mode 100644 task/node_modules/shelljs/README.md create mode 100755 task/node_modules/shelljs/bin/shjs create mode 100644 task/node_modules/shelljs/commands.js create mode 100644 task/node_modules/shelljs/global.js create mode 100644 task/node_modules/shelljs/make.js create mode 100644 task/node_modules/shelljs/package.json create mode 100644 task/node_modules/shelljs/plugin.js create mode 100644 task/node_modules/shelljs/shell.js create mode 100644 task/node_modules/shelljs/src/cat.js create mode 100644 task/node_modules/shelljs/src/cd.js create mode 100644 task/node_modules/shelljs/src/chmod.js create mode 100644 task/node_modules/shelljs/src/common.js create mode 100644 task/node_modules/shelljs/src/cp.js create mode 100644 task/node_modules/shelljs/src/dirs.js create mode 100644 task/node_modules/shelljs/src/echo.js create mode 100644 task/node_modules/shelljs/src/error.js create mode 100644 task/node_modules/shelljs/src/exec-child.js create mode 100644 task/node_modules/shelljs/src/exec.js create mode 100644 task/node_modules/shelljs/src/find.js create mode 100644 task/node_modules/shelljs/src/grep.js create mode 100644 task/node_modules/shelljs/src/head.js create mode 100644 task/node_modules/shelljs/src/ln.js create mode 100644 task/node_modules/shelljs/src/ls.js create mode 100644 task/node_modules/shelljs/src/mkdir.js create mode 100644 task/node_modules/shelljs/src/mv.js create mode 100644 task/node_modules/shelljs/src/popd.js create mode 100644 task/node_modules/shelljs/src/pushd.js create mode 100644 task/node_modules/shelljs/src/pwd.js create mode 100644 task/node_modules/shelljs/src/rm.js create mode 100644 task/node_modules/shelljs/src/sed.js create mode 100644 task/node_modules/shelljs/src/set.js create mode 100644 task/node_modules/shelljs/src/sort.js create mode 100644 task/node_modules/shelljs/src/tail.js create mode 100644 task/node_modules/shelljs/src/tempdir.js create mode 100644 task/node_modules/shelljs/src/test.js create mode 100644 task/node_modules/shelljs/src/to.js create mode 100644 task/node_modules/shelljs/src/toEnd.js create mode 100644 task/node_modules/shelljs/src/touch.js create mode 100644 task/node_modules/shelljs/src/uniq.js create mode 100644 task/node_modules/shelljs/src/which.js create mode 100644 task/node_modules/side-channel/.eslintignore create mode 100644 task/node_modules/side-channel/.eslintrc create mode 100644 task/node_modules/side-channel/.github/FUNDING.yml create mode 100644 task/node_modules/side-channel/.nycrc create mode 100644 task/node_modules/side-channel/CHANGELOG.md create mode 100644 task/node_modules/side-channel/LICENSE create mode 100644 task/node_modules/side-channel/README.md create mode 100644 task/node_modules/side-channel/index.js create mode 100644 task/node_modules/side-channel/package.json create mode 100644 task/node_modules/side-channel/test/index.js create mode 100644 task/node_modules/string_decoder/.travis.yml create mode 100644 task/node_modules/string_decoder/LICENSE create mode 100644 task/node_modules/string_decoder/README.md create mode 100644 task/node_modules/string_decoder/lib/string_decoder.js create mode 100644 task/node_modules/string_decoder/package.json create mode 100644 task/node_modules/supports-preserve-symlinks-flag/.eslintrc create mode 100644 task/node_modules/supports-preserve-symlinks-flag/.github/FUNDING.yml create mode 100644 task/node_modules/supports-preserve-symlinks-flag/.nycrc create mode 100644 task/node_modules/supports-preserve-symlinks-flag/CHANGELOG.md create mode 100644 task/node_modules/supports-preserve-symlinks-flag/LICENSE create mode 100644 task/node_modules/supports-preserve-symlinks-flag/README.md create mode 100644 task/node_modules/supports-preserve-symlinks-flag/browser.js create mode 100644 task/node_modules/supports-preserve-symlinks-flag/index.js create mode 100644 task/node_modules/supports-preserve-symlinks-flag/package.json create mode 100644 task/node_modules/supports-preserve-symlinks-flag/test/index.js create mode 100644 task/node_modules/sync-request/.prettierrc create mode 100644 task/node_modules/sync-request/.travis.yml create mode 100644 task/node_modules/sync-request/LICENSE create mode 100644 task/node_modules/sync-request/README.md create mode 100644 task/node_modules/sync-request/lib/FormData.d.ts create mode 100644 task/node_modules/sync-request/lib/FormData.js create mode 100644 task/node_modules/sync-request/lib/FormData.js.flow create mode 100644 task/node_modules/sync-request/lib/Options.d.ts create mode 100644 task/node_modules/sync-request/lib/Options.js create mode 100644 task/node_modules/sync-request/lib/Options.js.flow create mode 100644 task/node_modules/sync-request/lib/browser.d.ts create mode 100644 task/node_modules/sync-request/lib/browser.js create mode 100644 task/node_modules/sync-request/lib/browser.js.flow create mode 100644 task/node_modules/sync-request/lib/index.d.ts create mode 100644 task/node_modules/sync-request/lib/index.js create mode 100644 task/node_modules/sync-request/lib/index.js.flow create mode 100644 task/node_modules/sync-request/lib/messages.d.ts create mode 100644 task/node_modules/sync-request/lib/messages.js create mode 100644 task/node_modules/sync-request/lib/messages.js.flow create mode 100644 task/node_modules/sync-request/lib/worker.d.ts create mode 100644 task/node_modules/sync-request/lib/worker.js create mode 100644 task/node_modules/sync-request/lib/worker.js.flow create mode 100644 task/node_modules/sync-request/package.json create mode 100644 task/node_modules/sync-request/src/FormData.ts create mode 100644 task/node_modules/sync-request/src/Options.ts create mode 100644 task/node_modules/sync-request/src/browser.ts create mode 100644 task/node_modules/sync-request/src/index.ts create mode 100644 task/node_modules/sync-request/src/messages.ts create mode 100644 task/node_modules/sync-request/src/worker.ts create mode 100644 task/node_modules/sync-request/test/__snapshots__/external.test.js.snap create mode 100644 task/node_modules/sync-request/test/__snapshots__/internal.test.js.snap create mode 100644 task/node_modules/sync-request/test/benchmark-server.js create mode 100644 task/node_modules/sync-request/test/benchmark.js create mode 100644 task/node_modules/sync-request/test/external.test.js create mode 100644 task/node_modules/sync-request/test/fake-server.js create mode 100644 task/node_modules/sync-request/test/internal.test.js create mode 100644 task/node_modules/sync-request/tsconfig.json create mode 100644 task/node_modules/sync-rpc/HISTORY.md create mode 100644 task/node_modules/sync-rpc/LICENSE.md create mode 100644 task/node_modules/sync-rpc/README.md create mode 100644 task/node_modules/sync-rpc/lib/__tests__/index.test.js create mode 100644 task/node_modules/sync-rpc/lib/find-port.js create mode 100644 task/node_modules/sync-rpc/lib/index.js create mode 100644 task/node_modules/sync-rpc/lib/json-buffer/LICENSE create mode 100644 task/node_modules/sync-rpc/lib/json-buffer/README.md create mode 100644 task/node_modules/sync-rpc/lib/json-buffer/index.js create mode 100644 task/node_modules/sync-rpc/lib/test-worker.js create mode 100644 task/node_modules/sync-rpc/lib/worker.js create mode 100644 task/node_modules/sync-rpc/package.json create mode 100644 task/node_modules/then-request/HISTORY.md create mode 100644 task/node_modules/then-request/LICENSE create mode 100644 task/node_modules/then-request/README.md create mode 100644 task/node_modules/then-request/lib/Options.d.ts create mode 100644 task/node_modules/then-request/lib/Options.js create mode 100644 task/node_modules/then-request/lib/Options.js.flow create mode 100644 task/node_modules/then-request/lib/RequestFn.d.ts create mode 100644 task/node_modules/then-request/lib/RequestFn.js create mode 100644 task/node_modules/then-request/lib/RequestFn.js.flow create mode 100644 task/node_modules/then-request/lib/ResponsePromise.d.ts create mode 100644 task/node_modules/then-request/lib/ResponsePromise.js create mode 100644 task/node_modules/then-request/lib/ResponsePromise.js.flow create mode 100644 task/node_modules/then-request/lib/browser.d.ts create mode 100644 task/node_modules/then-request/lib/browser.js create mode 100644 task/node_modules/then-request/lib/browser.js.flow create mode 100644 task/node_modules/then-request/lib/handle-qs.d.ts create mode 100644 task/node_modules/then-request/lib/handle-qs.js create mode 100644 task/node_modules/then-request/lib/handle-qs.js.flow create mode 100644 task/node_modules/then-request/lib/index.d.ts create mode 100644 task/node_modules/then-request/lib/index.js create mode 100644 task/node_modules/then-request/lib/index.js.flow create mode 100644 task/node_modules/then-request/node_modules/@types/node/LICENSE create mode 100644 task/node_modules/then-request/node_modules/@types/node/README.md create mode 100644 task/node_modules/then-request/node_modules/@types/node/base.d.ts create mode 100644 task/node_modules/then-request/node_modules/@types/node/index.d.ts create mode 100644 task/node_modules/then-request/node_modules/@types/node/inspector.d.ts create mode 100644 task/node_modules/then-request/node_modules/@types/node/package.json create mode 100644 task/node_modules/then-request/package.json create mode 100644 task/node_modules/truncate-utf8-bytes/.gitmodules create mode 100644 task/node_modules/truncate-utf8-bytes/.npmignore create mode 100644 task/node_modules/truncate-utf8-bytes/.travis.yml create mode 100644 task/node_modules/truncate-utf8-bytes/AUTHORS create mode 100644 task/node_modules/truncate-utf8-bytes/README.md create mode 100644 task/node_modules/truncate-utf8-bytes/browser.js create mode 100644 task/node_modules/truncate-utf8-bytes/index.js create mode 100644 task/node_modules/truncate-utf8-bytes/lib/truncate.js create mode 100644 task/node_modules/truncate-utf8-bytes/package.json create mode 100644 task/node_modules/truncate-utf8-bytes/test.js create mode 100644 task/node_modules/typedarray/.travis.yml create mode 100644 task/node_modules/typedarray/LICENSE create mode 100644 task/node_modules/typedarray/example/tarray.js create mode 100644 task/node_modules/typedarray/index.js create mode 100644 task/node_modules/typedarray/package.json create mode 100644 task/node_modules/typedarray/readme.markdown create mode 100644 task/node_modules/typedarray/test/server/undef_globals.js create mode 100644 task/node_modules/typedarray/test/tarray.js create mode 100644 task/node_modules/undici-types/README.md create mode 100644 task/node_modules/undici-types/agent.d.ts create mode 100644 task/node_modules/undici-types/api.d.ts create mode 100644 task/node_modules/undici-types/balanced-pool.d.ts create mode 100644 task/node_modules/undici-types/cache.d.ts create mode 100644 task/node_modules/undici-types/client.d.ts create mode 100644 task/node_modules/undici-types/connector.d.ts create mode 100644 task/node_modules/undici-types/content-type.d.ts create mode 100644 task/node_modules/undici-types/cookies.d.ts create mode 100644 task/node_modules/undici-types/diagnostics-channel.d.ts create mode 100644 task/node_modules/undici-types/dispatcher.d.ts create mode 100644 task/node_modules/undici-types/errors.d.ts create mode 100644 task/node_modules/undici-types/fetch.d.ts create mode 100644 task/node_modules/undici-types/file.d.ts create mode 100644 task/node_modules/undici-types/filereader.d.ts create mode 100644 task/node_modules/undici-types/formdata.d.ts create mode 100644 task/node_modules/undici-types/global-dispatcher.d.ts create mode 100644 task/node_modules/undici-types/global-origin.d.ts create mode 100644 task/node_modules/undici-types/handlers.d.ts create mode 100644 task/node_modules/undici-types/header.d.ts create mode 100644 task/node_modules/undici-types/index.d.ts create mode 100644 task/node_modules/undici-types/interceptors.d.ts create mode 100644 task/node_modules/undici-types/mock-agent.d.ts create mode 100644 task/node_modules/undici-types/mock-client.d.ts create mode 100644 task/node_modules/undici-types/mock-errors.d.ts create mode 100644 task/node_modules/undici-types/mock-interceptor.d.ts create mode 100644 task/node_modules/undici-types/mock-pool.d.ts create mode 100644 task/node_modules/undici-types/package.json create mode 100644 task/node_modules/undici-types/patch.d.ts create mode 100644 task/node_modules/undici-types/pool-stats.d.ts create mode 100644 task/node_modules/undici-types/pool.d.ts create mode 100644 task/node_modules/undici-types/proxy-agent.d.ts create mode 100644 task/node_modules/undici-types/readable.d.ts create mode 100644 task/node_modules/undici-types/webidl.d.ts create mode 100644 task/node_modules/undici-types/websocket.d.ts create mode 100644 task/node_modules/utf8-byte-length/.gitmodules create mode 100644 task/node_modules/utf8-byte-length/.npmignore create mode 100644 task/node_modules/utf8-byte-length/.travis.yml create mode 100644 task/node_modules/utf8-byte-length/AUTHORS create mode 100644 task/node_modules/utf8-byte-length/README.md create mode 100644 task/node_modules/utf8-byte-length/browser.js create mode 100644 task/node_modules/utf8-byte-length/index.js create mode 100644 task/node_modules/utf8-byte-length/package.json create mode 100644 task/node_modules/utf8-byte-length/test.js create mode 100644 task/node_modules/util-deprecate/History.md create mode 100644 task/node_modules/util-deprecate/LICENSE create mode 100644 task/node_modules/util-deprecate/README.md create mode 100644 task/node_modules/util-deprecate/browser.js create mode 100644 task/node_modules/util-deprecate/node.js create mode 100644 task/node_modules/util-deprecate/package.json create mode 100644 task/node_modules/uuid/AUTHORS create mode 100644 task/node_modules/uuid/CHANGELOG.md create mode 100644 task/node_modules/uuid/LICENSE.md create mode 100644 task/node_modules/uuid/README.md create mode 100755 task/node_modules/uuid/bin/uuid create mode 100644 task/node_modules/uuid/index.js create mode 100644 task/node_modules/uuid/lib/bytesToUuid.js create mode 100644 task/node_modules/uuid/lib/md5-browser.js create mode 100644 task/node_modules/uuid/lib/md5.js create mode 100644 task/node_modules/uuid/lib/rng-browser.js create mode 100644 task/node_modules/uuid/lib/rng.js create mode 100644 task/node_modules/uuid/lib/sha1-browser.js create mode 100644 task/node_modules/uuid/lib/sha1.js create mode 100644 task/node_modules/uuid/lib/v35.js create mode 100644 task/node_modules/uuid/package.json create mode 100644 task/node_modules/uuid/v1.js create mode 100644 task/node_modules/uuid/v3.js create mode 100644 task/node_modules/uuid/v4.js create mode 100644 task/node_modules/uuid/v5.js create mode 100644 task/node_modules/wrappy/LICENSE create mode 100644 task/node_modules/wrappy/README.md create mode 100644 task/node_modules/wrappy/package.json create mode 100644 task/node_modules/wrappy/wrappy.js diff --git a/.gitignore b/.gitignore index a92ffe2..2de4533 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ -node_modules .dccache *.vsix \ No newline at end of file diff --git a/task/artifactory-api-helpers.js b/task/artifactory-api-helpers.js index a10985d..ee2b3e2 100644 --- a/task/artifactory-api-helpers.js +++ b/task/artifactory-api-helpers.js @@ -73,7 +73,7 @@ function setProperties(properties) { const queryParams = { "properties": [prop] + '=' + properties[prop], // Assuming 'prop' and 'properties' are defined elsewhere }; - axios_1.default.put(artifactUrl, null, { + setTimeout(() => axios_1.default.put(artifactUrl, null, { params: queryParams, headers: headers, }) @@ -81,11 +81,30 @@ function setProperties(properties) { console.log(`Successfully set property '${prop}' on Artifact ${artifactUrlShort}`); }) .catch(error => { - //test console.log('Error while attempting to add property to Artifact:' + error); // Handle errors here - process.exit(1); // Exiting with a non-zero code indicating an error - }); + for (let errorStatus of error.response.data.errors) { + switch (errorStatus.status) { + case 400: + console.log(`Invalid request parameters (headers / body). See headers here: ${headers} '\n Throwing failing code of 1`); + process.exit(1); + case 401: + console.log(`Endpoint requires authentication, please specify credentials. Message from endpoint is: ${errorStatus.message} ${errorStatus.status} \n Throwing failing code of 1`); + process.exit(1); + case 403: + console.log(`Endpoint permission requirements are not met. Message from endpoint is: Message from endpoint is: ${errorStatus.message} ${errorStatus.status} Please check that account has permission to ${prop} property on Artifact ${artifactUrlShort}.`); + console.log(`Artifact URL endpoint that failed ${artifactUrl}`); + process.exit(1); + case 500: + console.log(`Server error! Unexpected error during request handling, check distribution logs. Message from endpoint is: ${errorStatus.message} ${errorStatus.status} \n Throwing failing code of 1`); + process.exit(1); + default: + console.log(`Endpoint failed with the following error: ${error.message} \n Throwing failing code of 1`); + process.exit(1); + } + } + // process.exit(1); // Exiting with a non-zero code indicating an error + }), 1000); }); } } @@ -94,7 +113,8 @@ function setProperties(properties) { const buildNumber = tl.getInput('BuildNumber', true); const projectName = tl.getInput('ProjectKey', true); const BuildStatus = tl.getInput('BuildStatus', false); - const searchBody = Object.assign({ "buildName": buildName, "buildNumber": buildNumber, "project": projectName }, (BuildStatus !== null && { myProperty: BuildStatus })); + const repos = tl.getInput('ArtifactoryRepositoryName', false); + const searchBody = Object.assign(Object.assign({ "buildName": buildName, "buildNumber": buildNumber, "project": projectName }, (repos !== undefined && { repos: [repos] })), (BuildStatus !== null && { buildStatus: BuildStatus })); const searchUrl = `${baseUrl}/api/search/buildArtifacts`; axios_1.default.post(searchUrl, JSON.stringify(searchBody), { headers: headers, @@ -122,15 +142,36 @@ function setProperties(properties) { // Adding a delay between each API call }) .catch(error => { - console.log('Error while attempting to add property to Artifact: ' + error); + console.log('Error while attempting to add property to Artifact:' + error); // Handle errors here - process.exit(1); // Exiting with a non-zero code indicating an error + for (let errorStatus of error.response.data.errors) { + switch (errorStatus.status) { + case 400: + console.log(`Invalid request parameters (headers / body). See headers here: ${headers} '\n Throwing failing code of 1`); + process.exit(1); + case 401: + console.log(`Endpoint requires authentication, please specify credentials. Message from endpoint is: ${errorStatus.message} ${errorStatus.status} \n Throwing failing code of 1`); + process.exit(1); + case 403: + console.log(`Endpoint permission requirements are not met. Message from endpoint is: Message from endpoint is: ${errorStatus.message} ${errorStatus.status} Please check that account has permission to ${prop} property on Artifact ${artifactUrlShort}.`); + console.log(`Here is the artifact URL ${artifactUrl}`); + process.exit(1); + case 500: + console.log(`Server error! Unexpected error during request handling, check distribution logs. Message from endpoint is: ${errorStatus.message} ${errorStatus.status} \n Throwing failing code of 1`); + process.exit(1); + default: + console.log(`Endpoint failed with the following error: ${error.message} \n Throwing failing code of 1`); + process.exit(1); + } + } + // process.exit(1); // Exiting with a non-zero code indicating an error }), 1000); }); } }) .catch((error) => { console.error('Error from Artifactory search builds API:', error.response ? error.response.data : error.message); + console.log(`Artifactory search builds body: \n ${JSON.stringify(searchBody)}`); process.exit(1); }); } diff --git a/task/artifactory-api-helpers.ts b/task/artifactory-api-helpers.ts index 395c4c7..b6f53ca 100644 --- a/task/artifactory-api-helpers.ts +++ b/task/artifactory-api-helpers.ts @@ -8,7 +8,7 @@ import { json } from 'stream/consumers'; axiosRetry(axios, { retries: 10, // Number of retries retryDelay: axiosRetry.exponentialDelay, // Retry delay strategy - onRetry: (retryCount, error, Config)=>{console.log("Axios request failed with " + error + " retrying now..")} + onRetry: (retryCount, error, Config) => { console.log("Axios request failed with " + error + " retrying now..") } }); export function setProperties(properties: any): void { @@ -37,90 +37,135 @@ export function setProperties(properties: any): void { }; //Retrieve artifact URLs let artifactUrls: any = [] - if (inputType == "urllist"){ + if (inputType == "urllist") { const delimiter: any = tl.getInput('delimiter', false) || ',' artifactUrls = tl.getInput('artifactUrls', true)?.split(delimiter); - //add properties to each artifact - for (let artifactUrlShort of artifactUrls) { - artifactUrlShort = Utils.encodeUrl(artifactUrlShort); - const artifactUrl = `${baseUrl}/api/storage/${artifactUrlShort}`; // Construct the complete URL - - Object.keys(properties).forEach((prop) => { - const queryParams = { + //add properties to each artifact + for (let artifactUrlShort of artifactUrls) { + artifactUrlShort = Utils.encodeUrl(artifactUrlShort); + const artifactUrl = `${baseUrl}/api/storage/${artifactUrlShort}`; // Construct the complete URL + + Object.keys(properties).forEach((prop) => { + const queryParams = { "properties": [prop] + '=' + properties[prop], // Assuming 'prop' and 'properties' are defined elsewhere - }; - axios.put(artifactUrl, null, { - params: queryParams, - headers: headers, - }) - .then(response => { - console.log(`Successfully set property '${prop}' on Artifact ${artifactUrlShort}`) - }) - .catch(error => { - //test - console.log('Error while attempting to add property to Artifact:' + error); - // Handle errors here - process.exit(1); // Exiting with a non-zero code indicating an error + }; + setTimeout(() => + axios.put(artifactUrl, null, { + params: queryParams, + headers: headers, + }) + .then(response => { + console.log(`Successfully set property '${prop}' on Artifact ${artifactUrlShort}`) + }) + .catch(error => { + console.log('Error while attempting to add property to Artifact:' + error); + // Handle errors here + for (let errorStatus of error.response.data.errors) { + switch (errorStatus.status) { + case 400: + console.log(`Invalid request parameters (headers / body). See headers here: ${headers} '\n Throwing failing code of 1`); + process.exit(1) + case 401: + console.log(`Endpoint requires authentication, please specify credentials. Message from endpoint is: ${errorStatus.message} ${errorStatus.status} \n Throwing failing code of 1`); + process.exit(1) + case 403: + console.log(`Endpoint permission requirements are not met. Message from endpoint is: Message from endpoint is: ${errorStatus.message} ${errorStatus.status} Please check that account has permission to ${prop} property on Artifact ${artifactUrlShort}.`); + console.log(`Artifact URL endpoint that failed ${artifactUrl}`); + process.exit(1) + case 500: + console.log(`Server error! Unexpected error during request handling, check distribution logs. Message from endpoint is: ${errorStatus.message} ${errorStatus.status} \n Throwing failing code of 1`); + process.exit(1) + default: + console.log(`Endpoint failed with the following error: ${error.message} \n Throwing failing code of 1`); + process.exit(1) + } + } + // process.exit(1); // Exiting with a non-zero code indicating an error + }) + , 1000) }); - }); -} - }else if (inputType == "build"){ + } + } else if (inputType == "build") { const buildName = tl.getInput('BuildName', true) const buildNumber = tl.getInput('BuildNumber', true) const projectName = tl.getInput('ProjectKey', true) const BuildStatus = tl.getInput('BuildStatus', false) + const repos = tl.getInput('ArtifactoryRepositoryName', false) + const searchBody = { "buildName": buildName, "buildNumber": buildNumber, - "project" : projectName, - ...(BuildStatus !== null && { myProperty: BuildStatus }), + "project": projectName, + ...(repos !== undefined && { repos: [repos] }), + ...(BuildStatus !== null && { buildStatus: BuildStatus }), } - const searchUrl = `${baseUrl}/api/search/buildArtifacts` - axios.post(searchUrl, JSON.stringify(searchBody), { - headers: headers, - }) - .then((response) => { - console.log("Data received from build search API: " + JSON.stringify(response.data)) - artifactUrls = response.data.results.map((obj: any) => { - const { downloadUri } = obj; - const trimmedUrl = downloadUri.replace(`${baseUrl}/`, ""); - return trimmedUrl; - } - ); + const searchUrl = `${baseUrl}/api/search/buildArtifacts` + axios.post(searchUrl, JSON.stringify(searchBody), { + headers: headers, + }) + .then((response) => { + console.log("Data received from build search API: " + JSON.stringify(response.data)) + artifactUrls = response.data.results.map((obj: any) => { + const { downloadUri } = obj; + const trimmedUrl = downloadUri.replace(`${baseUrl}/`, ""); + return trimmedUrl; + } + ); - for (let artifactUrlShort of artifactUrls) { - artifactUrlShort = Utils.encodeUrl(artifactUrlShort); - const artifactUrl = `${baseUrl}/api/storage/${artifactUrlShort}`; // Construct the complete URL - - Object.keys(properties).forEach((prop) => { - const queryParams = { - "properties": [prop] + '=' + properties[prop], // Assuming 'prop' and 'properties' are defined elsewhere - }; - setTimeout(()=> - axios.put(artifactUrl, null, { - params: queryParams, - headers: headers, - }) - .then(response => { - console.log(`Successfully set property '${prop}' on Artifact ${artifactUrlShort}`) + for (let artifactUrlShort of artifactUrls) { + artifactUrlShort = Utils.encodeUrl(artifactUrlShort); + const artifactUrl = `${baseUrl}/api/storage/${artifactUrlShort}`; // Construct the complete URL - // Adding a delay between each API call - }) - .catch(error => { - console.log('Error while attempting to add property to Artifact: ' + error); - // Handle errors here - process.exit(1); // Exiting with a non-zero code indicating an error + Object.keys(properties).forEach((prop) => { + const queryParams = { + "properties": [prop] + '=' + properties[prop], // Assuming 'prop' and 'properties' are defined elsewhere + }; + setTimeout(() => + axios.put(artifactUrl, null, { + params: queryParams, + headers: headers, + }) + .then(response => { + console.log(`Successfully set property '${prop}' on Artifact ${artifactUrlShort}`) + + // Adding a delay between each API call + }) + .catch(error => { + console.log('Error while attempting to add property to Artifact:' + error); + // Handle errors here + for (let errorStatus of error.response.data.errors) { + switch (errorStatus.status) { + case 400: + console.log(`Invalid request parameters (headers / body). See headers here: ${headers} '\n Throwing failing code of 1`); + process.exit(1) + case 401: + console.log(`Endpoint requires authentication, please specify credentials. Message from endpoint is: ${errorStatus.message} ${errorStatus.status} \n Throwing failing code of 1`); + process.exit(1) + case 403: + console.log(`Endpoint permission requirements are not met. Message from endpoint is: Message from endpoint is: ${errorStatus.message} ${errorStatus.status} Please check that account has permission to ${prop} property on Artifact ${artifactUrlShort}.`); + console.log(`Here is the artifact URL ${artifactUrl}`); + process.exit(1) + case 500: + console.log(`Server error! Unexpected error during request handling, check distribution logs. Message from endpoint is: ${errorStatus.message} ${errorStatus.status} \n Throwing failing code of 1`); + process.exit(1) + default: + console.log(`Endpoint failed with the following error: ${error.message} \n Throwing failing code of 1`); + process.exit(1) + } + } + // process.exit(1); // Exiting with a non-zero code indicating an error + }) + , 1000) + }); + } }) - , 1000) - }); + .catch((error) => { + console.error('Error from Artifactory search builds API:', error.response ? error.response.data : error.message); + console.log(`Artifactory search builds body: \n ${JSON.stringify(searchBody)}`) + process.exit(1) + }); } -}) - .catch((error) => { - console.error('Error from Artifactory search builds API:', error.response ? error.response.data : error.message); - process.exit(1) - }); -} -} +} \ No newline at end of file diff --git a/task/node_modules/.bin/bunyan b/task/node_modules/.bin/bunyan new file mode 120000 index 0000000..3555ac7 --- /dev/null +++ b/task/node_modules/.bin/bunyan @@ -0,0 +1 @@ +../bunyan/bin/bunyan \ No newline at end of file diff --git a/task/node_modules/.bin/mkdirp b/task/node_modules/.bin/mkdirp new file mode 120000 index 0000000..017896c --- /dev/null +++ b/task/node_modules/.bin/mkdirp @@ -0,0 +1 @@ +../mkdirp/bin/cmd.js \ No newline at end of file diff --git a/task/node_modules/.bin/ncp b/task/node_modules/.bin/ncp new file mode 120000 index 0000000..1c02648 --- /dev/null +++ b/task/node_modules/.bin/ncp @@ -0,0 +1 @@ +../ncp/bin/ncp \ No newline at end of file diff --git a/task/node_modules/.bin/resolve b/task/node_modules/.bin/resolve new file mode 120000 index 0000000..b6afda6 --- /dev/null +++ b/task/node_modules/.bin/resolve @@ -0,0 +1 @@ +../resolve/bin/resolve \ No newline at end of file diff --git a/task/node_modules/.bin/rimraf b/task/node_modules/.bin/rimraf new file mode 120000 index 0000000..4cd49a4 --- /dev/null +++ b/task/node_modules/.bin/rimraf @@ -0,0 +1 @@ +../rimraf/bin.js \ No newline at end of file diff --git a/task/node_modules/.bin/semver b/task/node_modules/.bin/semver new file mode 120000 index 0000000..317eb29 --- /dev/null +++ b/task/node_modules/.bin/semver @@ -0,0 +1 @@ +../semver/bin/semver \ No newline at end of file diff --git a/task/node_modules/.bin/shjs b/task/node_modules/.bin/shjs new file mode 120000 index 0000000..a044997 --- /dev/null +++ b/task/node_modules/.bin/shjs @@ -0,0 +1 @@ +../shelljs/bin/shjs \ No newline at end of file diff --git a/task/node_modules/.bin/uuid b/task/node_modules/.bin/uuid new file mode 120000 index 0000000..b3e45bc --- /dev/null +++ b/task/node_modules/.bin/uuid @@ -0,0 +1 @@ +../uuid/bin/uuid \ No newline at end of file diff --git a/task/node_modules/.package-lock.json b/task/node_modules/.package-lock.json new file mode 100644 index 0000000..dc7d778 --- /dev/null +++ b/task/node_modules/.package-lock.json @@ -0,0 +1,1022 @@ +{ + "name": "artifactory-azure-extension", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "node_modules/@types/axios": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@types/axios/-/axios-0.14.0.tgz", + "integrity": "sha512-KqQnQbdYE54D7oa/UmYVMZKq7CO4l8DEENzOKc4aBRwxCXSlJXGz83flFx5L7AWrOQnmuN3kVsRdt+GZPPjiVQ==", + "deprecated": "This is a stub types definition for axios (https://github.com/mzabriskie/axios). axios provides its own type definitions, so you don't need @types/axios installed!", + "dev": true, + "dependencies": { + "axios": "*" + } + }, + "node_modules/@types/bunyan": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.11.tgz", + "integrity": "sha512-758fRH7umIMk5qt5ELmRMff4mLDlN+xyYzC+dkPTdKwbSkJFvz6xwyScrytPU0QIBbRRwbiE8/BIg8bpajerNQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mocha": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.6.tgz", + "integrity": "sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.10.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.3.tgz", + "integrity": "sha512-XJavIpZqiXID5Yxnxv3RUDKTN5b81ddNC3ecsA0SoFXz/QU8OGBwZGMomiq0zw+uuqbL/krztv/DINAQ/EV4gg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/q": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.10", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", + "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", + "dev": true + }, + "node_modules/adm-zip": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz", + "integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.4.tgz", + "integrity": "sha512-heJnIs6N4aa1eSthhN9M5ioILu8Wi8vmQW9iHQ9NUvfkJb0lEEDUiIdQNAuBtfUt3FxReaKdpQA5DbmMOqzF/A==", + "dependencies": { + "follow-redirects": "^1.15.4", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios-retry": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-4.0.0.tgz", + "integrity": "sha512-F6P4HVGITD/v4z9Lw2mIA24IabTajvpDZmKa6zq/gGwn57wN5j1P3uWrAV0+diqnW6kTM2fTqmWNfgYWGmMuiA==", + "dependencies": { + "is-retry-allowed": "^2.2.0" + }, + "peerDependencies": { + "axios": "0.x || 1.x" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/azure-pipelines-task-lib": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.9.0.tgz", + "integrity": "sha512-rF8I1pYZVGqZl1mo2r03flUqqqZt+ADUGOHYsEHL8ifKGzW6QbkPtpl6TYthLaQG2LZJDOnC8Agyu9+p06NwpA==", + "dependencies": { + "adm-zip": "^0.5.10", + "deasync": "^0.1.28", + "minimatch": "3.0.5", + "nodejs-file-downloader": "^4.11.1", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "uuid": "^3.0.1" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bunyan": { + "version": "1.8.15", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", + "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", + "engines": [ + "node >=0.10.0" + ], + "bin": { + "bunyan": "bin/bunyan" + }, + "optionalDependencies": { + "dtrace-provider": "~0.8", + "moment": "^2.19.3", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/deasync": { + "version": "0.1.29", + "resolved": "https://registry.npmjs.org/deasync/-/deasync-0.1.29.tgz", + "integrity": "sha512-EBtfUhVX23CE9GR6m+F8WPeImEE4hR/FW9RkK0PMl9V1t283s0elqsTD8EZjaKX28SY1BW2rYfCgNsAYdpamUw==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "node-addon-api": "^1.7.1" + }, + "engines": { + "node": ">=0.11.0" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dtrace-provider": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", + "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "nan": "^2.14.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "dev": true, + "dependencies": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "dev": true, + "dependencies": { + "@types/node": "^10.0.3" + } + }, + "node_modules/http-response-object/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", + "dev": true + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-retry-allowed": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", + "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "optional": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "optional": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", + "optional": true, + "dependencies": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/nan": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", + "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==", + "optional": true + }, + "node_modules/ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", + "optional": true, + "bin": { + "ncp": "bin/ncp" + } + }, + "node_modules/node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==" + }, + "node_modules/nodejs-file-downloader": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/nodejs-file-downloader/-/nodejs-file-downloader-4.12.1.tgz", + "integrity": "sha512-LpfCTNhh805AlLnJnzt1PuEj+RmbrccbAQZ6hBRw2e6QPVR0Qntuo6qqyvPHG5s77/0w0IEKgRAD4nbSnr/X4w==", + "dependencies": { + "follow-redirects": "^1.15.1", + "https-proxy-agent": "^5.0.0", + "mime-types": "^2.1.27", + "sanitize-filename": "^1.6.3" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", + "dev": true + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dev": true, + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", + "optional": true, + "dependencies": { + "glob": "^6.0.1" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", + "optional": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safe-json-stringify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", + "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", + "optional": true + }, + "node_modules/sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "dev": true, + "dependencies": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "dev": true, + "dependencies": { + "get-port": "^3.1.0" + } + }, + "node_modules/then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "dev": true, + "dependencies": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/then-request/node_modules/@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", + "dev": true + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/utf8-byte-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/task/node_modules/@types/axios/README.md b/task/node_modules/@types/axios/README.md new file mode 100644 index 0000000..79cc3f0 --- /dev/null +++ b/task/node_modules/@types/axios/README.md @@ -0,0 +1,2 @@ +This is a stub types definition for axios (https://github.com/mzabriskie/axios). +axios provides its own type definitions, so you don't need @types/axios installed! \ No newline at end of file diff --git a/task/node_modules/@types/axios/package.json b/task/node_modules/@types/axios/package.json new file mode 100644 index 0000000..6f14f8a --- /dev/null +++ b/task/node_modules/@types/axios/package.json @@ -0,0 +1,14 @@ +{ + "name": "@types/axios", + "version": "0.14.0", + "typings": null, + "description": "Stub TypeScript definitions entry for axios, which provides its own types definitions", + "main": "", + "scripts": {}, + "author": "", + "repository": "https://github.com/mzabriskie/axios", + "license": "MIT", + "dependencies": { + "axios": "*" + } +} \ No newline at end of file diff --git a/task/node_modules/@types/bunyan/LICENSE b/task/node_modules/@types/bunyan/LICENSE new file mode 100644 index 0000000..9e841e7 --- /dev/null +++ b/task/node_modules/@types/bunyan/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE diff --git a/task/node_modules/@types/bunyan/README.md b/task/node_modules/@types/bunyan/README.md new file mode 100644 index 0000000..fcd0606 --- /dev/null +++ b/task/node_modules/@types/bunyan/README.md @@ -0,0 +1,15 @@ +# Installation +> `npm install --save @types/bunyan` + +# Summary +This package contains type definitions for bunyan (https://github.com/trentm/node-bunyan). + +# Details +Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/bunyan. + +### Additional Details + * Last updated: Mon, 06 Nov 2023 22:41:05 GMT + * Dependencies: [@types/node](https://npmjs.com/package/@types/node) + +# Credits +These definitions were written by [Alex Mikhalev](https://github.com/amikhalev). diff --git a/task/node_modules/@types/bunyan/index.d.ts b/task/node_modules/@types/bunyan/index.d.ts new file mode 100644 index 0000000..2652ddf --- /dev/null +++ b/task/node_modules/@types/bunyan/index.d.ts @@ -0,0 +1,296 @@ +/// + +import { EventEmitter } from "events"; + +declare class Logger extends EventEmitter { + constructor(options: Logger.LoggerOptions); + addStream(stream: Logger.Stream): void; + addSerializers(serializers: Logger.Serializers): void; + child(options: Object, simple?: boolean): Logger; + reopenFileStreams(): void; + + level(): number; + level(value: Logger.LogLevel): void; + levels(): number[]; + levels(name: number | string): number; + levels(name: number | string, value: Logger.LogLevel): void; + + fields: any; + src: boolean; + + /** + * Returns a boolean: is the `trace` level enabled? + * + * This is equivalent to `log.isTraceEnabled()` or `log.isEnabledFor(TRACE)` in log4j. + */ + trace(): boolean; + + /** + * Special case to log an `Error` instance to the record. + * This adds an `err` field with exception details + * (including the stack) and sets `msg` to the exception + * message or you can specify the `msg`. + */ + trace(error: Error, ...params: any[]): void; + + /** + * The first field can optionally be a "fields" object, which + * is merged into the log record. + * + * To pass in an Error *and* other fields, use the `err` + * field name for the Error instance. + */ + trace(obj: Object, ...params: any[]): void; + + /** + * Uses `util.format` for msg formatting. + */ + trace(format: any, ...params: any[]): void; + + /** + * Returns a boolean: is the `debug` level enabled? + * + * This is equivalent to `log.isDebugEnabled()` or `log.isEnabledFor(DEBUG)` in log4j. + */ + debug(): boolean; + + /** + * Special case to log an `Error` instance to the record. + * This adds an `err` field with exception details + * (including the stack) and sets `msg` to the exception + * message or you can specify the `msg`. + */ + debug(error: Error, ...params: any[]): void; + + /** + * The first field can optionally be a "fields" object, which + * is merged into the log record. + * + * To pass in an Error *and* other fields, use the `err` + * field name for the Error instance. + */ + debug(obj: Object, ...params: any[]): void; + + /** + * Uses `util.format` for msg formatting. + */ + debug(format: any, ...params: any[]): void; + + /** + * Returns a boolean: is the `info` level enabled? + * + * This is equivalent to `log.isInfoEnabled()` or `log.isEnabledFor(INFO)` in log4j. + */ + info(): boolean; + + /** + * Special case to log an `Error` instance to the record. + * This adds an `err` field with exception details + * (including the stack) and sets `msg` to the exception + * message or you can specify the `msg`. + */ + info(error: Error, ...params: any[]): void; + + /** + * The first field can optionally be a "fields" object, which + * is merged into the log record. + * + * To pass in an Error *and* other fields, use the `err` + * field name for the Error instance. + */ + info(obj: Object, ...params: any[]): void; + + /** + * Uses `util.format` for msg formatting. + */ + info(format: any, ...params: any[]): void; + + /** + * Returns a boolean: is the `warn` level enabled? + * + * This is equivalent to `log.isWarnEnabled()` or `log.isEnabledFor(WARN)` in log4j. + */ + warn(): boolean; + + /** + * Special case to log an `Error` instance to the record. + * This adds an `err` field with exception details + * (including the stack) and sets `msg` to the exception + * message or you can specify the `msg`. + */ + warn(error: Error, ...params: any[]): void; + + /** + * The first field can optionally be a "fields" object, which + * is merged into the log record. + * + * To pass in an Error *and* other fields, use the `err` + * field name for the Error instance. + */ + warn(obj: Object, ...params: any[]): void; + + /** + * Uses `util.format` for msg formatting. + */ + warn(format: any, ...params: any[]): void; + + /** + * Returns a boolean: is the `error` level enabled? + * + * This is equivalent to `log.isErrorEnabled()` or `log.isEnabledFor(ERROR)` in log4j. + */ + error(): boolean; + + /** + * Special case to log an `Error` instance to the record. + * This adds an `err` field with exception details + * (including the stack) and sets `msg` to the exception + * message or you can specify the `msg`. + */ + error(error: Error, ...params: any[]): void; + + /** + * The first field can optionally be a "fields" object, which + * is merged into the log record. + * + * To pass in an Error *and* other fields, use the `err` + * field name for the Error instance. + */ + error(obj: Object, ...params: any[]): void; + + /** + * Uses `util.format` for msg formatting. + */ + error(format: any, ...params: any[]): void; + + /** + * Returns a boolean: is the `fatal` level enabled? + * + * This is equivalent to `log.isFatalEnabled()` or `log.isEnabledFor(FATAL)` in log4j. + */ + fatal(): boolean; + + /** + * Special case to log an `Error` instance to the record. + * This adds an `err` field with exception details + * (including the stack) and sets `msg` to the exception + * message or you can specify the `msg`. + */ + fatal(error: Error, ...params: any[]): void; + + /** + * The first field can optionally be a "fields" object, which + * is merged into the log record. + * + * To pass in an Error *and* other fields, use the `err` + * field name for the Error instance. + */ + fatal(obj: Object, ...params: any[]): void; + + /** + * Uses `util.format` for msg formatting. + */ + fatal(format: any, ...params: any[]): void; +} + +declare namespace Logger { + const TRACE: number; + const DEBUG: number; + const INFO: number; + const WARN: number; + const ERROR: number; + const FATAL: number; + + type LogLevelString = "trace" | "debug" | "info" | "warn" | "error" | "fatal"; + type LogLevel = LogLevelString | number; + + const levelFromName: { [name in LogLevelString]: number }; + const nameFromLevel: { [level: number]: string }; + + const stdSerializers: StdSerializers; + + function createLogger(options: LoggerOptions): Logger; + + function safeCycles(): (key: string, value: any) => any; + + function resolveLevel(value: LogLevel): number; + + interface WriteFn { + write: (object: Object) => void; + } + + interface Stream { + type?: string | undefined; + level?: LogLevel | undefined; + path?: string | undefined; + stream?: NodeJS.WritableStream | WriteFn | undefined; + closeOnExit?: boolean | undefined; + period?: string | undefined; + count?: number | undefined; + name?: string | undefined; + reemitErrorEvents?: boolean | undefined; + } + + interface LoggerOptions { + name: string; + streams?: Stream[] | undefined; + level?: LogLevel | undefined; + stream?: NodeJS.WritableStream | undefined; + serializers?: Serializers | undefined; + src?: boolean | undefined; + [custom: string]: any; + } + + type Serializer = (input: any) => any; + + interface Serializers { + [key: string]: Serializer; + } + + interface StdSerializers extends Serializers { + err: Serializer; + res: Serializer; + req: Serializer; + } + + interface RingBufferOptions { + limit?: number | undefined; + } + + class RingBuffer extends EventEmitter { + constructor(options: RingBufferOptions); + + writable: boolean; + records: any[]; + + write(record: any): boolean; + end(record?: any): void; + destroy(): void; + destroySoon(): void; + } + + interface RotatingFileStreamOptions { + path: string; + count?: number | undefined; + period?: string | undefined; + } + + class RotatingFileStream extends EventEmitter { + constructor(options: RotatingFileStreamOptions); + + writable: boolean; + periodNum: number; + periodScope: string; + stream: any; + rotQueue: any[]; + rotating: boolean; + + write(record: any): boolean; + end(record?: any): void; + destroy(): void; + destroySoon(): void; + rotate(): void; + } +} + +export = Logger; diff --git a/task/node_modules/@types/bunyan/package.json b/task/node_modules/@types/bunyan/package.json new file mode 100644 index 0000000..ec04f47 --- /dev/null +++ b/task/node_modules/@types/bunyan/package.json @@ -0,0 +1,27 @@ +{ + "name": "@types/bunyan", + "version": "1.8.11", + "description": "TypeScript definitions for bunyan", + "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/bunyan", + "license": "MIT", + "contributors": [ + { + "name": "Alex Mikhalev", + "githubUsername": "amikhalev", + "url": "https://github.com/amikhalev" + } + ], + "main": "", + "types": "index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git", + "directory": "types/bunyan" + }, + "scripts": {}, + "dependencies": { + "@types/node": "*" + }, + "typesPublisherContentHash": "75f683e59cfc06ef80b5a93228bbc7b6bc22f83c76630a237ac8e149f3a75600", + "typeScriptVersion": "4.5" +} \ No newline at end of file diff --git a/task/node_modules/@types/concat-stream/LICENSE b/task/node_modules/@types/concat-stream/LICENSE new file mode 100755 index 0000000..9e841e7 --- /dev/null +++ b/task/node_modules/@types/concat-stream/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE diff --git a/task/node_modules/@types/concat-stream/README.md b/task/node_modules/@types/concat-stream/README.md new file mode 100755 index 0000000..2cec026 --- /dev/null +++ b/task/node_modules/@types/concat-stream/README.md @@ -0,0 +1,37 @@ +# Installation +> `npm install --save @types/concat-stream` + +# Summary +This package contains type definitions for concat-stream (https://github.com/maxogden/concat-stream). + +# Details +Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/concat-stream. +## [index.d.ts](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/concat-stream/index.d.ts) +````ts +// Type definitions for concat-stream 1.6 +// Project: https://github.com/maxogden/concat-stream +// Definitions by: Joey Marianer +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +/// + +import { Writable } from "stream"; + +interface ConcatOpts { + encoding?: string | undefined; +} + +declare function concat(cb: (buf: Buffer) => void): Writable; +declare function concat(opts: ConcatOpts, cb: (buf: Buffer) => void): Writable; + +export = concat; + +```` + +### Additional Details + * Last updated: Tue, 06 Jul 2021 18:05:59 GMT + * Dependencies: [@types/node](https://npmjs.com/package/@types/node) + * Global values: none + +# Credits +These definitions were written by [Joey Marianer](https://github.com/jmarianer). diff --git a/task/node_modules/@types/concat-stream/index.d.ts b/task/node_modules/@types/concat-stream/index.d.ts new file mode 100755 index 0000000..2f1da0f --- /dev/null +++ b/task/node_modules/@types/concat-stream/index.d.ts @@ -0,0 +1,17 @@ +// Type definitions for concat-stream 1.6 +// Project: https://github.com/maxogden/concat-stream +// Definitions by: Joey Marianer +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +/// + +import { Writable } from "stream"; + +interface ConcatOpts { + encoding?: string | undefined; +} + +declare function concat(cb: (buf: Buffer) => void): Writable; +declare function concat(opts: ConcatOpts, cb: (buf: Buffer) => void): Writable; + +export = concat; diff --git a/task/node_modules/@types/concat-stream/package.json b/task/node_modules/@types/concat-stream/package.json new file mode 100755 index 0000000..62f33df --- /dev/null +++ b/task/node_modules/@types/concat-stream/package.json @@ -0,0 +1,27 @@ +{ + "name": "@types/concat-stream", + "version": "1.6.1", + "description": "TypeScript definitions for concat-stream", + "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/concat-stream", + "license": "MIT", + "contributors": [ + { + "name": "Joey Marianer", + "url": "https://github.com/jmarianer", + "githubUsername": "jmarianer" + } + ], + "main": "", + "types": "index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git", + "directory": "types/concat-stream" + }, + "scripts": {}, + "dependencies": { + "@types/node": "*" + }, + "typesPublisherContentHash": "8f7fac8d71824323d56f6c2aaa7be7b1cc479f85083e3f178fa31b830b717f86", + "typeScriptVersion": "3.6" +} \ No newline at end of file diff --git a/task/node_modules/@types/form-data/README.md b/task/node_modules/@types/form-data/README.md new file mode 100644 index 0000000..d3cb01d --- /dev/null +++ b/task/node_modules/@types/form-data/README.md @@ -0,0 +1,18 @@ +# Installation +> `npm install --save @types/form-data` + +# Summary +This package contains type definitions for form-data (https://github.com/felixge/node-form-data). + +# Details +Files were exported from https://www.github.com/DefinitelyTyped/DefinitelyTyped/tree/types-2.0/form-data + +Additional Details + * Last updated: Tue, 22 Nov 2016 23:38:10 GMT + * File structure: ProperModule + * Library Dependencies: node + * Module Dependencies: stream + * Global values: FormData + +# Credits +These definitions were written by Carlos Ballesteros Velasco , Leon Yu . diff --git a/task/node_modules/@types/form-data/index.d.ts b/task/node_modules/@types/form-data/index.d.ts new file mode 100644 index 0000000..e4bd6ca --- /dev/null +++ b/task/node_modules/@types/form-data/index.d.ts @@ -0,0 +1,26 @@ +// Type definitions for form-data +// Project: https://github.com/felixge/node-form-data +// Definitions by: Carlos Ballesteros Velasco , Leon Yu +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +// Imported from: https://github.com/soywiz/typescript-node-definitions/form-data.d.ts + +/// + +export = FormData; + +import * as stream from "stream"; + +declare class FormData extends stream.Readable { + append(key: string, value: any, options?: any): void; + getHeaders(): FormData.Dictionary; + submit(params: string | Object, callback: (error: any, response: any) => void): any; + getBoundary(): string; + getLength(callback: (err: Error, length: number) => void): void; +} + +declare namespace FormData { + interface Dictionary { + [key: string]: T; + } +} diff --git a/task/node_modules/@types/form-data/package.json b/task/node_modules/@types/form-data/package.json new file mode 100644 index 0000000..0df8dfa --- /dev/null +++ b/task/node_modules/@types/form-data/package.json @@ -0,0 +1,19 @@ +{ + "name": "@types/form-data", + "version": "0.0.33", + "description": "TypeScript definitions for form-data", + "license": "MIT", + "author": "Carlos Ballesteros Velasco , Leon Yu ", + "main": "", + "repository": { + "type": "git", + "url": "https://www.github.com/DefinitelyTyped/DefinitelyTyped.git" + }, + "scripts": {}, + "dependencies": { + "@types/node": "*" + }, + "peerDependencies": {}, + "typings": "index.d.ts", + "typesPublisherContentHash": "9cc91a75fca75af54344c0e61a0c29e9f9939ea01d67642720916db50a7245ef" +} \ No newline at end of file diff --git a/task/node_modules/@types/form-data/types-metadata.json b/task/node_modules/@types/form-data/types-metadata.json new file mode 100644 index 0000000..6a1eade --- /dev/null +++ b/task/node_modules/@types/form-data/types-metadata.json @@ -0,0 +1,29 @@ +{ + "authors": "Carlos Ballesteros Velasco , Leon Yu ", + "definitionFilename": "index.d.ts", + "libraryDependencies": [ + "node" + ], + "moduleDependencies": [ + "stream" + ], + "libraryMajorVersion": 0, + "libraryMinorVersion": 0, + "libraryName": "form-data", + "typingsPackageName": "form-data", + "projectName": "https://github.com/felixge/node-form-data", + "sourceRepoURL": "https://www.github.com/DefinitelyTyped/DefinitelyTyped", + "sourceBranch": "types-2.0", + "kind": "ProperModule", + "globals": [ + "FormData" + ], + "declaredModules": [ + "form-data" + ], + "files": [ + "index.d.ts" + ], + "hasPackageJson": false, + "contentHash": "9cc91a75fca75af54344c0e61a0c29e9f9939ea01d67642720916db50a7245ef" +} \ No newline at end of file diff --git a/task/node_modules/@types/mocha/LICENSE b/task/node_modules/@types/mocha/LICENSE new file mode 100644 index 0000000..9e841e7 --- /dev/null +++ b/task/node_modules/@types/mocha/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE diff --git a/task/node_modules/@types/mocha/README.md b/task/node_modules/@types/mocha/README.md new file mode 100644 index 0000000..cbd24f6 --- /dev/null +++ b/task/node_modules/@types/mocha/README.md @@ -0,0 +1,15 @@ +# Installation +> `npm install --save @types/mocha` + +# Summary +This package contains type definitions for mocha (https://mochajs.org). + +# Details +Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/mocha. + +### Additional Details + * Last updated: Wed, 22 Nov 2023 00:24:48 GMT + * Dependencies: none + +# Credits +These definitions were written by [Kazi Manzur Rashid](https://github.com/kazimanzurrashid), [otiai10](https://github.com/otiai10), [Vadim Macagon](https://github.com/enlight), [Andrew Bradley](https://github.com/cspotcode), [Dmitrii Sorin](https://github.com/1999), [Noah Hummel](https://github.com/strangedev), and [nicojs](https://github.com/nicojs). diff --git a/task/node_modules/@types/mocha/index.d.ts b/task/node_modules/@types/mocha/index.d.ts new file mode 100644 index 0000000..2700a02 --- /dev/null +++ b/task/node_modules/@types/mocha/index.d.ts @@ -0,0 +1,2916 @@ +/** + * Mocha API + * + * @see https://mochajs.org/api/mocha + */ +declare class Mocha { + private _growl; + private _reporter; + private _ui; + + constructor(options?: Mocha.MochaOptions); + + suite: Mocha.Suite; + files: string[]; + options: Mocha.MochaInstanceOptions; + + /** + * Add test `file`. + * + * @see https://mochajs.org/api/mocha#addFile + */ + addFile(file: string): this; + + /** + * Enable or disable bailing on the first failure. + * + * @see https://mochajs.org/api/mocha#bail + */ + bail(bail?: boolean): this; + + /** + * Enables or disables whether or not to dispose after each test run. + * Disable this to ensure you can run the test suite multiple times. + * If disabled, be sure to dispose mocha when you're done to prevent memory leaks. + * + * @see https://mochajs.org/api/mocha#cleanReferencesAfterRun + */ + cleanReferencesAfterRun(clean?: boolean): this; + + /** + * Manually dispose this mocha instance. Mark this instance as `disposed` and unable to run more tests. + * It also removes function references to tests functions and hooks, so variables trapped in closures can be cleaned by the garbage collector. + * + * @see https://mochajs.org/api/mocha#dispose + */ + dispose(): void; + + /** + * Set reporter to one of the built-in reporters. + * + * @see https://mochajs.org/api/mocha#reporter + */ + reporter(reporter: Mocha.Reporter, reporterOptions?: any): this; + + /** + * Set reporter to the provided constructor, one of the built-in reporters, or loads a reporter + * from a module path. Defaults to `"spec"`. + * + * @see https://mochajs.org/api/mocha#reporter + */ + reporter(reporter?: string | Mocha.ReporterConstructor, reporterOptions?: any): this; + + /** + * Set test UI to one of the built-in test interfaces. + * + * @see https://mochajs.org/api/mocha#ui + */ + ui(name: Mocha.Interface): this; + + /** + * Set test UI to one of the built-in test interfaces or loads a test interface from a module + * path. Defaults to `"bdd"`. + * + * @see https://mochajs.org/api/mocha#ui + */ + ui(name?: string): this; + + /** + * Escape string and add it to grep as a RegExp. + * + * @see https://mochajs.org/api/mocha#fgrep + */ + fgrep(str: string): this; + + /** + * Add regexp to grep, if `re` is a string it is escaped. + * + * @see https://mochajs.org/api/mocha#grep + */ + grep(re: string | RegExp): this; + + /** + * Whether to activate dry-run mode. + * + * @param dryRun Whether to activate dry-run mode. Defaults to `true`. + */ + dryRun(dryRun?: boolean): this; + + /** + * Invert `.grep()` matches. + * + * @see https://mochajs.org/api/mocha#invert + */ + invert(): this; + + /** + * Enable global leak checking. + * + * @see https://mochajs.org/api/mocha#checkLeaks + */ + checkLeaks(): this; + + /** + * Display long stack-trace on failing + * + * @see https://mochajs.org/api/mocha#fullTrace + */ + fullTrace(): this; + + /** + * Enable growl support. + * + * @see https://mochajs.org/api/mocha#growl + */ + growl(): this; + + /** + * Ignore `globals` array or string. + * + * @see https://mochajs.org/api/mocha#globals + */ + globals(globals: string | readonly string[]): this; + + /** + * Set the timeout in milliseconds. + * + * @see https://mochajs.org/api/mocha#timeout + */ + timeout(timeout: string | number): this; + + /** + * Set the number of times to retry failed tests. + * + * @see https://mochajs.org/api/mocha#retries + */ + retries(n: number): this; + + /** + * Set slowness threshold in milliseconds. + * + * @see https://mochajs.org/api/mocha#slow + */ + slow(slow: string | number): this; + + /** + * Makes all tests async (accepting a callback) + * + * @see https://mochajs.org/api/mocha#asyncOnly. + */ + asyncOnly(): this; + + /** + * Disable syntax highlighting (in browser). + * + * @see https://mochajs.org/api/mocha#noHighlighting + */ + noHighlighting(): this; + + /** + * Enable uncaught errors to propagate (in browser). + * + * @see https://mochajs.org/api/mocha#allowUncaught + */ + allowUncaught(): boolean; + + /** + * Delay root suite execution. + * + * @see https://mochajs.org/api/mocha#delay + */ + delay(): boolean; + + /** + * Tests marked only fail the suite + * + * @see https://mochajs.org/api/mocha#forbidOnly + */ + forbidOnly(): boolean; + + /** + * Pending tests and tests marked skip fail the suite + * + * @see https://mochajs.org/api/mocha#forbidPending + */ + forbidPending(): boolean; + + /** + * Run tests and invoke `fn()` when complete. + * + * Note that `run` relies on Node's `require` to execute + * the test interface functions and will be subject to the + * cache - if the files are already in the `require` cache, + * they will effectively be skipped. Therefore, to run tests + * multiple times or to run tests in files that are already + * in the `require` cache, make sure to clear them from the + * cache first in whichever manner best suits your needs. + * + * @see https://mochajs.org/api/mocha#run + */ + run(fn?: (failures: number) => void): Mocha.Runner; + + /** + * Loads ESM (and CJS) test files asynchronously. + * + * @see https://mochajs.org/api/mocha#loadFilesAsync + */ + loadFilesAsync(): Promise; + + /** + * Load registered files. + * + * @see https://mochajs.org/api/mocha#loadFiles + */ + protected loadFiles(fn?: () => void): void; + + /** + * Unloads `files` from Node's `require` cache. + * + * This allows required files to be "freshly" reloaded, providing the ability + * to reuse a Mocha instance programmatically. + * Note: does not clear ESM module files from the cache + */ + unloadFiles(): this; + + /** + * Toggles parallel mode. + * + * Must be run before calling `run`. Changes the `Runner` class to + * use; also enables lazy file loading if not already done so. + * + * @see https://mochajs.org/api/mocha#parallelMode + */ + parallelMode(enabled?: boolean): this; + + /** + * Assigns hooks to the root suite. + * + * @see https://mochajs.org/api/mocha#rootHooks + */ + rootHooks(hooks: Mocha.RootHookObject): this; + + /** + * Configures one or more global setup fixtures. + * If given no parameters, unsets any previously-set fixtures. + * + * @see https://mochajs.org/api/mocha#globalSetup + */ + globalSetup: Mocha.HookFunction; + + /** + * Configures one or more global teardown fixtures. + * If given no parameters, unsets any previously-set fixtures. + * + * @see https://mochajs.org/api/mocha#globalTeardown + */ + globalTeardown: Mocha.HookFunction; + + /** + * Returns `true` if one or more global setup fixtures have been supplied + * + * @see https://mochajs.org/api/mocha#hasGlobalSetupFixtures + */ + hasGlobalSetupFixtures(): boolean; + + /** + * Returns `true` if one or more global teardown fixtures have been supplied + * + * @see https://mochajs.org/api/mocha#hasGlobalTeardownFixtures + */ + hasGlobalTeardownFixtures(): boolean; + + /** + * Toggle execution of any global setup fixture(s) + * + * @see https://mochajs.org/api/mocha#enableGlobalSetup + */ + enableGlobalSetup(enabled: boolean): this; + + /** + * Toggle execution of any global teardown fixture(s) + * + * @see https://mochajs.org/api/mocha#enableGlobalTeardown + */ + enableGlobalTeardown(enabled: boolean): this; +} + +declare namespace Mocha { + namespace utils { + /** + * Compute a slug from the given `str`. + * + * @see https://mochajs.org/api/module-utils.html#.slug + */ + function slug(str: string): string; + + /** + * Strip the function definition from `str`, and re-indent for pre whitespace. + * + * @see https://mochajs.org/api/module-utils.html#.clean + */ + function clean(str: string): string; + + /** + * Highlight the given string of `js`. + */ + function highlight(js: string): string; + + /** + * Takes some variable and asks `Object.prototype.toString()` what it thinks it is. + */ + function type(value: any): string; + + /** + * Stringify `value`. Different behavior depending on type of value: + * + * - If `value` is undefined or null, return `'[undefined]'` or `'[null]'`, respectively. + * - If `value` is not an object, function or array, return result of `value.toString()` wrapped in double-quotes. + * - If `value` is an *empty* object, function, or array, returns `'{}'`, `'[Function]'`, or `'[]'` respectively. + * - If `value` has properties, call canonicalize} on it, then return result of `JSON.stringify()` + * + * @see https://mochajs.org/api/module-utils.html#.stringify + */ + function stringify(value: any): string; + + /** + * Return a new Thing that has the keys in sorted order. Recursive. + * + * If the Thing... + * - has already been seen, return string `'[Circular]'` + * - is `undefined`, return string `'[undefined]'` + * - is `null`, return value `null` + * - is some other primitive, return the value + * - is not a primitive or an `Array`, `Object`, or `Function`, return the value of the Thing's `toString()` method + * - is a non-empty `Array`, `Object`, or `Function`, return the result of calling this function again. + * - is an empty `Array`, `Object`, or `Function`, returns `'[]'`, `'{}'`, or `'[Function]'` respectively. + * + * @see https://mochajs.org/api/module-utils.html#.canonicalize + */ + function canonicalize(value: any, stack: any[], typeHint: string): any; + + /** + * Generate an undefined error with a message warning the user. + * + * @see https://mochajs.org/api/module-utils.html#.undefinedError + */ + function undefinedError(): Error; + + /** + * Generate an undefined error if `err` is not defined. + * + * @see https://mochajs.org/api/module-utils.html#.getError + */ + function getError(err: Error | undefined): Error; + + /** + * When invoking this function you get a filter function that get the Error.stack as an + * input, and return a prettify output. (i.e: strip Mocha and internal node functions from + * stack trace). + * + * @see https://mochajs.org/api/module-utils.html#.stackTraceFilter + */ + function stackTraceFilter(): (stack: string) => string; + } + + namespace interfaces { + function bdd(suite: Suite): void; + function tdd(suite: Suite): void; + function qunit(suite: Suite): void; + function exports(suite: Suite): void; + } + + // #region Test interface augmentations + + interface HookFunction { + /** + * [bdd, qunit, tdd] Describe a "hook" to execute the given callback `fn`. The name of the + * function is used as the name of the hook. + * + * - _Only available when invoked via the mocha CLI._ + */ + (fn: Func): void; + + /** + * [bdd, qunit, tdd] Describe a "hook" to execute the given callback `fn`. The name of the + * function is used as the name of the hook. + * + * - _Only available when invoked via the mocha CLI._ + */ + (fn: AsyncFunc): void; + + /** + * [bdd, qunit, tdd] Describe a "hook" to execute the given `title` and callback `fn`. + * + * - _Only available when invoked via the mocha CLI._ + */ + (name: string, fn?: Func): void; + + /** + * [bdd, qunit, tdd] Describe a "hook" to execute the given `title` and callback `fn`. + * + * - _Only available when invoked via the mocha CLI._ + */ + (name: string, fn?: AsyncFunc): void; + } + + interface SuiteFunction { + /** + * [bdd, tdd] Describe a "suite" with the given `title` and callback `fn` containing + * nested suites. + * + * - _Only available when invoked via the mocha CLI._ + */ + (title: string, fn: (this: Suite) => void): Suite; + + /** + * [qunit] Describe a "suite" with the given `title`. + * + * - _Only available when invoked via the mocha CLI._ + */ + (title: string): Suite; + + /** + * [bdd, tdd, qunit] Indicates this suite should be executed exclusively. + * + * - _Only available when invoked via the mocha CLI._ + */ + only: ExclusiveSuiteFunction; + + /** + * [bdd, tdd] Indicates this suite should not be executed. + * + * - _Only available when invoked via the mocha CLI._ + */ + skip: PendingSuiteFunction; + } + + interface ExclusiveSuiteFunction { + /** + * [bdd, tdd] Describe a "suite" with the given `title` and callback `fn` containing + * nested suites. Indicates this suite should be executed exclusively. + * + * - _Only available when invoked via the mocha CLI._ + */ + (title: string, fn: (this: Suite) => void): Suite; + + /** + * [qunit] Describe a "suite" with the given `title`. Indicates this suite should be executed + * exclusively. + * + * - _Only available when invoked via the mocha CLI._ + */ + (title: string): Suite; + } + + /** + * [bdd, tdd] Describe a "suite" with the given `title` and callback `fn` containing + * nested suites. Indicates this suite should not be executed. + * + * - _Only available when invoked via the mocha CLI._ + * + * @returns [bdd] `Suite` + * @returns [tdd] `void` + */ + interface PendingSuiteFunction { + // eslint-disable-next-line @typescript-eslint/no-invalid-void-type + (title: string, fn: (this: Suite) => void): Suite | void; + } + + interface TestFunction { + /** + * Describe a specification or test-case with the given callback `fn` acting as a thunk. + * The name of the function is used as the name of the test. + * + * - _Only available when invoked via the mocha CLI._ + */ + (fn: Func): Test; + + /** + * Describe a specification or test-case with the given callback `fn` acting as a thunk. + * The name of the function is used as the name of the test. + * + * - _Only available when invoked via the mocha CLI._ + */ + (fn: AsyncFunc): Test; + + /** + * Describe a specification or test-case with the given `title` and callback `fn` acting + * as a thunk. + * + * - _Only available when invoked via the mocha CLI._ + */ + (title: string, fn?: Func): Test; + + /** + * Describe a specification or test-case with the given `title` and callback `fn` acting + * as a thunk. + * + * - _Only available when invoked via the mocha CLI._ + */ + (title: string, fn?: AsyncFunc): Test; + + /** + * Indicates this test should be executed exclusively. + * + * - _Only available when invoked via the mocha CLI._ + */ + only: ExclusiveTestFunction; + + /** + * Indicates this test should not be executed. + * + * - _Only available when invoked via the mocha CLI._ + */ + skip: PendingTestFunction; + + /** + * Number of attempts to retry. + * + * - _Only available when invoked via the mocha CLI._ + */ + retries(n: number): void; + } + + interface ExclusiveTestFunction { + /** + * [bdd, tdd, qunit] Describe a specification or test-case with the given callback `fn` + * acting as a thunk. The name of the function is used as the name of the test. Indicates + * this test should be executed exclusively. + * + * - _Only available when invoked via the mocha CLI._ + */ + (fn: Func): Test; + + /** + * [bdd, tdd, qunit] Describe a specification or test-case with the given callback `fn` + * acting as a thunk. The name of the function is used as the name of the test. Indicates + * this test should be executed exclusively. + * + * - _Only available when invoked via the mocha CLI._ + */ + (fn: AsyncFunc): Test; + + /** + * [bdd, tdd, qunit] Describe a specification or test-case with the given `title` and + * callback `fn` acting as a thunk. Indicates this test should be executed exclusively. + * + * - _Only available when invoked via the mocha CLI._ + */ + (title: string, fn?: Func): Test; + + /** + * [bdd, tdd, qunit] Describe a specification or test-case with the given `title` and + * callback `fn` acting as a thunk. Indicates this test should be executed exclusively. + * + * - _Only available when invoked via the mocha CLI._ + */ + (title: string, fn?: AsyncFunc): Test; + } + + interface PendingTestFunction { + /** + * [bdd, tdd, qunit] Describe a specification or test-case with the given callback `fn` + * acting as a thunk. The name of the function is used as the name of the test. Indicates + * this test should not be executed. + * + * - _Only available when invoked via the mocha CLI._ + */ + (fn: Func): Test; + + /** + * [bdd, tdd, qunit] Describe a specification or test-case with the given callback `fn` + * acting as a thunk. The name of the function is used as the name of the test. Indicates + * this test should not be executed. + * + * - _Only available when invoked via the mocha CLI._ + */ + (fn: AsyncFunc): Test; + + /** + * [bdd, tdd, qunit] Describe a specification or test-case with the given `title` and + * callback `fn` acting as a thunk. Indicates this test should not be executed. + * + * - _Only available when invoked via the mocha CLI._ + */ + (title: string, fn?: Func): Test; + + /** + * [bdd, tdd, qunit] Describe a specification or test-case with the given `title` and + * callback `fn` acting as a thunk. Indicates this test should not be executed. + * + * - _Only available when invoked via the mocha CLI._ + */ + (title: string, fn?: AsyncFunc): Test; + } + + /** + * Execute after each test case. + * + * - _Only available when invoked via the mocha CLI._ + * + * @see https://mochajs.org/api/global.html#afterEach + */ + let afterEach: HookFunction; + + /** + * Execute after running tests. + * + * - _Only available when invoked via the mocha CLI._ + * + * @see https://mochajs.org/api/global.html#after + */ + let after: HookFunction; + + /** + * Execute before each test case. + * + * - _Only available when invoked via the mocha CLI._ + * + * @see https://mochajs.org/api/global.html#beforeEach + */ + let beforeEach: HookFunction; + + /** + * Execute before running tests. + * + * - _Only available when invoked via the mocha CLI._ + * + * @see https://mochajs.org/api/global.html#before + */ + let before: HookFunction; + + /** + * Describe a "suite" containing nested suites and tests. + * + * - _Only available when invoked via the mocha CLI._ + */ + let describe: SuiteFunction; + + /** + * Describe a pending suite. + * + * - _Only available when invoked via the mocha CLI._ + */ + let xdescribe: PendingSuiteFunction; + + /** + * Describes a test case. + * + * - _Only available when invoked via the mocha CLI._ + */ + let it: TestFunction; + + /** + * Describes a pending test case. + * + * - _Only available when invoked via the mocha CLI._ + */ + let xit: PendingTestFunction; + + /** + * Execute before each test case. + * + * - _Only available when invoked via the mocha CLI._ + * + * @see https://mochajs.org/api/global.html#beforeEach + */ + let setup: HookFunction; + + /** + * Execute before running tests. + * + * - _Only available when invoked via the mocha CLI._ + * + * @see https://mochajs.org/api/global.html#before + */ + let suiteSetup: HookFunction; + + /** + * Execute after running tests. + * + * - _Only available when invoked via the mocha CLI._ + * + * @see https://mochajs.org/api/global.html#after + */ + let suiteTeardown: HookFunction; + + /** + * Describe a "suite" containing nested suites and tests. + * + * - _Only available when invoked via the mocha CLI._ + */ + let suite: SuiteFunction; + + /** + * Execute after each test case. + * + * - _Only available when invoked via the mocha CLI._ + * + * @see https://mochajs.org/api/global.html#afterEach + */ + let teardown: HookFunction; + + /** + * Describes a test case. + * + * - _Only available when invoked via the mocha CLI._ + */ + let test: TestFunction; + + /** + * Triggers root suite execution. + * + * - _Only available if flag --delay is passed into Mocha._ + * - _Only available when invoked via the mocha CLI._ + * + * @see https://mochajs.org/api/global.html#runWithSuite + */ + function run(): void; + + // #endregion Test interface augmentations + + namespace reporters { + /** + * Initialize a new `Base` reporter. + * + * All other reporters generally inherit from this reporter, providing stats such as test duration, + * number of tests passed / failed, etc. + * + * @see https://mochajs.org/api/Mocha.reporters.Base.html + */ + class Base { + constructor(runner: Runner, options?: MochaOptions); + + /** + * Test run statistics + */ + stats: Stats; + + /** + * Test failures + */ + failures: Test[]; + + /** + * The configured runner + */ + runner: Runner; + + /** + * Output common epilogue used by many of the bundled reporters. + * + * @see https://mochajs.org/api/Mocha.reporters.Base.html#.Base#epilogue + */ + epilogue(): void; + + done?(failures: number, fn?: (failures: number) => void): void; + } + + namespace Base { + /** + * Enables coloring by default + * + * @see https://mochajs.org/api/module-base#.useColors + */ + let useColors: boolean; + + /** + * Inline diffs instead of +/- + * + * @see https://mochajs.org/api/module-base#.inlineDiffs + */ + let inlineDiffs: boolean; + + /** + * Default color map + * + * @see https://mochajs.org/api/module-base#.colors + */ + const colors: ColorMap; + + /** + * Default color map + * + * @see https://mochajs.org/api/module-base#.colors + */ + interface ColorMap { + // added by Base + pass: number; + fail: number; + "bright pass": number; + "bright fail": number; + "bright yellow": number; + pending: number; + suite: number; + "error title": number; + "error message": number; + "error stack": number; + checkmark: number; + fast: number; + medium: number; + slow: number; + green: number; + light: number; + "diff gutter": number; + "diff added": number; + "diff removed": number; + + // added by Progress + progress: number; + + // added by Landing + plane: number; + "plane crash": number; + runway: number; + + [key: string]: number; + } + + /** + * Default symbol map + * + * @see https://mochajs.org/api/module-base#.symbols + */ + const symbols: SymbolMap; + + /** + * Default symbol map + * + * @see https://mochajs.org/api/module-base#.symbols + */ + interface SymbolMap { + ok: string; + err: string; + dot: string; + comma: string; + bang: string; + [key: string]: string; + } + + /** + * Color `str` with the given `type` (from `colors`) + * + * @see https://mochajs.org/api/module-base#.color + */ + function color(type: string, str: string): string; + + /** + * Expose terminal window size + * + * @see https://mochajs.org/api/module-base#.window + */ + const window: { + width: number; + }; + + /** + * ANSI TTY control sequences common among reporters. + * + * @see https://mochajs.org/api/module-base#.cursor + */ + namespace cursor { + /** + * Hides the cursor + */ + function hide(): void; + + /** + * Shows the cursor + */ + function show(): void; + + /** + * Deletes the current line + */ + function deleteLine(): void; + + /** + * Moves to the beginning of the line + */ + function beginningOfLine(): void; + + /** + * Clears the line and moves to the beginning of the line. + */ + function CR(): void; + } + + /** + * Returns a diff between two strings with colored ANSI output. + * + * @see https://mochajs.org/api/module-base#.generateDiff + */ + function generateDiff(actual: string, expected: string): string; + + /** + * Output the given `failures` as a list. + * + * @see https://mochajs.org/api/Mocha.reporters.Base.html#.exports.list1 + */ + function list(failures: Test[]): void; + } + + /** + * Initialize a new `Dot` matrix test reporter. + * + * @see https://mochajs.org/api/Mocha.reporters.Dot.html + */ + class Dot extends Base {} + + /** + * Initialize a new `Doc` reporter. + * + * @see https://mochajs.org/api/Mocha.reporters.Doc.html + */ + class Doc extends Base {} + + /** + * Initialize a new `TAP` test reporter. + * + * @see https://mochajs.org/api/Mocha.reporters.TAP.html + */ + class TAP extends Base {} + + /** + * Initialize a new `JSON` reporter + * + * @see https://mochajs.org/api/Mocha.reporters.JSON.html + */ + class JSON extends Base {} + + /** + * Initialize a new `HTML` reporter. + * + * - _This reporter cannot be used on the console._ + * + * @see https://mochajs.org/api/Mocha.reporters.HTML.html + */ + class HTML extends Base { + /** + * Provide suite URL. + * + * @see https://mochajs.org/api/Mocha.reporters.HTML.html#suiteURL + */ + suiteURL(suite: Suite): string; + + /** + * Provide test URL. + * + * @see https://mochajs.org/api/Mocha.reporters.HTML.html#testURL + */ + testURL(test: Test): string; + + /** + * Adds code toggle functionality for the provided test's list element. + * + * @see https://mochajs.org/api/Mocha.reporters.HTML.html#addCodeToggle + */ + addCodeToggle(el: HTMLLIElement, contents: string): void; + } + + /** + * Initialize a new `List` test reporter. + * + * @see https://mochajs.org/api/Mocha.reporters.List.html + */ + class List extends Base {} + + /** + * Initialize a new `Min` minimal test reporter (best used with --watch). + * + * @see https://mochajs.org/api/Mocha.reporters.Min.html + */ + class Min extends Base {} + + /** + * Initialize a new `Spec` test reporter. + * + * @see https://mochajs.org/api/Mocha.reporters.Spec.html + */ + class Spec extends Base {} + + /** + * Initialize a new `NyanCat` test reporter. + * + * @see https://mochajs.org/api/Mocha.reporters.Nyan.html + */ + class Nyan extends Base { + private colorIndex; + private numberOfLines; + private rainbowColors; + private scoreboardWidth; + private tick; + private trajectories; + private trajectoryWidthMax; + private draw; + private drawScoreboard; + private appendRainbow; + private drawRainbow; + private drawNyanCat; + private face; + private cursorUp; + private cursorDown; + private generateColors; + private rainbowify; + } + + /** + * Initialize a new `XUnit` test reporter. + * + * @see https://mochajs.org/api/Mocha.reporters.XUnit.html + */ + class XUnit extends Base { + constructor(runner: Runner, options?: XUnit.MochaOptions); + + /** + * Override done to close the stream (if it's a file). + * + * @see https://mochajs.org/api/Mocha.reporters.XUnit.html#done + */ + done(failures: number, fn: (failures: number) => void): void; + + /** + * Write out the given line. + * + * @see https://mochajs.org/api/Mocha.reporters.XUnit.html#write + */ + write(line: string): void; + + /** + * Output tag for the given `test.` + * + * @see https://mochajs.org/api/Mocha.reporters.XUnit.html#test + */ + test(test: Test): void; + } + + namespace XUnit { + interface MochaOptions extends Mocha.MochaOptions { + reporterOptions?: ReporterOptions | undefined; + } + + interface ReporterOptions { + output?: string | undefined; + suiteName?: string | undefined; + } + } + + /** + * Initialize a new `Markdown` test reporter. + * + * @see https://mochajs.org/api/Mocha.reporters.Markdown.html + */ + class Markdown extends Base {} + + /** + * Initialize a new `Progress` bar test reporter. + * + * @see https://mochajs.org/api/Mocha.reporters.Progress.html + */ + class Progress extends Base { + constructor(runner: Runner, options?: Progress.MochaOptions); + } + + namespace Progress { + interface MochaOptions extends Mocha.MochaOptions { + reporterOptions?: ReporterOptions | undefined; + } + + interface ReporterOptions { + open?: string | undefined; + complete?: string | undefined; + incomplete?: string | undefined; + close?: string | undefined; + verbose?: boolean | undefined; + } + } + + /** + * Initialize a new `Landing` reporter. + * + * @see https://mochajs.org/api/Mocha.reporters.Landing.html + */ + class Landing extends Base {} + + /** + * Initialize a new `JSONStream` test reporter. + * + * @see https://mochajs.org/api/Mocha.reporters.JSONStream.html + */ + class JSONStream extends Base {} + + // value-only aliases + const base: typeof Base; + const dot: typeof Dot; + const doc: typeof Doc; + const tap: typeof TAP; + const json: typeof JSON; + const html: typeof HTML; + const list: typeof List; + const spec: typeof Spec; + const nyan: typeof Nyan; + const xunit: typeof XUnit; + const markdown: typeof Markdown; + const progress: typeof Progress; + const landing: typeof Landing; + // NOTE: not possible to type this correctly: + // const "json-stream": typeof JSONStream; + } + + /** + * Initialize a new `Runnable` with the given `title` and callback `fn`. + * + * @see https://mochajs.org/api/Runnable.html + */ + class Runnable { + private _slow; + private _retries; + private _currentRetry; + private _timeout; + private _timeoutError; + + constructor(title: string, fn?: Func | AsyncFunc); + + id: string; + title: string; + fn: Func | AsyncFunc | undefined; + body: string; + async: boolean; + sync: boolean; + timedOut: boolean; + pending: boolean; + duration?: number | undefined; + parent?: Suite | undefined; + state?: "failed" | "passed" | "pending" | undefined; + timer?: any; + ctx?: Context | undefined; + callback?: Done | undefined; + allowUncaught?: boolean | undefined; + file?: string | undefined; + + /** + * Get test timeout. + * + * @see https://mochajs.org/api/Runnable.html#timeout + */ + timeout(): number; + + /** + * Set test timeout. + * + * @see https://mochajs.org/api/Runnable.html#timeout + */ + timeout(ms: string | number): this; + + /** + * Get test slowness threshold. + * + * @see https://mochajs.org/api/Runnable.html#slow + */ + slow(): number; + + /** + * Set test slowness threshold. + * + * @see https://mochajs.org/api/Runnable.html#slow + */ + slow(ms: string | number): this; + + /** + * Halt and mark as pending. + */ + skip(): never; + + /** + * Check if this runnable or its parent suite is marked as pending. + * + * @see https://mochajs.org/api/Runnable.html#isPending + */ + isPending(): boolean; + + /** + * Return `true` if this Runnable has failed. + */ + isFailed(): boolean; + + /** + * Return `true` if this Runnable has passed. + */ + isPassed(): boolean; + + /** + * Set or get number of retries. + * + * @see https://mochajs.org/api/Runnable.html#retries + */ + retries(): number; + + /** + * Set or get number of retries. + * + * @see https://mochajs.org/api/Runnable.html#retries + */ + retries(n: number): void; + + /** + * Set or get current retry + * + * @see https://mochajs.org/api/Runnable.html#currentRetry + */ + protected currentRetry(): number; + + /** + * Set or get current retry + * + * @see https://mochajs.org/api/Runnable.html#currentRetry + */ + protected currentRetry(n: number): void; + + /** + * Return the full title generated by recursively concatenating the parent's full title. + */ + fullTitle(): string; + + /** + * Return the title path generated by concatenating the parent's title path with the title. + */ + titlePath(): string[]; + + /** + * Clear the timeout. + * + * @see https://mochajs.org/api/Runnable.html#clearTimeout + */ + clearTimeout(): void; + + /** + * Inspect the runnable void of private properties. + * + * @see https://mochajs.org/api/Runnable.html#inspect + */ + inspect(): string; + + /** + * Reset the timeout. + * + * @see https://mochajs.org/api/Runnable.html#resetTimeout + */ + resetTimeout(): void; + + /** + * Get a list of whitelisted globals for this test run. + * + * @see https://mochajs.org/api/Runnable.html#globals + */ + globals(): string[]; + + /** + * Set a list of whitelisted globals for this test run. + * + * @see https://mochajs.org/api/Runnable.html#globals + */ + globals(globals: readonly string[]): void; + + /** + * Run the test and invoke `fn(err)`. + * + * @see https://mochajs.org/api/Runnable.html#run + */ + run(fn: Done): void; + } + + // #region Runnable "error" event + interface Runnable extends NodeJS.EventEmitter { + on(event: "error", listener: (error: any) => void): this; + once(event: "error", listener: (error: any) => void): this; + addListener(event: "error", listener: (error: any) => void): this; + removeListener(event: "error", listener: (error: any) => void): this; + prependListener(event: "error", listener: (error: any) => void): this; + prependOnceListener(event: "error", listener: (error: any) => void): this; + emit(name: "error", error: any): boolean; + } + // #endregion Runnable "error" event + // #region Runnable untyped events + interface Runnable extends NodeJS.EventEmitter { + on(event: string, listener: (...args: any[]) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + addListener(event: string, listener: (...args: any[]) => void): this; + removeListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + emit(name: string, ...args: any[]): boolean; + } + // #endregion Runnable untyped events + + /** + * Test context + * + * @see https://mochajs.org/api/module-Context.html#~Context + */ + class Context { + private _runnable; + + test?: Runnable | undefined; + currentTest?: Test | undefined; + + /** + * Get the context `Runnable`. + */ + runnable(): Runnable; + + /** + * Set the context `Runnable`. + */ + runnable(runnable: Runnable): this; + + /** + * Get test timeout. + */ + timeout(): number; + + /** + * Set test timeout. + */ + timeout(ms: string | number): this; + + /** + * Get test slowness threshold. + */ + slow(): number; + + /** + * Set test slowness threshold. + */ + slow(ms: string | number): this; + + /** + * Mark a test as skipped. + */ + skip(): never; + + /** + * Get the number of allowed retries on failed tests. + */ + retries(): number; + + /** + * Set the number of allowed retries on failed tests. + */ + retries(n: number): this; + + [key: string]: any; + } + + interface RunnerConstants { + readonly EVENT_HOOK_BEGIN: "hook"; + readonly EVENT_HOOK_END: "hook end"; + readonly EVENT_RUN_BEGIN: "start"; + readonly EVENT_DELAY_BEGIN: "waiting"; + readonly EVENT_DELAY_END: "ready"; + readonly EVENT_RUN_END: "end"; + readonly EVENT_SUITE_BEGIN: "suite"; + readonly EVENT_SUITE_END: "suite end"; + readonly EVENT_TEST_BEGIN: "test"; + readonly EVENT_TEST_END: "test end"; + readonly EVENT_TEST_FAIL: "fail"; + readonly EVENT_TEST_PASS: "pass"; + readonly EVENT_TEST_PENDING: "pending"; + readonly EVENT_TEST_RETRY: "retry"; + readonly STATE_IDLE: "idle"; + readonly STATE_RUNNING: "running"; + readonly STATE_STOPPED: "stopped"; + } + + interface RunnerOptions { + /** Whether to delay execution of root suite until ready. */ + delay?: boolean; + + /** Whether to report tests without running them. */ + dryRun?: boolean; + + /** Whether to clean references to test fns and hooks when a suite is done. */ + cleanReferencesAfterRun?: boolean; + } + + /** + * Initialize a `Runner` for the given `suite`. + * + * @see https://mochajs.org/api/Mocha.Runner.html + */ + class Runner { + private _globals; + private _abort; + private _delay; + private _defaultGrep; + private next; + private hookErr; + private prevGlobalsLength; + private nextSuite; + + static readonly constants: RunnerConstants; + + /** + * Initialize a `Runner` at the Root Suite, which represents a hierarchy of Suites and Tests. + * + * @param suite Root suite + * @param optionsOrDelay Options. If boolean (deprecated), whether or not to delay execution of root suite until ready. + */ + constructor(suite: Suite, optionsOrDelay?: RunnerOptions | boolean); + + suite: Suite; + started: boolean; + total: number; + failures: number; + asyncOnly?: boolean | undefined; + allowUncaught?: boolean | undefined; + fullStackTrace?: boolean | undefined; + forbidOnly?: boolean | undefined; + forbidPending?: boolean | undefined; + checkLeaks?: boolean | undefined; + test?: Test | undefined; + currentRunnable?: Runnable | undefined; + stats?: Stats | undefined; // added by reporters + + /** + * Removes all event handlers set during a run on this instance. + * Remark: this does *not* clean/dispose the tests or suites themselves. + * + * @see https://mochajs.org/api/runner#dispose + */ + dispose(): void; + + /** + * Run tests with full titles matching `re`. Updates runner.total + * with number of tests matched. + * + * @see https://mochajs.org/api/Mocha.Runner.html#.Runner#grep + */ + grep(re: RegExp, invert: boolean): this; + + /** + * Returns the number of tests matching the grep search for the + * given suite. + * + * @see https://mochajs.org/api/Mocha.Runner.html#.Runner#grepTotal + */ + grepTotal(suite: Suite): number; + + /** + * Gets the allowed globals. + * + * @see https://mochajs.org/api/Mocha.Runner.html#.Runner#globals + */ + globals(): string[]; + + /** + * Allow the given `arr` of globals. + * + * @see https://mochajs.org/api/Mocha.Runner.html#.Runner#globals + */ + globals(arr: readonly string[]): this; + + /** + * Run the root suite and invoke `fn(failures)` on completion. + * + * @see https://mochajs.org/api/Mocha.Runner.html#.Runner#run + */ + run(fn?: (failures: number) => void): this; + + /** + * Cleanly abort execution. + * + * @see https://mochajs.org/api/Mocha.Runner.html#.Runner#abort + */ + abort(): this; + + /** + * Handle uncaught exceptions. + * + * @see https://mochajs.org/api/Mocha.Runner.html#uncaught + */ + uncaught(err: any): void; + + /** + * Wrapper for setImmediate, process.nextTick, or browser polyfill. + */ + protected static immediately(callback: Function): void; + + /** + * Return a list of global properties. + * + * @see https://mochajs.org/api/Mocha.Runner.html#globalProps + */ + protected globalProps(): string[]; + + /** + * Check for global variable leaks. + * + * @see https://mochajs.org/api/Mocha.Runner.html#checkGlobals + */ + protected checkGlobals(test: Test): void; + + /** + * Fail the given `test`. + * + * @see https://mochajs.org/api/Mocha.Runner.html#fail + */ + protected fail(test: Test, err: any): void; + + /** + * Fail the given `hook` with `err`. + * + * Hook failures work in the following pattern: + * - If bail, then exit + * - Failed `before` hook skips all tests in a suite and subsuites, + * but jumps to corresponding `after` hook + * - Failed `before each` hook skips remaining tests in a + * suite and jumps to corresponding `after each` hook, + * which is run only once + * - Failed `after` hook does not alter + * execution order + * - Failed `after each` hook skips remaining tests in a + * suite and subsuites, but executes other `after each` + * hooks + * + * @see https://mochajs.org/api/Mocha.Runner.html#failHook + */ + protected failHook(hook: Hook, err: any): void; + + /** + * Run hook `name` callbacks and then invoke `fn()`. + * + * @see https://mochajs.org/api/Mocha.Runner.html#hook + */ + protected hook(name: string, fn: () => void): void; + + /** + * Run hook `name` for the given array of `suites` + * in order, and callback `fn(err, errSuite)`. + * + * @see https://mochajs.org/api/Mocha.Runner.html#hooks + */ + protected hooks(name: string, suites: Suite[], fn: (err?: any, errSuite?: Suite) => void): void; + + /** + * Run hooks from the top level down. + * + * @see https://mochajs.org/api/Mocha.Runner.html#hookUp + */ + protected hookUp(name: string, fn: (err?: any, errSuite?: Suite) => void): void; + + /** + * Run hooks from the bottom up. + * + * @see https://mochajs.org/api/Mocha.Runner.html#hookDown + */ + protected hookDown(name: string, fn: (err?: any, errSuite?: Suite) => void): void; + + /** + * Return an array of parent Suites from closest to furthest. + * + * @see https://mochajs.org/api/Mocha.Runner.html#parents + */ + protected parents(): Suite[]; + + /** + * Run the current test and callback `fn(err)`. + * + * @see https://mochajs.org/api/Mocha.Runner.html#runTest + */ + protected runTest(fn: Done): any; + + /** + * Run tests in the given `suite` and invoke the callback `fn()` when complete. + * + * @see https://mochajs.org/api/Mocha.Runner.html#runTests + */ + protected runTests(suite: Suite, fn: (errSuite?: Suite) => void): void; + + /** + * Run the given `suite` and invoke the callback `fn()` when complete. + * + * @see https://mochajs.org/api/Mocha.Runner.html#runSuite + */ + protected runSuite(suite: Suite, fn: (errSuite?: Suite) => void): void; + } + + // #region Runner "waiting" event + interface Runner { + on(event: "waiting", listener: (rootSuite: Suite) => void): this; + once(event: "waiting", listener: (rootSuite: Suite) => void): this; + addListener(event: "waiting", listener: (rootSuite: Suite) => void): this; + removeListener(event: "waiting", listener: (rootSuite: Suite) => void): this; + prependListener(event: "waiting", listener: (rootSuite: Suite) => void): this; + prependOnceListener(event: "waiting", listener: (rootSuite: Suite) => void): this; + emit(name: "waiting", rootSuite: Suite): boolean; + } + // #endregion Runner "waiting" event + // #region Runner "start" event + interface Runner extends NodeJS.EventEmitter { + on(event: "start", listener: () => void): this; + once(event: "start", listener: () => void): this; + addListener(event: "start", listener: () => void): this; + removeListener(event: "start", listener: () => void): this; + prependListener(event: "start", listener: () => void): this; + prependOnceListener(event: "start", listener: () => void): this; + emit(name: "start"): boolean; + } + // #endregion Runner "start" event + // #region Runner "end" event + interface Runner extends NodeJS.EventEmitter { + on(event: "end", listener: () => void): this; + once(event: "end", listener: () => void): this; + addListener(event: "end", listener: () => void): this; + removeListener(event: "end", listener: () => void): this; + prependListener(event: "end", listener: () => void): this; + prependOnceListener(event: "end", listener: () => void): this; + emit(name: "end"): boolean; + } + // #endregion Runner "end" event + // #region Runner "suite" event + interface Runner extends NodeJS.EventEmitter { + on(event: "suite", listener: (suite: Suite) => void): this; + once(event: "suite", listener: (suite: Suite) => void): this; + addListener(event: "suite", listener: (suite: Suite) => void): this; + removeListener(event: "suite", listener: (suite: Suite) => void): this; + prependListener(event: "suite", listener: (suite: Suite) => void): this; + prependOnceListener(event: "suite", listener: (suite: Suite) => void): this; + emit(name: "suite", suite: Suite): boolean; + } + // #endregion Runner "suite" event + // #region Runner "suite end" event + interface Runner extends NodeJS.EventEmitter { + on(event: "suite end", listener: (suite: Suite) => void): this; + once(event: "suite end", listener: (suite: Suite) => void): this; + addListener(event: "suite end", listener: (suite: Suite) => void): this; + removeListener(event: "suite end", listener: (suite: Suite) => void): this; + prependListener(event: "suite end", listener: (suite: Suite) => void): this; + prependOnceListener(event: "suite end", listener: (suite: Suite) => void): this; + emit(name: "suite end", suite: Suite): boolean; + } + // #endregion Runner "suite end" event + // #region Runner "test" event + interface Runner extends NodeJS.EventEmitter { + on(event: "test", listener: (test: Test) => void): this; + once(event: "test", listener: (test: Test) => void): this; + addListener(event: "test", listener: (test: Test) => void): this; + removeListener(event: "test", listener: (test: Test) => void): this; + prependListener(event: "test", listener: (test: Test) => void): this; + prependOnceListener(event: "test", listener: (test: Test) => void): this; + emit(name: "test", test: Test): boolean; + } + // #endregion Runner "test" event + // #region Runner "test end" event + interface Runner extends NodeJS.EventEmitter { + on(event: "test end", listener: (test: Test) => void): this; + once(event: "test end", listener: (test: Test) => void): this; + addListener(event: "test end", listener: (test: Test) => void): this; + removeListener(event: "test end", listener: (test: Test) => void): this; + prependListener(event: "test end", listener: (test: Test) => void): this; + prependOnceListener(event: "test end", listener: (test: Test) => void): this; + emit(name: "test end", test: Test): boolean; + } + // #endregion Runner "test end" event + // #region Runner "hook" event + interface Runner extends NodeJS.EventEmitter { + on(event: "hook", listener: (hook: Hook) => void): this; + once(event: "hook", listener: (hook: Hook) => void): this; + addListener(event: "hook", listener: (hook: Hook) => void): this; + removeListener(event: "hook", listener: (hook: Hook) => void): this; + prependListener(event: "hook", listener: (hook: Hook) => void): this; + prependOnceListener(event: "hook", listener: (hook: Hook) => void): this; + emit(name: "hook", hook: Hook): boolean; + } + // #endregion Runner "hook" event + // #region Runner "hook end" event + interface Runner extends NodeJS.EventEmitter { + on(event: "hook end", listener: (hook: Hook) => void): this; + once(event: "hook end", listener: (hook: Hook) => void): this; + addListener(event: "hook end", listener: (hook: Hook) => void): this; + removeListener(event: "hook end", listener: (hook: Hook) => void): this; + prependListener(event: "hook end", listener: (hook: Hook) => void): this; + prependOnceListener(event: "hook end", listener: (hook: Hook) => void): this; + emit(name: "hook end", hook: Hook): boolean; + } + // #endregion Runner "hook end" event + // #region Runner "pass" event + interface Runner extends NodeJS.EventEmitter { + on(event: "pass", listener: (test: Test) => void): this; + once(event: "pass", listener: (test: Test) => void): this; + addListener(event: "pass", listener: (test: Test) => void): this; + removeListener(event: "pass", listener: (test: Test) => void): this; + prependListener(event: "pass", listener: (test: Test) => void): this; + prependOnceListener(event: "pass", listener: (test: Test) => void): this; + emit(name: "pass", test: Test): boolean; + } + // #endregion Runner "pass" event + // #region Runner "fail" event + interface Runner extends NodeJS.EventEmitter { + on(event: "fail", listener: (test: Test, err: any) => void): this; + once(event: "fail", listener: (test: Test, err: any) => void): this; + addListener(event: "fail", listener: (test: Test, err: any) => void): this; + removeListener(event: "fail", listener: (test: Test, err: any) => void): this; + prependListener(event: "fail", listener: (test: Test, err: any) => void): this; + prependOnceListener(event: "fail", listener: (test: Test, err: any) => void): this; + emit(name: "fail", test: Test, err: any): boolean; + } + // #endregion Runner "fail" event + // #region Runner "pending" event + interface Runner extends NodeJS.EventEmitter { + on(event: "pending", listener: (test: Test) => void): this; + once(event: "pending", listener: (test: Test) => void): this; + addListener(event: "pending", listener: (test: Test) => void): this; + removeListener(event: "pending", listener: (test: Test) => void): this; + prependListener(event: "pending", listener: (test: Test) => void): this; + prependOnceListener(event: "pending", listener: (test: Test) => void): this; + emit(name: "pending", test: Test): boolean; + } + // #endregion Runner "pending" event + // #region Runner untyped events + interface Runner extends NodeJS.EventEmitter { + on(event: string, listener: (...args: any[]) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + addListener(event: string, listener: (...args: any[]) => void): this; + removeListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + emit(name: string, ...args: any[]): boolean; + } + // #endregion Runner untyped events + + interface SuiteConstants { + readonly EVENT_FILE_POST_REQUIRE: "post-require"; + readonly EVENT_FILE_PRE_REQUIRE: "pre-require"; + readonly EVENT_FILE_REQUIRE: "require"; + readonly EVENT_ROOT_SUITE_RUN: "run"; + + readonly HOOK_TYPE_AFTER_ALL: "afterAll"; + readonly HOOK_TYPE_AFTER_EACH: "afterEach"; + readonly HOOK_TYPE_BEFORE_ALL: "beforeAll"; + readonly HOOK_TYPE_BEFORE_EACH: "beforeEach"; + + readonly EVENT_SUITE_ADD_HOOK_AFTER_ALL: "afterAll"; + readonly EVENT_SUITE_ADD_HOOK_AFTER_EACH: "afterEach"; + readonly EVENT_SUITE_ADD_HOOK_BEFORE_ALL: "beforeAll"; + readonly EVENT_SUITE_ADD_HOOK_BEFORE_EACH: "beforeEach"; + readonly EVENT_SUITE_ADD_SUITE: "suite"; + readonly EVENT_SUITE_ADD_TEST: "test"; + } + + /** + * Initialize a new `Suite` with the given `title` and `ctx`. + * + * @see https://mochajs.org/api/Mocha.Suite.html + */ + class Suite { + private _beforeEach; + private _beforeAll; + private _afterEach; + private _afterAll; + private _timeout; + private _slow; + private _bail; + private _retries; + private _onlyTests; + private _onlySuites; + + static readonly constants: SuiteConstants; + + constructor(title: string, parentContext?: Context); + + ctx: Context; + suites: Suite[]; + tests: Test[]; + pending: boolean; + file?: string | undefined; + root: boolean; + delayed: boolean; + parent: Suite | undefined; + title: string; + + /** + * Create a new `Suite` with the given `title` and parent `Suite`. When a suite + * with the same title is already present, that suite is returned to provide + * nicer reporter and more flexible meta-testing. + * + * @see https://mochajs.org/api/mocha#.exports.create + */ + static create(parent: Suite, title: string): Suite; + + /** + * Return a clone of this `Suite`. + * + * @see https://mochajs.org/api/Mocha.Suite.html#clone + */ + clone(): Suite; + + /** + * Get timeout `ms`. + * + * @see https://mochajs.org/api/Mocha.Suite.html#timeout + */ + timeout(): number; + + /** + * Set timeout `ms` or short-hand such as "2s". + * + * @see https://mochajs.org/api/Mocha.Suite.html#timeout + */ + timeout(ms: string | number): this; + + /** + * Get number of times to retry a failed test. + * + * @see https://mochajs.org/api/Mocha.Suite.html#retries + */ + retries(): number; + + /** + * Set number of times to retry a failed test. + * + * @see https://mochajs.org/api/Mocha.Suite.html#retries + */ + retries(n: string | number): this; + + /** + * Get slow `ms`. + * + * @see https://mochajs.org/api/Mocha.Suite.html#slow + */ + slow(): number; + + /** + * Set slow `ms` or short-hand such as "2s". + * + * @see https://mochajs.org/api/Mocha.Suite.html#slow + */ + slow(ms: string | number): this; + + /** + * Get whether to bail after first error. + * + * @see https://mochajs.org/api/Mocha.Suite.html#bail + */ + bail(): boolean; + + /** + * Set whether to bail after first error. + * + * @see https://mochajs.org/api/Mocha.Suite.html#bail + */ + bail(bail: boolean): this; + + /** + * Check if this suite or its parent suite is marked as pending. + * + * @see https://mochajs.org/api/Mocha.Suite.html#isPending + */ + isPending(): boolean; + + /** + * Run `fn(test[, done])` before running tests. + * + * @see https://mochajs.org/api/Mocha.Suite.html#beforeAll + */ + beforeAll(fn?: Func): this; + + /** + * Run `fn(test[, done])` before running tests. + * + * @see https://mochajs.org/api/Mocha.Suite.html#beforeAll + */ + beforeAll(fn?: AsyncFunc): this; + + /** + * Run `fn(test[, done])` before running tests. + * + * @see https://mochajs.org/api/Mocha.Suite.html#beforeAll + */ + beforeAll(title: string, fn?: Func): this; + + /** + * Run `fn(test[, done])` before running tests. + * + * @see https://mochajs.org/api/Mocha.Suite.html#beforeAll + */ + beforeAll(title: string, fn?: AsyncFunc): this; + + /** + * Run `fn(test[, done])` after running tests. + * + * @see https://mochajs.org/api/Mocha.Suite.html#afterAll + */ + afterAll(fn?: Func): this; + + /** + * Run `fn(test[, done])` after running tests. + * + * @see https://mochajs.org/api/Mocha.Suite.html#afterAll + */ + afterAll(fn?: AsyncFunc): this; + + /** + * Run `fn(test[, done])` after running tests. + * + * @see https://mochajs.org/api/Mocha.Suite.html#afterAll + */ + afterAll(title: string, fn?: Func): this; + + /** + * Run `fn(test[, done])` after running tests. + * + * @see https://mochajs.org/api/Mocha.Suite.html#afterAll + */ + afterAll(title: string, fn?: AsyncFunc): this; + + /** + * Run `fn(test[, done])` before each test case. + * + * @see https://mochajs.org/api/Mocha.Suite.html#beforeEach + */ + beforeEach(fn?: Func): this; + + /** + * Run `fn(test[, done])` before each test case. + * + * @see https://mochajs.org/api/Mocha.Suite.html#beforeEach + */ + beforeEach(fn?: AsyncFunc): this; + + /** + * Run `fn(test[, done])` before each test case. + * + * @see https://mochajs.org/api/Mocha.Suite.html#beforeEach + */ + beforeEach(title: string, fn?: Func): this; + + /** + * Run `fn(test[, done])` before each test case. + * + * @see https://mochajs.org/api/Mocha.Suite.html#beforeEach + */ + beforeEach(title: string, fn?: AsyncFunc): this; + + /** + * Run `fn(test[, done])` after each test case. + * + * @see https://mochajs.org/api/Mocha.Suite.html#afterEach + */ + afterEach(fn?: Func): this; + + /** + * Run `fn(test[, done])` after each test case. + * + * @see https://mochajs.org/api/Mocha.Suite.html#afterEach + */ + afterEach(fn?: AsyncFunc): this; + + /** + * Run `fn(test[, done])` after each test case. + * + * @see https://mochajs.org/api/Mocha.Suite.html#afterEach + */ + afterEach(title: string, fn?: Func): this; + + /** + * Run `fn(test[, done])` after each test case. + * + * @see https://mochajs.org/api/Mocha.Suite.html#afterEach + */ + afterEach(title: string, fn?: AsyncFunc): this; + + /** + * Add a test `suite`. + * + * @see https://mochajs.org/api/Mocha.Suite.html#addSuite + */ + addSuite(suite: Suite): this; + + /** + * Add a `test` to this suite. + * + * @see https://mochajs.org/api/Mocha.Suite.html#addTest + */ + addTest(test: Test): this; + + /** + * Cleans all references from this suite and all child suites. + * + * https://mochajs.org/api/suite#dispose + */ + dispose(): void; + + /** + * Return the full title generated by recursively concatenating the parent's + * full title. + * + * @see https://mochajs.org/api/Mocha.Suite.html#.Suite#fullTitle + */ + fullTitle(): string; + + /** + * Return the title path generated by recursively concatenating the parent's + * title path. + * + * @see https://mochajs.org/api/Mocha.Suite.html#.Suite#titlePath + */ + titlePath(): string[]; + + /** + * Return the total number of tests. + * + * @see https://mochajs.org/api/Mocha.Suite.html#.Suite#total + */ + total(): number; + + /** + * Iterates through each suite recursively to find all tests. Applies a + * function in the format `fn(test)`. + * + * @see https://mochajs.org/api/Mocha.Suite.html#eachTest + */ + eachTest(fn: (test: Test) => void): this; + + /** + * This will run the root suite if we happen to be running in delayed mode. + * + * @see https://mochajs.org/api/Mocha.Suite.html#run + */ + run(): void; + + /** + * Generic hook-creator. + */ + protected _createHook(title: string, fn?: Func | AsyncFunc): Hook; + } + + // #region Suite "beforeAll" event + interface Suite extends NodeJS.EventEmitter { + on(event: "beforeAll", listener: (hook: Hook) => void): this; + once(event: "beforeAll", listener: (hook: Hook) => void): this; + addListener(event: "beforeAll", listener: (hook: Hook) => void): this; + removeListener(event: "beforeAll", listener: (hook: Hook) => void): this; + prependListener(event: "beforeAll", listener: (hook: Hook) => void): this; + prependOnceListener(event: "beforeAll", listener: (hook: Hook) => void): this; + emit(name: "beforeAll", hook: Hook): boolean; + } + // #endregion Suite "beforeAll" event + // #region Suite "afterAll" event + interface Suite extends NodeJS.EventEmitter { + on(event: "afterAll", listener: (hook: Hook) => void): this; + once(event: "afterAll", listener: (hook: Hook) => void): this; + addListener(event: "afterAll", listener: (hook: Hook) => void): this; + removeListener(event: "afterAll", listener: (hook: Hook) => void): this; + prependListener(event: "afterAll", listener: (hook: Hook) => void): this; + prependOnceListener(event: "afterAll", listener: (hook: Hook) => void): this; + emit(name: "afterAll", hook: Hook): boolean; + } + // #endregion Suite "afterAll" event + // #region Suite "beforeEach" event + interface Suite extends NodeJS.EventEmitter { + on(event: "beforeEach", listener: (hook: Hook) => void): this; + once(event: "beforeEach", listener: (hook: Hook) => void): this; + addListener(event: "beforeEach", listener: (hook: Hook) => void): this; + removeListener(event: "beforeEach", listener: (hook: Hook) => void): this; + prependListener(event: "beforeEach", listener: (hook: Hook) => void): this; + prependOnceListener(event: "beforeEach", listener: (hook: Hook) => void): this; + emit(name: "beforeEach", hook: Hook): boolean; + } + // #endregion Suite "beforeEach" event + // #region Suite "afterEach" event + interface Suite extends NodeJS.EventEmitter { + on(event: "afterEach", listener: (hook: Hook) => void): this; + once(event: "afterEach", listener: (hook: Hook) => void): this; + addListener(event: "afterEach", listener: (hook: Hook) => void): this; + removeListener(event: "afterEach", listener: (hook: Hook) => void): this; + prependListener(event: "afterEach", listener: (hook: Hook) => void): this; + prependOnceListener(event: "afterEach", listener: (hook: Hook) => void): this; + emit(name: "afterEach", hook: Hook): boolean; + } + // #endregion Suite "afterEach" event + // #region Suite "suite" event + interface Suite extends NodeJS.EventEmitter { + on(event: "suite", listener: (suite: Suite) => void): this; + once(event: "suite", listener: (suite: Suite) => void): this; + addListener(event: "suite", listener: (suite: Suite) => void): this; + removeListener(event: "suite", listener: (suite: Suite) => void): this; + prependListener(event: "suite", listener: (suite: Suite) => void): this; + prependOnceListener(event: "suite", listener: (suite: Suite) => void): this; + emit(name: "suite", suite: Suite): boolean; + } + // #endregion Suite "suite" event + // #region Suite "test" event + interface Suite { + on(event: "test", listener: (test: Test) => void): this; + once(event: "test", listener: (test: Test) => void): this; + addListener(event: "test", listener: (test: Test) => void): this; + removeListener(event: "test", listener: (test: Test) => void): this; + prependListener(event: "test", listener: (test: Test) => void): this; + prependOnceListener(event: "test", listener: (test: Test) => void): this; + emit(name: "test", test: Test): boolean; + } + // #endregion Suite "test" event + // #region Suite "run" event + interface Suite extends NodeJS.EventEmitter { + on(event: "run", listener: () => void): this; + once(event: "run", listener: () => void): this; + addListener(event: "run", listener: () => void): this; + removeListener(event: "run", listener: () => void): this; + prependListener(event: "run", listener: () => void): this; + prependOnceListener(event: "run", listener: () => void): this; + emit(name: "run"): boolean; + } + // #endregion Suite "run" event + // #region Suite "pre-require" event + interface Suite extends NodeJS.EventEmitter { + on(event: "pre-require", listener: (context: MochaGlobals, file: string, mocha: Mocha) => void): this; + once(event: "pre-require", listener: (context: MochaGlobals, file: string, mocha: Mocha) => void): this; + addListener(event: "pre-require", listener: (context: MochaGlobals, file: string, mocha: Mocha) => void): this; + removeListener( + event: "pre-require", + listener: (context: MochaGlobals, file: string, mocha: Mocha) => void, + ): this; + prependListener( + event: "pre-require", + listener: (context: MochaGlobals, file: string, mocha: Mocha) => void, + ): this; + prependOnceListener( + event: "pre-require", + listener: (context: MochaGlobals, file: string, mocha: Mocha) => void, + ): this; + emit(name: "pre-require", context: MochaGlobals, file: string, mocha: Mocha): boolean; + } + // #endregion Suite "pre-require" event + // #region Suite "require" event + interface Suite extends NodeJS.EventEmitter { + on(event: "require", listener: (module: any, file: string, mocha: Mocha) => void): this; + once(event: "require", listener: (module: any, file: string, mocha: Mocha) => void): this; + addListener(event: "require", listener: (module: any, file: string, mocha: Mocha) => void): this; + removeListener(event: "require", listener: (module: any, file: string, mocha: Mocha) => void): this; + prependListener(event: "require", listener: (module: any, file: string, mocha: Mocha) => void): this; + prependOnceListener(event: "require", listener: (module: any, file: string, mocha: Mocha) => void): this; + emit(name: "require", module: any, file: string, mocha: Mocha): boolean; + } + // #endregion Suite "require" event + // #region Suite "post-require" event + interface Suite extends NodeJS.EventEmitter { + on(event: "post-require", listener: (context: MochaGlobals, file: string, mocha: Mocha) => void): this; + once(event: "post-require", listener: (context: MochaGlobals, file: string, mocha: Mocha) => void): this; + addListener(event: "post-require", listener: (context: MochaGlobals, file: string, mocha: Mocha) => void): this; + removeListener( + event: "post-require", + listener: (context: MochaGlobals, file: string, mocha: Mocha) => void, + ): this; + prependListener( + event: "post-require", + listener: (context: MochaGlobals, file: string, mocha: Mocha) => void, + ): this; + prependOnceListener( + event: "post-require", + listener: (context: MochaGlobals, file: string, mocha: Mocha) => void, + ): this; + emit(name: "post-require", context: MochaGlobals, file: string, mocha: Mocha): boolean; + } + // #endregion Suite "post-require" event + // #region Suite untyped events + interface Suite extends NodeJS.EventEmitter { + on(event: string, listener: (...args: any[]) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + addListener(event: string, listener: (...args: any[]) => void): this; + removeListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + emit(name: string, ...args: any[]): boolean; + } + // #endregion Runner untyped events + + /** + * Initialize a new `Hook` with the given `title` and callback `fn` + * + * @see https://mochajs.org/api/Hook.html + */ + class Hook extends Runnable { + private _error; + + type: "hook"; + originalTitle?: string | undefined; // added by Runner + + /** + * Get the test `err`. + * + * @see https://mochajs.org/api/Hook.html#error + */ + error(): any; + + /** + * Set the test `err`. + * + * @see https://mochajs.org/api/Hook.html#error + */ + error(err: any): void; + } + + /** + * An alternative way to define root hooks that works with parallel runs. + * + * Root hooks work with any interface, but the property names do not change. + * In other words, if you are using the tdd interface, suiteSetup maps to beforeAll, and setup maps to beforeEach. + * + * As with other hooks, `this` refers to to the current context object. + * + * @see https://mochajs.org/#root-hook-plugins + */ + interface RootHookObject { + /** + * In serial mode, run after all tests end, once only. + * In parallel mode, run after all tests end, for each file. + */ + afterAll?: Func | AsyncFunc | Func[] | AsyncFunc[] | undefined; + /** + * In serial mode (Mocha's default), before all tests begin, once only. + * In parallel mode, run before all tests begin, for each file. + */ + beforeAll?: Func | AsyncFunc | Func[] | AsyncFunc[] | undefined; + /** + * In both modes, run after every test. + */ + afterEach?: Func | AsyncFunc | Func[] | AsyncFunc[] | undefined; + /** + * In both modes, run before each test. + */ + beforeEach?: Func | AsyncFunc | Func[] | AsyncFunc[] | undefined; + } + + /** + * Initialize a new `Test` with the given `title` and callback `fn`. + * + * @see https://mochajs.org/api/Test.html + */ + class Test extends Runnable { + type: "test"; + speed?: "slow" | "medium" | "fast" | undefined; // added by reporters + err?: Error | undefined; // added by reporters + clone(): Test; + } + + /** + * Test statistics + */ + interface Stats { + suites: number; + tests: number; + passes: number; + pending: number; + failures: number; + start?: Date | undefined; + end?: Date | undefined; + duration?: number | undefined; + } + + type TestInterface = (suite: Suite) => void; + + interface ReporterConstructor { + new(runner: Runner, options: MochaOptions): reporters.Base; + } + + type Done = (err?: any) => void; + + /** + * Callback function used for tests and hooks. + */ + type Func = (this: Context, done: Done) => void; + + /** + * Async callback function used for tests and hooks. + */ + type AsyncFunc = (this: Context) => PromiseLike; + + /** + * Options to pass to Mocha. + */ + interface MochaOptions { + /** Propagate uncaught errors? */ + allowUncaught?: boolean | undefined; + + /** Force `done` callback or promise? */ + asyncOnly?: boolean | undefined; + + /** bail on the first test failure. */ + bail?: boolean | undefined; + + /** Check for global variable leaks? */ + checkLeaks?: boolean | undefined; + + /** Color TTY output from reporter */ + color?: boolean | undefined; + + /** Delay root suite execution? */ + delay?: boolean | undefined; + + /** Show diff on failure? */ + diff?: boolean | undefined; + + /** Report tests without running them? */ + dryRun?: boolean | undefined; + + /** Test filter given string. */ + fgrep?: string | undefined; + + /** Tests marked `only` fail the suite? */ + forbidOnly?: boolean | undefined; + + /** Pending tests fail the suite? */ + forbidPending?: boolean | undefined; + + /** Full stacktrace upon failure? */ + fullTrace?: boolean | undefined; + + /** Variables expected in global scope. */ + globals?: string[] | undefined; + + /** Test filter given regular expression. */ + grep?: string | RegExp | undefined; + + /** Enable desktop notifications? */ + growl?: boolean | undefined; + + /** Display inline diffs? */ + inlineDiffs?: boolean | undefined; + + /** Invert test filter matches? */ + invert?: boolean | undefined; + + /** Disable syntax highlighting? */ + noHighlighting?: boolean | undefined; + + /** Reporter name or constructor. */ + reporter?: string | ReporterConstructor | undefined; + + /** Reporter settings object. */ + reporterOptions?: any; + + /** Number of times to retry failed tests. */ + retries?: number | undefined; + + /** Slow threshold value. */ + slow?: number | undefined; + + /** Timeout threshold value. */ + timeout?: number | string | undefined; + + /** Interface name. */ + ui?: Interface | undefined; + + /** Run jobs in parallel */ + parallel?: boolean | undefined; + + /** Max number of worker processes for parallel runs. */ + jobs?: number | undefined; + + /** Hooks to bootstrap the root suite with. */ + rootHooks?: RootHookObject | undefined; + + /** Pathname of `rootHooks` plugin for parallel runs. */ + require?: string[] | undefined; + + /** Should be `true` if `Mocha` process is running in a worker process. */ + isWorker?: boolean | undefined; + } + + interface MochaInstanceOptions extends MochaOptions { + files?: string[] | undefined; + } + + /** + * Variables added to the global scope by Mocha when run in the CLI. + */ + interface MochaGlobals { + /** + * Execute before running tests. + * + * - _Only available when invoked via the mocha CLI._ + * + * @see https://mochajs.org/api/global.html#before + */ + before: HookFunction; + + /** + * Execute after running tests. + * + * - _Only available when invoked via the mocha CLI._ + * + * @see https://mochajs.org/api/global.html#after + */ + after: HookFunction; + + /** + * Execute before each test case. + * + * - _Only available when invoked via the mocha CLI._ + * + * @see https://mochajs.org/api/global.html#beforeEach + */ + beforeEach: HookFunction; + + /** + * Execute after each test case. + * + * - _Only available when invoked via the mocha CLI._ + * + * @see https://mochajs.org/api/global.html#afterEach + */ + afterEach: HookFunction; + + /** + * Describe a "suite" containing nested suites and tests. + * + * - _Only available when invoked via the mocha CLI._ + */ + describe: SuiteFunction; + + /** + * Describe a "suite" containing nested suites and tests. + * + * - _Only available when invoked via the mocha CLI._ + */ + context: SuiteFunction; + + /** + * Pending suite. + * + * - _Only available when invoked via the mocha CLI._ + */ + xdescribe: PendingSuiteFunction; + + /** + * Pending suite. + * + * - _Only available when invoked via the mocha CLI._ + */ + xcontext: PendingSuiteFunction; + + /** + * Describes a test case. + * + * - _Only available when invoked via the mocha CLI._ + */ + it: TestFunction; + + /** + * Describes a test case. + * + * - _Only available when invoked via the mocha CLI._ + */ + specify: TestFunction; + + /** + * Describes a pending test case. + * + * - _Only available when invoked via the mocha CLI._ + */ + xit: PendingTestFunction; + + /** + * Describes a pending test case. + * + * - _Only available when invoked via the mocha CLI._ + */ + xspecify: PendingTestFunction; + + /** + * Execute before running tests. + * + * - _Only available when invoked via the mocha CLI._ + * + * @see https://mochajs.org/api/global.html#before + */ + suiteSetup: HookFunction; + + /** + * Execute after running tests. + * + * - _Only available when invoked via the mocha CLI._ + * + * @see https://mochajs.org/api/global.html#after + */ + suiteTeardown: HookFunction; + + /** + * Execute before each test case. + * + * - _Only available when invoked via the mocha CLI._ + * + * @see https://mochajs.org/api/global.html#beforeEach + */ + setup: HookFunction; + + /** + * Execute after each test case. + * + * - _Only available when invoked via the mocha CLI._ + * + * @see https://mochajs.org/api/global.html#afterEach + */ + teardown: HookFunction; + + /** + * Describe a "suite" containing nested suites and tests. + * + * - _Only available when invoked via the mocha CLI._ + */ + suite: SuiteFunction; + + /** + * Describes a test case. + * + * - _Only available when invoked via the mocha CLI._ + */ + test: TestFunction; + + run: typeof run; + } + + /** + * Third-party declarations that want to add new entries to the `Reporter` union can + * contribute names here. + */ + interface ReporterContributions { + Base: never; + base: never; + Dot: never; + dot: never; + TAP: never; + tap: never; + JSON: never; + json: never; + HTML: never; + html: never; + List: never; + list: never; + Min: never; + min: never; + Spec: never; + spec: never; + Nyan: never; + nyan: never; + XUnit: never; + xunit: never; + Markdown: never; + markdown: never; + Progress: never; + progress: never; + Landing: never; + landing: never; + JSONStream: never; + "json-stream": never; + } + + type Reporter = keyof ReporterContributions; + + /** + * Third-party declarations that want to add new entries to the `Interface` union can + * contribute names here. + */ + interface InterfaceContributions { + bdd: never; + tdd: never; + qunit: never; + exports: never; + } + + type Interface = keyof InterfaceContributions; +} + +// #region Test interface augmentations + +/** + * Triggers root suite execution. + * + * - _Only available if flag --delay is passed into Mocha._ + * - _Only available when invoked via the mocha CLI._ + * + * @see https://mochajs.org/api/global.html#runWithSuite + */ +declare function run(): void; + +/** + * Execute before running tests. + * + * - _Only available when invoked via the mocha CLI._ + * + * @see https://mochajs.org/api/global.html#before + */ +declare var before: Mocha.HookFunction; + +/** + * Execute before running tests. + * + * - _Only available when invoked via the mocha CLI._ + * + * @see https://mochajs.org/api/global.html#before + */ +declare var suiteSetup: Mocha.HookFunction; + +/** + * Execute after running tests. + * + * - _Only available when invoked via the mocha CLI._ + * + * @see https://mochajs.org/api/global.html#after + */ +declare var after: Mocha.HookFunction; + +/** + * Execute after running tests. + * + * - _Only available when invoked via the mocha CLI._ + * + * @see https://mochajs.org/api/global.html#after + */ +declare var suiteTeardown: Mocha.HookFunction; + +/** + * Execute before each test case. + * + * - _Only available when invoked via the mocha CLI._ + * + * @see https://mochajs.org/api/global.html#beforeEach + */ +declare var beforeEach: Mocha.HookFunction; + +/** + * Execute before each test case. + * + * - _Only available when invoked via the mocha CLI._ + * + * @see https://mochajs.org/api/global.html#beforeEach + */ +declare var setup: Mocha.HookFunction; + +/** + * Execute after each test case. + * + * - _Only available when invoked via the mocha CLI._ + * + * @see https://mochajs.org/api/global.html#afterEach + */ +declare var afterEach: Mocha.HookFunction; + +/** + * Execute after each test case. + * + * - _Only available when invoked via the mocha CLI._ + * + * @see https://mochajs.org/api/global.html#afterEach + */ +declare var teardown: Mocha.HookFunction; + +/** + * Describe a "suite" containing nested suites and tests. + * + * - _Only available when invoked via the mocha CLI._ + */ +declare var describe: Mocha.SuiteFunction; + +/** + * Describe a "suite" containing nested suites and tests. + * + * - _Only available when invoked via the mocha CLI._ + */ +declare var context: Mocha.SuiteFunction; + +/** + * Describe a "suite" containing nested suites and tests. + * + * - _Only available when invoked via the mocha CLI._ + */ +declare var suite: Mocha.SuiteFunction; + +/** + * Pending suite. + * + * - _Only available when invoked via the mocha CLI._ + */ +declare var xdescribe: Mocha.PendingSuiteFunction; + +/** + * Pending suite. + * + * - _Only available when invoked via the mocha CLI._ + */ +declare var xcontext: Mocha.PendingSuiteFunction; + +/** + * Describes a test case. + * + * - _Only available when invoked via the mocha CLI._ + */ +declare var it: Mocha.TestFunction; + +/** + * Describes a test case. + * + * - _Only available when invoked via the mocha CLI._ + */ +declare var specify: Mocha.TestFunction; + +/** + * Describes a test case. + * + * - _Only available when invoked via the mocha CLI._ + */ +declare var test: Mocha.TestFunction; + +/** + * Describes a pending test case. + * + * - _Only available when invoked via the mocha CLI._ + */ +declare var xit: Mocha.PendingTestFunction; + +/** + * Describes a pending test case. + * + * - _Only available when invoked via the mocha CLI._ + */ +declare var xspecify: Mocha.PendingTestFunction; + +// #endregion Test interface augmentations + +// #region Reporter augmentations + +// Forward declaration for `HTMLLIElement` from lib.dom.d.ts. +// Required by Mocha.reporters.HTML. +// NOTE: Mocha *must not* have a direct dependency on DOM types. +// eslint-disable-next-line @typescript-eslint/no-empty-interface +interface HTMLLIElement {} + +// Augments the DOM `Window` object when lib.dom.d.ts is loaded. +// eslint-disable-next-line @typescript-eslint/no-empty-interface +interface Window extends Mocha.MochaGlobals {} + +declare namespace NodeJS { + // Forward declaration for `NodeJS.EventEmitter` from node.d.ts. + // Required by Mocha.Runnable, Mocha.Runner, and Mocha.Suite. + // NOTE: Mocha *must not* have a direct dependency on @types/node. + // eslint-disable-next-line @typescript-eslint/no-empty-interface + interface EventEmitter {} + + // Augments NodeJS's `global` object when node.d.ts is loaded + // eslint-disable-next-line @typescript-eslint/no-empty-interface + interface Global extends Mocha.MochaGlobals {} +} + +// #endregion Reporter augmentations + +// #region Browser augmentations + +/** + * Mocha global. + * + * - _Only supported in the browser._ + */ +declare const mocha: BrowserMocha; + +interface BrowserMocha extends Mocha { + /** + * Function to allow assertion libraries to throw errors directly into mocha. + * This is useful when running tests in a browser because window.onerror will + * only receive the 'message' attribute of the Error. + * + * - _Only supported in the browser._ + */ + throwError(err: any): never; + + /** + * Setup mocha with the given settings options. + * + * - _Only supported in the browser._ + */ + setup(opts?: Mocha.Interface | Mocha.MochaOptions): this; +} + +// #endregion Browser augmentations + +declare module "mocha" { + export = Mocha; +} + +declare module "mocha/lib/stats-collector" { + export = createStatsCollector; + + /** + * Provides stats such as test duration, number of tests passed / failed etc., by listening for events emitted by `runner`. + */ + function createStatsCollector(runner: Mocha.Runner): void; +} + +declare module "mocha/lib/interfaces/common" { + export = common; + + function common(suites: Mocha.Suite[], context: Mocha.MochaGlobals, mocha: Mocha): common.CommonFunctions; + + namespace common { + interface CommonFunctions { + /** + * This is only present if flag --delay is passed into Mocha. It triggers + * root suite execution. + */ + runWithSuite(suite: Mocha.Suite): () => void; + + /** + * Execute before running tests. + */ + before(fn?: Mocha.Func | Mocha.AsyncFunc): void; + + /** + * Execute before running tests. + */ + before(name: string, fn?: Mocha.Func | Mocha.AsyncFunc): void; + + /** + * Execute after running tests. + */ + after(fn?: Mocha.Func | Mocha.AsyncFunc): void; + + /** + * Execute after running tests. + */ + after(name: string, fn?: Mocha.Func | Mocha.AsyncFunc): void; + + /** + * Execute before each test case. + */ + beforeEach(fn?: Mocha.Func | Mocha.AsyncFunc): void; + + /** + * Execute before each test case. + */ + beforeEach(name: string, fn?: Mocha.Func | Mocha.AsyncFunc): void; + + /** + * Execute after each test case. + */ + afterEach(fn?: Mocha.Func | Mocha.AsyncFunc): void; + + /** + * Execute after each test case. + */ + afterEach(name: string, fn?: Mocha.Func | Mocha.AsyncFunc): void; + + suite: SuiteFunctions; + test: TestFunctions; + } + + interface CreateOptions { + /** Title of suite */ + title: string; + + /** Suite function */ + fn?: ((this: Mocha.Suite) => void) | undefined; + + /** Is suite pending? */ + pending?: boolean | undefined; + + /** Filepath where this Suite resides */ + file?: string | undefined; + + /** Is suite exclusive? */ + isOnly?: boolean | undefined; + } + + interface SuiteFunctions { + /** + * Create an exclusive Suite; convenience function + */ + only(opts: CreateOptions): Mocha.Suite; + + /** + * Create a Suite, but skip it; convenience function + */ + skip(opts: CreateOptions): Mocha.Suite; + + /** + * Creates a suite. + */ + create(opts: CreateOptions): Mocha.Suite; + } + + interface TestFunctions { + /** + * Exclusive test-case. + */ + only(mocha: Mocha, test: Mocha.Test): Mocha.Test; + + /** + * Pending test case. + */ + skip(title: string): void; + + /** + * Number of retry attempts + */ + retries(n: number): void; + } + } +} diff --git a/task/node_modules/@types/mocha/package.json b/task/node_modules/@types/mocha/package.json new file mode 100644 index 0000000..31a2d86 --- /dev/null +++ b/task/node_modules/@types/mocha/package.json @@ -0,0 +1,55 @@ +{ + "name": "@types/mocha", + "version": "10.0.6", + "description": "TypeScript definitions for mocha", + "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/mocha", + "license": "MIT", + "contributors": [ + { + "name": "Kazi Manzur Rashid", + "githubUsername": "kazimanzurrashid", + "url": "https://github.com/kazimanzurrashid" + }, + { + "name": "otiai10", + "githubUsername": "otiai10", + "url": "https://github.com/otiai10" + }, + { + "name": "Vadim Macagon", + "githubUsername": "enlight", + "url": "https://github.com/enlight" + }, + { + "name": "Andrew Bradley", + "githubUsername": "cspotcode", + "url": "https://github.com/cspotcode" + }, + { + "name": "Dmitrii Sorin", + "githubUsername": "1999", + "url": "https://github.com/1999" + }, + { + "name": "Noah Hummel", + "githubUsername": "strangedev", + "url": "https://github.com/strangedev" + }, + { + "name": "nicojs", + "githubUsername": "nicojs", + "url": "https://github.com/nicojs" + } + ], + "main": "", + "types": "index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git", + "directory": "types/mocha" + }, + "scripts": {}, + "dependencies": {}, + "typesPublisherContentHash": "de34ee99a18094486419f8e3b6c2a3f81f623ecdcbc5f6f4cfe46236c7df5831", + "typeScriptVersion": "4.5" +} \ No newline at end of file diff --git a/task/node_modules/@types/node/LICENSE b/task/node_modules/@types/node/LICENSE new file mode 100644 index 0000000..9e841e7 --- /dev/null +++ b/task/node_modules/@types/node/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE diff --git a/task/node_modules/@types/node/README.md b/task/node_modules/@types/node/README.md new file mode 100644 index 0000000..49b0580 --- /dev/null +++ b/task/node_modules/@types/node/README.md @@ -0,0 +1,15 @@ +# Installation +> `npm install --save @types/node` + +# Summary +This package contains type definitions for node (https://nodejs.org/). + +# Details +Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node. + +### Additional Details + * Last updated: Sun, 03 Dec 2023 18:07:12 GMT + * Dependencies: [undici-types](https://npmjs.com/package/undici-types) + +# Credits +These definitions were written by [Microsoft TypeScript](https://github.com/Microsoft), [Alberto Schiabel](https://github.com/jkomyno), [Alvis HT Tang](https://github.com/alvis), [Andrew Makarov](https://github.com/r3nya), [Benjamin Toueg](https://github.com/btoueg), [Chigozirim C.](https://github.com/smac89), [David Junger](https://github.com/touffy), [Deividas Bakanas](https://github.com/DeividasBakanas), [Eugene Y. Q. Shen](https://github.com/eyqs), [Hannes Magnusson](https://github.com/Hannes-Magnusson-CK), [Huw](https://github.com/hoo29), [Kelvin Jin](https://github.com/kjin), [Klaus Meinhardt](https://github.com/ajafff), [Lishude](https://github.com/islishude), [Mariusz Wiktorczyk](https://github.com/mwiktorczyk), [Mohsen Azimi](https://github.com/mohsen1), [Nicolas Even](https://github.com/n-e), [Nikita Galkin](https://github.com/galkin), [Parambir Singh](https://github.com/parambirs), [Sebastian Silbermann](https://github.com/eps1lon), [Thomas den Hollander](https://github.com/ThomasdenH), [Wilco Bakker](https://github.com/WilcoBakker), [wwwy3y3](https://github.com/wwwy3y3), [Samuel Ainsworth](https://github.com/samuela), [Kyle Uehlein](https://github.com/kuehlein), [Thanik Bhongbhibhat](https://github.com/bhongy), [Marcin Kopacz](https://github.com/chyzwar), [Trivikram Kamat](https://github.com/trivikr), [Junxiao Shi](https://github.com/yoursunny), [Ilia Baryshnikov](https://github.com/qwelias), [ExE Boss](https://github.com/ExE-Boss), [Piotr Błażejewicz](https://github.com/peterblazejewicz), [Anna Henningsen](https://github.com/addaleax), [Victor Perin](https://github.com/victorperin), [Yongsheng Zhang](https://github.com/ZYSzys), [NodeJS Contributors](https://github.com/NodeJS), [Linus Unnebäck](https://github.com/LinusU), [wafuwafu13](https://github.com/wafuwafu13), [Matteo Collina](https://github.com/mcollina), and [Dmitry Semigradsky](https://github.com/Semigradsky). diff --git a/task/node_modules/@types/node/assert.d.ts b/task/node_modules/@types/node/assert.d.ts new file mode 100644 index 0000000..cd82143 --- /dev/null +++ b/task/node_modules/@types/node/assert.d.ts @@ -0,0 +1,996 @@ +/** + * The `node:assert` module provides a set of assertion functions for verifying + * invariants. + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/assert.js) + */ +declare module "assert" { + /** + * An alias of {@link ok}. + * @since v0.5.9 + * @param value The input that is checked for being truthy. + */ + function assert(value: unknown, message?: string | Error): asserts value; + namespace assert { + /** + * Indicates the failure of an assertion. All errors thrown by the `node:assert`module will be instances of the `AssertionError` class. + */ + class AssertionError extends Error { + /** + * Set to the `actual` argument for methods such as {@link assert.strictEqual()}. + */ + actual: unknown; + /** + * Set to the `expected` argument for methods such as {@link assert.strictEqual()}. + */ + expected: unknown; + /** + * Set to the passed in operator value. + */ + operator: string; + /** + * Indicates if the message was auto-generated (`true`) or not. + */ + generatedMessage: boolean; + /** + * Value is always `ERR_ASSERTION` to show that the error is an assertion error. + */ + code: "ERR_ASSERTION"; + constructor(options?: { + /** If provided, the error message is set to this value. */ + message?: string | undefined; + /** The `actual` property on the error instance. */ + actual?: unknown | undefined; + /** The `expected` property on the error instance. */ + expected?: unknown | undefined; + /** The `operator` property on the error instance. */ + operator?: string | undefined; + /** If provided, the generated stack trace omits frames before this function. */ + // eslint-disable-next-line @typescript-eslint/ban-types + stackStartFn?: Function | undefined; + }); + } + /** + * This feature is deprecated and will be removed in a future version. + * Please consider using alternatives such as the `mock` helper function. + * @since v14.2.0, v12.19.0 + * @deprecated Deprecated + */ + class CallTracker { + /** + * The wrapper function is expected to be called exactly `exact` times. If the + * function has not been called exactly `exact` times when `tracker.verify()` is called, then `tracker.verify()` will throw an + * error. + * + * ```js + * import assert from 'node:assert'; + * + * // Creates call tracker. + * const tracker = new assert.CallTracker(); + * + * function func() {} + * + * // Returns a function that wraps func() that must be called exact times + * // before tracker.verify(). + * const callsfunc = tracker.calls(func); + * ``` + * @since v14.2.0, v12.19.0 + * @param [fn='A no-op function'] + * @param [exact=1] + * @return that wraps `fn`. + */ + calls(exact?: number): () => void; + calls any>(fn?: Func, exact?: number): Func; + /** + * Example: + * + * ```js + * import assert from 'node:assert'; + * + * const tracker = new assert.CallTracker(); + * + * function func() {} + * const callsfunc = tracker.calls(func); + * callsfunc(1, 2, 3); + * + * assert.deepStrictEqual(tracker.getCalls(callsfunc), + * [{ thisArg: undefined, arguments: [1, 2, 3] }]); + * ``` + * @since v18.8.0, v16.18.0 + * @param fn + * @return An Array with all the calls to a tracked function. + */ + getCalls(fn: Function): CallTrackerCall[]; + /** + * The arrays contains information about the expected and actual number of calls of + * the functions that have not been called the expected number of times. + * + * ```js + * import assert from 'node:assert'; + * + * // Creates call tracker. + * const tracker = new assert.CallTracker(); + * + * function func() {} + * + * // Returns a function that wraps func() that must be called exact times + * // before tracker.verify(). + * const callsfunc = tracker.calls(func, 2); + * + * // Returns an array containing information on callsfunc() + * console.log(tracker.report()); + * // [ + * // { + * // message: 'Expected the func function to be executed 2 time(s) but was + * // executed 0 time(s).', + * // actual: 0, + * // expected: 2, + * // operator: 'func', + * // stack: stack trace + * // } + * // ] + * ``` + * @since v14.2.0, v12.19.0 + * @return An Array of objects containing information about the wrapper functions returned by `calls`. + */ + report(): CallTrackerReportInformation[]; + /** + * Reset calls of the call tracker. + * If a tracked function is passed as an argument, the calls will be reset for it. + * If no arguments are passed, all tracked functions will be reset. + * + * ```js + * import assert from 'node:assert'; + * + * const tracker = new assert.CallTracker(); + * + * function func() {} + * const callsfunc = tracker.calls(func); + * + * callsfunc(); + * // Tracker was called once + * assert.strictEqual(tracker.getCalls(callsfunc).length, 1); + * + * tracker.reset(callsfunc); + * assert.strictEqual(tracker.getCalls(callsfunc).length, 0); + * ``` + * @since v18.8.0, v16.18.0 + * @param fn a tracked function to reset. + */ + reset(fn?: Function): void; + /** + * Iterates through the list of functions passed to `tracker.calls()` and will throw an error for functions that + * have not been called the expected number of times. + * + * ```js + * import assert from 'node:assert'; + * + * // Creates call tracker. + * const tracker = new assert.CallTracker(); + * + * function func() {} + * + * // Returns a function that wraps func() that must be called exact times + * // before tracker.verify(). + * const callsfunc = tracker.calls(func, 2); + * + * callsfunc(); + * + * // Will throw an error since callsfunc() was only called once. + * tracker.verify(); + * ``` + * @since v14.2.0, v12.19.0 + */ + verify(): void; + } + interface CallTrackerCall { + thisArg: object; + arguments: unknown[]; + } + interface CallTrackerReportInformation { + message: string; + /** The actual number of times the function was called. */ + actual: number; + /** The number of times the function was expected to be called. */ + expected: number; + /** The name of the function that is wrapped. */ + operator: string; + /** A stack trace of the function. */ + stack: object; + } + type AssertPredicate = RegExp | (new() => object) | ((thrown: unknown) => boolean) | object | Error; + /** + * Throws an `AssertionError` with the provided error message or a default + * error message. If the `message` parameter is an instance of an `Error` then + * it will be thrown instead of the `AssertionError`. + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.fail(); + * // AssertionError [ERR_ASSERTION]: Failed + * + * assert.fail('boom'); + * // AssertionError [ERR_ASSERTION]: boom + * + * assert.fail(new TypeError('need array')); + * // TypeError: need array + * ``` + * + * Using `assert.fail()` with more than two arguments is possible but deprecated. + * See below for further details. + * @since v0.1.21 + * @param [message='Failed'] + */ + function fail(message?: string | Error): never; + /** @deprecated since v10.0.0 - use fail([message]) or other assert functions instead. */ + function fail( + actual: unknown, + expected: unknown, + message?: string | Error, + operator?: string, + // eslint-disable-next-line @typescript-eslint/ban-types + stackStartFn?: Function, + ): never; + /** + * Tests if `value` is truthy. It is equivalent to`assert.equal(!!value, true, message)`. + * + * If `value` is not truthy, an `AssertionError` is thrown with a `message`property set equal to the value of the `message` parameter. If the `message`parameter is `undefined`, a default + * error message is assigned. If the `message`parameter is an instance of an `Error` then it will be thrown instead of the`AssertionError`. + * If no arguments are passed in at all `message` will be set to the string:`` 'No value argument passed to `assert.ok()`' ``. + * + * Be aware that in the `repl` the error message will be different to the one + * thrown in a file! See below for further details. + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.ok(true); + * // OK + * assert.ok(1); + * // OK + * + * assert.ok(); + * // AssertionError: No value argument passed to `assert.ok()` + * + * assert.ok(false, 'it\'s false'); + * // AssertionError: it's false + * + * // In the repl: + * assert.ok(typeof 123 === 'string'); + * // AssertionError: false == true + * + * // In a file (e.g. test.js): + * assert.ok(typeof 123 === 'string'); + * // AssertionError: The expression evaluated to a falsy value: + * // + * // assert.ok(typeof 123 === 'string') + * + * assert.ok(false); + * // AssertionError: The expression evaluated to a falsy value: + * // + * // assert.ok(false) + * + * assert.ok(0); + * // AssertionError: The expression evaluated to a falsy value: + * // + * // assert.ok(0) + * ``` + * + * ```js + * import assert from 'node:assert/strict'; + * + * // Using `assert()` works the same: + * assert(0); + * // AssertionError: The expression evaluated to a falsy value: + * // + * // assert(0) + * ``` + * @since v0.1.21 + */ + function ok(value: unknown, message?: string | Error): asserts value; + /** + * **Strict assertion mode** + * + * An alias of {@link strictEqual}. + * + * **Legacy assertion mode** + * + * > Stability: 3 - Legacy: Use {@link strictEqual} instead. + * + * Tests shallow, coercive equality between the `actual` and `expected` parameters + * using the [`==` operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Equality). `NaN` is specially handled + * and treated as being identical if both sides are `NaN`. + * + * ```js + * import assert from 'node:assert'; + * + * assert.equal(1, 1); + * // OK, 1 == 1 + * assert.equal(1, '1'); + * // OK, 1 == '1' + * assert.equal(NaN, NaN); + * // OK + * + * assert.equal(1, 2); + * // AssertionError: 1 == 2 + * assert.equal({ a: { b: 1 } }, { a: { b: 1 } }); + * // AssertionError: { a: { b: 1 } } == { a: { b: 1 } } + * ``` + * + * If the values are not equal, an `AssertionError` is thrown with a `message`property set equal to the value of the `message` parameter. If the `message`parameter is undefined, a default + * error message is assigned. If the `message`parameter is an instance of an `Error` then it will be thrown instead of the`AssertionError`. + * @since v0.1.21 + */ + function equal(actual: unknown, expected: unknown, message?: string | Error): void; + /** + * **Strict assertion mode** + * + * An alias of {@link notStrictEqual}. + * + * **Legacy assertion mode** + * + * > Stability: 3 - Legacy: Use {@link notStrictEqual} instead. + * + * Tests shallow, coercive inequality with the [`!=` operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Inequality). `NaN` is + * specially handled and treated as being identical if both sides are `NaN`. + * + * ```js + * import assert from 'node:assert'; + * + * assert.notEqual(1, 2); + * // OK + * + * assert.notEqual(1, 1); + * // AssertionError: 1 != 1 + * + * assert.notEqual(1, '1'); + * // AssertionError: 1 != '1' + * ``` + * + * If the values are equal, an `AssertionError` is thrown with a `message`property set equal to the value of the `message` parameter. If the `message`parameter is undefined, a default error + * message is assigned. If the `message`parameter is an instance of an `Error` then it will be thrown instead of the`AssertionError`. + * @since v0.1.21 + */ + function notEqual(actual: unknown, expected: unknown, message?: string | Error): void; + /** + * **Strict assertion mode** + * + * An alias of {@link deepStrictEqual}. + * + * **Legacy assertion mode** + * + * > Stability: 3 - Legacy: Use {@link deepStrictEqual} instead. + * + * Tests for deep equality between the `actual` and `expected` parameters. Consider + * using {@link deepStrictEqual} instead. {@link deepEqual} can have + * surprising results. + * + * _Deep equality_ means that the enumerable "own" properties of child objects + * are also recursively evaluated by the following rules. + * @since v0.1.21 + */ + function deepEqual(actual: unknown, expected: unknown, message?: string | Error): void; + /** + * **Strict assertion mode** + * + * An alias of {@link notDeepStrictEqual}. + * + * **Legacy assertion mode** + * + * > Stability: 3 - Legacy: Use {@link notDeepStrictEqual} instead. + * + * Tests for any deep inequality. Opposite of {@link deepEqual}. + * + * ```js + * import assert from 'node:assert'; + * + * const obj1 = { + * a: { + * b: 1, + * }, + * }; + * const obj2 = { + * a: { + * b: 2, + * }, + * }; + * const obj3 = { + * a: { + * b: 1, + * }, + * }; + * const obj4 = { __proto__: obj1 }; + * + * assert.notDeepEqual(obj1, obj1); + * // AssertionError: { a: { b: 1 } } notDeepEqual { a: { b: 1 } } + * + * assert.notDeepEqual(obj1, obj2); + * // OK + * + * assert.notDeepEqual(obj1, obj3); + * // AssertionError: { a: { b: 1 } } notDeepEqual { a: { b: 1 } } + * + * assert.notDeepEqual(obj1, obj4); + * // OK + * ``` + * + * If the values are deeply equal, an `AssertionError` is thrown with a`message` property set equal to the value of the `message` parameter. If the`message` parameter is undefined, a default + * error message is assigned. If the`message` parameter is an instance of an `Error` then it will be thrown + * instead of the `AssertionError`. + * @since v0.1.21 + */ + function notDeepEqual(actual: unknown, expected: unknown, message?: string | Error): void; + /** + * Tests strict equality between the `actual` and `expected` parameters as + * determined by [`Object.is()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is). + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.strictEqual(1, 2); + * // AssertionError [ERR_ASSERTION]: Expected inputs to be strictly equal: + * // + * // 1 !== 2 + * + * assert.strictEqual(1, 1); + * // OK + * + * assert.strictEqual('Hello foobar', 'Hello World!'); + * // AssertionError [ERR_ASSERTION]: Expected inputs to be strictly equal: + * // + actual - expected + * // + * // + 'Hello foobar' + * // - 'Hello World!' + * // ^ + * + * const apples = 1; + * const oranges = 2; + * assert.strictEqual(apples, oranges, `apples ${apples} !== oranges ${oranges}`); + * // AssertionError [ERR_ASSERTION]: apples 1 !== oranges 2 + * + * assert.strictEqual(1, '1', new TypeError('Inputs are not identical')); + * // TypeError: Inputs are not identical + * ``` + * + * If the values are not strictly equal, an `AssertionError` is thrown with a`message` property set equal to the value of the `message` parameter. If the`message` parameter is undefined, a + * default error message is assigned. If the`message` parameter is an instance of an `Error` then it will be thrown + * instead of the `AssertionError`. + * @since v0.1.21 + */ + function strictEqual(actual: unknown, expected: T, message?: string | Error): asserts actual is T; + /** + * Tests strict inequality between the `actual` and `expected` parameters as + * determined by [`Object.is()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is). + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.notStrictEqual(1, 2); + * // OK + * + * assert.notStrictEqual(1, 1); + * // AssertionError [ERR_ASSERTION]: Expected "actual" to be strictly unequal to: + * // + * // 1 + * + * assert.notStrictEqual(1, '1'); + * // OK + * ``` + * + * If the values are strictly equal, an `AssertionError` is thrown with a`message` property set equal to the value of the `message` parameter. If the`message` parameter is undefined, a + * default error message is assigned. If the`message` parameter is an instance of an `Error` then it will be thrown + * instead of the `AssertionError`. + * @since v0.1.21 + */ + function notStrictEqual(actual: unknown, expected: unknown, message?: string | Error): void; + /** + * Tests for deep equality between the `actual` and `expected` parameters. + * "Deep" equality means that the enumerable "own" properties of child objects + * are recursively evaluated also by the following rules. + * @since v1.2.0 + */ + function deepStrictEqual(actual: unknown, expected: T, message?: string | Error): asserts actual is T; + /** + * Tests for deep strict inequality. Opposite of {@link deepStrictEqual}. + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.notDeepStrictEqual({ a: 1 }, { a: '1' }); + * // OK + * ``` + * + * If the values are deeply and strictly equal, an `AssertionError` is thrown + * with a `message` property set equal to the value of the `message` parameter. If + * the `message` parameter is undefined, a default error message is assigned. If + * the `message` parameter is an instance of an `Error` then it will be thrown + * instead of the `AssertionError`. + * @since v1.2.0 + */ + function notDeepStrictEqual(actual: unknown, expected: unknown, message?: string | Error): void; + /** + * Expects the function `fn` to throw an error. + * + * If specified, `error` can be a [`Class`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes), + * [`RegExp`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions), a validation function, + * a validation object where each property will be tested for strict deep equality, + * or an instance of error where each property will be tested for strict deep + * equality including the non-enumerable `message` and `name` properties. When + * using an object, it is also possible to use a regular expression, when + * validating against a string property. See below for examples. + * + * If specified, `message` will be appended to the message provided by the`AssertionError` if the `fn` call fails to throw or in case the error validation + * fails. + * + * Custom validation object/error instance: + * + * ```js + * import assert from 'node:assert/strict'; + * + * const err = new TypeError('Wrong value'); + * err.code = 404; + * err.foo = 'bar'; + * err.info = { + * nested: true, + * baz: 'text', + * }; + * err.reg = /abc/i; + * + * assert.throws( + * () => { + * throw err; + * }, + * { + * name: 'TypeError', + * message: 'Wrong value', + * info: { + * nested: true, + * baz: 'text', + * }, + * // Only properties on the validation object will be tested for. + * // Using nested objects requires all properties to be present. Otherwise + * // the validation is going to fail. + * }, + * ); + * + * // Using regular expressions to validate error properties: + * assert.throws( + * () => { + * throw err; + * }, + * { + * // The `name` and `message` properties are strings and using regular + * // expressions on those will match against the string. If they fail, an + * // error is thrown. + * name: /^TypeError$/, + * message: /Wrong/, + * foo: 'bar', + * info: { + * nested: true, + * // It is not possible to use regular expressions for nested properties! + * baz: 'text', + * }, + * // The `reg` property contains a regular expression and only if the + * // validation object contains an identical regular expression, it is going + * // to pass. + * reg: /abc/i, + * }, + * ); + * + * // Fails due to the different `message` and `name` properties: + * assert.throws( + * () => { + * const otherErr = new Error('Not found'); + * // Copy all enumerable properties from `err` to `otherErr`. + * for (const [key, value] of Object.entries(err)) { + * otherErr[key] = value; + * } + * throw otherErr; + * }, + * // The error's `message` and `name` properties will also be checked when using + * // an error as validation object. + * err, + * ); + * ``` + * + * Validate instanceof using constructor: + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.throws( + * () => { + * throw new Error('Wrong value'); + * }, + * Error, + * ); + * ``` + * + * Validate error message using [`RegExp`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions): + * + * Using a regular expression runs `.toString` on the error object, and will + * therefore also include the error name. + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.throws( + * () => { + * throw new Error('Wrong value'); + * }, + * /^Error: Wrong value$/, + * ); + * ``` + * + * Custom error validation: + * + * The function must return `true` to indicate all internal validations passed. + * It will otherwise fail with an `AssertionError`. + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.throws( + * () => { + * throw new Error('Wrong value'); + * }, + * (err) => { + * assert(err instanceof Error); + * assert(/value/.test(err)); + * // Avoid returning anything from validation functions besides `true`. + * // Otherwise, it's not clear what part of the validation failed. Instead, + * // throw an error about the specific validation that failed (as done in this + * // example) and add as much helpful debugging information to that error as + * // possible. + * return true; + * }, + * 'unexpected error', + * ); + * ``` + * + * `error` cannot be a string. If a string is provided as the second + * argument, then `error` is assumed to be omitted and the string will be used for`message` instead. This can lead to easy-to-miss mistakes. Using the same + * message as the thrown error message is going to result in an`ERR_AMBIGUOUS_ARGUMENT` error. Please read the example below carefully if using + * a string as the second argument gets considered: + * + * ```js + * import assert from 'node:assert/strict'; + * + * function throwingFirst() { + * throw new Error('First'); + * } + * + * function throwingSecond() { + * throw new Error('Second'); + * } + * + * function notThrowing() {} + * + * // The second argument is a string and the input function threw an Error. + * // The first case will not throw as it does not match for the error message + * // thrown by the input function! + * assert.throws(throwingFirst, 'Second'); + * // In the next example the message has no benefit over the message from the + * // error and since it is not clear if the user intended to actually match + * // against the error message, Node.js throws an `ERR_AMBIGUOUS_ARGUMENT` error. + * assert.throws(throwingSecond, 'Second'); + * // TypeError [ERR_AMBIGUOUS_ARGUMENT] + * + * // The string is only used (as message) in case the function does not throw: + * assert.throws(notThrowing, 'Second'); + * // AssertionError [ERR_ASSERTION]: Missing expected exception: Second + * + * // If it was intended to match for the error message do this instead: + * // It does not throw because the error messages match. + * assert.throws(throwingSecond, /Second$/); + * + * // If the error message does not match, an AssertionError is thrown. + * assert.throws(throwingFirst, /Second$/); + * // AssertionError [ERR_ASSERTION] + * ``` + * + * Due to the confusing error-prone notation, avoid a string as the second + * argument. + * @since v0.1.21 + */ + function throws(block: () => unknown, message?: string | Error): void; + function throws(block: () => unknown, error: AssertPredicate, message?: string | Error): void; + /** + * Asserts that the function `fn` does not throw an error. + * + * Using `assert.doesNotThrow()` is actually not useful because there + * is no benefit in catching an error and then rethrowing it. Instead, consider + * adding a comment next to the specific code path that should not throw and keep + * error messages as expressive as possible. + * + * When `assert.doesNotThrow()` is called, it will immediately call the `fn`function. + * + * If an error is thrown and it is the same type as that specified by the `error`parameter, then an `AssertionError` is thrown. If the error is of a + * different type, or if the `error` parameter is undefined, the error is + * propagated back to the caller. + * + * If specified, `error` can be a [`Class`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes), + * [`RegExp`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions), or a validation + * function. See {@link throws} for more details. + * + * The following, for instance, will throw the `TypeError` because there is no + * matching error type in the assertion: + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.doesNotThrow( + * () => { + * throw new TypeError('Wrong value'); + * }, + * SyntaxError, + * ); + * ``` + * + * However, the following will result in an `AssertionError` with the message + * 'Got unwanted exception...': + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.doesNotThrow( + * () => { + * throw new TypeError('Wrong value'); + * }, + * TypeError, + * ); + * ``` + * + * If an `AssertionError` is thrown and a value is provided for the `message`parameter, the value of `message` will be appended to the `AssertionError` message: + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.doesNotThrow( + * () => { + * throw new TypeError('Wrong value'); + * }, + * /Wrong value/, + * 'Whoops', + * ); + * // Throws: AssertionError: Got unwanted exception: Whoops + * ``` + * @since v0.1.21 + */ + function doesNotThrow(block: () => unknown, message?: string | Error): void; + function doesNotThrow(block: () => unknown, error: AssertPredicate, message?: string | Error): void; + /** + * Throws `value` if `value` is not `undefined` or `null`. This is useful when + * testing the `error` argument in callbacks. The stack trace contains all frames + * from the error passed to `ifError()` including the potential new frames for`ifError()` itself. + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.ifError(null); + * // OK + * assert.ifError(0); + * // AssertionError [ERR_ASSERTION]: ifError got unwanted exception: 0 + * assert.ifError('error'); + * // AssertionError [ERR_ASSERTION]: ifError got unwanted exception: 'error' + * assert.ifError(new Error()); + * // AssertionError [ERR_ASSERTION]: ifError got unwanted exception: Error + * + * // Create some random error frames. + * let err; + * (function errorFrame() { + * err = new Error('test error'); + * })(); + * + * (function ifErrorFrame() { + * assert.ifError(err); + * })(); + * // AssertionError [ERR_ASSERTION]: ifError got unwanted exception: test error + * // at ifErrorFrame + * // at errorFrame + * ``` + * @since v0.1.97 + */ + function ifError(value: unknown): asserts value is null | undefined; + /** + * Awaits the `asyncFn` promise or, if `asyncFn` is a function, immediately + * calls the function and awaits the returned promise to complete. It will then + * check that the promise is rejected. + * + * If `asyncFn` is a function and it throws an error synchronously,`assert.rejects()` will return a rejected `Promise` with that error. If the + * function does not return a promise, `assert.rejects()` will return a rejected`Promise` with an `ERR_INVALID_RETURN_VALUE` error. In both cases the error + * handler is skipped. + * + * Besides the async nature to await the completion behaves identically to {@link throws}. + * + * If specified, `error` can be a [`Class`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes), + * [`RegExp`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions), a validation function, + * an object where each property will be tested for, or an instance of error where + * each property will be tested for including the non-enumerable `message` and`name` properties. + * + * If specified, `message` will be the message provided by the `AssertionError` if the `asyncFn` fails to reject. + * + * ```js + * import assert from 'node:assert/strict'; + * + * await assert.rejects( + * async () => { + * throw new TypeError('Wrong value'); + * }, + * { + * name: 'TypeError', + * message: 'Wrong value', + * }, + * ); + * ``` + * + * ```js + * import assert from 'node:assert/strict'; + * + * await assert.rejects( + * async () => { + * throw new TypeError('Wrong value'); + * }, + * (err) => { + * assert.strictEqual(err.name, 'TypeError'); + * assert.strictEqual(err.message, 'Wrong value'); + * return true; + * }, + * ); + * ``` + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.rejects( + * Promise.reject(new Error('Wrong value')), + * Error, + * ).then(() => { + * // ... + * }); + * ``` + * + * `error` cannot be a string. If a string is provided as the second + * argument, then `error` is assumed to be omitted and the string will be used for`message` instead. This can lead to easy-to-miss mistakes. Please read the + * example in {@link throws} carefully if using a string as the second + * argument gets considered. + * @since v10.0.0 + */ + function rejects(block: (() => Promise) | Promise, message?: string | Error): Promise; + function rejects( + block: (() => Promise) | Promise, + error: AssertPredicate, + message?: string | Error, + ): Promise; + /** + * Awaits the `asyncFn` promise or, if `asyncFn` is a function, immediately + * calls the function and awaits the returned promise to complete. It will then + * check that the promise is not rejected. + * + * If `asyncFn` is a function and it throws an error synchronously,`assert.doesNotReject()` will return a rejected `Promise` with that error. If + * the function does not return a promise, `assert.doesNotReject()` will return a + * rejected `Promise` with an `ERR_INVALID_RETURN_VALUE` error. In both cases + * the error handler is skipped. + * + * Using `assert.doesNotReject()` is actually not useful because there is little + * benefit in catching a rejection and then rejecting it again. Instead, consider + * adding a comment next to the specific code path that should not reject and keep + * error messages as expressive as possible. + * + * If specified, `error` can be a [`Class`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes), + * [`RegExp`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions), or a validation + * function. See {@link throws} for more details. + * + * Besides the async nature to await the completion behaves identically to {@link doesNotThrow}. + * + * ```js + * import assert from 'node:assert/strict'; + * + * await assert.doesNotReject( + * async () => { + * throw new TypeError('Wrong value'); + * }, + * SyntaxError, + * ); + * ``` + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.doesNotReject(Promise.reject(new TypeError('Wrong value'))) + * .then(() => { + * // ... + * }); + * ``` + * @since v10.0.0 + */ + function doesNotReject( + block: (() => Promise) | Promise, + message?: string | Error, + ): Promise; + function doesNotReject( + block: (() => Promise) | Promise, + error: AssertPredicate, + message?: string | Error, + ): Promise; + /** + * Expects the `string` input to match the regular expression. + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.match('I will fail', /pass/); + * // AssertionError [ERR_ASSERTION]: The input did not match the regular ... + * + * assert.match(123, /pass/); + * // AssertionError [ERR_ASSERTION]: The "string" argument must be of type string. + * + * assert.match('I will pass', /pass/); + * // OK + * ``` + * + * If the values do not match, or if the `string` argument is of another type than`string`, an `AssertionError` is thrown with a `message` property set equal + * to the value of the `message` parameter. If the `message` parameter is + * undefined, a default error message is assigned. If the `message` parameter is an + * instance of an `Error` then it will be thrown instead of the `AssertionError`. + * @since v13.6.0, v12.16.0 + */ + function match(value: string, regExp: RegExp, message?: string | Error): void; + /** + * Expects the `string` input not to match the regular expression. + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.doesNotMatch('I will fail', /fail/); + * // AssertionError [ERR_ASSERTION]: The input was expected to not match the ... + * + * assert.doesNotMatch(123, /pass/); + * // AssertionError [ERR_ASSERTION]: The "string" argument must be of type string. + * + * assert.doesNotMatch('I will pass', /different/); + * // OK + * ``` + * + * If the values do match, or if the `string` argument is of another type than`string`, an `AssertionError` is thrown with a `message` property set equal + * to the value of the `message` parameter. If the `message` parameter is + * undefined, a default error message is assigned. If the `message` parameter is an + * instance of an `Error` then it will be thrown instead of the `AssertionError`. + * @since v13.6.0, v12.16.0 + */ + function doesNotMatch(value: string, regExp: RegExp, message?: string | Error): void; + const strict: + & Omit< + typeof assert, + | "equal" + | "notEqual" + | "deepEqual" + | "notDeepEqual" + | "ok" + | "strictEqual" + | "deepStrictEqual" + | "ifError" + | "strict" + > + & { + (value: unknown, message?: string | Error): asserts value; + equal: typeof strictEqual; + notEqual: typeof notStrictEqual; + deepEqual: typeof deepStrictEqual; + notDeepEqual: typeof notDeepStrictEqual; + // Mapped types and assertion functions are incompatible? + // TS2775: Assertions require every name in the call target + // to be declared with an explicit type annotation. + ok: typeof ok; + strictEqual: typeof strictEqual; + deepStrictEqual: typeof deepStrictEqual; + ifError: typeof ifError; + strict: typeof strict; + }; + } + export = assert; +} +declare module "node:assert" { + import assert = require("assert"); + export = assert; +} diff --git a/task/node_modules/@types/node/assert/strict.d.ts b/task/node_modules/@types/node/assert/strict.d.ts new file mode 100644 index 0000000..f333913 --- /dev/null +++ b/task/node_modules/@types/node/assert/strict.d.ts @@ -0,0 +1,8 @@ +declare module "assert/strict" { + import { strict } from "node:assert"; + export = strict; +} +declare module "node:assert/strict" { + import { strict } from "node:assert"; + export = strict; +} diff --git a/task/node_modules/@types/node/async_hooks.d.ts b/task/node_modules/@types/node/async_hooks.d.ts new file mode 100644 index 0000000..0667a61 --- /dev/null +++ b/task/node_modules/@types/node/async_hooks.d.ts @@ -0,0 +1,539 @@ +/** + * We strongly discourage the use of the `async_hooks` API. + * Other APIs that can cover most of its use cases include: + * + * * `AsyncLocalStorage` tracks async context + * * `process.getActiveResourcesInfo()` tracks active resources + * + * The `node:async_hooks` module provides an API to track asynchronous resources. + * It can be accessed using: + * + * ```js + * import async_hooks from 'node:async_hooks'; + * ``` + * @experimental + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/async_hooks.js) + */ +declare module "async_hooks" { + /** + * ```js + * import { executionAsyncId } from 'node:async_hooks'; + * import fs from 'node:fs'; + * + * console.log(executionAsyncId()); // 1 - bootstrap + * const path = '.'; + * fs.open(path, 'r', (err, fd) => { + * console.log(executionAsyncId()); // 6 - open() + * }); + * ``` + * + * The ID returned from `executionAsyncId()` is related to execution timing, not + * causality (which is covered by `triggerAsyncId()`): + * + * ```js + * const server = net.createServer((conn) => { + * // Returns the ID of the server, not of the new connection, because the + * // callback runs in the execution scope of the server's MakeCallback(). + * async_hooks.executionAsyncId(); + * + * }).listen(port, () => { + * // Returns the ID of a TickObject (process.nextTick()) because all + * // callbacks passed to .listen() are wrapped in a nextTick(). + * async_hooks.executionAsyncId(); + * }); + * ``` + * + * Promise contexts may not get precise `executionAsyncIds` by default. + * See the section on `promise execution tracking`. + * @since v8.1.0 + * @return The `asyncId` of the current execution context. Useful to track when something calls. + */ + function executionAsyncId(): number; + /** + * Resource objects returned by `executionAsyncResource()` are most often internal + * Node.js handle objects with undocumented APIs. Using any functions or properties + * on the object is likely to crash your application and should be avoided. + * + * Using `executionAsyncResource()` in the top-level execution context will + * return an empty object as there is no handle or request object to use, + * but having an object representing the top-level can be helpful. + * + * ```js + * import { open } from 'node:fs'; + * import { executionAsyncId, executionAsyncResource } from 'node:async_hooks'; + * + * console.log(executionAsyncId(), executionAsyncResource()); // 1 {} + * open(new URL(import.meta.url), 'r', (err, fd) => { + * console.log(executionAsyncId(), executionAsyncResource()); // 7 FSReqWrap + * }); + * ``` + * + * This can be used to implement continuation local storage without the + * use of a tracking `Map` to store the metadata: + * + * ```js + * import { createServer } from 'node:http'; + * import { + * executionAsyncId, + * executionAsyncResource, + * createHook, + * } from 'async_hooks'; + * const sym = Symbol('state'); // Private symbol to avoid pollution + * + * createHook({ + * init(asyncId, type, triggerAsyncId, resource) { + * const cr = executionAsyncResource(); + * if (cr) { + * resource[sym] = cr[sym]; + * } + * }, + * }).enable(); + * + * const server = createServer((req, res) => { + * executionAsyncResource()[sym] = { state: req.url }; + * setTimeout(function() { + * res.end(JSON.stringify(executionAsyncResource()[sym])); + * }, 100); + * }).listen(3000); + * ``` + * @since v13.9.0, v12.17.0 + * @return The resource representing the current execution. Useful to store data within the resource. + */ + function executionAsyncResource(): object; + /** + * ```js + * const server = net.createServer((conn) => { + * // The resource that caused (or triggered) this callback to be called + * // was that of the new connection. Thus the return value of triggerAsyncId() + * // is the asyncId of "conn". + * async_hooks.triggerAsyncId(); + * + * }).listen(port, () => { + * // Even though all callbacks passed to .listen() are wrapped in a nextTick() + * // the callback itself exists because the call to the server's .listen() + * // was made. So the return value would be the ID of the server. + * async_hooks.triggerAsyncId(); + * }); + * ``` + * + * Promise contexts may not get valid `triggerAsyncId`s by default. See + * the section on `promise execution tracking`. + * @return The ID of the resource responsible for calling the callback that is currently being executed. + */ + function triggerAsyncId(): number; + interface HookCallbacks { + /** + * Called when a class is constructed that has the possibility to emit an asynchronous event. + * @param asyncId a unique ID for the async resource + * @param type the type of the async resource + * @param triggerAsyncId the unique ID of the async resource in whose execution context this async resource was created + * @param resource reference to the resource representing the async operation, needs to be released during destroy + */ + init?(asyncId: number, type: string, triggerAsyncId: number, resource: object): void; + /** + * When an asynchronous operation is initiated or completes a callback is called to notify the user. + * The before callback is called just before said callback is executed. + * @param asyncId the unique identifier assigned to the resource about to execute the callback. + */ + before?(asyncId: number): void; + /** + * Called immediately after the callback specified in before is completed. + * @param asyncId the unique identifier assigned to the resource which has executed the callback. + */ + after?(asyncId: number): void; + /** + * Called when a promise has resolve() called. This may not be in the same execution id + * as the promise itself. + * @param asyncId the unique id for the promise that was resolve()d. + */ + promiseResolve?(asyncId: number): void; + /** + * Called after the resource corresponding to asyncId is destroyed + * @param asyncId a unique ID for the async resource + */ + destroy?(asyncId: number): void; + } + interface AsyncHook { + /** + * Enable the callbacks for a given AsyncHook instance. If no callbacks are provided enabling is a noop. + */ + enable(): this; + /** + * Disable the callbacks for a given AsyncHook instance from the global pool of AsyncHook callbacks to be executed. Once a hook has been disabled it will not be called again until enabled. + */ + disable(): this; + } + /** + * Registers functions to be called for different lifetime events of each async + * operation. + * + * The callbacks `init()`/`before()`/`after()`/`destroy()` are called for the + * respective asynchronous event during a resource's lifetime. + * + * All callbacks are optional. For example, if only resource cleanup needs to + * be tracked, then only the `destroy` callback needs to be passed. The + * specifics of all functions that can be passed to `callbacks` is in the `Hook Callbacks` section. + * + * ```js + * import { createHook } from 'node:async_hooks'; + * + * const asyncHook = createHook({ + * init(asyncId, type, triggerAsyncId, resource) { }, + * destroy(asyncId) { }, + * }); + * ``` + * + * The callbacks will be inherited via the prototype chain: + * + * ```js + * class MyAsyncCallbacks { + * init(asyncId, type, triggerAsyncId, resource) { } + * destroy(asyncId) {} + * } + * + * class MyAddedCallbacks extends MyAsyncCallbacks { + * before(asyncId) { } + * after(asyncId) { } + * } + * + * const asyncHook = async_hooks.createHook(new MyAddedCallbacks()); + * ``` + * + * Because promises are asynchronous resources whose lifecycle is tracked + * via the async hooks mechanism, the `init()`, `before()`, `after()`, and`destroy()` callbacks _must not_ be async functions that return promises. + * @since v8.1.0 + * @param callbacks The `Hook Callbacks` to register + * @return Instance used for disabling and enabling hooks + */ + function createHook(callbacks: HookCallbacks): AsyncHook; + interface AsyncResourceOptions { + /** + * The ID of the execution context that created this async event. + * @default executionAsyncId() + */ + triggerAsyncId?: number | undefined; + /** + * Disables automatic `emitDestroy` when the object is garbage collected. + * This usually does not need to be set (even if `emitDestroy` is called + * manually), unless the resource's `asyncId` is retrieved and the + * sensitive API's `emitDestroy` is called with it. + * @default false + */ + requireManualDestroy?: boolean | undefined; + } + /** + * The class `AsyncResource` is designed to be extended by the embedder's async + * resources. Using this, users can easily trigger the lifetime events of their + * own resources. + * + * The `init` hook will trigger when an `AsyncResource` is instantiated. + * + * The following is an overview of the `AsyncResource` API. + * + * ```js + * import { AsyncResource, executionAsyncId } from 'node:async_hooks'; + * + * // AsyncResource() is meant to be extended. Instantiating a + * // new AsyncResource() also triggers init. If triggerAsyncId is omitted then + * // async_hook.executionAsyncId() is used. + * const asyncResource = new AsyncResource( + * type, { triggerAsyncId: executionAsyncId(), requireManualDestroy: false }, + * ); + * + * // Run a function in the execution context of the resource. This will + * // * establish the context of the resource + * // * trigger the AsyncHooks before callbacks + * // * call the provided function `fn` with the supplied arguments + * // * trigger the AsyncHooks after callbacks + * // * restore the original execution context + * asyncResource.runInAsyncScope(fn, thisArg, ...args); + * + * // Call AsyncHooks destroy callbacks. + * asyncResource.emitDestroy(); + * + * // Return the unique ID assigned to the AsyncResource instance. + * asyncResource.asyncId(); + * + * // Return the trigger ID for the AsyncResource instance. + * asyncResource.triggerAsyncId(); + * ``` + */ + class AsyncResource { + /** + * AsyncResource() is meant to be extended. Instantiating a + * new AsyncResource() also triggers init. If triggerAsyncId is omitted then + * async_hook.executionAsyncId() is used. + * @param type The type of async event. + * @param triggerAsyncId The ID of the execution context that created + * this async event (default: `executionAsyncId()`), or an + * AsyncResourceOptions object (since v9.3.0) + */ + constructor(type: string, triggerAsyncId?: number | AsyncResourceOptions); + /** + * Binds the given function to the current execution context. + * @since v14.8.0, v12.19.0 + * @param fn The function to bind to the current execution context. + * @param type An optional name to associate with the underlying `AsyncResource`. + */ + static bind any, ThisArg>( + fn: Func, + type?: string, + thisArg?: ThisArg, + ): Func; + /** + * Binds the given function to execute to this `AsyncResource`'s scope. + * @since v14.8.0, v12.19.0 + * @param fn The function to bind to the current `AsyncResource`. + */ + bind any>(fn: Func): Func; + /** + * Call the provided function with the provided arguments in the execution context + * of the async resource. This will establish the context, trigger the AsyncHooks + * before callbacks, call the function, trigger the AsyncHooks after callbacks, and + * then restore the original execution context. + * @since v9.6.0 + * @param fn The function to call in the execution context of this async resource. + * @param thisArg The receiver to be used for the function call. + * @param args Optional arguments to pass to the function. + */ + runInAsyncScope( + fn: (this: This, ...args: any[]) => Result, + thisArg?: This, + ...args: any[] + ): Result; + /** + * Call all `destroy` hooks. This should only ever be called once. An error will + * be thrown if it is called more than once. This **must** be manually called. If + * the resource is left to be collected by the GC then the `destroy` hooks will + * never be called. + * @return A reference to `asyncResource`. + */ + emitDestroy(): this; + /** + * @return The unique `asyncId` assigned to the resource. + */ + asyncId(): number; + /** + * @return The same `triggerAsyncId` that is passed to the `AsyncResource` constructor. + */ + triggerAsyncId(): number; + } + /** + * This class creates stores that stay coherent through asynchronous operations. + * + * While you can create your own implementation on top of the `node:async_hooks`module, `AsyncLocalStorage` should be preferred as it is a performant and memory + * safe implementation that involves significant optimizations that are non-obvious + * to implement. + * + * The following example uses `AsyncLocalStorage` to build a simple logger + * that assigns IDs to incoming HTTP requests and includes them in messages + * logged within each request. + * + * ```js + * import http from 'node:http'; + * import { AsyncLocalStorage } from 'node:async_hooks'; + * + * const asyncLocalStorage = new AsyncLocalStorage(); + * + * function logWithId(msg) { + * const id = asyncLocalStorage.getStore(); + * console.log(`${id !== undefined ? id : '-'}:`, msg); + * } + * + * let idSeq = 0; + * http.createServer((req, res) => { + * asyncLocalStorage.run(idSeq++, () => { + * logWithId('start'); + * // Imagine any chain of async operations here + * setImmediate(() => { + * logWithId('finish'); + * res.end(); + * }); + * }); + * }).listen(8080); + * + * http.get('http://localhost:8080'); + * http.get('http://localhost:8080'); + * // Prints: + * // 0: start + * // 1: start + * // 0: finish + * // 1: finish + * ``` + * + * Each instance of `AsyncLocalStorage` maintains an independent storage context. + * Multiple instances can safely exist simultaneously without risk of interfering + * with each other's data. + * @since v13.10.0, v12.17.0 + */ + class AsyncLocalStorage { + /** + * Binds the given function to the current execution context. + * @since v19.8.0 + * @experimental + * @param fn The function to bind to the current execution context. + * @return A new function that calls `fn` within the captured execution context. + */ + static bind any>(fn: Func): Func; + /** + * Captures the current execution context and returns a function that accepts a + * function as an argument. Whenever the returned function is called, it + * calls the function passed to it within the captured context. + * + * ```js + * const asyncLocalStorage = new AsyncLocalStorage(); + * const runInAsyncScope = asyncLocalStorage.run(123, () => AsyncLocalStorage.snapshot()); + * const result = asyncLocalStorage.run(321, () => runInAsyncScope(() => asyncLocalStorage.getStore())); + * console.log(result); // returns 123 + * ``` + * + * AsyncLocalStorage.snapshot() can replace the use of AsyncResource for simple + * async context tracking purposes, for example: + * + * ```js + * class Foo { + * #runInAsyncScope = AsyncLocalStorage.snapshot(); + * + * get() { return this.#runInAsyncScope(() => asyncLocalStorage.getStore()); } + * } + * + * const foo = asyncLocalStorage.run(123, () => new Foo()); + * console.log(asyncLocalStorage.run(321, () => foo.get())); // returns 123 + * ``` + * @since v19.8.0 + * @experimental + * @return A new function with the signature `(fn: (...args) : R, ...args) : R`. + */ + static snapshot(): (fn: (...args: TArgs) => R, ...args: TArgs) => R; + /** + * Disables the instance of `AsyncLocalStorage`. All subsequent calls + * to `asyncLocalStorage.getStore()` will return `undefined` until`asyncLocalStorage.run()` or `asyncLocalStorage.enterWith()` is called again. + * + * When calling `asyncLocalStorage.disable()`, all current contexts linked to the + * instance will be exited. + * + * Calling `asyncLocalStorage.disable()` is required before the`asyncLocalStorage` can be garbage collected. This does not apply to stores + * provided by the `asyncLocalStorage`, as those objects are garbage collected + * along with the corresponding async resources. + * + * Use this method when the `asyncLocalStorage` is not in use anymore + * in the current process. + * @since v13.10.0, v12.17.0 + * @experimental + */ + disable(): void; + /** + * Returns the current store. + * If called outside of an asynchronous context initialized by + * calling `asyncLocalStorage.run()` or `asyncLocalStorage.enterWith()`, it + * returns `undefined`. + * @since v13.10.0, v12.17.0 + */ + getStore(): T | undefined; + /** + * Runs a function synchronously within a context and returns its + * return value. The store is not accessible outside of the callback function. + * The store is accessible to any asynchronous operations created within the + * callback. + * + * The optional `args` are passed to the callback function. + * + * If the callback function throws an error, the error is thrown by `run()` too. + * The stacktrace is not impacted by this call and the context is exited. + * + * Example: + * + * ```js + * const store = { id: 2 }; + * try { + * asyncLocalStorage.run(store, () => { + * asyncLocalStorage.getStore(); // Returns the store object + * setTimeout(() => { + * asyncLocalStorage.getStore(); // Returns the store object + * }, 200); + * throw new Error(); + * }); + * } catch (e) { + * asyncLocalStorage.getStore(); // Returns undefined + * // The error will be caught here + * } + * ``` + * @since v13.10.0, v12.17.0 + */ + run(store: T, callback: () => R): R; + run(store: T, callback: (...args: TArgs) => R, ...args: TArgs): R; + /** + * Runs a function synchronously outside of a context and returns its + * return value. The store is not accessible within the callback function or + * the asynchronous operations created within the callback. Any `getStore()`call done within the callback function will always return `undefined`. + * + * The optional `args` are passed to the callback function. + * + * If the callback function throws an error, the error is thrown by `exit()` too. + * The stacktrace is not impacted by this call and the context is re-entered. + * + * Example: + * + * ```js + * // Within a call to run + * try { + * asyncLocalStorage.getStore(); // Returns the store object or value + * asyncLocalStorage.exit(() => { + * asyncLocalStorage.getStore(); // Returns undefined + * throw new Error(); + * }); + * } catch (e) { + * asyncLocalStorage.getStore(); // Returns the same object or value + * // The error will be caught here + * } + * ``` + * @since v13.10.0, v12.17.0 + * @experimental + */ + exit(callback: (...args: TArgs) => R, ...args: TArgs): R; + /** + * Transitions into the context for the remainder of the current + * synchronous execution and then persists the store through any following + * asynchronous calls. + * + * Example: + * + * ```js + * const store = { id: 1 }; + * // Replaces previous store with the given store object + * asyncLocalStorage.enterWith(store); + * asyncLocalStorage.getStore(); // Returns the store object + * someAsyncOperation(() => { + * asyncLocalStorage.getStore(); // Returns the same object + * }); + * ``` + * + * This transition will continue for the _entire_ synchronous execution. + * This means that if, for example, the context is entered within an event + * handler subsequent event handlers will also run within that context unless + * specifically bound to another context with an `AsyncResource`. That is why`run()` should be preferred over `enterWith()` unless there are strong reasons + * to use the latter method. + * + * ```js + * const store = { id: 1 }; + * + * emitter.on('my-event', () => { + * asyncLocalStorage.enterWith(store); + * }); + * emitter.on('my-event', () => { + * asyncLocalStorage.getStore(); // Returns the same object + * }); + * + * asyncLocalStorage.getStore(); // Returns undefined + * emitter.emit('my-event'); + * asyncLocalStorage.getStore(); // Returns the same object + * ``` + * @since v13.11.0, v12.17.0 + * @experimental + */ + enterWith(store: T): void; + } +} +declare module "node:async_hooks" { + export * from "async_hooks"; +} diff --git a/task/node_modules/@types/node/buffer.d.ts b/task/node_modules/@types/node/buffer.d.ts new file mode 100644 index 0000000..1ee5c01 --- /dev/null +++ b/task/node_modules/@types/node/buffer.d.ts @@ -0,0 +1,2362 @@ +/** + * `Buffer` objects are used to represent a fixed-length sequence of bytes. Many + * Node.js APIs support `Buffer`s. + * + * The `Buffer` class is a subclass of JavaScript's [`Uint8Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array) class and + * extends it with methods that cover additional use cases. Node.js APIs accept + * plain [`Uint8Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array) s wherever `Buffer`s are supported as well. + * + * While the `Buffer` class is available within the global scope, it is still + * recommended to explicitly reference it via an import or require statement. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * // Creates a zero-filled Buffer of length 10. + * const buf1 = Buffer.alloc(10); + * + * // Creates a Buffer of length 10, + * // filled with bytes which all have the value `1`. + * const buf2 = Buffer.alloc(10, 1); + * + * // Creates an uninitialized buffer of length 10. + * // This is faster than calling Buffer.alloc() but the returned + * // Buffer instance might contain old data that needs to be + * // overwritten using fill(), write(), or other functions that fill the Buffer's + * // contents. + * const buf3 = Buffer.allocUnsafe(10); + * + * // Creates a Buffer containing the bytes [1, 2, 3]. + * const buf4 = Buffer.from([1, 2, 3]); + * + * // Creates a Buffer containing the bytes [1, 1, 1, 1] – the entries + * // are all truncated using `(value & 255)` to fit into the range 0–255. + * const buf5 = Buffer.from([257, 257.5, -255, '1']); + * + * // Creates a Buffer containing the UTF-8-encoded bytes for the string 'tést': + * // [0x74, 0xc3, 0xa9, 0x73, 0x74] (in hexadecimal notation) + * // [116, 195, 169, 115, 116] (in decimal notation) + * const buf6 = Buffer.from('tést'); + * + * // Creates a Buffer containing the Latin-1 bytes [0x74, 0xe9, 0x73, 0x74]. + * const buf7 = Buffer.from('tést', 'latin1'); + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/buffer.js) + */ +declare module "buffer" { + import { BinaryLike } from "node:crypto"; + import { ReadableStream as WebReadableStream } from "node:stream/web"; + /** + * This function returns `true` if `input` contains only valid UTF-8-encoded data, + * including the case in which `input` is empty. + * + * Throws if the `input` is a detached array buffer. + * @since v19.4.0, v18.14.0 + * @param input The input to validate. + */ + export function isUtf8(input: Buffer | ArrayBuffer | NodeJS.TypedArray): boolean; + /** + * This function returns `true` if `input` contains only valid ASCII-encoded data, + * including the case in which `input` is empty. + * + * Throws if the `input` is a detached array buffer. + * @since v19.6.0, v18.15.0 + * @param input The input to validate. + */ + export function isAscii(input: Buffer | ArrayBuffer | NodeJS.TypedArray): boolean; + export const INSPECT_MAX_BYTES: number; + export const kMaxLength: number; + export const kStringMaxLength: number; + export const constants: { + MAX_LENGTH: number; + MAX_STRING_LENGTH: number; + }; + export type TranscodeEncoding = + | "ascii" + | "utf8" + | "utf-8" + | "utf16le" + | "utf-16le" + | "ucs2" + | "ucs-2" + | "latin1" + | "binary"; + /** + * Re-encodes the given `Buffer` or `Uint8Array` instance from one character + * encoding to another. Returns a new `Buffer` instance. + * + * Throws if the `fromEnc` or `toEnc` specify invalid character encodings or if + * conversion from `fromEnc` to `toEnc` is not permitted. + * + * Encodings supported by `buffer.transcode()` are: `'ascii'`, `'utf8'`,`'utf16le'`, `'ucs2'`, `'latin1'`, and `'binary'`. + * + * The transcoding process will use substitution characters if a given byte + * sequence cannot be adequately represented in the target encoding. For instance: + * + * ```js + * import { Buffer, transcode } from 'node:buffer'; + * + * const newBuf = transcode(Buffer.from('€'), 'utf8', 'ascii'); + * console.log(newBuf.toString('ascii')); + * // Prints: '?' + * ``` + * + * Because the Euro (`€`) sign is not representable in US-ASCII, it is replaced + * with `?` in the transcoded `Buffer`. + * @since v7.1.0 + * @param source A `Buffer` or `Uint8Array` instance. + * @param fromEnc The current encoding. + * @param toEnc To target encoding. + */ + export function transcode(source: Uint8Array, fromEnc: TranscodeEncoding, toEnc: TranscodeEncoding): Buffer; + export const SlowBuffer: { + /** @deprecated since v6.0.0, use `Buffer.allocUnsafeSlow()` */ + new(size: number): Buffer; + prototype: Buffer; + }; + /** + * Resolves a `'blob:nodedata:...'` an associated `Blob` object registered using + * a prior call to `URL.createObjectURL()`. + * @since v16.7.0 + * @experimental + * @param id A `'blob:nodedata:...` URL string returned by a prior call to `URL.createObjectURL()`. + */ + export function resolveObjectURL(id: string): Blob | undefined; + export { Buffer }; + /** + * @experimental + */ + export interface BlobOptions { + /** + * @default 'utf8' + */ + encoding?: BufferEncoding | undefined; + /** + * The Blob content-type. The intent is for `type` to convey + * the MIME media type of the data, however no validation of the type format + * is performed. + */ + type?: string | undefined; + } + /** + * A [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob) encapsulates immutable, raw data that can be safely shared across + * multiple worker threads. + * @since v15.7.0, v14.18.0 + */ + export class Blob { + /** + * The total size of the `Blob` in bytes. + * @since v15.7.0, v14.18.0 + */ + readonly size: number; + /** + * The content-type of the `Blob`. + * @since v15.7.0, v14.18.0 + */ + readonly type: string; + /** + * Creates a new `Blob` object containing a concatenation of the given sources. + * + * {ArrayBuffer}, {TypedArray}, {DataView}, and {Buffer} sources are copied into + * the 'Blob' and can therefore be safely modified after the 'Blob' is created. + * + * String sources are also copied into the `Blob`. + */ + constructor(sources: Array, options?: BlobOptions); + /** + * Returns a promise that fulfills with an [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer) containing a copy of + * the `Blob` data. + * @since v15.7.0, v14.18.0 + */ + arrayBuffer(): Promise; + /** + * Creates and returns a new `Blob` containing a subset of this `Blob` objects + * data. The original `Blob` is not altered. + * @since v15.7.0, v14.18.0 + * @param start The starting index. + * @param end The ending index. + * @param type The content-type for the new `Blob` + */ + slice(start?: number, end?: number, type?: string): Blob; + /** + * Returns a promise that fulfills with the contents of the `Blob` decoded as a + * UTF-8 string. + * @since v15.7.0, v14.18.0 + */ + text(): Promise; + /** + * Returns a new `ReadableStream` that allows the content of the `Blob` to be read. + * @since v16.7.0 + */ + stream(): WebReadableStream; + } + export interface FileOptions { + /** + * One of either `'transparent'` or `'native'`. When set to `'native'`, line endings in string source parts will be + * converted to the platform native line-ending as specified by `require('node:os').EOL`. + */ + endings?: "native" | "transparent"; + /** The File content-type. */ + type?: string; + /** The last modified date of the file. `Default`: Date.now(). */ + lastModified?: number; + } + /** + * A [`File`](https://developer.mozilla.org/en-US/docs/Web/API/File) provides information about files. + * @since v19.2.0, v18.13.0 + */ + export class File extends Blob { + constructor(sources: Array, fileName: string, options?: FileOptions); + /** + * The name of the `File`. + * @since v19.2.0, v18.13.0 + */ + readonly name: string; + /** + * The last modified date of the `File`. + * @since v19.2.0, v18.13.0 + */ + readonly lastModified: number; + } + export import atob = globalThis.atob; + export import btoa = globalThis.btoa; + import { Blob as NodeBlob } from "buffer"; + // This conditional type will be the existing global Blob in a browser, or + // the copy below in a Node environment. + type __Blob = typeof globalThis extends { onmessage: any; Blob: any } ? {} : NodeBlob; + global { + namespace NodeJS { + export { BufferEncoding }; + } + // Buffer class + type BufferEncoding = + | "ascii" + | "utf8" + | "utf-8" + | "utf16le" + | "utf-16le" + | "ucs2" + | "ucs-2" + | "base64" + | "base64url" + | "latin1" + | "binary" + | "hex"; + type WithImplicitCoercion = + | T + | { + valueOf(): T; + }; + /** + * Raw data is stored in instances of the Buffer class. + * A Buffer is similar to an array of integers but corresponds to a raw memory allocation outside the V8 heap. A Buffer cannot be resized. + * Valid string encodings: 'ascii'|'utf8'|'utf16le'|'ucs2'(alias of 'utf16le')|'base64'|'base64url'|'binary'(deprecated)|'hex' + */ + interface BufferConstructor { + /** + * Allocates a new buffer containing the given {str}. + * + * @param str String to store in buffer. + * @param encoding encoding to use, optional. Default is 'utf8' + * @deprecated since v10.0.0 - Use `Buffer.from(string[, encoding])` instead. + */ + new(str: string, encoding?: BufferEncoding): Buffer; + /** + * Allocates a new buffer of {size} octets. + * + * @param size count of octets to allocate. + * @deprecated since v10.0.0 - Use `Buffer.alloc()` instead (also see `Buffer.allocUnsafe()`). + */ + new(size: number): Buffer; + /** + * Allocates a new buffer containing the given {array} of octets. + * + * @param array The octets to store. + * @deprecated since v10.0.0 - Use `Buffer.from(array)` instead. + */ + new(array: Uint8Array): Buffer; + /** + * Produces a Buffer backed by the same allocated memory as + * the given {ArrayBuffer}/{SharedArrayBuffer}. + * + * @param arrayBuffer The ArrayBuffer with which to share memory. + * @deprecated since v10.0.0 - Use `Buffer.from(arrayBuffer[, byteOffset[, length]])` instead. + */ + new(arrayBuffer: ArrayBuffer | SharedArrayBuffer): Buffer; + /** + * Allocates a new buffer containing the given {array} of octets. + * + * @param array The octets to store. + * @deprecated since v10.0.0 - Use `Buffer.from(array)` instead. + */ + new(array: readonly any[]): Buffer; + /** + * Copies the passed {buffer} data onto a new {Buffer} instance. + * + * @param buffer The buffer to copy. + * @deprecated since v10.0.0 - Use `Buffer.from(buffer)` instead. + */ + new(buffer: Buffer): Buffer; + /** + * Allocates a new `Buffer` using an `array` of bytes in the range `0` – `255`. + * Array entries outside that range will be truncated to fit into it. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * // Creates a new Buffer containing the UTF-8 bytes of the string 'buffer'. + * const buf = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]); + * ``` + * + * If `array` is an `Array`\-like object (that is, one with a `length` property of + * type `number`), it is treated as if it is an array, unless it is a `Buffer` or + * a `Uint8Array`. This means all other `TypedArray` variants get treated as an`Array`. To create a `Buffer` from the bytes backing a `TypedArray`, use `Buffer.copyBytesFrom()`. + * + * A `TypeError` will be thrown if `array` is not an `Array` or another type + * appropriate for `Buffer.from()` variants. + * + * `Buffer.from(array)` and `Buffer.from(string)` may also use the internal`Buffer` pool like `Buffer.allocUnsafe()` does. + * @since v5.10.0 + */ + from( + arrayBuffer: WithImplicitCoercion, + byteOffset?: number, + length?: number, + ): Buffer; + /** + * Creates a new Buffer using the passed {data} + * @param data data to create a new Buffer + */ + from(data: Uint8Array | readonly number[]): Buffer; + from(data: WithImplicitCoercion): Buffer; + /** + * Creates a new Buffer containing the given JavaScript string {str}. + * If provided, the {encoding} parameter identifies the character encoding. + * If not provided, {encoding} defaults to 'utf8'. + */ + from( + str: + | WithImplicitCoercion + | { + [Symbol.toPrimitive](hint: "string"): string; + }, + encoding?: BufferEncoding, + ): Buffer; + /** + * Creates a new Buffer using the passed {data} + * @param values to create a new Buffer + */ + of(...items: number[]): Buffer; + /** + * Returns `true` if `obj` is a `Buffer`, `false` otherwise. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * Buffer.isBuffer(Buffer.alloc(10)); // true + * Buffer.isBuffer(Buffer.from('foo')); // true + * Buffer.isBuffer('a string'); // false + * Buffer.isBuffer([]); // false + * Buffer.isBuffer(new Uint8Array(1024)); // false + * ``` + * @since v0.1.101 + */ + isBuffer(obj: any): obj is Buffer; + /** + * Returns `true` if `encoding` is the name of a supported character encoding, + * or `false` otherwise. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * console.log(Buffer.isEncoding('utf8')); + * // Prints: true + * + * console.log(Buffer.isEncoding('hex')); + * // Prints: true + * + * console.log(Buffer.isEncoding('utf/8')); + * // Prints: false + * + * console.log(Buffer.isEncoding('')); + * // Prints: false + * ``` + * @since v0.9.1 + * @param encoding A character encoding name to check. + */ + isEncoding(encoding: string): encoding is BufferEncoding; + /** + * Returns the byte length of a string when encoded using `encoding`. + * This is not the same as [`String.prototype.length`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/length), which does not account + * for the encoding that is used to convert the string into bytes. + * + * For `'base64'`, `'base64url'`, and `'hex'`, this function assumes valid input. + * For strings that contain non-base64/hex-encoded data (e.g. whitespace), the + * return value might be greater than the length of a `Buffer` created from the + * string. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const str = '\u00bd + \u00bc = \u00be'; + * + * console.log(`${str}: ${str.length} characters, ` + + * `${Buffer.byteLength(str, 'utf8')} bytes`); + * // Prints: ½ + ¼ = ¾: 9 characters, 12 bytes + * ``` + * + * When `string` is a + * `Buffer`/[`DataView`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView)/[`TypedArray`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/- + * Reference/Global_Objects/TypedArray)/[`ArrayBuffer`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer)/[`SharedArrayBuffer`](https://develop- + * er.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer), the byte length as reported by `.byteLength`is returned. + * @since v0.1.90 + * @param string A value to calculate the length of. + * @param [encoding='utf8'] If `string` is a string, this is its encoding. + * @return The number of bytes contained within `string`. + */ + byteLength( + string: string | NodeJS.ArrayBufferView | ArrayBuffer | SharedArrayBuffer, + encoding?: BufferEncoding, + ): number; + /** + * Returns a new `Buffer` which is the result of concatenating all the `Buffer`instances in the `list` together. + * + * If the list has no items, or if the `totalLength` is 0, then a new zero-length`Buffer` is returned. + * + * If `totalLength` is not provided, it is calculated from the `Buffer` instances + * in `list` by adding their lengths. + * + * If `totalLength` is provided, it is coerced to an unsigned integer. If the + * combined length of the `Buffer`s in `list` exceeds `totalLength`, the result is + * truncated to `totalLength`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * // Create a single `Buffer` from a list of three `Buffer` instances. + * + * const buf1 = Buffer.alloc(10); + * const buf2 = Buffer.alloc(14); + * const buf3 = Buffer.alloc(18); + * const totalLength = buf1.length + buf2.length + buf3.length; + * + * console.log(totalLength); + * // Prints: 42 + * + * const bufA = Buffer.concat([buf1, buf2, buf3], totalLength); + * + * console.log(bufA); + * // Prints: + * console.log(bufA.length); + * // Prints: 42 + * ``` + * + * `Buffer.concat()` may also use the internal `Buffer` pool like `Buffer.allocUnsafe()` does. + * @since v0.7.11 + * @param list List of `Buffer` or {@link Uint8Array} instances to concatenate. + * @param totalLength Total length of the `Buffer` instances in `list` when concatenated. + */ + concat(list: readonly Uint8Array[], totalLength?: number): Buffer; + /** + * Copies the underlying memory of `view` into a new `Buffer`. + * + * ```js + * const u16 = new Uint16Array([0, 0xffff]); + * const buf = Buffer.copyBytesFrom(u16, 1, 1); + * u16[1] = 0; + * console.log(buf.length); // 2 + * console.log(buf[0]); // 255 + * console.log(buf[1]); // 255 + * ``` + * @since v19.8.0 + * @param view The {TypedArray} to copy. + * @param [offset=': 0'] The starting offset within `view`. + * @param [length=view.length - offset] The number of elements from `view` to copy. + */ + copyBytesFrom(view: NodeJS.TypedArray, offset?: number, length?: number): Buffer; + /** + * Compares `buf1` to `buf2`, typically for the purpose of sorting arrays of`Buffer` instances. This is equivalent to calling `buf1.compare(buf2)`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf1 = Buffer.from('1234'); + * const buf2 = Buffer.from('0123'); + * const arr = [buf1, buf2]; + * + * console.log(arr.sort(Buffer.compare)); + * // Prints: [ , ] + * // (This result is equal to: [buf2, buf1].) + * ``` + * @since v0.11.13 + * @return Either `-1`, `0`, or `1`, depending on the result of the comparison. See `compare` for details. + */ + compare(buf1: Uint8Array, buf2: Uint8Array): -1 | 0 | 1; + /** + * Allocates a new `Buffer` of `size` bytes. If `fill` is `undefined`, the`Buffer` will be zero-filled. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.alloc(5); + * + * console.log(buf); + * // Prints: + * ``` + * + * If `size` is larger than {@link constants.MAX_LENGTH} or smaller than 0, `ERR_OUT_OF_RANGE` is thrown. + * + * If `fill` is specified, the allocated `Buffer` will be initialized by calling `buf.fill(fill)`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.alloc(5, 'a'); + * + * console.log(buf); + * // Prints: + * ``` + * + * If both `fill` and `encoding` are specified, the allocated `Buffer` will be + * initialized by calling `buf.fill(fill, encoding)`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64'); + * + * console.log(buf); + * // Prints: + * ``` + * + * Calling `Buffer.alloc()` can be measurably slower than the alternative `Buffer.allocUnsafe()` but ensures that the newly created `Buffer` instance + * contents will never contain sensitive data from previous allocations, including + * data that might not have been allocated for `Buffer`s. + * + * A `TypeError` will be thrown if `size` is not a number. + * @since v5.10.0 + * @param size The desired length of the new `Buffer`. + * @param [fill=0] A value to pre-fill the new `Buffer` with. + * @param [encoding='utf8'] If `fill` is a string, this is its encoding. + */ + alloc(size: number, fill?: string | Uint8Array | number, encoding?: BufferEncoding): Buffer; + /** + * Allocates a new `Buffer` of `size` bytes. If `size` is larger than {@link constants.MAX_LENGTH} or smaller than 0, `ERR_OUT_OF_RANGE` is thrown. + * + * The underlying memory for `Buffer` instances created in this way is _not_ + * _initialized_. The contents of the newly created `Buffer` are unknown and _may contain sensitive data_. Use `Buffer.alloc()` instead to initialize`Buffer` instances with zeroes. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(10); + * + * console.log(buf); + * // Prints (contents may vary): + * + * buf.fill(0); + * + * console.log(buf); + * // Prints: + * ``` + * + * A `TypeError` will be thrown if `size` is not a number. + * + * The `Buffer` module pre-allocates an internal `Buffer` instance of + * size `Buffer.poolSize` that is used as a pool for the fast allocation of new`Buffer` instances created using `Buffer.allocUnsafe()`, `Buffer.from(array)`, + * and `Buffer.concat()` only when `size` is less than or equal to`Buffer.poolSize >> 1` (floor of `Buffer.poolSize` divided by two). + * + * Use of this pre-allocated internal memory pool is a key difference between + * calling `Buffer.alloc(size, fill)` vs. `Buffer.allocUnsafe(size).fill(fill)`. + * Specifically, `Buffer.alloc(size, fill)` will _never_ use the internal `Buffer`pool, while `Buffer.allocUnsafe(size).fill(fill)`_will_ use the internal`Buffer` pool if `size` is less + * than or equal to half `Buffer.poolSize`. The + * difference is subtle but can be important when an application requires the + * additional performance that `Buffer.allocUnsafe()` provides. + * @since v5.10.0 + * @param size The desired length of the new `Buffer`. + */ + allocUnsafe(size: number): Buffer; + /** + * Allocates a new `Buffer` of `size` bytes. If `size` is larger than {@link constants.MAX_LENGTH} or smaller than 0, `ERR_OUT_OF_RANGE` is thrown. A zero-length `Buffer` is created if + * `size` is 0. + * + * The underlying memory for `Buffer` instances created in this way is _not_ + * _initialized_. The contents of the newly created `Buffer` are unknown and _may contain sensitive data_. Use `buf.fill(0)` to initialize + * such `Buffer` instances with zeroes. + * + * When using `Buffer.allocUnsafe()` to allocate new `Buffer` instances, + * allocations under 4 KiB are sliced from a single pre-allocated `Buffer`. This + * allows applications to avoid the garbage collection overhead of creating many + * individually allocated `Buffer` instances. This approach improves both + * performance and memory usage by eliminating the need to track and clean up as + * many individual `ArrayBuffer` objects. + * + * However, in the case where a developer may need to retain a small chunk of + * memory from a pool for an indeterminate amount of time, it may be appropriate + * to create an un-pooled `Buffer` instance using `Buffer.allocUnsafeSlow()` and + * then copying out the relevant bits. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * // Need to keep around a few small chunks of memory. + * const store = []; + * + * socket.on('readable', () => { + * let data; + * while (null !== (data = readable.read())) { + * // Allocate for retained data. + * const sb = Buffer.allocUnsafeSlow(10); + * + * // Copy the data into the new allocation. + * data.copy(sb, 0, 0, 10); + * + * store.push(sb); + * } + * }); + * ``` + * + * A `TypeError` will be thrown if `size` is not a number. + * @since v5.12.0 + * @param size The desired length of the new `Buffer`. + */ + allocUnsafeSlow(size: number): Buffer; + /** + * This is the size (in bytes) of pre-allocated internal `Buffer` instances used + * for pooling. This value may be modified. + * @since v0.11.3 + */ + poolSize: number; + } + interface Buffer extends Uint8Array { + /** + * Writes `string` to `buf` at `offset` according to the character encoding in`encoding`. The `length` parameter is the number of bytes to write. If `buf` did + * not contain enough space to fit the entire string, only part of `string` will be + * written. However, partially encoded characters will not be written. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.alloc(256); + * + * const len = buf.write('\u00bd + \u00bc = \u00be', 0); + * + * console.log(`${len} bytes: ${buf.toString('utf8', 0, len)}`); + * // Prints: 12 bytes: ½ + ¼ = ¾ + * + * const buffer = Buffer.alloc(10); + * + * const length = buffer.write('abcd', 8); + * + * console.log(`${length} bytes: ${buffer.toString('utf8', 8, 10)}`); + * // Prints: 2 bytes : ab + * ``` + * @since v0.1.90 + * @param string String to write to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write `string`. + * @param [length=buf.length - offset] Maximum number of bytes to write (written bytes will not exceed `buf.length - offset`). + * @param [encoding='utf8'] The character encoding of `string`. + * @return Number of bytes written. + */ + write(string: string, encoding?: BufferEncoding): number; + write(string: string, offset: number, encoding?: BufferEncoding): number; + write(string: string, offset: number, length: number, encoding?: BufferEncoding): number; + /** + * Decodes `buf` to a string according to the specified character encoding in`encoding`. `start` and `end` may be passed to decode only a subset of `buf`. + * + * If `encoding` is `'utf8'` and a byte sequence in the input is not valid UTF-8, + * then each invalid byte is replaced with the replacement character `U+FFFD`. + * + * The maximum length of a string instance (in UTF-16 code units) is available + * as {@link constants.MAX_STRING_LENGTH}. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf1 = Buffer.allocUnsafe(26); + * + * for (let i = 0; i < 26; i++) { + * // 97 is the decimal ASCII value for 'a'. + * buf1[i] = i + 97; + * } + * + * console.log(buf1.toString('utf8')); + * // Prints: abcdefghijklmnopqrstuvwxyz + * console.log(buf1.toString('utf8', 0, 5)); + * // Prints: abcde + * + * const buf2 = Buffer.from('tést'); + * + * console.log(buf2.toString('hex')); + * // Prints: 74c3a97374 + * console.log(buf2.toString('utf8', 0, 3)); + * // Prints: té + * console.log(buf2.toString(undefined, 0, 3)); + * // Prints: té + * ``` + * @since v0.1.90 + * @param [encoding='utf8'] The character encoding to use. + * @param [start=0] The byte offset to start decoding at. + * @param [end=buf.length] The byte offset to stop decoding at (not inclusive). + */ + toString(encoding?: BufferEncoding, start?: number, end?: number): string; + /** + * Returns a JSON representation of `buf`. [`JSON.stringify()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) implicitly calls + * this function when stringifying a `Buffer` instance. + * + * `Buffer.from()` accepts objects in the format returned from this method. + * In particular, `Buffer.from(buf.toJSON())` works like `Buffer.from(buf)`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]); + * const json = JSON.stringify(buf); + * + * console.log(json); + * // Prints: {"type":"Buffer","data":[1,2,3,4,5]} + * + * const copy = JSON.parse(json, (key, value) => { + * return value && value.type === 'Buffer' ? + * Buffer.from(value) : + * value; + * }); + * + * console.log(copy); + * // Prints: + * ``` + * @since v0.9.2 + */ + toJSON(): { + type: "Buffer"; + data: number[]; + }; + /** + * Returns `true` if both `buf` and `otherBuffer` have exactly the same bytes,`false` otherwise. Equivalent to `buf.compare(otherBuffer) === 0`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf1 = Buffer.from('ABC'); + * const buf2 = Buffer.from('414243', 'hex'); + * const buf3 = Buffer.from('ABCD'); + * + * console.log(buf1.equals(buf2)); + * // Prints: true + * console.log(buf1.equals(buf3)); + * // Prints: false + * ``` + * @since v0.11.13 + * @param otherBuffer A `Buffer` or {@link Uint8Array} with which to compare `buf`. + */ + equals(otherBuffer: Uint8Array): boolean; + /** + * Compares `buf` with `target` and returns a number indicating whether `buf`comes before, after, or is the same as `target` in sort order. + * Comparison is based on the actual sequence of bytes in each `Buffer`. + * + * * `0` is returned if `target` is the same as `buf` + * * `1` is returned if `target` should come _before_`buf` when sorted. + * * `-1` is returned if `target` should come _after_`buf` when sorted. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf1 = Buffer.from('ABC'); + * const buf2 = Buffer.from('BCD'); + * const buf3 = Buffer.from('ABCD'); + * + * console.log(buf1.compare(buf1)); + * // Prints: 0 + * console.log(buf1.compare(buf2)); + * // Prints: -1 + * console.log(buf1.compare(buf3)); + * // Prints: -1 + * console.log(buf2.compare(buf1)); + * // Prints: 1 + * console.log(buf2.compare(buf3)); + * // Prints: 1 + * console.log([buf1, buf2, buf3].sort(Buffer.compare)); + * // Prints: [ , , ] + * // (This result is equal to: [buf1, buf3, buf2].) + * ``` + * + * The optional `targetStart`, `targetEnd`, `sourceStart`, and `sourceEnd`arguments can be used to limit the comparison to specific ranges within `target`and `buf` respectively. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf1 = Buffer.from([1, 2, 3, 4, 5, 6, 7, 8, 9]); + * const buf2 = Buffer.from([5, 6, 7, 8, 9, 1, 2, 3, 4]); + * + * console.log(buf1.compare(buf2, 5, 9, 0, 4)); + * // Prints: 0 + * console.log(buf1.compare(buf2, 0, 6, 4)); + * // Prints: -1 + * console.log(buf1.compare(buf2, 5, 6, 5)); + * // Prints: 1 + * ``` + * + * `ERR_OUT_OF_RANGE` is thrown if `targetStart < 0`, `sourceStart < 0`,`targetEnd > target.byteLength`, or `sourceEnd > source.byteLength`. + * @since v0.11.13 + * @param target A `Buffer` or {@link Uint8Array} with which to compare `buf`. + * @param [targetStart=0] The offset within `target` at which to begin comparison. + * @param [targetEnd=target.length] The offset within `target` at which to end comparison (not inclusive). + * @param [sourceStart=0] The offset within `buf` at which to begin comparison. + * @param [sourceEnd=buf.length] The offset within `buf` at which to end comparison (not inclusive). + */ + compare( + target: Uint8Array, + targetStart?: number, + targetEnd?: number, + sourceStart?: number, + sourceEnd?: number, + ): -1 | 0 | 1; + /** + * Copies data from a region of `buf` to a region in `target`, even if the `target`memory region overlaps with `buf`. + * + * [`TypedArray.prototype.set()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/set) performs the same operation, and is available + * for all TypedArrays, including Node.js `Buffer`s, although it takes + * different function arguments. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * // Create two `Buffer` instances. + * const buf1 = Buffer.allocUnsafe(26); + * const buf2 = Buffer.allocUnsafe(26).fill('!'); + * + * for (let i = 0; i < 26; i++) { + * // 97 is the decimal ASCII value for 'a'. + * buf1[i] = i + 97; + * } + * + * // Copy `buf1` bytes 16 through 19 into `buf2` starting at byte 8 of `buf2`. + * buf1.copy(buf2, 8, 16, 20); + * // This is equivalent to: + * // buf2.set(buf1.subarray(16, 20), 8); + * + * console.log(buf2.toString('ascii', 0, 25)); + * // Prints: !!!!!!!!qrst!!!!!!!!!!!!! + * ``` + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * // Create a `Buffer` and copy data from one region to an overlapping region + * // within the same `Buffer`. + * + * const buf = Buffer.allocUnsafe(26); + * + * for (let i = 0; i < 26; i++) { + * // 97 is the decimal ASCII value for 'a'. + * buf[i] = i + 97; + * } + * + * buf.copy(buf, 0, 4, 10); + * + * console.log(buf.toString()); + * // Prints: efghijghijklmnopqrstuvwxyz + * ``` + * @since v0.1.90 + * @param target A `Buffer` or {@link Uint8Array} to copy into. + * @param [targetStart=0] The offset within `target` at which to begin writing. + * @param [sourceStart=0] The offset within `buf` from which to begin copying. + * @param [sourceEnd=buf.length] The offset within `buf` at which to stop copying (not inclusive). + * @return The number of bytes copied. + */ + copy(target: Uint8Array, targetStart?: number, sourceStart?: number, sourceEnd?: number): number; + /** + * Returns a new `Buffer` that references the same memory as the original, but + * offset and cropped by the `start` and `end` indices. + * + * This method is not compatible with the `Uint8Array.prototype.slice()`, + * which is a superclass of `Buffer`. To copy the slice, use`Uint8Array.prototype.slice()`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from('buffer'); + * + * const copiedBuf = Uint8Array.prototype.slice.call(buf); + * copiedBuf[0]++; + * console.log(copiedBuf.toString()); + * // Prints: cuffer + * + * console.log(buf.toString()); + * // Prints: buffer + * + * // With buf.slice(), the original buffer is modified. + * const notReallyCopiedBuf = buf.slice(); + * notReallyCopiedBuf[0]++; + * console.log(notReallyCopiedBuf.toString()); + * // Prints: cuffer + * console.log(buf.toString()); + * // Also prints: cuffer (!) + * ``` + * @since v0.3.0 + * @deprecated Use `subarray` instead. + * @param [start=0] Where the new `Buffer` will start. + * @param [end=buf.length] Where the new `Buffer` will end (not inclusive). + */ + slice(start?: number, end?: number): Buffer; + /** + * Returns a new `Buffer` that references the same memory as the original, but + * offset and cropped by the `start` and `end` indices. + * + * Specifying `end` greater than `buf.length` will return the same result as + * that of `end` equal to `buf.length`. + * + * This method is inherited from [`TypedArray.prototype.subarray()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/subarray). + * + * Modifying the new `Buffer` slice will modify the memory in the original `Buffer`because the allocated memory of the two objects overlap. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * // Create a `Buffer` with the ASCII alphabet, take a slice, and modify one byte + * // from the original `Buffer`. + * + * const buf1 = Buffer.allocUnsafe(26); + * + * for (let i = 0; i < 26; i++) { + * // 97 is the decimal ASCII value for 'a'. + * buf1[i] = i + 97; + * } + * + * const buf2 = buf1.subarray(0, 3); + * + * console.log(buf2.toString('ascii', 0, buf2.length)); + * // Prints: abc + * + * buf1[0] = 33; + * + * console.log(buf2.toString('ascii', 0, buf2.length)); + * // Prints: !bc + * ``` + * + * Specifying negative indexes causes the slice to be generated relative to the + * end of `buf` rather than the beginning. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from('buffer'); + * + * console.log(buf.subarray(-6, -1).toString()); + * // Prints: buffe + * // (Equivalent to buf.subarray(0, 5).) + * + * console.log(buf.subarray(-6, -2).toString()); + * // Prints: buff + * // (Equivalent to buf.subarray(0, 4).) + * + * console.log(buf.subarray(-5, -2).toString()); + * // Prints: uff + * // (Equivalent to buf.subarray(1, 4).) + * ``` + * @since v3.0.0 + * @param [start=0] Where the new `Buffer` will start. + * @param [end=buf.length] Where the new `Buffer` will end (not inclusive). + */ + subarray(start?: number, end?: number): Buffer; + /** + * Writes `value` to `buf` at the specified `offset` as big-endian. + * + * `value` is interpreted and written as a two's complement signed integer. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(8); + * + * buf.writeBigInt64BE(0x0102030405060708n, 0); + * + * console.log(buf); + * // Prints: + * ``` + * @since v12.0.0, v10.20.0 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy: `0 <= offset <= buf.length - 8`. + * @return `offset` plus the number of bytes written. + */ + writeBigInt64BE(value: bigint, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as little-endian. + * + * `value` is interpreted and written as a two's complement signed integer. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(8); + * + * buf.writeBigInt64LE(0x0102030405060708n, 0); + * + * console.log(buf); + * // Prints: + * ``` + * @since v12.0.0, v10.20.0 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy: `0 <= offset <= buf.length - 8`. + * @return `offset` plus the number of bytes written. + */ + writeBigInt64LE(value: bigint, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as big-endian. + * + * This function is also available under the `writeBigUint64BE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(8); + * + * buf.writeBigUInt64BE(0xdecafafecacefaden, 0); + * + * console.log(buf); + * // Prints: + * ``` + * @since v12.0.0, v10.20.0 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy: `0 <= offset <= buf.length - 8`. + * @return `offset` plus the number of bytes written. + */ + writeBigUInt64BE(value: bigint, offset?: number): number; + /** + * @alias Buffer.writeBigUInt64BE + * @since v14.10.0, v12.19.0 + */ + writeBigUint64BE(value: bigint, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as little-endian + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(8); + * + * buf.writeBigUInt64LE(0xdecafafecacefaden, 0); + * + * console.log(buf); + * // Prints: + * ``` + * + * This function is also available under the `writeBigUint64LE` alias. + * @since v12.0.0, v10.20.0 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy: `0 <= offset <= buf.length - 8`. + * @return `offset` plus the number of bytes written. + */ + writeBigUInt64LE(value: bigint, offset?: number): number; + /** + * @alias Buffer.writeBigUInt64LE + * @since v14.10.0, v12.19.0 + */ + writeBigUint64LE(value: bigint, offset?: number): number; + /** + * Writes `byteLength` bytes of `value` to `buf` at the specified `offset`as little-endian. Supports up to 48 bits of accuracy. Behavior is undefined + * when `value` is anything other than an unsigned integer. + * + * This function is also available under the `writeUintLE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(6); + * + * buf.writeUIntLE(0x1234567890ab, 0, 6); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.5.5 + * @param value Number to be written to `buf`. + * @param offset Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - byteLength`. + * @param byteLength Number of bytes to write. Must satisfy `0 < byteLength <= 6`. + * @return `offset` plus the number of bytes written. + */ + writeUIntLE(value: number, offset: number, byteLength: number): number; + /** + * @alias Buffer.writeUIntLE + * @since v14.9.0, v12.19.0 + */ + writeUintLE(value: number, offset: number, byteLength: number): number; + /** + * Writes `byteLength` bytes of `value` to `buf` at the specified `offset`as big-endian. Supports up to 48 bits of accuracy. Behavior is undefined + * when `value` is anything other than an unsigned integer. + * + * This function is also available under the `writeUintBE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(6); + * + * buf.writeUIntBE(0x1234567890ab, 0, 6); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.5.5 + * @param value Number to be written to `buf`. + * @param offset Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - byteLength`. + * @param byteLength Number of bytes to write. Must satisfy `0 < byteLength <= 6`. + * @return `offset` plus the number of bytes written. + */ + writeUIntBE(value: number, offset: number, byteLength: number): number; + /** + * @alias Buffer.writeUIntBE + * @since v14.9.0, v12.19.0 + */ + writeUintBE(value: number, offset: number, byteLength: number): number; + /** + * Writes `byteLength` bytes of `value` to `buf` at the specified `offset`as little-endian. Supports up to 48 bits of accuracy. Behavior is undefined + * when `value` is anything other than a signed integer. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(6); + * + * buf.writeIntLE(0x1234567890ab, 0, 6); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.11.15 + * @param value Number to be written to `buf`. + * @param offset Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - byteLength`. + * @param byteLength Number of bytes to write. Must satisfy `0 < byteLength <= 6`. + * @return `offset` plus the number of bytes written. + */ + writeIntLE(value: number, offset: number, byteLength: number): number; + /** + * Writes `byteLength` bytes of `value` to `buf` at the specified `offset`as big-endian. Supports up to 48 bits of accuracy. Behavior is undefined when`value` is anything other than a + * signed integer. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(6); + * + * buf.writeIntBE(0x1234567890ab, 0, 6); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.11.15 + * @param value Number to be written to `buf`. + * @param offset Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - byteLength`. + * @param byteLength Number of bytes to write. Must satisfy `0 < byteLength <= 6`. + * @return `offset` plus the number of bytes written. + */ + writeIntBE(value: number, offset: number, byteLength: number): number; + /** + * Reads an unsigned, big-endian 64-bit integer from `buf` at the specified`offset`. + * + * This function is also available under the `readBigUint64BE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff]); + * + * console.log(buf.readBigUInt64BE(0)); + * // Prints: 4294967295n + * ``` + * @since v12.0.0, v10.20.0 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy: `0 <= offset <= buf.length - 8`. + */ + readBigUInt64BE(offset?: number): bigint; + /** + * @alias Buffer.readBigUInt64BE + * @since v14.10.0, v12.19.0 + */ + readBigUint64BE(offset?: number): bigint; + /** + * Reads an unsigned, little-endian 64-bit integer from `buf` at the specified`offset`. + * + * This function is also available under the `readBigUint64LE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff]); + * + * console.log(buf.readBigUInt64LE(0)); + * // Prints: 18446744069414584320n + * ``` + * @since v12.0.0, v10.20.0 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy: `0 <= offset <= buf.length - 8`. + */ + readBigUInt64LE(offset?: number): bigint; + /** + * @alias Buffer.readBigUInt64LE + * @since v14.10.0, v12.19.0 + */ + readBigUint64LE(offset?: number): bigint; + /** + * Reads a signed, big-endian 64-bit integer from `buf` at the specified `offset`. + * + * Integers read from a `Buffer` are interpreted as two's complement signed + * values. + * @since v12.0.0, v10.20.0 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy: `0 <= offset <= buf.length - 8`. + */ + readBigInt64BE(offset?: number): bigint; + /** + * Reads a signed, little-endian 64-bit integer from `buf` at the specified`offset`. + * + * Integers read from a `Buffer` are interpreted as two's complement signed + * values. + * @since v12.0.0, v10.20.0 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy: `0 <= offset <= buf.length - 8`. + */ + readBigInt64LE(offset?: number): bigint; + /** + * Reads `byteLength` number of bytes from `buf` at the specified `offset`and interprets the result as an unsigned, little-endian integer supporting + * up to 48 bits of accuracy. + * + * This function is also available under the `readUintLE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0x12, 0x34, 0x56, 0x78, 0x90, 0xab]); + * + * console.log(buf.readUIntLE(0, 6).toString(16)); + * // Prints: ab9078563412 + * ``` + * @since v0.11.15 + * @param offset Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - byteLength`. + * @param byteLength Number of bytes to read. Must satisfy `0 < byteLength <= 6`. + */ + readUIntLE(offset: number, byteLength: number): number; + /** + * @alias Buffer.readUIntLE + * @since v14.9.0, v12.19.0 + */ + readUintLE(offset: number, byteLength: number): number; + /** + * Reads `byteLength` number of bytes from `buf` at the specified `offset`and interprets the result as an unsigned big-endian integer supporting + * up to 48 bits of accuracy. + * + * This function is also available under the `readUintBE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0x12, 0x34, 0x56, 0x78, 0x90, 0xab]); + * + * console.log(buf.readUIntBE(0, 6).toString(16)); + * // Prints: 1234567890ab + * console.log(buf.readUIntBE(1, 6).toString(16)); + * // Throws ERR_OUT_OF_RANGE. + * ``` + * @since v0.11.15 + * @param offset Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - byteLength`. + * @param byteLength Number of bytes to read. Must satisfy `0 < byteLength <= 6`. + */ + readUIntBE(offset: number, byteLength: number): number; + /** + * @alias Buffer.readUIntBE + * @since v14.9.0, v12.19.0 + */ + readUintBE(offset: number, byteLength: number): number; + /** + * Reads `byteLength` number of bytes from `buf` at the specified `offset`and interprets the result as a little-endian, two's complement signed value + * supporting up to 48 bits of accuracy. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0x12, 0x34, 0x56, 0x78, 0x90, 0xab]); + * + * console.log(buf.readIntLE(0, 6).toString(16)); + * // Prints: -546f87a9cbee + * ``` + * @since v0.11.15 + * @param offset Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - byteLength`. + * @param byteLength Number of bytes to read. Must satisfy `0 < byteLength <= 6`. + */ + readIntLE(offset: number, byteLength: number): number; + /** + * Reads `byteLength` number of bytes from `buf` at the specified `offset`and interprets the result as a big-endian, two's complement signed value + * supporting up to 48 bits of accuracy. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0x12, 0x34, 0x56, 0x78, 0x90, 0xab]); + * + * console.log(buf.readIntBE(0, 6).toString(16)); + * // Prints: 1234567890ab + * console.log(buf.readIntBE(1, 6).toString(16)); + * // Throws ERR_OUT_OF_RANGE. + * console.log(buf.readIntBE(1, 0).toString(16)); + * // Throws ERR_OUT_OF_RANGE. + * ``` + * @since v0.11.15 + * @param offset Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - byteLength`. + * @param byteLength Number of bytes to read. Must satisfy `0 < byteLength <= 6`. + */ + readIntBE(offset: number, byteLength: number): number; + /** + * Reads an unsigned 8-bit integer from `buf` at the specified `offset`. + * + * This function is also available under the `readUint8` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([1, -2]); + * + * console.log(buf.readUInt8(0)); + * // Prints: 1 + * console.log(buf.readUInt8(1)); + * // Prints: 254 + * console.log(buf.readUInt8(2)); + * // Throws ERR_OUT_OF_RANGE. + * ``` + * @since v0.5.0 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 1`. + */ + readUInt8(offset?: number): number; + /** + * @alias Buffer.readUInt8 + * @since v14.9.0, v12.19.0 + */ + readUint8(offset?: number): number; + /** + * Reads an unsigned, little-endian 16-bit integer from `buf` at the specified`offset`. + * + * This function is also available under the `readUint16LE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0x12, 0x34, 0x56]); + * + * console.log(buf.readUInt16LE(0).toString(16)); + * // Prints: 3412 + * console.log(buf.readUInt16LE(1).toString(16)); + * // Prints: 5634 + * console.log(buf.readUInt16LE(2).toString(16)); + * // Throws ERR_OUT_OF_RANGE. + * ``` + * @since v0.5.5 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 2`. + */ + readUInt16LE(offset?: number): number; + /** + * @alias Buffer.readUInt16LE + * @since v14.9.0, v12.19.0 + */ + readUint16LE(offset?: number): number; + /** + * Reads an unsigned, big-endian 16-bit integer from `buf` at the specified`offset`. + * + * This function is also available under the `readUint16BE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0x12, 0x34, 0x56]); + * + * console.log(buf.readUInt16BE(0).toString(16)); + * // Prints: 1234 + * console.log(buf.readUInt16BE(1).toString(16)); + * // Prints: 3456 + * ``` + * @since v0.5.5 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 2`. + */ + readUInt16BE(offset?: number): number; + /** + * @alias Buffer.readUInt16BE + * @since v14.9.0, v12.19.0 + */ + readUint16BE(offset?: number): number; + /** + * Reads an unsigned, little-endian 32-bit integer from `buf` at the specified`offset`. + * + * This function is also available under the `readUint32LE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0x12, 0x34, 0x56, 0x78]); + * + * console.log(buf.readUInt32LE(0).toString(16)); + * // Prints: 78563412 + * console.log(buf.readUInt32LE(1).toString(16)); + * // Throws ERR_OUT_OF_RANGE. + * ``` + * @since v0.5.5 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 4`. + */ + readUInt32LE(offset?: number): number; + /** + * @alias Buffer.readUInt32LE + * @since v14.9.0, v12.19.0 + */ + readUint32LE(offset?: number): number; + /** + * Reads an unsigned, big-endian 32-bit integer from `buf` at the specified`offset`. + * + * This function is also available under the `readUint32BE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0x12, 0x34, 0x56, 0x78]); + * + * console.log(buf.readUInt32BE(0).toString(16)); + * // Prints: 12345678 + * ``` + * @since v0.5.5 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 4`. + */ + readUInt32BE(offset?: number): number; + /** + * @alias Buffer.readUInt32BE + * @since v14.9.0, v12.19.0 + */ + readUint32BE(offset?: number): number; + /** + * Reads a signed 8-bit integer from `buf` at the specified `offset`. + * + * Integers read from a `Buffer` are interpreted as two's complement signed values. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([-1, 5]); + * + * console.log(buf.readInt8(0)); + * // Prints: -1 + * console.log(buf.readInt8(1)); + * // Prints: 5 + * console.log(buf.readInt8(2)); + * // Throws ERR_OUT_OF_RANGE. + * ``` + * @since v0.5.0 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 1`. + */ + readInt8(offset?: number): number; + /** + * Reads a signed, little-endian 16-bit integer from `buf` at the specified`offset`. + * + * Integers read from a `Buffer` are interpreted as two's complement signed values. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0, 5]); + * + * console.log(buf.readInt16LE(0)); + * // Prints: 1280 + * console.log(buf.readInt16LE(1)); + * // Throws ERR_OUT_OF_RANGE. + * ``` + * @since v0.5.5 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 2`. + */ + readInt16LE(offset?: number): number; + /** + * Reads a signed, big-endian 16-bit integer from `buf` at the specified `offset`. + * + * Integers read from a `Buffer` are interpreted as two's complement signed values. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0, 5]); + * + * console.log(buf.readInt16BE(0)); + * // Prints: 5 + * ``` + * @since v0.5.5 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 2`. + */ + readInt16BE(offset?: number): number; + /** + * Reads a signed, little-endian 32-bit integer from `buf` at the specified`offset`. + * + * Integers read from a `Buffer` are interpreted as two's complement signed values. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0, 0, 0, 5]); + * + * console.log(buf.readInt32LE(0)); + * // Prints: 83886080 + * console.log(buf.readInt32LE(1)); + * // Throws ERR_OUT_OF_RANGE. + * ``` + * @since v0.5.5 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 4`. + */ + readInt32LE(offset?: number): number; + /** + * Reads a signed, big-endian 32-bit integer from `buf` at the specified `offset`. + * + * Integers read from a `Buffer` are interpreted as two's complement signed values. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0, 0, 0, 5]); + * + * console.log(buf.readInt32BE(0)); + * // Prints: 5 + * ``` + * @since v0.5.5 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 4`. + */ + readInt32BE(offset?: number): number; + /** + * Reads a 32-bit, little-endian float from `buf` at the specified `offset`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([1, 2, 3, 4]); + * + * console.log(buf.readFloatLE(0)); + * // Prints: 1.539989614439558e-36 + * console.log(buf.readFloatLE(1)); + * // Throws ERR_OUT_OF_RANGE. + * ``` + * @since v0.11.15 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 4`. + */ + readFloatLE(offset?: number): number; + /** + * Reads a 32-bit, big-endian float from `buf` at the specified `offset`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([1, 2, 3, 4]); + * + * console.log(buf.readFloatBE(0)); + * // Prints: 2.387939260590663e-38 + * ``` + * @since v0.11.15 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 4`. + */ + readFloatBE(offset?: number): number; + /** + * Reads a 64-bit, little-endian double from `buf` at the specified `offset`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([1, 2, 3, 4, 5, 6, 7, 8]); + * + * console.log(buf.readDoubleLE(0)); + * // Prints: 5.447603722011605e-270 + * console.log(buf.readDoubleLE(1)); + * // Throws ERR_OUT_OF_RANGE. + * ``` + * @since v0.11.15 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 8`. + */ + readDoubleLE(offset?: number): number; + /** + * Reads a 64-bit, big-endian double from `buf` at the specified `offset`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([1, 2, 3, 4, 5, 6, 7, 8]); + * + * console.log(buf.readDoubleBE(0)); + * // Prints: 8.20788039913184e-304 + * ``` + * @since v0.11.15 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 8`. + */ + readDoubleBE(offset?: number): number; + reverse(): this; + /** + * Interprets `buf` as an array of unsigned 16-bit integers and swaps the + * byte order _in-place_. Throws `ERR_INVALID_BUFFER_SIZE` if `buf.length` is not a multiple of 2. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf1 = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8]); + * + * console.log(buf1); + * // Prints: + * + * buf1.swap16(); + * + * console.log(buf1); + * // Prints: + * + * const buf2 = Buffer.from([0x1, 0x2, 0x3]); + * + * buf2.swap16(); + * // Throws ERR_INVALID_BUFFER_SIZE. + * ``` + * + * One convenient use of `buf.swap16()` is to perform a fast in-place conversion + * between UTF-16 little-endian and UTF-16 big-endian: + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from('This is little-endian UTF-16', 'utf16le'); + * buf.swap16(); // Convert to big-endian UTF-16 text. + * ``` + * @since v5.10.0 + * @return A reference to `buf`. + */ + swap16(): Buffer; + /** + * Interprets `buf` as an array of unsigned 32-bit integers and swaps the + * byte order _in-place_. Throws `ERR_INVALID_BUFFER_SIZE` if `buf.length` is not a multiple of 4. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf1 = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8]); + * + * console.log(buf1); + * // Prints: + * + * buf1.swap32(); + * + * console.log(buf1); + * // Prints: + * + * const buf2 = Buffer.from([0x1, 0x2, 0x3]); + * + * buf2.swap32(); + * // Throws ERR_INVALID_BUFFER_SIZE. + * ``` + * @since v5.10.0 + * @return A reference to `buf`. + */ + swap32(): Buffer; + /** + * Interprets `buf` as an array of 64-bit numbers and swaps byte order _in-place_. + * Throws `ERR_INVALID_BUFFER_SIZE` if `buf.length` is not a multiple of 8. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf1 = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8]); + * + * console.log(buf1); + * // Prints: + * + * buf1.swap64(); + * + * console.log(buf1); + * // Prints: + * + * const buf2 = Buffer.from([0x1, 0x2, 0x3]); + * + * buf2.swap64(); + * // Throws ERR_INVALID_BUFFER_SIZE. + * ``` + * @since v6.3.0 + * @return A reference to `buf`. + */ + swap64(): Buffer; + /** + * Writes `value` to `buf` at the specified `offset`. `value` must be a + * valid unsigned 8-bit integer. Behavior is undefined when `value` is anything + * other than an unsigned 8-bit integer. + * + * This function is also available under the `writeUint8` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(4); + * + * buf.writeUInt8(0x3, 0); + * buf.writeUInt8(0x4, 1); + * buf.writeUInt8(0x23, 2); + * buf.writeUInt8(0x42, 3); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.5.0 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 1`. + * @return `offset` plus the number of bytes written. + */ + writeUInt8(value: number, offset?: number): number; + /** + * @alias Buffer.writeUInt8 + * @since v14.9.0, v12.19.0 + */ + writeUint8(value: number, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as little-endian. The `value`must be a valid unsigned 16-bit integer. Behavior is undefined when `value` is + * anything other than an unsigned 16-bit integer. + * + * This function is also available under the `writeUint16LE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(4); + * + * buf.writeUInt16LE(0xdead, 0); + * buf.writeUInt16LE(0xbeef, 2); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.5.5 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 2`. + * @return `offset` plus the number of bytes written. + */ + writeUInt16LE(value: number, offset?: number): number; + /** + * @alias Buffer.writeUInt16LE + * @since v14.9.0, v12.19.0 + */ + writeUint16LE(value: number, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as big-endian. The `value`must be a valid unsigned 16-bit integer. Behavior is undefined when `value`is anything other than an + * unsigned 16-bit integer. + * + * This function is also available under the `writeUint16BE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(4); + * + * buf.writeUInt16BE(0xdead, 0); + * buf.writeUInt16BE(0xbeef, 2); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.5.5 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 2`. + * @return `offset` plus the number of bytes written. + */ + writeUInt16BE(value: number, offset?: number): number; + /** + * @alias Buffer.writeUInt16BE + * @since v14.9.0, v12.19.0 + */ + writeUint16BE(value: number, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as little-endian. The `value`must be a valid unsigned 32-bit integer. Behavior is undefined when `value` is + * anything other than an unsigned 32-bit integer. + * + * This function is also available under the `writeUint32LE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(4); + * + * buf.writeUInt32LE(0xfeedface, 0); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.5.5 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 4`. + * @return `offset` plus the number of bytes written. + */ + writeUInt32LE(value: number, offset?: number): number; + /** + * @alias Buffer.writeUInt32LE + * @since v14.9.0, v12.19.0 + */ + writeUint32LE(value: number, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as big-endian. The `value`must be a valid unsigned 32-bit integer. Behavior is undefined when `value`is anything other than an + * unsigned 32-bit integer. + * + * This function is also available under the `writeUint32BE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(4); + * + * buf.writeUInt32BE(0xfeedface, 0); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.5.5 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 4`. + * @return `offset` plus the number of bytes written. + */ + writeUInt32BE(value: number, offset?: number): number; + /** + * @alias Buffer.writeUInt32BE + * @since v14.9.0, v12.19.0 + */ + writeUint32BE(value: number, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset`. `value` must be a valid + * signed 8-bit integer. Behavior is undefined when `value` is anything other than + * a signed 8-bit integer. + * + * `value` is interpreted and written as a two's complement signed integer. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(2); + * + * buf.writeInt8(2, 0); + * buf.writeInt8(-2, 1); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.5.0 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 1`. + * @return `offset` plus the number of bytes written. + */ + writeInt8(value: number, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as little-endian. The `value`must be a valid signed 16-bit integer. Behavior is undefined when `value` is + * anything other than a signed 16-bit integer. + * + * The `value` is interpreted and written as a two's complement signed integer. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(2); + * + * buf.writeInt16LE(0x0304, 0); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.5.5 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 2`. + * @return `offset` plus the number of bytes written. + */ + writeInt16LE(value: number, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as big-endian. The `value`must be a valid signed 16-bit integer. Behavior is undefined when `value` is + * anything other than a signed 16-bit integer. + * + * The `value` is interpreted and written as a two's complement signed integer. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(2); + * + * buf.writeInt16BE(0x0102, 0); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.5.5 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 2`. + * @return `offset` plus the number of bytes written. + */ + writeInt16BE(value: number, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as little-endian. The `value`must be a valid signed 32-bit integer. Behavior is undefined when `value` is + * anything other than a signed 32-bit integer. + * + * The `value` is interpreted and written as a two's complement signed integer. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(4); + * + * buf.writeInt32LE(0x05060708, 0); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.5.5 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 4`. + * @return `offset` plus the number of bytes written. + */ + writeInt32LE(value: number, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as big-endian. The `value`must be a valid signed 32-bit integer. Behavior is undefined when `value` is + * anything other than a signed 32-bit integer. + * + * The `value` is interpreted and written as a two's complement signed integer. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(4); + * + * buf.writeInt32BE(0x01020304, 0); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.5.5 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 4`. + * @return `offset` plus the number of bytes written. + */ + writeInt32BE(value: number, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as little-endian. Behavior is + * undefined when `value` is anything other than a JavaScript number. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(4); + * + * buf.writeFloatLE(0xcafebabe, 0); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.11.15 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 4`. + * @return `offset` plus the number of bytes written. + */ + writeFloatLE(value: number, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as big-endian. Behavior is + * undefined when `value` is anything other than a JavaScript number. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(4); + * + * buf.writeFloatBE(0xcafebabe, 0); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.11.15 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 4`. + * @return `offset` plus the number of bytes written. + */ + writeFloatBE(value: number, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as little-endian. The `value`must be a JavaScript number. Behavior is undefined when `value` is anything + * other than a JavaScript number. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(8); + * + * buf.writeDoubleLE(123.456, 0); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.11.15 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 8`. + * @return `offset` plus the number of bytes written. + */ + writeDoubleLE(value: number, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as big-endian. The `value`must be a JavaScript number. Behavior is undefined when `value` is anything + * other than a JavaScript number. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(8); + * + * buf.writeDoubleBE(123.456, 0); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.11.15 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 8`. + * @return `offset` plus the number of bytes written. + */ + writeDoubleBE(value: number, offset?: number): number; + /** + * Fills `buf` with the specified `value`. If the `offset` and `end` are not given, + * the entire `buf` will be filled: + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * // Fill a `Buffer` with the ASCII character 'h'. + * + * const b = Buffer.allocUnsafe(50).fill('h'); + * + * console.log(b.toString()); + * // Prints: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh + * + * // Fill a buffer with empty string + * const c = Buffer.allocUnsafe(5).fill(''); + * + * console.log(c.fill('')); + * // Prints: + * ``` + * + * `value` is coerced to a `uint32` value if it is not a string, `Buffer`, or + * integer. If the resulting integer is greater than `255` (decimal), `buf` will be + * filled with `value & 255`. + * + * If the final write of a `fill()` operation falls on a multi-byte character, + * then only the bytes of that character that fit into `buf` are written: + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * // Fill a `Buffer` with character that takes up two bytes in UTF-8. + * + * console.log(Buffer.allocUnsafe(5).fill('\u0222')); + * // Prints: + * ``` + * + * If `value` contains invalid characters, it is truncated; if no valid + * fill data remains, an exception is thrown: + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(5); + * + * console.log(buf.fill('a')); + * // Prints: + * console.log(buf.fill('aazz', 'hex')); + * // Prints: + * console.log(buf.fill('zz', 'hex')); + * // Throws an exception. + * ``` + * @since v0.5.0 + * @param value The value with which to fill `buf`. Empty value (string, Uint8Array, Buffer) is coerced to `0`. + * @param [offset=0] Number of bytes to skip before starting to fill `buf`. + * @param [end=buf.length] Where to stop filling `buf` (not inclusive). + * @param [encoding='utf8'] The encoding for `value` if `value` is a string. + * @return A reference to `buf`. + */ + fill(value: string | Uint8Array | number, offset?: number, end?: number, encoding?: BufferEncoding): this; + /** + * If `value` is: + * + * * a string, `value` is interpreted according to the character encoding in`encoding`. + * * a `Buffer` or [`Uint8Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array), `value` will be used in its entirety. + * To compare a partial `Buffer`, use `buf.subarray`. + * * a number, `value` will be interpreted as an unsigned 8-bit integer + * value between `0` and `255`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from('this is a buffer'); + * + * console.log(buf.indexOf('this')); + * // Prints: 0 + * console.log(buf.indexOf('is')); + * // Prints: 2 + * console.log(buf.indexOf(Buffer.from('a buffer'))); + * // Prints: 8 + * console.log(buf.indexOf(97)); + * // Prints: 8 (97 is the decimal ASCII value for 'a') + * console.log(buf.indexOf(Buffer.from('a buffer example'))); + * // Prints: -1 + * console.log(buf.indexOf(Buffer.from('a buffer example').slice(0, 8))); + * // Prints: 8 + * + * const utf16Buffer = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'utf16le'); + * + * console.log(utf16Buffer.indexOf('\u03a3', 0, 'utf16le')); + * // Prints: 4 + * console.log(utf16Buffer.indexOf('\u03a3', -4, 'utf16le')); + * // Prints: 6 + * ``` + * + * If `value` is not a string, number, or `Buffer`, this method will throw a`TypeError`. If `value` is a number, it will be coerced to a valid byte value, + * an integer between 0 and 255. + * + * If `byteOffset` is not a number, it will be coerced to a number. If the result + * of coercion is `NaN` or `0`, then the entire buffer will be searched. This + * behavior matches [`String.prototype.indexOf()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf). + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const b = Buffer.from('abcdef'); + * + * // Passing a value that's a number, but not a valid byte. + * // Prints: 2, equivalent to searching for 99 or 'c'. + * console.log(b.indexOf(99.9)); + * console.log(b.indexOf(256 + 99)); + * + * // Passing a byteOffset that coerces to NaN or 0. + * // Prints: 1, searching the whole buffer. + * console.log(b.indexOf('b', undefined)); + * console.log(b.indexOf('b', {})); + * console.log(b.indexOf('b', null)); + * console.log(b.indexOf('b', [])); + * ``` + * + * If `value` is an empty string or empty `Buffer` and `byteOffset` is less + * than `buf.length`, `byteOffset` will be returned. If `value` is empty and`byteOffset` is at least `buf.length`, `buf.length` will be returned. + * @since v1.5.0 + * @param value What to search for. + * @param [byteOffset=0] Where to begin searching in `buf`. If negative, then offset is calculated from the end of `buf`. + * @param [encoding='utf8'] If `value` is a string, this is the encoding used to determine the binary representation of the string that will be searched for in `buf`. + * @return The index of the first occurrence of `value` in `buf`, or `-1` if `buf` does not contain `value`. + */ + indexOf(value: string | number | Uint8Array, byteOffset?: number, encoding?: BufferEncoding): number; + /** + * Identical to `buf.indexOf()`, except the last occurrence of `value` is found + * rather than the first occurrence. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from('this buffer is a buffer'); + * + * console.log(buf.lastIndexOf('this')); + * // Prints: 0 + * console.log(buf.lastIndexOf('buffer')); + * // Prints: 17 + * console.log(buf.lastIndexOf(Buffer.from('buffer'))); + * // Prints: 17 + * console.log(buf.lastIndexOf(97)); + * // Prints: 15 (97 is the decimal ASCII value for 'a') + * console.log(buf.lastIndexOf(Buffer.from('yolo'))); + * // Prints: -1 + * console.log(buf.lastIndexOf('buffer', 5)); + * // Prints: 5 + * console.log(buf.lastIndexOf('buffer', 4)); + * // Prints: -1 + * + * const utf16Buffer = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'utf16le'); + * + * console.log(utf16Buffer.lastIndexOf('\u03a3', undefined, 'utf16le')); + * // Prints: 6 + * console.log(utf16Buffer.lastIndexOf('\u03a3', -5, 'utf16le')); + * // Prints: 4 + * ``` + * + * If `value` is not a string, number, or `Buffer`, this method will throw a`TypeError`. If `value` is a number, it will be coerced to a valid byte value, + * an integer between 0 and 255. + * + * If `byteOffset` is not a number, it will be coerced to a number. Any arguments + * that coerce to `NaN`, like `{}` or `undefined`, will search the whole buffer. + * This behavior matches [`String.prototype.lastIndexOf()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/lastIndexOf). + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const b = Buffer.from('abcdef'); + * + * // Passing a value that's a number, but not a valid byte. + * // Prints: 2, equivalent to searching for 99 or 'c'. + * console.log(b.lastIndexOf(99.9)); + * console.log(b.lastIndexOf(256 + 99)); + * + * // Passing a byteOffset that coerces to NaN. + * // Prints: 1, searching the whole buffer. + * console.log(b.lastIndexOf('b', undefined)); + * console.log(b.lastIndexOf('b', {})); + * + * // Passing a byteOffset that coerces to 0. + * // Prints: -1, equivalent to passing 0. + * console.log(b.lastIndexOf('b', null)); + * console.log(b.lastIndexOf('b', [])); + * ``` + * + * If `value` is an empty string or empty `Buffer`, `byteOffset` will be returned. + * @since v6.0.0 + * @param value What to search for. + * @param [byteOffset=buf.length - 1] Where to begin searching in `buf`. If negative, then offset is calculated from the end of `buf`. + * @param [encoding='utf8'] If `value` is a string, this is the encoding used to determine the binary representation of the string that will be searched for in `buf`. + * @return The index of the last occurrence of `value` in `buf`, or `-1` if `buf` does not contain `value`. + */ + lastIndexOf(value: string | number | Uint8Array, byteOffset?: number, encoding?: BufferEncoding): number; + /** + * Creates and returns an [iterator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols) of `[index, byte]` pairs from the contents + * of `buf`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * // Log the entire contents of a `Buffer`. + * + * const buf = Buffer.from('buffer'); + * + * for (const pair of buf.entries()) { + * console.log(pair); + * } + * // Prints: + * // [0, 98] + * // [1, 117] + * // [2, 102] + * // [3, 102] + * // [4, 101] + * // [5, 114] + * ``` + * @since v1.1.0 + */ + entries(): IterableIterator<[number, number]>; + /** + * Equivalent to `buf.indexOf() !== -1`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from('this is a buffer'); + * + * console.log(buf.includes('this')); + * // Prints: true + * console.log(buf.includes('is')); + * // Prints: true + * console.log(buf.includes(Buffer.from('a buffer'))); + * // Prints: true + * console.log(buf.includes(97)); + * // Prints: true (97 is the decimal ASCII value for 'a') + * console.log(buf.includes(Buffer.from('a buffer example'))); + * // Prints: false + * console.log(buf.includes(Buffer.from('a buffer example').slice(0, 8))); + * // Prints: true + * console.log(buf.includes('this', 4)); + * // Prints: false + * ``` + * @since v5.3.0 + * @param value What to search for. + * @param [byteOffset=0] Where to begin searching in `buf`. If negative, then offset is calculated from the end of `buf`. + * @param [encoding='utf8'] If `value` is a string, this is its encoding. + * @return `true` if `value` was found in `buf`, `false` otherwise. + */ + includes(value: string | number | Buffer, byteOffset?: number, encoding?: BufferEncoding): boolean; + /** + * Creates and returns an [iterator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols) of `buf` keys (indices). + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from('buffer'); + * + * for (const key of buf.keys()) { + * console.log(key); + * } + * // Prints: + * // 0 + * // 1 + * // 2 + * // 3 + * // 4 + * // 5 + * ``` + * @since v1.1.0 + */ + keys(): IterableIterator; + /** + * Creates and returns an [iterator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols) for `buf` values (bytes). This function is + * called automatically when a `Buffer` is used in a `for..of` statement. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from('buffer'); + * + * for (const value of buf.values()) { + * console.log(value); + * } + * // Prints: + * // 98 + * // 117 + * // 102 + * // 102 + * // 101 + * // 114 + * + * for (const value of buf) { + * console.log(value); + * } + * // Prints: + * // 98 + * // 117 + * // 102 + * // 102 + * // 101 + * // 114 + * ``` + * @since v1.1.0 + */ + values(): IterableIterator; + } + var Buffer: BufferConstructor; + /** + * Decodes a string of Base64-encoded data into bytes, and encodes those bytes + * into a string using Latin-1 (ISO-8859-1). + * + * The `data` may be any JavaScript-value that can be coerced into a string. + * + * **This function is only provided for compatibility with legacy web platform APIs** + * **and should never be used in new code, because they use strings to represent** + * **binary data and predate the introduction of typed arrays in JavaScript.** + * **For code running using Node.js APIs, converting between base64-encoded strings** + * **and binary data should be performed using `Buffer.from(str, 'base64')` and`buf.toString('base64')`.** + * @since v15.13.0, v14.17.0 + * @legacy Use `Buffer.from(data, 'base64')` instead. + * @param data The Base64-encoded input string. + */ + function atob(data: string): string; + /** + * Decodes a string into bytes using Latin-1 (ISO-8859), and encodes those bytes + * into a string using Base64. + * + * The `data` may be any JavaScript-value that can be coerced into a string. + * + * **This function is only provided for compatibility with legacy web platform APIs** + * **and should never be used in new code, because they use strings to represent** + * **binary data and predate the introduction of typed arrays in JavaScript.** + * **For code running using Node.js APIs, converting between base64-encoded strings** + * **and binary data should be performed using `Buffer.from(str, 'base64')` and`buf.toString('base64')`.** + * @since v15.13.0, v14.17.0 + * @legacy Use `buf.toString('base64')` instead. + * @param data An ASCII (Latin1) string. + */ + function btoa(data: string): string; + interface Blob extends __Blob {} + /** + * `Blob` class is a global reference for `require('node:buffer').Blob` + * https://nodejs.org/api/buffer.html#class-blob + * @since v18.0.0 + */ + var Blob: typeof globalThis extends { + onmessage: any; + Blob: infer T; + } ? T + : typeof NodeBlob; + } +} +declare module "node:buffer" { + export * from "buffer"; +} diff --git a/task/node_modules/@types/node/child_process.d.ts b/task/node_modules/@types/node/child_process.d.ts new file mode 100644 index 0000000..a97532b --- /dev/null +++ b/task/node_modules/@types/node/child_process.d.ts @@ -0,0 +1,1540 @@ +/** + * The `node:child_process` module provides the ability to spawn subprocesses in + * a manner that is similar, but not identical, to [`popen(3)`](http://man7.org/linux/man-pages/man3/popen.3.html). This capability + * is primarily provided by the {@link spawn} function: + * + * ```js + * const { spawn } = require('node:child_process'); + * const ls = spawn('ls', ['-lh', '/usr']); + * + * ls.stdout.on('data', (data) => { + * console.log(`stdout: ${data}`); + * }); + * + * ls.stderr.on('data', (data) => { + * console.error(`stderr: ${data}`); + * }); + * + * ls.on('close', (code) => { + * console.log(`child process exited with code ${code}`); + * }); + * ``` + * + * By default, pipes for `stdin`, `stdout`, and `stderr` are established between + * the parent Node.js process and the spawned subprocess. These pipes have + * limited (and platform-specific) capacity. If the subprocess writes to + * stdout in excess of that limit without the output being captured, the + * subprocess blocks waiting for the pipe buffer to accept more data. This is + * identical to the behavior of pipes in the shell. Use the `{ stdio: 'ignore' }`option if the output will not be consumed. + * + * The command lookup is performed using the `options.env.PATH` environment + * variable if `env` is in the `options` object. Otherwise, `process.env.PATH` is + * used. If `options.env` is set without `PATH`, lookup on Unix is performed + * on a default search path search of `/usr/bin:/bin` (see your operating system's + * manual for execvpe/execvp), on Windows the current processes environment + * variable `PATH` is used. + * + * On Windows, environment variables are case-insensitive. Node.js + * lexicographically sorts the `env` keys and uses the first one that + * case-insensitively matches. Only first (in lexicographic order) entry will be + * passed to the subprocess. This might lead to issues on Windows when passing + * objects to the `env` option that have multiple variants of the same key, such as`PATH` and `Path`. + * + * The {@link spawn} method spawns the child process asynchronously, + * without blocking the Node.js event loop. The {@link spawnSync} function provides equivalent functionality in a synchronous manner that blocks + * the event loop until the spawned process either exits or is terminated. + * + * For convenience, the `node:child_process` module provides a handful of + * synchronous and asynchronous alternatives to {@link spawn} and {@link spawnSync}. Each of these alternatives are implemented on + * top of {@link spawn} or {@link spawnSync}. + * + * * {@link exec}: spawns a shell and runs a command within that + * shell, passing the `stdout` and `stderr` to a callback function when + * complete. + * * {@link execFile}: similar to {@link exec} except + * that it spawns the command directly without first spawning a shell by + * default. + * * {@link fork}: spawns a new Node.js process and invokes a + * specified module with an IPC communication channel established that allows + * sending messages between parent and child. + * * {@link execSync}: a synchronous version of {@link exec} that will block the Node.js event loop. + * * {@link execFileSync}: a synchronous version of {@link execFile} that will block the Node.js event loop. + * + * For certain use cases, such as automating shell scripts, the `synchronous counterparts` may be more convenient. In many cases, however, + * the synchronous methods can have significant impact on performance due to + * stalling the event loop while spawned processes complete. + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/child_process.js) + */ +declare module "child_process" { + import { ObjectEncodingOptions } from "node:fs"; + import { Abortable, EventEmitter } from "node:events"; + import * as net from "node:net"; + import { Pipe, Readable, Stream, Writable } from "node:stream"; + import { URL } from "node:url"; + type Serializable = string | object | number | boolean | bigint; + type SendHandle = net.Socket | net.Server; + /** + * Instances of the `ChildProcess` represent spawned child processes. + * + * Instances of `ChildProcess` are not intended to be created directly. Rather, + * use the {@link spawn}, {@link exec},{@link execFile}, or {@link fork} methods to create + * instances of `ChildProcess`. + * @since v2.2.0 + */ + class ChildProcess extends EventEmitter { + /** + * A `Writable Stream` that represents the child process's `stdin`. + * + * If a child process waits to read all of its input, the child will not continue + * until this stream has been closed via `end()`. + * + * If the child was spawned with `stdio[0]` set to anything other than `'pipe'`, + * then this will be `null`. + * + * `subprocess.stdin` is an alias for `subprocess.stdio[0]`. Both properties will + * refer to the same value. + * + * The `subprocess.stdin` property can be `null` or `undefined`if the child process could not be successfully spawned. + * @since v0.1.90 + */ + stdin: Writable | null; + /** + * A `Readable Stream` that represents the child process's `stdout`. + * + * If the child was spawned with `stdio[1]` set to anything other than `'pipe'`, + * then this will be `null`. + * + * `subprocess.stdout` is an alias for `subprocess.stdio[1]`. Both properties will + * refer to the same value. + * + * ```js + * const { spawn } = require('node:child_process'); + * + * const subprocess = spawn('ls'); + * + * subprocess.stdout.on('data', (data) => { + * console.log(`Received chunk ${data}`); + * }); + * ``` + * + * The `subprocess.stdout` property can be `null` or `undefined`if the child process could not be successfully spawned. + * @since v0.1.90 + */ + stdout: Readable | null; + /** + * A `Readable Stream` that represents the child process's `stderr`. + * + * If the child was spawned with `stdio[2]` set to anything other than `'pipe'`, + * then this will be `null`. + * + * `subprocess.stderr` is an alias for `subprocess.stdio[2]`. Both properties will + * refer to the same value. + * + * The `subprocess.stderr` property can be `null` or `undefined`if the child process could not be successfully spawned. + * @since v0.1.90 + */ + stderr: Readable | null; + /** + * The `subprocess.channel` property is a reference to the child's IPC channel. If + * no IPC channel exists, this property is `undefined`. + * @since v7.1.0 + */ + readonly channel?: Pipe | null | undefined; + /** + * A sparse array of pipes to the child process, corresponding with positions in + * the `stdio` option passed to {@link spawn} that have been set + * to the value `'pipe'`. `subprocess.stdio[0]`, `subprocess.stdio[1]`, and`subprocess.stdio[2]` are also available as `subprocess.stdin`,`subprocess.stdout`, and `subprocess.stderr`, + * respectively. + * + * In the following example, only the child's fd `1` (stdout) is configured as a + * pipe, so only the parent's `subprocess.stdio[1]` is a stream, all other values + * in the array are `null`. + * + * ```js + * const assert = require('node:assert'); + * const fs = require('node:fs'); + * const child_process = require('node:child_process'); + * + * const subprocess = child_process.spawn('ls', { + * stdio: [ + * 0, // Use parent's stdin for child. + * 'pipe', // Pipe child's stdout to parent. + * fs.openSync('err.out', 'w'), // Direct child's stderr to a file. + * ], + * }); + * + * assert.strictEqual(subprocess.stdio[0], null); + * assert.strictEqual(subprocess.stdio[0], subprocess.stdin); + * + * assert(subprocess.stdout); + * assert.strictEqual(subprocess.stdio[1], subprocess.stdout); + * + * assert.strictEqual(subprocess.stdio[2], null); + * assert.strictEqual(subprocess.stdio[2], subprocess.stderr); + * ``` + * + * The `subprocess.stdio` property can be `undefined` if the child process could + * not be successfully spawned. + * @since v0.7.10 + */ + readonly stdio: [ + Writable | null, + // stdin + Readable | null, + // stdout + Readable | null, + // stderr + Readable | Writable | null | undefined, + // extra + Readable | Writable | null | undefined, // extra + ]; + /** + * The `subprocess.killed` property indicates whether the child process + * successfully received a signal from `subprocess.kill()`. The `killed` property + * does not indicate that the child process has been terminated. + * @since v0.5.10 + */ + readonly killed: boolean; + /** + * Returns the process identifier (PID) of the child process. If the child process + * fails to spawn due to errors, then the value is `undefined` and `error` is + * emitted. + * + * ```js + * const { spawn } = require('node:child_process'); + * const grep = spawn('grep', ['ssh']); + * + * console.log(`Spawned child pid: ${grep.pid}`); + * grep.stdin.end(); + * ``` + * @since v0.1.90 + */ + readonly pid?: number | undefined; + /** + * The `subprocess.connected` property indicates whether it is still possible to + * send and receive messages from a child process. When `subprocess.connected` is`false`, it is no longer possible to send or receive messages. + * @since v0.7.2 + */ + readonly connected: boolean; + /** + * The `subprocess.exitCode` property indicates the exit code of the child process. + * If the child process is still running, the field will be `null`. + */ + readonly exitCode: number | null; + /** + * The `subprocess.signalCode` property indicates the signal received by + * the child process if any, else `null`. + */ + readonly signalCode: NodeJS.Signals | null; + /** + * The `subprocess.spawnargs` property represents the full list of command-line + * arguments the child process was launched with. + */ + readonly spawnargs: string[]; + /** + * The `subprocess.spawnfile` property indicates the executable file name of + * the child process that is launched. + * + * For {@link fork}, its value will be equal to `process.execPath`. + * For {@link spawn}, its value will be the name of + * the executable file. + * For {@link exec}, its value will be the name of the shell + * in which the child process is launched. + */ + readonly spawnfile: string; + /** + * The `subprocess.kill()` method sends a signal to the child process. If no + * argument is given, the process will be sent the `'SIGTERM'` signal. See [`signal(7)`](http://man7.org/linux/man-pages/man7/signal.7.html) for a list of available signals. This function + * returns `true` if [`kill(2)`](http://man7.org/linux/man-pages/man2/kill.2.html) succeeds, and `false` otherwise. + * + * ```js + * const { spawn } = require('node:child_process'); + * const grep = spawn('grep', ['ssh']); + * + * grep.on('close', (code, signal) => { + * console.log( + * `child process terminated due to receipt of signal ${signal}`); + * }); + * + * // Send SIGHUP to process. + * grep.kill('SIGHUP'); + * ``` + * + * The `ChildProcess` object may emit an `'error'` event if the signal + * cannot be delivered. Sending a signal to a child process that has already exited + * is not an error but may have unforeseen consequences. Specifically, if the + * process identifier (PID) has been reassigned to another process, the signal will + * be delivered to that process instead which can have unexpected results. + * + * While the function is called `kill`, the signal delivered to the child process + * may not actually terminate the process. + * + * See [`kill(2)`](http://man7.org/linux/man-pages/man2/kill.2.html) for reference. + * + * On Windows, where POSIX signals do not exist, the `signal` argument will be + * ignored, and the process will be killed forcefully and abruptly (similar to`'SIGKILL'`). + * See `Signal Events` for more details. + * + * On Linux, child processes of child processes will not be terminated + * when attempting to kill their parent. This is likely to happen when running a + * new process in a shell or with the use of the `shell` option of `ChildProcess`: + * + * ```js + * 'use strict'; + * const { spawn } = require('node:child_process'); + * + * const subprocess = spawn( + * 'sh', + * [ + * '-c', + * `node -e "setInterval(() => { + * console.log(process.pid, 'is alive') + * }, 500);"`, + * ], { + * stdio: ['inherit', 'inherit', 'inherit'], + * }, + * ); + * + * setTimeout(() => { + * subprocess.kill(); // Does not terminate the Node.js process in the shell. + * }, 2000); + * ``` + * @since v0.1.90 + */ + kill(signal?: NodeJS.Signals | number): boolean; + /** + * Calls {@link ChildProcess.kill} with `'SIGTERM'`. + * @since v20.5.0 + */ + [Symbol.dispose](): void; + /** + * When an IPC channel has been established between the parent and child ( + * i.e. when using {@link fork}), the `subprocess.send()` method can + * be used to send messages to the child process. When the child process is a + * Node.js instance, these messages can be received via the `'message'` event. + * + * The message goes through serialization and parsing. The resulting + * message might not be the same as what is originally sent. + * + * For example, in the parent script: + * + * ```js + * const cp = require('node:child_process'); + * const n = cp.fork(`${__dirname}/sub.js`); + * + * n.on('message', (m) => { + * console.log('PARENT got message:', m); + * }); + * + * // Causes the child to print: CHILD got message: { hello: 'world' } + * n.send({ hello: 'world' }); + * ``` + * + * And then the child script, `'sub.js'` might look like this: + * + * ```js + * process.on('message', (m) => { + * console.log('CHILD got message:', m); + * }); + * + * // Causes the parent to print: PARENT got message: { foo: 'bar', baz: null } + * process.send({ foo: 'bar', baz: NaN }); + * ``` + * + * Child Node.js processes will have a `process.send()` method of their own + * that allows the child to send messages back to the parent. + * + * There is a special case when sending a `{cmd: 'NODE_foo'}` message. Messages + * containing a `NODE_` prefix in the `cmd` property are reserved for use within + * Node.js core and will not be emitted in the child's `'message'` event. Rather, such messages are emitted using the`'internalMessage'` event and are consumed internally by Node.js. + * Applications should avoid using such messages or listening for`'internalMessage'` events as it is subject to change without notice. + * + * The optional `sendHandle` argument that may be passed to `subprocess.send()` is + * for passing a TCP server or socket object to the child process. The child will + * receive the object as the second argument passed to the callback function + * registered on the `'message'` event. Any data that is received + * and buffered in the socket will not be sent to the child. + * + * The optional `callback` is a function that is invoked after the message is + * sent but before the child may have received it. The function is called with a + * single argument: `null` on success, or an `Error` object on failure. + * + * If no `callback` function is provided and the message cannot be sent, an`'error'` event will be emitted by the `ChildProcess` object. This can + * happen, for instance, when the child process has already exited. + * + * `subprocess.send()` will return `false` if the channel has closed or when the + * backlog of unsent messages exceeds a threshold that makes it unwise to send + * more. Otherwise, the method returns `true`. The `callback` function can be + * used to implement flow control. + * + * #### Example: sending a server object + * + * The `sendHandle` argument can be used, for instance, to pass the handle of + * a TCP server object to the child process as illustrated in the example below: + * + * ```js + * const subprocess = require('node:child_process').fork('subprocess.js'); + * + * // Open up the server object and send the handle. + * const server = require('node:net').createServer(); + * server.on('connection', (socket) => { + * socket.end('handled by parent'); + * }); + * server.listen(1337, () => { + * subprocess.send('server', server); + * }); + * ``` + * + * The child would then receive the server object as: + * + * ```js + * process.on('message', (m, server) => { + * if (m === 'server') { + * server.on('connection', (socket) => { + * socket.end('handled by child'); + * }); + * } + * }); + * ``` + * + * Once the server is now shared between the parent and child, some connections + * can be handled by the parent and some by the child. + * + * While the example above uses a server created using the `node:net` module,`node:dgram` module servers use exactly the same workflow with the exceptions of + * listening on a `'message'` event instead of `'connection'` and using`server.bind()` instead of `server.listen()`. This is, however, only + * supported on Unix platforms. + * + * #### Example: sending a socket object + * + * Similarly, the `sendHandler` argument can be used to pass the handle of a + * socket to the child process. The example below spawns two children that each + * handle connections with "normal" or "special" priority: + * + * ```js + * const { fork } = require('node:child_process'); + * const normal = fork('subprocess.js', ['normal']); + * const special = fork('subprocess.js', ['special']); + * + * // Open up the server and send sockets to child. Use pauseOnConnect to prevent + * // the sockets from being read before they are sent to the child process. + * const server = require('node:net').createServer({ pauseOnConnect: true }); + * server.on('connection', (socket) => { + * + * // If this is special priority... + * if (socket.remoteAddress === '74.125.127.100') { + * special.send('socket', socket); + * return; + * } + * // This is normal priority. + * normal.send('socket', socket); + * }); + * server.listen(1337); + * ``` + * + * The `subprocess.js` would receive the socket handle as the second argument + * passed to the event callback function: + * + * ```js + * process.on('message', (m, socket) => { + * if (m === 'socket') { + * if (socket) { + * // Check that the client socket exists. + * // It is possible for the socket to be closed between the time it is + * // sent and the time it is received in the child process. + * socket.end(`Request handled with ${process.argv[2]} priority`); + * } + * } + * }); + * ``` + * + * Do not use `.maxConnections` on a socket that has been passed to a subprocess. + * The parent cannot track when the socket is destroyed. + * + * Any `'message'` handlers in the subprocess should verify that `socket` exists, + * as the connection may have been closed during the time it takes to send the + * connection to the child. + * @since v0.5.9 + * @param options The `options` argument, if present, is an object used to parameterize the sending of certain types of handles. `options` supports the following properties: + */ + send(message: Serializable, callback?: (error: Error | null) => void): boolean; + send(message: Serializable, sendHandle?: SendHandle, callback?: (error: Error | null) => void): boolean; + send( + message: Serializable, + sendHandle?: SendHandle, + options?: MessageOptions, + callback?: (error: Error | null) => void, + ): boolean; + /** + * Closes the IPC channel between parent and child, allowing the child to exit + * gracefully once there are no other connections keeping it alive. After calling + * this method the `subprocess.connected` and `process.connected` properties in + * both the parent and child (respectively) will be set to `false`, and it will be + * no longer possible to pass messages between the processes. + * + * The `'disconnect'` event will be emitted when there are no messages in the + * process of being received. This will most often be triggered immediately after + * calling `subprocess.disconnect()`. + * + * When the child process is a Node.js instance (e.g. spawned using {@link fork}), the `process.disconnect()` method can be invoked + * within the child process to close the IPC channel as well. + * @since v0.7.2 + */ + disconnect(): void; + /** + * By default, the parent will wait for the detached child to exit. To prevent the + * parent from waiting for a given `subprocess` to exit, use the`subprocess.unref()` method. Doing so will cause the parent's event loop to not + * include the child in its reference count, allowing the parent to exit + * independently of the child, unless there is an established IPC channel between + * the child and the parent. + * + * ```js + * const { spawn } = require('node:child_process'); + * + * const subprocess = spawn(process.argv[0], ['child_program.js'], { + * detached: true, + * stdio: 'ignore', + * }); + * + * subprocess.unref(); + * ``` + * @since v0.7.10 + */ + unref(): void; + /** + * Calling `subprocess.ref()` after making a call to `subprocess.unref()` will + * restore the removed reference count for the child process, forcing the parent + * to wait for the child to exit before exiting itself. + * + * ```js + * const { spawn } = require('node:child_process'); + * + * const subprocess = spawn(process.argv[0], ['child_program.js'], { + * detached: true, + * stdio: 'ignore', + * }); + * + * subprocess.unref(); + * subprocess.ref(); + * ``` + * @since v0.7.10 + */ + ref(): void; + /** + * events.EventEmitter + * 1. close + * 2. disconnect + * 3. error + * 4. exit + * 5. message + * 6. spawn + */ + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "close", listener: (code: number | null, signal: NodeJS.Signals | null) => void): this; + addListener(event: "disconnect", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "exit", listener: (code: number | null, signal: NodeJS.Signals | null) => void): this; + addListener(event: "message", listener: (message: Serializable, sendHandle: SendHandle) => void): this; + addListener(event: "spawn", listener: () => void): this; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close", code: number | null, signal: NodeJS.Signals | null): boolean; + emit(event: "disconnect"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "exit", code: number | null, signal: NodeJS.Signals | null): boolean; + emit(event: "message", message: Serializable, sendHandle: SendHandle): boolean; + emit(event: "spawn", listener: () => void): boolean; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "close", listener: (code: number | null, signal: NodeJS.Signals | null) => void): this; + on(event: "disconnect", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "exit", listener: (code: number | null, signal: NodeJS.Signals | null) => void): this; + on(event: "message", listener: (message: Serializable, sendHandle: SendHandle) => void): this; + on(event: "spawn", listener: () => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "close", listener: (code: number | null, signal: NodeJS.Signals | null) => void): this; + once(event: "disconnect", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "exit", listener: (code: number | null, signal: NodeJS.Signals | null) => void): this; + once(event: "message", listener: (message: Serializable, sendHandle: SendHandle) => void): this; + once(event: "spawn", listener: () => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: (code: number | null, signal: NodeJS.Signals | null) => void): this; + prependListener(event: "disconnect", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "exit", listener: (code: number | null, signal: NodeJS.Signals | null) => void): this; + prependListener(event: "message", listener: (message: Serializable, sendHandle: SendHandle) => void): this; + prependListener(event: "spawn", listener: () => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener( + event: "close", + listener: (code: number | null, signal: NodeJS.Signals | null) => void, + ): this; + prependOnceListener(event: "disconnect", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener( + event: "exit", + listener: (code: number | null, signal: NodeJS.Signals | null) => void, + ): this; + prependOnceListener(event: "message", listener: (message: Serializable, sendHandle: SendHandle) => void): this; + prependOnceListener(event: "spawn", listener: () => void): this; + } + // return this object when stdio option is undefined or not specified + interface ChildProcessWithoutNullStreams extends ChildProcess { + stdin: Writable; + stdout: Readable; + stderr: Readable; + readonly stdio: [ + Writable, + Readable, + Readable, + // stderr + Readable | Writable | null | undefined, + // extra, no modification + Readable | Writable | null | undefined, // extra, no modification + ]; + } + // return this object when stdio option is a tuple of 3 + interface ChildProcessByStdio + extends ChildProcess + { + stdin: I; + stdout: O; + stderr: E; + readonly stdio: [ + I, + O, + E, + Readable | Writable | null | undefined, + // extra, no modification + Readable | Writable | null | undefined, // extra, no modification + ]; + } + interface MessageOptions { + keepOpen?: boolean | undefined; + } + type IOType = "overlapped" | "pipe" | "ignore" | "inherit"; + type StdioOptions = IOType | Array; + type SerializationType = "json" | "advanced"; + interface MessagingOptions extends Abortable { + /** + * Specify the kind of serialization used for sending messages between processes. + * @default 'json' + */ + serialization?: SerializationType | undefined; + /** + * The signal value to be used when the spawned process will be killed by the abort signal. + * @default 'SIGTERM' + */ + killSignal?: NodeJS.Signals | number | undefined; + /** + * In milliseconds the maximum amount of time the process is allowed to run. + */ + timeout?: number | undefined; + } + interface ProcessEnvOptions { + uid?: number | undefined; + gid?: number | undefined; + cwd?: string | URL | undefined; + env?: NodeJS.ProcessEnv | undefined; + } + interface CommonOptions extends ProcessEnvOptions { + /** + * @default false + */ + windowsHide?: boolean | undefined; + /** + * @default 0 + */ + timeout?: number | undefined; + } + interface CommonSpawnOptions extends CommonOptions, MessagingOptions, Abortable { + argv0?: string | undefined; + /** + * Can be set to 'pipe', 'inherit', 'overlapped', or 'ignore', or an array of these strings. + * If passed as an array, the first element is used for `stdin`, the second for + * `stdout`, and the third for `stderr`. A fourth element can be used to + * specify the `stdio` behavior beyond the standard streams. See + * {@link ChildProcess.stdio} for more information. + * + * @default 'pipe' + */ + stdio?: StdioOptions | undefined; + shell?: boolean | string | undefined; + windowsVerbatimArguments?: boolean | undefined; + } + interface SpawnOptions extends CommonSpawnOptions { + detached?: boolean | undefined; + } + interface SpawnOptionsWithoutStdio extends SpawnOptions { + stdio?: StdioPipeNamed | StdioPipe[] | undefined; + } + type StdioNull = "inherit" | "ignore" | Stream; + type StdioPipeNamed = "pipe" | "overlapped"; + type StdioPipe = undefined | null | StdioPipeNamed; + interface SpawnOptionsWithStdioTuple< + Stdin extends StdioNull | StdioPipe, + Stdout extends StdioNull | StdioPipe, + Stderr extends StdioNull | StdioPipe, + > extends SpawnOptions { + stdio: [Stdin, Stdout, Stderr]; + } + /** + * The `child_process.spawn()` method spawns a new process using the given`command`, with command-line arguments in `args`. If omitted, `args` defaults + * to an empty array. + * + * **If the `shell` option is enabled, do not pass unsanitized user input to this** + * **function. Any input containing shell metacharacters may be used to trigger** + * **arbitrary command execution.** + * + * A third argument may be used to specify additional options, with these defaults: + * + * ```js + * const defaults = { + * cwd: undefined, + * env: process.env, + * }; + * ``` + * + * Use `cwd` to specify the working directory from which the process is spawned. + * If not given, the default is to inherit the current working directory. If given, + * but the path does not exist, the child process emits an `ENOENT` error + * and exits immediately. `ENOENT` is also emitted when the command + * does not exist. + * + * Use `env` to specify environment variables that will be visible to the new + * process, the default is `process.env`. + * + * `undefined` values in `env` will be ignored. + * + * Example of running `ls -lh /usr`, capturing `stdout`, `stderr`, and the + * exit code: + * + * ```js + * const { spawn } = require('node:child_process'); + * const ls = spawn('ls', ['-lh', '/usr']); + * + * ls.stdout.on('data', (data) => { + * console.log(`stdout: ${data}`); + * }); + * + * ls.stderr.on('data', (data) => { + * console.error(`stderr: ${data}`); + * }); + * + * ls.on('close', (code) => { + * console.log(`child process exited with code ${code}`); + * }); + * ``` + * + * Example: A very elaborate way to run `ps ax | grep ssh` + * + * ```js + * const { spawn } = require('node:child_process'); + * const ps = spawn('ps', ['ax']); + * const grep = spawn('grep', ['ssh']); + * + * ps.stdout.on('data', (data) => { + * grep.stdin.write(data); + * }); + * + * ps.stderr.on('data', (data) => { + * console.error(`ps stderr: ${data}`); + * }); + * + * ps.on('close', (code) => { + * if (code !== 0) { + * console.log(`ps process exited with code ${code}`); + * } + * grep.stdin.end(); + * }); + * + * grep.stdout.on('data', (data) => { + * console.log(data.toString()); + * }); + * + * grep.stderr.on('data', (data) => { + * console.error(`grep stderr: ${data}`); + * }); + * + * grep.on('close', (code) => { + * if (code !== 0) { + * console.log(`grep process exited with code ${code}`); + * } + * }); + * ``` + * + * Example of checking for failed `spawn`: + * + * ```js + * const { spawn } = require('node:child_process'); + * const subprocess = spawn('bad_command'); + * + * subprocess.on('error', (err) => { + * console.error('Failed to start subprocess.'); + * }); + * ``` + * + * Certain platforms (macOS, Linux) will use the value of `argv[0]` for the process + * title while others (Windows, SunOS) will use `command`. + * + * Node.js overwrites `argv[0]` with `process.execPath` on startup, so`process.argv[0]` in a Node.js child process will not match the `argv0`parameter passed to `spawn` from the parent. Retrieve + * it with the`process.argv0` property instead. + * + * If the `signal` option is enabled, calling `.abort()` on the corresponding`AbortController` is similar to calling `.kill()` on the child process except + * the error passed to the callback will be an `AbortError`: + * + * ```js + * const { spawn } = require('node:child_process'); + * const controller = new AbortController(); + * const { signal } = controller; + * const grep = spawn('grep', ['ssh'], { signal }); + * grep.on('error', (err) => { + * // This will be called with err being an AbortError if the controller aborts + * }); + * controller.abort(); // Stops the child process + * ``` + * @since v0.1.90 + * @param command The command to run. + * @param args List of string arguments. + */ + function spawn(command: string, options?: SpawnOptionsWithoutStdio): ChildProcessWithoutNullStreams; + function spawn( + command: string, + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn(command: string, options: SpawnOptions): ChildProcess; + // overloads of spawn with 'args' + function spawn( + command: string, + args?: readonly string[], + options?: SpawnOptionsWithoutStdio, + ): ChildProcessWithoutNullStreams; + function spawn( + command: string, + args: readonly string[], + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + args: readonly string[], + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + args: readonly string[], + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + args: readonly string[], + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + args: readonly string[], + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + args: readonly string[], + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + args: readonly string[], + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + args: readonly string[], + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn(command: string, args: readonly string[], options: SpawnOptions): ChildProcess; + interface ExecOptions extends CommonOptions { + shell?: string | undefined; + signal?: AbortSignal | undefined; + maxBuffer?: number | undefined; + killSignal?: NodeJS.Signals | number | undefined; + } + interface ExecOptionsWithStringEncoding extends ExecOptions { + encoding: BufferEncoding; + } + interface ExecOptionsWithBufferEncoding extends ExecOptions { + encoding: BufferEncoding | null; // specify `null`. + } + interface ExecException extends Error { + cmd?: string | undefined; + killed?: boolean | undefined; + code?: number | undefined; + signal?: NodeJS.Signals | undefined; + } + /** + * Spawns a shell then executes the `command` within that shell, buffering any + * generated output. The `command` string passed to the exec function is processed + * directly by the shell and special characters (vary based on [shell](https://en.wikipedia.org/wiki/List_of_command-line_interpreters)) + * need to be dealt with accordingly: + * + * ```js + * const { exec } = require('node:child_process'); + * + * exec('"/path/to/test file/test.sh" arg1 arg2'); + * // Double quotes are used so that the space in the path is not interpreted as + * // a delimiter of multiple arguments. + * + * exec('echo "The \\$HOME variable is $HOME"'); + * // The $HOME variable is escaped in the first instance, but not in the second. + * ``` + * + * **Never pass unsanitized user input to this function. Any input containing shell** + * **metacharacters may be used to trigger arbitrary command execution.** + * + * If a `callback` function is provided, it is called with the arguments`(error, stdout, stderr)`. On success, `error` will be `null`. On error,`error` will be an instance of `Error`. The + * `error.code` property will be + * the exit code of the process. By convention, any exit code other than `0`indicates an error. `error.signal` will be the signal that terminated the + * process. + * + * The `stdout` and `stderr` arguments passed to the callback will contain the + * stdout and stderr output of the child process. By default, Node.js will decode + * the output as UTF-8 and pass strings to the callback. The `encoding` option + * can be used to specify the character encoding used to decode the stdout and + * stderr output. If `encoding` is `'buffer'`, or an unrecognized character + * encoding, `Buffer` objects will be passed to the callback instead. + * + * ```js + * const { exec } = require('node:child_process'); + * exec('cat *.js missing_file | wc -l', (error, stdout, stderr) => { + * if (error) { + * console.error(`exec error: ${error}`); + * return; + * } + * console.log(`stdout: ${stdout}`); + * console.error(`stderr: ${stderr}`); + * }); + * ``` + * + * If `timeout` is greater than `0`, the parent will send the signal + * identified by the `killSignal` property (the default is `'SIGTERM'`) if the + * child runs longer than `timeout` milliseconds. + * + * Unlike the [`exec(3)`](http://man7.org/linux/man-pages/man3/exec.3.html) POSIX system call, `child_process.exec()` does not replace + * the existing process and uses a shell to execute the command. + * + * If this method is invoked as its `util.promisify()` ed version, it returns + * a `Promise` for an `Object` with `stdout` and `stderr` properties. The returned`ChildProcess` instance is attached to the `Promise` as a `child` property. In + * case of an error (including any error resulting in an exit code other than 0), a + * rejected promise is returned, with the same `error` object given in the + * callback, but with two additional properties `stdout` and `stderr`. + * + * ```js + * const util = require('node:util'); + * const exec = util.promisify(require('node:child_process').exec); + * + * async function lsExample() { + * const { stdout, stderr } = await exec('ls'); + * console.log('stdout:', stdout); + * console.error('stderr:', stderr); + * } + * lsExample(); + * ``` + * + * If the `signal` option is enabled, calling `.abort()` on the corresponding`AbortController` is similar to calling `.kill()` on the child process except + * the error passed to the callback will be an `AbortError`: + * + * ```js + * const { exec } = require('node:child_process'); + * const controller = new AbortController(); + * const { signal } = controller; + * const child = exec('grep ssh', { signal }, (error) => { + * console.error(error); // an AbortError + * }); + * controller.abort(); + * ``` + * @since v0.1.90 + * @param command The command to run, with space-separated arguments. + * @param callback called with the output when process terminates. + */ + function exec( + command: string, + callback?: (error: ExecException | null, stdout: string, stderr: string) => void, + ): ChildProcess; + // `options` with `"buffer"` or `null` for `encoding` means stdout/stderr are definitely `Buffer`. + function exec( + command: string, + options: { + encoding: "buffer" | null; + } & ExecOptions, + callback?: (error: ExecException | null, stdout: Buffer, stderr: Buffer) => void, + ): ChildProcess; + // `options` with well known `encoding` means stdout/stderr are definitely `string`. + function exec( + command: string, + options: { + encoding: BufferEncoding; + } & ExecOptions, + callback?: (error: ExecException | null, stdout: string, stderr: string) => void, + ): ChildProcess; + // `options` with an `encoding` whose type is `string` means stdout/stderr could either be `Buffer` or `string`. + // There is no guarantee the `encoding` is unknown as `string` is a superset of `BufferEncoding`. + function exec( + command: string, + options: { + encoding: BufferEncoding; + } & ExecOptions, + callback?: (error: ExecException | null, stdout: string | Buffer, stderr: string | Buffer) => void, + ): ChildProcess; + // `options` without an `encoding` means stdout/stderr are definitely `string`. + function exec( + command: string, + options: ExecOptions, + callback?: (error: ExecException | null, stdout: string, stderr: string) => void, + ): ChildProcess; + // fallback if nothing else matches. Worst case is always `string | Buffer`. + function exec( + command: string, + options: (ObjectEncodingOptions & ExecOptions) | undefined | null, + callback?: (error: ExecException | null, stdout: string | Buffer, stderr: string | Buffer) => void, + ): ChildProcess; + interface PromiseWithChild extends Promise { + child: ChildProcess; + } + namespace exec { + function __promisify__(command: string): PromiseWithChild<{ + stdout: string; + stderr: string; + }>; + function __promisify__( + command: string, + options: { + encoding: "buffer" | null; + } & ExecOptions, + ): PromiseWithChild<{ + stdout: Buffer; + stderr: Buffer; + }>; + function __promisify__( + command: string, + options: { + encoding: BufferEncoding; + } & ExecOptions, + ): PromiseWithChild<{ + stdout: string; + stderr: string; + }>; + function __promisify__( + command: string, + options: ExecOptions, + ): PromiseWithChild<{ + stdout: string; + stderr: string; + }>; + function __promisify__( + command: string, + options?: (ObjectEncodingOptions & ExecOptions) | null, + ): PromiseWithChild<{ + stdout: string | Buffer; + stderr: string | Buffer; + }>; + } + interface ExecFileOptions extends CommonOptions, Abortable { + maxBuffer?: number | undefined; + killSignal?: NodeJS.Signals | number | undefined; + windowsVerbatimArguments?: boolean | undefined; + shell?: boolean | string | undefined; + signal?: AbortSignal | undefined; + } + interface ExecFileOptionsWithStringEncoding extends ExecFileOptions { + encoding: BufferEncoding; + } + interface ExecFileOptionsWithBufferEncoding extends ExecFileOptions { + encoding: "buffer" | null; + } + interface ExecFileOptionsWithOtherEncoding extends ExecFileOptions { + encoding: BufferEncoding; + } + type ExecFileException = + & Omit + & Omit + & { code?: string | number | undefined | null }; + /** + * The `child_process.execFile()` function is similar to {@link exec} except that it does not spawn a shell by default. Rather, the specified + * executable `file` is spawned directly as a new process making it slightly more + * efficient than {@link exec}. + * + * The same options as {@link exec} are supported. Since a shell is + * not spawned, behaviors such as I/O redirection and file globbing are not + * supported. + * + * ```js + * const { execFile } = require('node:child_process'); + * const child = execFile('node', ['--version'], (error, stdout, stderr) => { + * if (error) { + * throw error; + * } + * console.log(stdout); + * }); + * ``` + * + * The `stdout` and `stderr` arguments passed to the callback will contain the + * stdout and stderr output of the child process. By default, Node.js will decode + * the output as UTF-8 and pass strings to the callback. The `encoding` option + * can be used to specify the character encoding used to decode the stdout and + * stderr output. If `encoding` is `'buffer'`, or an unrecognized character + * encoding, `Buffer` objects will be passed to the callback instead. + * + * If this method is invoked as its `util.promisify()` ed version, it returns + * a `Promise` for an `Object` with `stdout` and `stderr` properties. The returned`ChildProcess` instance is attached to the `Promise` as a `child` property. In + * case of an error (including any error resulting in an exit code other than 0), a + * rejected promise is returned, with the same `error` object given in the + * callback, but with two additional properties `stdout` and `stderr`. + * + * ```js + * const util = require('node:util'); + * const execFile = util.promisify(require('node:child_process').execFile); + * async function getVersion() { + * const { stdout } = await execFile('node', ['--version']); + * console.log(stdout); + * } + * getVersion(); + * ``` + * + * **If the `shell` option is enabled, do not pass unsanitized user input to this** + * **function. Any input containing shell metacharacters may be used to trigger** + * **arbitrary command execution.** + * + * If the `signal` option is enabled, calling `.abort()` on the corresponding`AbortController` is similar to calling `.kill()` on the child process except + * the error passed to the callback will be an `AbortError`: + * + * ```js + * const { execFile } = require('node:child_process'); + * const controller = new AbortController(); + * const { signal } = controller; + * const child = execFile('node', ['--version'], { signal }, (error) => { + * console.error(error); // an AbortError + * }); + * controller.abort(); + * ``` + * @since v0.1.91 + * @param file The name or path of the executable file to run. + * @param args List of string arguments. + * @param callback Called with the output when process terminates. + */ + function execFile(file: string): ChildProcess; + function execFile( + file: string, + options: (ObjectEncodingOptions & ExecFileOptions) | undefined | null, + ): ChildProcess; + function execFile(file: string, args?: readonly string[] | null): ChildProcess; + function execFile( + file: string, + args: readonly string[] | undefined | null, + options: (ObjectEncodingOptions & ExecFileOptions) | undefined | null, + ): ChildProcess; + // no `options` definitely means stdout/stderr are `string`. + function execFile( + file: string, + callback: (error: ExecFileException | null, stdout: string, stderr: string) => void, + ): ChildProcess; + function execFile( + file: string, + args: readonly string[] | undefined | null, + callback: (error: ExecFileException | null, stdout: string, stderr: string) => void, + ): ChildProcess; + // `options` with `"buffer"` or `null` for `encoding` means stdout/stderr are definitely `Buffer`. + function execFile( + file: string, + options: ExecFileOptionsWithBufferEncoding, + callback: (error: ExecFileException | null, stdout: Buffer, stderr: Buffer) => void, + ): ChildProcess; + function execFile( + file: string, + args: readonly string[] | undefined | null, + options: ExecFileOptionsWithBufferEncoding, + callback: (error: ExecFileException | null, stdout: Buffer, stderr: Buffer) => void, + ): ChildProcess; + // `options` with well known `encoding` means stdout/stderr are definitely `string`. + function execFile( + file: string, + options: ExecFileOptionsWithStringEncoding, + callback: (error: ExecFileException | null, stdout: string, stderr: string) => void, + ): ChildProcess; + function execFile( + file: string, + args: readonly string[] | undefined | null, + options: ExecFileOptionsWithStringEncoding, + callback: (error: ExecFileException | null, stdout: string, stderr: string) => void, + ): ChildProcess; + // `options` with an `encoding` whose type is `string` means stdout/stderr could either be `Buffer` or `string`. + // There is no guarantee the `encoding` is unknown as `string` is a superset of `BufferEncoding`. + function execFile( + file: string, + options: ExecFileOptionsWithOtherEncoding, + callback: (error: ExecFileException | null, stdout: string | Buffer, stderr: string | Buffer) => void, + ): ChildProcess; + function execFile( + file: string, + args: readonly string[] | undefined | null, + options: ExecFileOptionsWithOtherEncoding, + callback: (error: ExecFileException | null, stdout: string | Buffer, stderr: string | Buffer) => void, + ): ChildProcess; + // `options` without an `encoding` means stdout/stderr are definitely `string`. + function execFile( + file: string, + options: ExecFileOptions, + callback: (error: ExecFileException | null, stdout: string, stderr: string) => void, + ): ChildProcess; + function execFile( + file: string, + args: readonly string[] | undefined | null, + options: ExecFileOptions, + callback: (error: ExecFileException | null, stdout: string, stderr: string) => void, + ): ChildProcess; + // fallback if nothing else matches. Worst case is always `string | Buffer`. + function execFile( + file: string, + options: (ObjectEncodingOptions & ExecFileOptions) | undefined | null, + callback: + | ((error: ExecFileException | null, stdout: string | Buffer, stderr: string | Buffer) => void) + | undefined + | null, + ): ChildProcess; + function execFile( + file: string, + args: readonly string[] | undefined | null, + options: (ObjectEncodingOptions & ExecFileOptions) | undefined | null, + callback: + | ((error: ExecFileException | null, stdout: string | Buffer, stderr: string | Buffer) => void) + | undefined + | null, + ): ChildProcess; + namespace execFile { + function __promisify__(file: string): PromiseWithChild<{ + stdout: string; + stderr: string; + }>; + function __promisify__( + file: string, + args: readonly string[] | undefined | null, + ): PromiseWithChild<{ + stdout: string; + stderr: string; + }>; + function __promisify__( + file: string, + options: ExecFileOptionsWithBufferEncoding, + ): PromiseWithChild<{ + stdout: Buffer; + stderr: Buffer; + }>; + function __promisify__( + file: string, + args: readonly string[] | undefined | null, + options: ExecFileOptionsWithBufferEncoding, + ): PromiseWithChild<{ + stdout: Buffer; + stderr: Buffer; + }>; + function __promisify__( + file: string, + options: ExecFileOptionsWithStringEncoding, + ): PromiseWithChild<{ + stdout: string; + stderr: string; + }>; + function __promisify__( + file: string, + args: readonly string[] | undefined | null, + options: ExecFileOptionsWithStringEncoding, + ): PromiseWithChild<{ + stdout: string; + stderr: string; + }>; + function __promisify__( + file: string, + options: ExecFileOptionsWithOtherEncoding, + ): PromiseWithChild<{ + stdout: string | Buffer; + stderr: string | Buffer; + }>; + function __promisify__( + file: string, + args: readonly string[] | undefined | null, + options: ExecFileOptionsWithOtherEncoding, + ): PromiseWithChild<{ + stdout: string | Buffer; + stderr: string | Buffer; + }>; + function __promisify__( + file: string, + options: ExecFileOptions, + ): PromiseWithChild<{ + stdout: string; + stderr: string; + }>; + function __promisify__( + file: string, + args: readonly string[] | undefined | null, + options: ExecFileOptions, + ): PromiseWithChild<{ + stdout: string; + stderr: string; + }>; + function __promisify__( + file: string, + options: (ObjectEncodingOptions & ExecFileOptions) | undefined | null, + ): PromiseWithChild<{ + stdout: string | Buffer; + stderr: string | Buffer; + }>; + function __promisify__( + file: string, + args: readonly string[] | undefined | null, + options: (ObjectEncodingOptions & ExecFileOptions) | undefined | null, + ): PromiseWithChild<{ + stdout: string | Buffer; + stderr: string | Buffer; + }>; + } + interface ForkOptions extends ProcessEnvOptions, MessagingOptions, Abortable { + execPath?: string | undefined; + execArgv?: string[] | undefined; + silent?: boolean | undefined; + /** + * Can be set to 'pipe', 'inherit', 'overlapped', or 'ignore', or an array of these strings. + * If passed as an array, the first element is used for `stdin`, the second for + * `stdout`, and the third for `stderr`. A fourth element can be used to + * specify the `stdio` behavior beyond the standard streams. See + * {@link ChildProcess.stdio} for more information. + * + * @default 'pipe' + */ + stdio?: StdioOptions | undefined; + detached?: boolean | undefined; + windowsVerbatimArguments?: boolean | undefined; + } + /** + * The `child_process.fork()` method is a special case of {@link spawn} used specifically to spawn new Node.js processes. + * Like {@link spawn}, a `ChildProcess` object is returned. The + * returned `ChildProcess` will have an additional communication channel + * built-in that allows messages to be passed back and forth between the parent and + * child. See `subprocess.send()` for details. + * + * Keep in mind that spawned Node.js child processes are + * independent of the parent with exception of the IPC communication channel + * that is established between the two. Each process has its own memory, with + * their own V8 instances. Because of the additional resource allocations + * required, spawning a large number of child Node.js processes is not + * recommended. + * + * By default, `child_process.fork()` will spawn new Node.js instances using the `process.execPath` of the parent process. The `execPath` property in the`options` object allows for an alternative + * execution path to be used. + * + * Node.js processes launched with a custom `execPath` will communicate with the + * parent process using the file descriptor (fd) identified using the + * environment variable `NODE_CHANNEL_FD` on the child process. + * + * Unlike the [`fork(2)`](http://man7.org/linux/man-pages/man2/fork.2.html) POSIX system call, `child_process.fork()` does not clone the + * current process. + * + * The `shell` option available in {@link spawn} is not supported by`child_process.fork()` and will be ignored if set. + * + * If the `signal` option is enabled, calling `.abort()` on the corresponding`AbortController` is similar to calling `.kill()` on the child process except + * the error passed to the callback will be an `AbortError`: + * + * ```js + * if (process.argv[2] === 'child') { + * setTimeout(() => { + * console.log(`Hello from ${process.argv[2]}!`); + * }, 1_000); + * } else { + * const { fork } = require('node:child_process'); + * const controller = new AbortController(); + * const { signal } = controller; + * const child = fork(__filename, ['child'], { signal }); + * child.on('error', (err) => { + * // This will be called with err being an AbortError if the controller aborts + * }); + * controller.abort(); // Stops the child process + * } + * ``` + * @since v0.5.0 + * @param modulePath The module to run in the child. + * @param args List of string arguments. + */ + function fork(modulePath: string, options?: ForkOptions): ChildProcess; + function fork(modulePath: string, args?: readonly string[], options?: ForkOptions): ChildProcess; + interface SpawnSyncOptions extends CommonSpawnOptions { + input?: string | NodeJS.ArrayBufferView | undefined; + maxBuffer?: number | undefined; + encoding?: BufferEncoding | "buffer" | null | undefined; + } + interface SpawnSyncOptionsWithStringEncoding extends SpawnSyncOptions { + encoding: BufferEncoding; + } + interface SpawnSyncOptionsWithBufferEncoding extends SpawnSyncOptions { + encoding?: "buffer" | null | undefined; + } + interface SpawnSyncReturns { + pid: number; + output: Array; + stdout: T; + stderr: T; + status: number | null; + signal: NodeJS.Signals | null; + error?: Error | undefined; + } + /** + * The `child_process.spawnSync()` method is generally identical to {@link spawn} with the exception that the function will not return + * until the child process has fully closed. When a timeout has been encountered + * and `killSignal` is sent, the method won't return until the process has + * completely exited. If the process intercepts and handles the `SIGTERM` signal + * and doesn't exit, the parent process will wait until the child process has + * exited. + * + * **If the `shell` option is enabled, do not pass unsanitized user input to this** + * **function. Any input containing shell metacharacters may be used to trigger** + * **arbitrary command execution.** + * @since v0.11.12 + * @param command The command to run. + * @param args List of string arguments. + */ + function spawnSync(command: string): SpawnSyncReturns; + function spawnSync(command: string, options: SpawnSyncOptionsWithStringEncoding): SpawnSyncReturns; + function spawnSync(command: string, options: SpawnSyncOptionsWithBufferEncoding): SpawnSyncReturns; + function spawnSync(command: string, options?: SpawnSyncOptions): SpawnSyncReturns; + function spawnSync(command: string, args: readonly string[]): SpawnSyncReturns; + function spawnSync( + command: string, + args: readonly string[], + options: SpawnSyncOptionsWithStringEncoding, + ): SpawnSyncReturns; + function spawnSync( + command: string, + args: readonly string[], + options: SpawnSyncOptionsWithBufferEncoding, + ): SpawnSyncReturns; + function spawnSync( + command: string, + args?: readonly string[], + options?: SpawnSyncOptions, + ): SpawnSyncReturns; + interface CommonExecOptions extends CommonOptions { + input?: string | NodeJS.ArrayBufferView | undefined; + /** + * Can be set to 'pipe', 'inherit, or 'ignore', or an array of these strings. + * If passed as an array, the first element is used for `stdin`, the second for + * `stdout`, and the third for `stderr`. A fourth element can be used to + * specify the `stdio` behavior beyond the standard streams. See + * {@link ChildProcess.stdio} for more information. + * + * @default 'pipe' + */ + stdio?: StdioOptions | undefined; + killSignal?: NodeJS.Signals | number | undefined; + maxBuffer?: number | undefined; + encoding?: BufferEncoding | "buffer" | null | undefined; + } + interface ExecSyncOptions extends CommonExecOptions { + shell?: string | undefined; + } + interface ExecSyncOptionsWithStringEncoding extends ExecSyncOptions { + encoding: BufferEncoding; + } + interface ExecSyncOptionsWithBufferEncoding extends ExecSyncOptions { + encoding?: "buffer" | null | undefined; + } + /** + * The `child_process.execSync()` method is generally identical to {@link exec} with the exception that the method will not return + * until the child process has fully closed. When a timeout has been encountered + * and `killSignal` is sent, the method won't return until the process has + * completely exited. If the child process intercepts and handles the `SIGTERM`signal and doesn't exit, the parent process will wait until the child process + * has exited. + * + * If the process times out or has a non-zero exit code, this method will throw. + * The `Error` object will contain the entire result from {@link spawnSync}. + * + * **Never pass unsanitized user input to this function. Any input containing shell** + * **metacharacters may be used to trigger arbitrary command execution.** + * @since v0.11.12 + * @param command The command to run. + * @return The stdout from the command. + */ + function execSync(command: string): Buffer; + function execSync(command: string, options: ExecSyncOptionsWithStringEncoding): string; + function execSync(command: string, options: ExecSyncOptionsWithBufferEncoding): Buffer; + function execSync(command: string, options?: ExecSyncOptions): string | Buffer; + interface ExecFileSyncOptions extends CommonExecOptions { + shell?: boolean | string | undefined; + } + interface ExecFileSyncOptionsWithStringEncoding extends ExecFileSyncOptions { + encoding: BufferEncoding; + } + interface ExecFileSyncOptionsWithBufferEncoding extends ExecFileSyncOptions { + encoding?: "buffer" | null; // specify `null`. + } + /** + * The `child_process.execFileSync()` method is generally identical to {@link execFile} with the exception that the method will not + * return until the child process has fully closed. When a timeout has been + * encountered and `killSignal` is sent, the method won't return until the process + * has completely exited. + * + * If the child process intercepts and handles the `SIGTERM` signal and + * does not exit, the parent process will still wait until the child process has + * exited. + * + * If the process times out or has a non-zero exit code, this method will throw an `Error` that will include the full result of the underlying {@link spawnSync}. + * + * **If the `shell` option is enabled, do not pass unsanitized user input to this** + * **function. Any input containing shell metacharacters may be used to trigger** + * **arbitrary command execution.** + * @since v0.11.12 + * @param file The name or path of the executable file to run. + * @param args List of string arguments. + * @return The stdout from the command. + */ + function execFileSync(file: string): Buffer; + function execFileSync(file: string, options: ExecFileSyncOptionsWithStringEncoding): string; + function execFileSync(file: string, options: ExecFileSyncOptionsWithBufferEncoding): Buffer; + function execFileSync(file: string, options?: ExecFileSyncOptions): string | Buffer; + function execFileSync(file: string, args: readonly string[]): Buffer; + function execFileSync( + file: string, + args: readonly string[], + options: ExecFileSyncOptionsWithStringEncoding, + ): string; + function execFileSync( + file: string, + args: readonly string[], + options: ExecFileSyncOptionsWithBufferEncoding, + ): Buffer; + function execFileSync(file: string, args?: readonly string[], options?: ExecFileSyncOptions): string | Buffer; +} +declare module "node:child_process" { + export * from "child_process"; +} diff --git a/task/node_modules/@types/node/cluster.d.ts b/task/node_modules/@types/node/cluster.d.ts new file mode 100644 index 0000000..39cd56a --- /dev/null +++ b/task/node_modules/@types/node/cluster.d.ts @@ -0,0 +1,432 @@ +/** + * Clusters of Node.js processes can be used to run multiple instances of Node.js + * that can distribute workloads among their application threads. When process + * isolation is not needed, use the `worker_threads` module instead, which + * allows running multiple application threads within a single Node.js instance. + * + * The cluster module allows easy creation of child processes that all share + * server ports. + * + * ```js + * import cluster from 'node:cluster'; + * import http from 'node:http'; + * import { availableParallelism } from 'node:os'; + * import process from 'node:process'; + * + * const numCPUs = availableParallelism(); + * + * if (cluster.isPrimary) { + * console.log(`Primary ${process.pid} is running`); + * + * // Fork workers. + * for (let i = 0; i < numCPUs; i++) { + * cluster.fork(); + * } + * + * cluster.on('exit', (worker, code, signal) => { + * console.log(`worker ${worker.process.pid} died`); + * }); + * } else { + * // Workers can share any TCP connection + * // In this case it is an HTTP server + * http.createServer((req, res) => { + * res.writeHead(200); + * res.end('hello world\n'); + * }).listen(8000); + * + * console.log(`Worker ${process.pid} started`); + * } + * ``` + * + * Running Node.js will now share port 8000 between the workers: + * + * ```console + * $ node server.js + * Primary 3596 is running + * Worker 4324 started + * Worker 4520 started + * Worker 6056 started + * Worker 5644 started + * ``` + * + * On Windows, it is not yet possible to set up a named pipe server in a worker. + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/cluster.js) + */ +declare module "cluster" { + import * as child from "node:child_process"; + import EventEmitter = require("node:events"); + import * as net from "node:net"; + type SerializationType = "json" | "advanced"; + export interface ClusterSettings { + execArgv?: string[] | undefined; // default: process.execArgv + exec?: string | undefined; + args?: string[] | undefined; + silent?: boolean | undefined; + stdio?: any[] | undefined; + uid?: number | undefined; + gid?: number | undefined; + inspectPort?: number | (() => number) | undefined; + serialization?: SerializationType | undefined; + cwd?: string | undefined; + windowsHide?: boolean | undefined; + } + export interface Address { + address: string; + port: number; + addressType: number | "udp4" | "udp6"; // 4, 6, -1, "udp4", "udp6" + } + /** + * A `Worker` object contains all public information and method about a worker. + * In the primary it can be obtained using `cluster.workers`. In a worker + * it can be obtained using `cluster.worker`. + * @since v0.7.0 + */ + export class Worker extends EventEmitter { + /** + * Each new worker is given its own unique id, this id is stored in the`id`. + * + * While a worker is alive, this is the key that indexes it in`cluster.workers`. + * @since v0.8.0 + */ + id: number; + /** + * All workers are created using `child_process.fork()`, the returned object + * from this function is stored as `.process`. In a worker, the global `process`is stored. + * + * See: `Child Process module`. + * + * Workers will call `process.exit(0)` if the `'disconnect'` event occurs + * on `process` and `.exitedAfterDisconnect` is not `true`. This protects against + * accidental disconnection. + * @since v0.7.0 + */ + process: child.ChildProcess; + /** + * Send a message to a worker or primary, optionally with a handle. + * + * In the primary, this sends a message to a specific worker. It is identical to `ChildProcess.send()`. + * + * In a worker, this sends a message to the primary. It is identical to`process.send()`. + * + * This example will echo back all messages from the primary: + * + * ```js + * if (cluster.isPrimary) { + * const worker = cluster.fork(); + * worker.send('hi there'); + * + * } else if (cluster.isWorker) { + * process.on('message', (msg) => { + * process.send(msg); + * }); + * } + * ``` + * @since v0.7.0 + * @param options The `options` argument, if present, is an object used to parameterize the sending of certain types of handles. `options` supports the following properties: + */ + send(message: child.Serializable, callback?: (error: Error | null) => void): boolean; + send( + message: child.Serializable, + sendHandle: child.SendHandle, + callback?: (error: Error | null) => void, + ): boolean; + send( + message: child.Serializable, + sendHandle: child.SendHandle, + options?: child.MessageOptions, + callback?: (error: Error | null) => void, + ): boolean; + /** + * This function will kill the worker. In the primary worker, it does this by + * disconnecting the `worker.process`, and once disconnected, killing with`signal`. In the worker, it does it by killing the process with `signal`. + * + * The `kill()` function kills the worker process without waiting for a graceful + * disconnect, it has the same behavior as `worker.process.kill()`. + * + * This method is aliased as `worker.destroy()` for backwards compatibility. + * + * In a worker, `process.kill()` exists, but it is not this function; + * it is `kill()`. + * @since v0.9.12 + * @param [signal='SIGTERM'] Name of the kill signal to send to the worker process. + */ + kill(signal?: string): void; + destroy(signal?: string): void; + /** + * In a worker, this function will close all servers, wait for the `'close'` event + * on those servers, and then disconnect the IPC channel. + * + * In the primary, an internal message is sent to the worker causing it to call`.disconnect()` on itself. + * + * Causes `.exitedAfterDisconnect` to be set. + * + * After a server is closed, it will no longer accept new connections, + * but connections may be accepted by any other listening worker. Existing + * connections will be allowed to close as usual. When no more connections exist, + * see `server.close()`, the IPC channel to the worker will close allowing it + * to die gracefully. + * + * The above applies _only_ to server connections, client connections are not + * automatically closed by workers, and disconnect does not wait for them to close + * before exiting. + * + * In a worker, `process.disconnect` exists, but it is not this function; + * it is `disconnect()`. + * + * Because long living server connections may block workers from disconnecting, it + * may be useful to send a message, so application specific actions may be taken to + * close them. It also may be useful to implement a timeout, killing a worker if + * the `'disconnect'` event has not been emitted after some time. + * + * ```js + * if (cluster.isPrimary) { + * const worker = cluster.fork(); + * let timeout; + * + * worker.on('listening', (address) => { + * worker.send('shutdown'); + * worker.disconnect(); + * timeout = setTimeout(() => { + * worker.kill(); + * }, 2000); + * }); + * + * worker.on('disconnect', () => { + * clearTimeout(timeout); + * }); + * + * } else if (cluster.isWorker) { + * const net = require('node:net'); + * const server = net.createServer((socket) => { + * // Connections never end + * }); + * + * server.listen(8000); + * + * process.on('message', (msg) => { + * if (msg === 'shutdown') { + * // Initiate graceful close of any connections to server + * } + * }); + * } + * ``` + * @since v0.7.7 + * @return A reference to `worker`. + */ + disconnect(): void; + /** + * This function returns `true` if the worker is connected to its primary via its + * IPC channel, `false` otherwise. A worker is connected to its primary after it + * has been created. It is disconnected after the `'disconnect'` event is emitted. + * @since v0.11.14 + */ + isConnected(): boolean; + /** + * This function returns `true` if the worker's process has terminated (either + * because of exiting or being signaled). Otherwise, it returns `false`. + * + * ```js + * import cluster from 'node:cluster'; + * import http from 'node:http'; + * import { availableParallelism } from 'node:os'; + * import process from 'node:process'; + * + * const numCPUs = availableParallelism(); + * + * if (cluster.isPrimary) { + * console.log(`Primary ${process.pid} is running`); + * + * // Fork workers. + * for (let i = 0; i < numCPUs; i++) { + * cluster.fork(); + * } + * + * cluster.on('fork', (worker) => { + * console.log('worker is dead:', worker.isDead()); + * }); + * + * cluster.on('exit', (worker, code, signal) => { + * console.log('worker is dead:', worker.isDead()); + * }); + * } else { + * // Workers can share any TCP connection. In this case, it is an HTTP server. + * http.createServer((req, res) => { + * res.writeHead(200); + * res.end(`Current process\n ${process.pid}`); + * process.kill(process.pid); + * }).listen(8000); + * } + * ``` + * @since v0.11.14 + */ + isDead(): boolean; + /** + * This property is `true` if the worker exited due to `.disconnect()`. + * If the worker exited any other way, it is `false`. If the + * worker has not exited, it is `undefined`. + * + * The boolean `worker.exitedAfterDisconnect` allows distinguishing between + * voluntary and accidental exit, the primary may choose not to respawn a worker + * based on this value. + * + * ```js + * cluster.on('exit', (worker, code, signal) => { + * if (worker.exitedAfterDisconnect === true) { + * console.log('Oh, it was just voluntary – no need to worry'); + * } + * }); + * + * // kill worker + * worker.kill(); + * ``` + * @since v6.0.0 + */ + exitedAfterDisconnect: boolean; + /** + * events.EventEmitter + * 1. disconnect + * 2. error + * 3. exit + * 4. listening + * 5. message + * 6. online + */ + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "disconnect", listener: () => void): this; + addListener(event: "error", listener: (error: Error) => void): this; + addListener(event: "exit", listener: (code: number, signal: string) => void): this; + addListener(event: "listening", listener: (address: Address) => void): this; + addListener(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + addListener(event: "online", listener: () => void): this; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "disconnect"): boolean; + emit(event: "error", error: Error): boolean; + emit(event: "exit", code: number, signal: string): boolean; + emit(event: "listening", address: Address): boolean; + emit(event: "message", message: any, handle: net.Socket | net.Server): boolean; + emit(event: "online"): boolean; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "disconnect", listener: () => void): this; + on(event: "error", listener: (error: Error) => void): this; + on(event: "exit", listener: (code: number, signal: string) => void): this; + on(event: "listening", listener: (address: Address) => void): this; + on(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + on(event: "online", listener: () => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "disconnect", listener: () => void): this; + once(event: "error", listener: (error: Error) => void): this; + once(event: "exit", listener: (code: number, signal: string) => void): this; + once(event: "listening", listener: (address: Address) => void): this; + once(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + once(event: "online", listener: () => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "disconnect", listener: () => void): this; + prependListener(event: "error", listener: (error: Error) => void): this; + prependListener(event: "exit", listener: (code: number, signal: string) => void): this; + prependListener(event: "listening", listener: (address: Address) => void): this; + prependListener(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + prependListener(event: "online", listener: () => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "disconnect", listener: () => void): this; + prependOnceListener(event: "error", listener: (error: Error) => void): this; + prependOnceListener(event: "exit", listener: (code: number, signal: string) => void): this; + prependOnceListener(event: "listening", listener: (address: Address) => void): this; + prependOnceListener(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + prependOnceListener(event: "online", listener: () => void): this; + } + export interface Cluster extends EventEmitter { + disconnect(callback?: () => void): void; + fork(env?: any): Worker; + /** @deprecated since v16.0.0 - use isPrimary. */ + readonly isMaster: boolean; + readonly isPrimary: boolean; + readonly isWorker: boolean; + schedulingPolicy: number; + readonly settings: ClusterSettings; + /** @deprecated since v16.0.0 - use setupPrimary. */ + setupMaster(settings?: ClusterSettings): void; + /** + * `setupPrimary` is used to change the default 'fork' behavior. Once called, the settings will be present in cluster.settings. + */ + setupPrimary(settings?: ClusterSettings): void; + readonly worker?: Worker | undefined; + readonly workers?: NodeJS.Dict | undefined; + readonly SCHED_NONE: number; + readonly SCHED_RR: number; + /** + * events.EventEmitter + * 1. disconnect + * 2. exit + * 3. fork + * 4. listening + * 5. message + * 6. online + * 7. setup + */ + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "disconnect", listener: (worker: Worker) => void): this; + addListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; + addListener(event: "fork", listener: (worker: Worker) => void): this; + addListener(event: "listening", listener: (worker: Worker, address: Address) => void): this; + addListener( + event: "message", + listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void, + ): this; // the handle is a net.Socket or net.Server object, or undefined. + addListener(event: "online", listener: (worker: Worker) => void): this; + addListener(event: "setup", listener: (settings: ClusterSettings) => void): this; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "disconnect", worker: Worker): boolean; + emit(event: "exit", worker: Worker, code: number, signal: string): boolean; + emit(event: "fork", worker: Worker): boolean; + emit(event: "listening", worker: Worker, address: Address): boolean; + emit(event: "message", worker: Worker, message: any, handle: net.Socket | net.Server): boolean; + emit(event: "online", worker: Worker): boolean; + emit(event: "setup", settings: ClusterSettings): boolean; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "disconnect", listener: (worker: Worker) => void): this; + on(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; + on(event: "fork", listener: (worker: Worker) => void): this; + on(event: "listening", listener: (worker: Worker, address: Address) => void): this; + on(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + on(event: "online", listener: (worker: Worker) => void): this; + on(event: "setup", listener: (settings: ClusterSettings) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "disconnect", listener: (worker: Worker) => void): this; + once(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; + once(event: "fork", listener: (worker: Worker) => void): this; + once(event: "listening", listener: (worker: Worker, address: Address) => void): this; + once(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + once(event: "online", listener: (worker: Worker) => void): this; + once(event: "setup", listener: (settings: ClusterSettings) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "disconnect", listener: (worker: Worker) => void): this; + prependListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; + prependListener(event: "fork", listener: (worker: Worker) => void): this; + prependListener(event: "listening", listener: (worker: Worker, address: Address) => void): this; + // the handle is a net.Socket or net.Server object, or undefined. + prependListener( + event: "message", + listener: (worker: Worker, message: any, handle?: net.Socket | net.Server) => void, + ): this; + prependListener(event: "online", listener: (worker: Worker) => void): this; + prependListener(event: "setup", listener: (settings: ClusterSettings) => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "disconnect", listener: (worker: Worker) => void): this; + prependOnceListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; + prependOnceListener(event: "fork", listener: (worker: Worker) => void): this; + prependOnceListener(event: "listening", listener: (worker: Worker, address: Address) => void): this; + // the handle is a net.Socket or net.Server object, or undefined. + prependOnceListener( + event: "message", + listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void, + ): this; + prependOnceListener(event: "online", listener: (worker: Worker) => void): this; + prependOnceListener(event: "setup", listener: (settings: ClusterSettings) => void): this; + } + const cluster: Cluster; + export default cluster; +} +declare module "node:cluster" { + export * from "cluster"; + export { default as default } from "cluster"; +} diff --git a/task/node_modules/@types/node/console.d.ts b/task/node_modules/@types/node/console.d.ts new file mode 100644 index 0000000..bcc3450 --- /dev/null +++ b/task/node_modules/@types/node/console.d.ts @@ -0,0 +1,415 @@ +/** + * The `node:console` module provides a simple debugging console that is similar to + * the JavaScript console mechanism provided by web browsers. + * + * The module exports two specific components: + * + * * A `Console` class with methods such as `console.log()`, `console.error()`, and`console.warn()` that can be used to write to any Node.js stream. + * * A global `console` instance configured to write to `process.stdout` and `process.stderr`. The global `console` can be used without calling`require('node:console')`. + * + * _**Warning**_: The global console object's methods are neither consistently + * synchronous like the browser APIs they resemble, nor are they consistently + * asynchronous like all other Node.js streams. See the `note on process I/O` for + * more information. + * + * Example using the global `console`: + * + * ```js + * console.log('hello world'); + * // Prints: hello world, to stdout + * console.log('hello %s', 'world'); + * // Prints: hello world, to stdout + * console.error(new Error('Whoops, something bad happened')); + * // Prints error message and stack trace to stderr: + * // Error: Whoops, something bad happened + * // at [eval]:5:15 + * // at Script.runInThisContext (node:vm:132:18) + * // at Object.runInThisContext (node:vm:309:38) + * // at node:internal/process/execution:77:19 + * // at [eval]-wrapper:6:22 + * // at evalScript (node:internal/process/execution:76:60) + * // at node:internal/main/eval_string:23:3 + * + * const name = 'Will Robinson'; + * console.warn(`Danger ${name}! Danger!`); + * // Prints: Danger Will Robinson! Danger!, to stderr + * ``` + * + * Example using the `Console` class: + * + * ```js + * const out = getStreamSomehow(); + * const err = getStreamSomehow(); + * const myConsole = new console.Console(out, err); + * + * myConsole.log('hello world'); + * // Prints: hello world, to out + * myConsole.log('hello %s', 'world'); + * // Prints: hello world, to out + * myConsole.error(new Error('Whoops, something bad happened')); + * // Prints: [Error: Whoops, something bad happened], to err + * + * const name = 'Will Robinson'; + * myConsole.warn(`Danger ${name}! Danger!`); + * // Prints: Danger Will Robinson! Danger!, to err + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/console.js) + */ +declare module "console" { + import console = require("node:console"); + export = console; +} +declare module "node:console" { + import { InspectOptions } from "node:util"; + global { + // This needs to be global to avoid TS2403 in case lib.dom.d.ts is present in the same build + interface Console { + Console: console.ConsoleConstructor; + /** + * `console.assert()` writes a message if `value` is [falsy](https://developer.mozilla.org/en-US/docs/Glossary/Falsy) or omitted. It only + * writes a message and does not otherwise affect execution. The output always + * starts with `"Assertion failed"`. If provided, `message` is formatted using `util.format()`. + * + * If `value` is [truthy](https://developer.mozilla.org/en-US/docs/Glossary/Truthy), nothing happens. + * + * ```js + * console.assert(true, 'does nothing'); + * + * console.assert(false, 'Whoops %s work', 'didn\'t'); + * // Assertion failed: Whoops didn't work + * + * console.assert(); + * // Assertion failed + * ``` + * @since v0.1.101 + * @param value The value tested for being truthy. + * @param message All arguments besides `value` are used as error message. + */ + assert(value: any, message?: string, ...optionalParams: any[]): void; + /** + * When `stdout` is a TTY, calling `console.clear()` will attempt to clear the + * TTY. When `stdout` is not a TTY, this method does nothing. + * + * The specific operation of `console.clear()` can vary across operating systems + * and terminal types. For most Linux operating systems, `console.clear()`operates similarly to the `clear` shell command. On Windows, `console.clear()`will clear only the output in the + * current terminal viewport for the Node.js + * binary. + * @since v8.3.0 + */ + clear(): void; + /** + * Maintains an internal counter specific to `label` and outputs to `stdout` the + * number of times `console.count()` has been called with the given `label`. + * + * ```js + * > console.count() + * default: 1 + * undefined + * > console.count('default') + * default: 2 + * undefined + * > console.count('abc') + * abc: 1 + * undefined + * > console.count('xyz') + * xyz: 1 + * undefined + * > console.count('abc') + * abc: 2 + * undefined + * > console.count() + * default: 3 + * undefined + * > + * ``` + * @since v8.3.0 + * @param [label='default'] The display label for the counter. + */ + count(label?: string): void; + /** + * Resets the internal counter specific to `label`. + * + * ```js + * > console.count('abc'); + * abc: 1 + * undefined + * > console.countReset('abc'); + * undefined + * > console.count('abc'); + * abc: 1 + * undefined + * > + * ``` + * @since v8.3.0 + * @param [label='default'] The display label for the counter. + */ + countReset(label?: string): void; + /** + * The `console.debug()` function is an alias for {@link log}. + * @since v8.0.0 + */ + debug(message?: any, ...optionalParams: any[]): void; + /** + * Uses `util.inspect()` on `obj` and prints the resulting string to `stdout`. + * This function bypasses any custom `inspect()` function defined on `obj`. + * @since v0.1.101 + */ + dir(obj: any, options?: InspectOptions): void; + /** + * This method calls `console.log()` passing it the arguments received. + * This method does not produce any XML formatting. + * @since v8.0.0 + */ + dirxml(...data: any[]): void; + /** + * Prints to `stderr` with newline. Multiple arguments can be passed, with the + * first used as the primary message and all additional used as substitution + * values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html) (the arguments are all passed to `util.format()`). + * + * ```js + * const code = 5; + * console.error('error #%d', code); + * // Prints: error #5, to stderr + * console.error('error', code); + * // Prints: error 5, to stderr + * ``` + * + * If formatting elements (e.g. `%d`) are not found in the first string then `util.inspect()` is called on each argument and the resulting string + * values are concatenated. See `util.format()` for more information. + * @since v0.1.100 + */ + error(message?: any, ...optionalParams: any[]): void; + /** + * Increases indentation of subsequent lines by spaces for `groupIndentation`length. + * + * If one or more `label`s are provided, those are printed first without the + * additional indentation. + * @since v8.5.0 + */ + group(...label: any[]): void; + /** + * An alias for {@link group}. + * @since v8.5.0 + */ + groupCollapsed(...label: any[]): void; + /** + * Decreases indentation of subsequent lines by spaces for `groupIndentation`length. + * @since v8.5.0 + */ + groupEnd(): void; + /** + * The `console.info()` function is an alias for {@link log}. + * @since v0.1.100 + */ + info(message?: any, ...optionalParams: any[]): void; + /** + * Prints to `stdout` with newline. Multiple arguments can be passed, with the + * first used as the primary message and all additional used as substitution + * values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html) (the arguments are all passed to `util.format()`). + * + * ```js + * const count = 5; + * console.log('count: %d', count); + * // Prints: count: 5, to stdout + * console.log('count:', count); + * // Prints: count: 5, to stdout + * ``` + * + * See `util.format()` for more information. + * @since v0.1.100 + */ + log(message?: any, ...optionalParams: any[]): void; + /** + * Try to construct a table with the columns of the properties of `tabularData`(or use `properties`) and rows of `tabularData` and log it. Falls back to just + * logging the argument if it can't be parsed as tabular. + * + * ```js + * // These can't be parsed as tabular data + * console.table(Symbol()); + * // Symbol() + * + * console.table(undefined); + * // undefined + * + * console.table([{ a: 1, b: 'Y' }, { a: 'Z', b: 2 }]); + * // ┌─────────┬─────┬─────┐ + * // │ (index) │ a │ b │ + * // ├─────────┼─────┼─────┤ + * // │ 0 │ 1 │ 'Y' │ + * // │ 1 │ 'Z' │ 2 │ + * // └─────────┴─────┴─────┘ + * + * console.table([{ a: 1, b: 'Y' }, { a: 'Z', b: 2 }], ['a']); + * // ┌─────────┬─────┐ + * // │ (index) │ a │ + * // ├─────────┼─────┤ + * // │ 0 │ 1 │ + * // │ 1 │ 'Z' │ + * // └─────────┴─────┘ + * ``` + * @since v10.0.0 + * @param properties Alternate properties for constructing the table. + */ + table(tabularData: any, properties?: readonly string[]): void; + /** + * Starts a timer that can be used to compute the duration of an operation. Timers + * are identified by a unique `label`. Use the same `label` when calling {@link timeEnd} to stop the timer and output the elapsed time in + * suitable time units to `stdout`. For example, if the elapsed + * time is 3869ms, `console.timeEnd()` displays "3.869s". + * @since v0.1.104 + * @param [label='default'] + */ + time(label?: string): void; + /** + * Stops a timer that was previously started by calling {@link time} and + * prints the result to `stdout`: + * + * ```js + * console.time('bunch-of-stuff'); + * // Do a bunch of stuff. + * console.timeEnd('bunch-of-stuff'); + * // Prints: bunch-of-stuff: 225.438ms + * ``` + * @since v0.1.104 + * @param [label='default'] + */ + timeEnd(label?: string): void; + /** + * For a timer that was previously started by calling {@link time}, prints + * the elapsed time and other `data` arguments to `stdout`: + * + * ```js + * console.time('process'); + * const value = expensiveProcess1(); // Returns 42 + * console.timeLog('process', value); + * // Prints "process: 365.227ms 42". + * doExpensiveProcess2(value); + * console.timeEnd('process'); + * ``` + * @since v10.7.0 + * @param [label='default'] + */ + timeLog(label?: string, ...data: any[]): void; + /** + * Prints to `stderr` the string `'Trace: '`, followed by the `util.format()` formatted message and stack trace to the current position in the code. + * + * ```js + * console.trace('Show me'); + * // Prints: (stack trace will vary based on where trace is called) + * // Trace: Show me + * // at repl:2:9 + * // at REPLServer.defaultEval (repl.js:248:27) + * // at bound (domain.js:287:14) + * // at REPLServer.runBound [as eval] (domain.js:300:12) + * // at REPLServer. (repl.js:412:12) + * // at emitOne (events.js:82:20) + * // at REPLServer.emit (events.js:169:7) + * // at REPLServer.Interface._onLine (readline.js:210:10) + * // at REPLServer.Interface._line (readline.js:549:8) + * // at REPLServer.Interface._ttyWrite (readline.js:826:14) + * ``` + * @since v0.1.104 + */ + trace(message?: any, ...optionalParams: any[]): void; + /** + * The `console.warn()` function is an alias for {@link error}. + * @since v0.1.100 + */ + warn(message?: any, ...optionalParams: any[]): void; + // --- Inspector mode only --- + /** + * This method does not display anything unless used in the inspector. + * Starts a JavaScript CPU profile with an optional label. + */ + profile(label?: string): void; + /** + * This method does not display anything unless used in the inspector. + * Stops the current JavaScript CPU profiling session if one has been started and prints the report to the Profiles panel of the inspector. + */ + profileEnd(label?: string): void; + /** + * This method does not display anything unless used in the inspector. + * Adds an event with the label `label` to the Timeline panel of the inspector. + */ + timeStamp(label?: string): void; + } + /** + * The `console` module provides a simple debugging console that is similar to the + * JavaScript console mechanism provided by web browsers. + * + * The module exports two specific components: + * + * * A `Console` class with methods such as `console.log()`, `console.error()` and`console.warn()` that can be used to write to any Node.js stream. + * * A global `console` instance configured to write to `process.stdout` and `process.stderr`. The global `console` can be used without calling`require('console')`. + * + * _**Warning**_: The global console object's methods are neither consistently + * synchronous like the browser APIs they resemble, nor are they consistently + * asynchronous like all other Node.js streams. See the `note on process I/O` for + * more information. + * + * Example using the global `console`: + * + * ```js + * console.log('hello world'); + * // Prints: hello world, to stdout + * console.log('hello %s', 'world'); + * // Prints: hello world, to stdout + * console.error(new Error('Whoops, something bad happened')); + * // Prints error message and stack trace to stderr: + * // Error: Whoops, something bad happened + * // at [eval]:5:15 + * // at Script.runInThisContext (node:vm:132:18) + * // at Object.runInThisContext (node:vm:309:38) + * // at node:internal/process/execution:77:19 + * // at [eval]-wrapper:6:22 + * // at evalScript (node:internal/process/execution:76:60) + * // at node:internal/main/eval_string:23:3 + * + * const name = 'Will Robinson'; + * console.warn(`Danger ${name}! Danger!`); + * // Prints: Danger Will Robinson! Danger!, to stderr + * ``` + * + * Example using the `Console` class: + * + * ```js + * const out = getStreamSomehow(); + * const err = getStreamSomehow(); + * const myConsole = new console.Console(out, err); + * + * myConsole.log('hello world'); + * // Prints: hello world, to out + * myConsole.log('hello %s', 'world'); + * // Prints: hello world, to out + * myConsole.error(new Error('Whoops, something bad happened')); + * // Prints: [Error: Whoops, something bad happened], to err + * + * const name = 'Will Robinson'; + * myConsole.warn(`Danger ${name}! Danger!`); + * // Prints: Danger Will Robinson! Danger!, to err + * ``` + * @see [source](https://github.com/nodejs/node/blob/v16.4.2/lib/console.js) + */ + namespace console { + interface ConsoleConstructorOptions { + stdout: NodeJS.WritableStream; + stderr?: NodeJS.WritableStream | undefined; + ignoreErrors?: boolean | undefined; + colorMode?: boolean | "auto" | undefined; + inspectOptions?: InspectOptions | undefined; + /** + * Set group indentation + * @default 2 + */ + groupIndentation?: number | undefined; + } + interface ConsoleConstructor { + prototype: Console; + new(stdout: NodeJS.WritableStream, stderr?: NodeJS.WritableStream, ignoreErrors?: boolean): Console; + new(options: ConsoleConstructorOptions): Console; + } + } + var console: Console; + } + export = globalThis.console; +} diff --git a/task/node_modules/@types/node/constants.d.ts b/task/node_modules/@types/node/constants.d.ts new file mode 100644 index 0000000..c3ac2b8 --- /dev/null +++ b/task/node_modules/@types/node/constants.d.ts @@ -0,0 +1,19 @@ +/** @deprecated since v6.3.0 - use constants property exposed by the relevant module instead. */ +declare module "constants" { + import { constants as osConstants, SignalConstants } from "node:os"; + import { constants as cryptoConstants } from "node:crypto"; + import { constants as fsConstants } from "node:fs"; + + const exp: + & typeof osConstants.errno + & typeof osConstants.priority + & SignalConstants + & typeof cryptoConstants + & typeof fsConstants; + export = exp; +} + +declare module "node:constants" { + import constants = require("constants"); + export = constants; +} diff --git a/task/node_modules/@types/node/crypto.d.ts b/task/node_modules/@types/node/crypto.d.ts new file mode 100644 index 0000000..2f2038e --- /dev/null +++ b/task/node_modules/@types/node/crypto.d.ts @@ -0,0 +1,4456 @@ +/** + * The `node:crypto` module provides cryptographic functionality that includes a + * set of wrappers for OpenSSL's hash, HMAC, cipher, decipher, sign, and verify + * functions. + * + * ```js + * const { createHmac } = await import('node:crypto'); + * + * const secret = 'abcdefg'; + * const hash = createHmac('sha256', secret) + * .update('I love cupcakes') + * .digest('hex'); + * console.log(hash); + * // Prints: + * // c0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658e + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/crypto.js) + */ +declare module "crypto" { + import * as stream from "node:stream"; + import { PeerCertificate } from "node:tls"; + /** + * SPKAC is a Certificate Signing Request mechanism originally implemented by + * Netscape and was specified formally as part of HTML5's `keygen` element. + * + * `` is deprecated since [HTML 5.2](https://www.w3.org/TR/html52/changes.html#features-removed) and new projects + * should not use this element anymore. + * + * The `node:crypto` module provides the `Certificate` class for working with SPKAC + * data. The most common usage is handling output generated by the HTML5`` element. Node.js uses [OpenSSL's SPKAC + * implementation](https://www.openssl.org/docs/man3.0/man1/openssl-spkac.html) internally. + * @since v0.11.8 + */ + class Certificate { + /** + * ```js + * const { Certificate } = await import('node:crypto'); + * const spkac = getSpkacSomehow(); + * const challenge = Certificate.exportChallenge(spkac); + * console.log(challenge.toString('utf8')); + * // Prints: the challenge as a UTF8 string + * ``` + * @since v9.0.0 + * @param encoding The `encoding` of the `spkac` string. + * @return The challenge component of the `spkac` data structure, which includes a public key and a challenge. + */ + static exportChallenge(spkac: BinaryLike): Buffer; + /** + * ```js + * const { Certificate } = await import('node:crypto'); + * const spkac = getSpkacSomehow(); + * const publicKey = Certificate.exportPublicKey(spkac); + * console.log(publicKey); + * // Prints: the public key as + * ``` + * @since v9.0.0 + * @param encoding The `encoding` of the `spkac` string. + * @return The public key component of the `spkac` data structure, which includes a public key and a challenge. + */ + static exportPublicKey(spkac: BinaryLike, encoding?: string): Buffer; + /** + * ```js + * import { Buffer } from 'node:buffer'; + * const { Certificate } = await import('node:crypto'); + * + * const spkac = getSpkacSomehow(); + * console.log(Certificate.verifySpkac(Buffer.from(spkac))); + * // Prints: true or false + * ``` + * @since v9.0.0 + * @param encoding The `encoding` of the `spkac` string. + * @return `true` if the given `spkac` data structure is valid, `false` otherwise. + */ + static verifySpkac(spkac: NodeJS.ArrayBufferView): boolean; + /** + * @deprecated + * @param spkac + * @returns The challenge component of the `spkac` data structure, + * which includes a public key and a challenge. + */ + exportChallenge(spkac: BinaryLike): Buffer; + /** + * @deprecated + * @param spkac + * @param encoding The encoding of the spkac string. + * @returns The public key component of the `spkac` data structure, + * which includes a public key and a challenge. + */ + exportPublicKey(spkac: BinaryLike, encoding?: string): Buffer; + /** + * @deprecated + * @param spkac + * @returns `true` if the given `spkac` data structure is valid, + * `false` otherwise. + */ + verifySpkac(spkac: NodeJS.ArrayBufferView): boolean; + } + namespace constants { + // https://nodejs.org/dist/latest-v20.x/docs/api/crypto.html#crypto-constants + const OPENSSL_VERSION_NUMBER: number; + /** Applies multiple bug workarounds within OpenSSL. See https://www.openssl.org/docs/man1.0.2/ssl/SSL_CTX_set_options.html for detail. */ + const SSL_OP_ALL: number; + /** Allows legacy insecure renegotiation between OpenSSL and unpatched clients or servers. See https://www.openssl.org/docs/man1.0.2/ssl/SSL_CTX_set_options.html. */ + const SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION: number; + /** Attempts to use the server's preferences instead of the client's when selecting a cipher. See https://www.openssl.org/docs/man1.0.2/ssl/SSL_CTX_set_options.html. */ + const SSL_OP_CIPHER_SERVER_PREFERENCE: number; + /** Instructs OpenSSL to use Cisco's "speshul" version of DTLS_BAD_VER. */ + const SSL_OP_CISCO_ANYCONNECT: number; + /** Instructs OpenSSL to turn on cookie exchange. */ + const SSL_OP_COOKIE_EXCHANGE: number; + /** Instructs OpenSSL to add server-hello extension from an early version of the cryptopro draft. */ + const SSL_OP_CRYPTOPRO_TLSEXT_BUG: number; + /** Instructs OpenSSL to disable a SSL 3.0/TLS 1.0 vulnerability workaround added in OpenSSL 0.9.6d. */ + const SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS: number; + /** Allows initial connection to servers that do not support RI. */ + const SSL_OP_LEGACY_SERVER_CONNECT: number; + /** Instructs OpenSSL to disable support for SSL/TLS compression. */ + const SSL_OP_NO_COMPRESSION: number; + const SSL_OP_NO_QUERY_MTU: number; + /** Instructs OpenSSL to always start a new session when performing renegotiation. */ + const SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION: number; + const SSL_OP_NO_SSLv2: number; + const SSL_OP_NO_SSLv3: number; + const SSL_OP_NO_TICKET: number; + const SSL_OP_NO_TLSv1: number; + const SSL_OP_NO_TLSv1_1: number; + const SSL_OP_NO_TLSv1_2: number; + /** Instructs OpenSSL to disable version rollback attack detection. */ + const SSL_OP_TLS_ROLLBACK_BUG: number; + const ENGINE_METHOD_RSA: number; + const ENGINE_METHOD_DSA: number; + const ENGINE_METHOD_DH: number; + const ENGINE_METHOD_RAND: number; + const ENGINE_METHOD_EC: number; + const ENGINE_METHOD_CIPHERS: number; + const ENGINE_METHOD_DIGESTS: number; + const ENGINE_METHOD_PKEY_METHS: number; + const ENGINE_METHOD_PKEY_ASN1_METHS: number; + const ENGINE_METHOD_ALL: number; + const ENGINE_METHOD_NONE: number; + const DH_CHECK_P_NOT_SAFE_PRIME: number; + const DH_CHECK_P_NOT_PRIME: number; + const DH_UNABLE_TO_CHECK_GENERATOR: number; + const DH_NOT_SUITABLE_GENERATOR: number; + const RSA_PKCS1_PADDING: number; + const RSA_SSLV23_PADDING: number; + const RSA_NO_PADDING: number; + const RSA_PKCS1_OAEP_PADDING: number; + const RSA_X931_PADDING: number; + const RSA_PKCS1_PSS_PADDING: number; + /** Sets the salt length for RSA_PKCS1_PSS_PADDING to the digest size when signing or verifying. */ + const RSA_PSS_SALTLEN_DIGEST: number; + /** Sets the salt length for RSA_PKCS1_PSS_PADDING to the maximum permissible value when signing data. */ + const RSA_PSS_SALTLEN_MAX_SIGN: number; + /** Causes the salt length for RSA_PKCS1_PSS_PADDING to be determined automatically when verifying a signature. */ + const RSA_PSS_SALTLEN_AUTO: number; + const POINT_CONVERSION_COMPRESSED: number; + const POINT_CONVERSION_UNCOMPRESSED: number; + const POINT_CONVERSION_HYBRID: number; + /** Specifies the built-in default cipher list used by Node.js (colon-separated values). */ + const defaultCoreCipherList: string; + /** Specifies the active default cipher list used by the current Node.js process (colon-separated values). */ + const defaultCipherList: string; + } + interface HashOptions extends stream.TransformOptions { + /** + * For XOF hash functions such as `shake256`, the + * outputLength option can be used to specify the desired output length in bytes. + */ + outputLength?: number | undefined; + } + /** @deprecated since v10.0.0 */ + const fips: boolean; + /** + * Creates and returns a `Hash` object that can be used to generate hash digests + * using the given `algorithm`. Optional `options` argument controls stream + * behavior. For XOF hash functions such as `'shake256'`, the `outputLength` option + * can be used to specify the desired output length in bytes. + * + * The `algorithm` is dependent on the available algorithms supported by the + * version of OpenSSL on the platform. Examples are `'sha256'`, `'sha512'`, etc. + * On recent releases of OpenSSL, `openssl list -digest-algorithms` will + * display the available digest algorithms. + * + * Example: generating the sha256 sum of a file + * + * ```js + * import { + * createReadStream, + * } from 'node:fs'; + * import { argv } from 'node:process'; + * const { + * createHash, + * } = await import('node:crypto'); + * + * const filename = argv[2]; + * + * const hash = createHash('sha256'); + * + * const input = createReadStream(filename); + * input.on('readable', () => { + * // Only one element is going to be produced by the + * // hash stream. + * const data = input.read(); + * if (data) + * hash.update(data); + * else { + * console.log(`${hash.digest('hex')} ${filename}`); + * } + * }); + * ``` + * @since v0.1.92 + * @param options `stream.transform` options + */ + function createHash(algorithm: string, options?: HashOptions): Hash; + /** + * Creates and returns an `Hmac` object that uses the given `algorithm` and `key`. + * Optional `options` argument controls stream behavior. + * + * The `algorithm` is dependent on the available algorithms supported by the + * version of OpenSSL on the platform. Examples are `'sha256'`, `'sha512'`, etc. + * On recent releases of OpenSSL, `openssl list -digest-algorithms` will + * display the available digest algorithms. + * + * The `key` is the HMAC key used to generate the cryptographic HMAC hash. If it is + * a `KeyObject`, its type must be `secret`. If it is a string, please consider `caveats when using strings as inputs to cryptographic APIs`. If it was + * obtained from a cryptographically secure source of entropy, such as {@link randomBytes} or {@link generateKey}, its length should not + * exceed the block size of `algorithm` (e.g., 512 bits for SHA-256). + * + * Example: generating the sha256 HMAC of a file + * + * ```js + * import { + * createReadStream, + * } from 'node:fs'; + * import { argv } from 'node:process'; + * const { + * createHmac, + * } = await import('node:crypto'); + * + * const filename = argv[2]; + * + * const hmac = createHmac('sha256', 'a secret'); + * + * const input = createReadStream(filename); + * input.on('readable', () => { + * // Only one element is going to be produced by the + * // hash stream. + * const data = input.read(); + * if (data) + * hmac.update(data); + * else { + * console.log(`${hmac.digest('hex')} ${filename}`); + * } + * }); + * ``` + * @since v0.1.94 + * @param options `stream.transform` options + */ + function createHmac(algorithm: string, key: BinaryLike | KeyObject, options?: stream.TransformOptions): Hmac; + // https://nodejs.org/api/buffer.html#buffer_buffers_and_character_encodings + type BinaryToTextEncoding = "base64" | "base64url" | "hex" | "binary"; + type CharacterEncoding = "utf8" | "utf-8" | "utf16le" | "utf-16le" | "latin1"; + type LegacyCharacterEncoding = "ascii" | "binary" | "ucs2" | "ucs-2"; + type Encoding = BinaryToTextEncoding | CharacterEncoding | LegacyCharacterEncoding; + type ECDHKeyFormat = "compressed" | "uncompressed" | "hybrid"; + /** + * The `Hash` class is a utility for creating hash digests of data. It can be + * used in one of two ways: + * + * * As a `stream` that is both readable and writable, where data is written + * to produce a computed hash digest on the readable side, or + * * Using the `hash.update()` and `hash.digest()` methods to produce the + * computed hash. + * + * The {@link createHash} method is used to create `Hash` instances. `Hash`objects are not to be created directly using the `new` keyword. + * + * Example: Using `Hash` objects as streams: + * + * ```js + * const { + * createHash, + * } = await import('node:crypto'); + * + * const hash = createHash('sha256'); + * + * hash.on('readable', () => { + * // Only one element is going to be produced by the + * // hash stream. + * const data = hash.read(); + * if (data) { + * console.log(data.toString('hex')); + * // Prints: + * // 6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50 + * } + * }); + * + * hash.write('some data to hash'); + * hash.end(); + * ``` + * + * Example: Using `Hash` and piped streams: + * + * ```js + * import { createReadStream } from 'node:fs'; + * import { stdout } from 'node:process'; + * const { createHash } = await import('node:crypto'); + * + * const hash = createHash('sha256'); + * + * const input = createReadStream('test.js'); + * input.pipe(hash).setEncoding('hex').pipe(stdout); + * ``` + * + * Example: Using the `hash.update()` and `hash.digest()` methods: + * + * ```js + * const { + * createHash, + * } = await import('node:crypto'); + * + * const hash = createHash('sha256'); + * + * hash.update('some data to hash'); + * console.log(hash.digest('hex')); + * // Prints: + * // 6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50 + * ``` + * @since v0.1.92 + */ + class Hash extends stream.Transform { + private constructor(); + /** + * Creates a new `Hash` object that contains a deep copy of the internal state + * of the current `Hash` object. + * + * The optional `options` argument controls stream behavior. For XOF hash + * functions such as `'shake256'`, the `outputLength` option can be used to + * specify the desired output length in bytes. + * + * An error is thrown when an attempt is made to copy the `Hash` object after + * its `hash.digest()` method has been called. + * + * ```js + * // Calculate a rolling hash. + * const { + * createHash, + * } = await import('node:crypto'); + * + * const hash = createHash('sha256'); + * + * hash.update('one'); + * console.log(hash.copy().digest('hex')); + * + * hash.update('two'); + * console.log(hash.copy().digest('hex')); + * + * hash.update('three'); + * console.log(hash.copy().digest('hex')); + * + * // Etc. + * ``` + * @since v13.1.0 + * @param options `stream.transform` options + */ + copy(options?: stream.TransformOptions): Hash; + /** + * Updates the hash content with the given `data`, the encoding of which + * is given in `inputEncoding`. + * If `encoding` is not provided, and the `data` is a string, an + * encoding of `'utf8'` is enforced. If `data` is a `Buffer`, `TypedArray`, or`DataView`, then `inputEncoding` is ignored. + * + * This can be called many times with new data as it is streamed. + * @since v0.1.92 + * @param inputEncoding The `encoding` of the `data` string. + */ + update(data: BinaryLike): Hash; + update(data: string, inputEncoding: Encoding): Hash; + /** + * Calculates the digest of all of the data passed to be hashed (using the `hash.update()` method). + * If `encoding` is provided a string will be returned; otherwise + * a `Buffer` is returned. + * + * The `Hash` object can not be used again after `hash.digest()` method has been + * called. Multiple calls will cause an error to be thrown. + * @since v0.1.92 + * @param encoding The `encoding` of the return value. + */ + digest(): Buffer; + digest(encoding: BinaryToTextEncoding): string; + } + /** + * The `Hmac` class is a utility for creating cryptographic HMAC digests. It can + * be used in one of two ways: + * + * * As a `stream` that is both readable and writable, where data is written + * to produce a computed HMAC digest on the readable side, or + * * Using the `hmac.update()` and `hmac.digest()` methods to produce the + * computed HMAC digest. + * + * The {@link createHmac} method is used to create `Hmac` instances. `Hmac`objects are not to be created directly using the `new` keyword. + * + * Example: Using `Hmac` objects as streams: + * + * ```js + * const { + * createHmac, + * } = await import('node:crypto'); + * + * const hmac = createHmac('sha256', 'a secret'); + * + * hmac.on('readable', () => { + * // Only one element is going to be produced by the + * // hash stream. + * const data = hmac.read(); + * if (data) { + * console.log(data.toString('hex')); + * // Prints: + * // 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e + * } + * }); + * + * hmac.write('some data to hash'); + * hmac.end(); + * ``` + * + * Example: Using `Hmac` and piped streams: + * + * ```js + * import { createReadStream } from 'node:fs'; + * import { stdout } from 'node:process'; + * const { + * createHmac, + * } = await import('node:crypto'); + * + * const hmac = createHmac('sha256', 'a secret'); + * + * const input = createReadStream('test.js'); + * input.pipe(hmac).pipe(stdout); + * ``` + * + * Example: Using the `hmac.update()` and `hmac.digest()` methods: + * + * ```js + * const { + * createHmac, + * } = await import('node:crypto'); + * + * const hmac = createHmac('sha256', 'a secret'); + * + * hmac.update('some data to hash'); + * console.log(hmac.digest('hex')); + * // Prints: + * // 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e + * ``` + * @since v0.1.94 + */ + class Hmac extends stream.Transform { + private constructor(); + /** + * Updates the `Hmac` content with the given `data`, the encoding of which + * is given in `inputEncoding`. + * If `encoding` is not provided, and the `data` is a string, an + * encoding of `'utf8'` is enforced. If `data` is a `Buffer`, `TypedArray`, or`DataView`, then `inputEncoding` is ignored. + * + * This can be called many times with new data as it is streamed. + * @since v0.1.94 + * @param inputEncoding The `encoding` of the `data` string. + */ + update(data: BinaryLike): Hmac; + update(data: string, inputEncoding: Encoding): Hmac; + /** + * Calculates the HMAC digest of all of the data passed using `hmac.update()`. + * If `encoding` is + * provided a string is returned; otherwise a `Buffer` is returned; + * + * The `Hmac` object can not be used again after `hmac.digest()` has been + * called. Multiple calls to `hmac.digest()` will result in an error being thrown. + * @since v0.1.94 + * @param encoding The `encoding` of the return value. + */ + digest(): Buffer; + digest(encoding: BinaryToTextEncoding): string; + } + type KeyObjectType = "secret" | "public" | "private"; + interface KeyExportOptions { + type: "pkcs1" | "spki" | "pkcs8" | "sec1"; + format: T; + cipher?: string | undefined; + passphrase?: string | Buffer | undefined; + } + interface JwkKeyExportOptions { + format: "jwk"; + } + interface JsonWebKey { + crv?: string | undefined; + d?: string | undefined; + dp?: string | undefined; + dq?: string | undefined; + e?: string | undefined; + k?: string | undefined; + kty?: string | undefined; + n?: string | undefined; + p?: string | undefined; + q?: string | undefined; + qi?: string | undefined; + x?: string | undefined; + y?: string | undefined; + [key: string]: unknown; + } + interface AsymmetricKeyDetails { + /** + * Key size in bits (RSA, DSA). + */ + modulusLength?: number | undefined; + /** + * Public exponent (RSA). + */ + publicExponent?: bigint | undefined; + /** + * Name of the message digest (RSA-PSS). + */ + hashAlgorithm?: string | undefined; + /** + * Name of the message digest used by MGF1 (RSA-PSS). + */ + mgf1HashAlgorithm?: string | undefined; + /** + * Minimal salt length in bytes (RSA-PSS). + */ + saltLength?: number | undefined; + /** + * Size of q in bits (DSA). + */ + divisorLength?: number | undefined; + /** + * Name of the curve (EC). + */ + namedCurve?: string | undefined; + } + /** + * Node.js uses a `KeyObject` class to represent a symmetric or asymmetric key, + * and each kind of key exposes different functions. The {@link createSecretKey}, {@link createPublicKey} and {@link createPrivateKey} methods are used to create `KeyObject`instances. `KeyObject` + * objects are not to be created directly using the `new`keyword. + * + * Most applications should consider using the new `KeyObject` API instead of + * passing keys as strings or `Buffer`s due to improved security features. + * + * `KeyObject` instances can be passed to other threads via `postMessage()`. + * The receiver obtains a cloned `KeyObject`, and the `KeyObject` does not need to + * be listed in the `transferList` argument. + * @since v11.6.0 + */ + class KeyObject { + private constructor(); + /** + * Example: Converting a `CryptoKey` instance to a `KeyObject`: + * + * ```js + * const { KeyObject } = await import('node:crypto'); + * const { subtle } = globalThis.crypto; + * + * const key = await subtle.generateKey({ + * name: 'HMAC', + * hash: 'SHA-256', + * length: 256, + * }, true, ['sign', 'verify']); + * + * const keyObject = KeyObject.from(key); + * console.log(keyObject.symmetricKeySize); + * // Prints: 32 (symmetric key size in bytes) + * ``` + * @since v15.0.0 + */ + static from(key: webcrypto.CryptoKey): KeyObject; + /** + * For asymmetric keys, this property represents the type of the key. Supported key + * types are: + * + * * `'rsa'` (OID 1.2.840.113549.1.1.1) + * * `'rsa-pss'` (OID 1.2.840.113549.1.1.10) + * * `'dsa'` (OID 1.2.840.10040.4.1) + * * `'ec'` (OID 1.2.840.10045.2.1) + * * `'x25519'` (OID 1.3.101.110) + * * `'x448'` (OID 1.3.101.111) + * * `'ed25519'` (OID 1.3.101.112) + * * `'ed448'` (OID 1.3.101.113) + * * `'dh'` (OID 1.2.840.113549.1.3.1) + * + * This property is `undefined` for unrecognized `KeyObject` types and symmetric + * keys. + * @since v11.6.0 + */ + asymmetricKeyType?: KeyType | undefined; + /** + * For asymmetric keys, this property represents the size of the embedded key in + * bytes. This property is `undefined` for symmetric keys. + */ + asymmetricKeySize?: number | undefined; + /** + * This property exists only on asymmetric keys. Depending on the type of the key, + * this object contains information about the key. None of the information obtained + * through this property can be used to uniquely identify a key or to compromise + * the security of the key. + * + * For RSA-PSS keys, if the key material contains a `RSASSA-PSS-params` sequence, + * the `hashAlgorithm`, `mgf1HashAlgorithm`, and `saltLength` properties will be + * set. + * + * Other key details might be exposed via this API using additional attributes. + * @since v15.7.0 + */ + asymmetricKeyDetails?: AsymmetricKeyDetails | undefined; + /** + * For symmetric keys, the following encoding options can be used: + * + * For public keys, the following encoding options can be used: + * + * For private keys, the following encoding options can be used: + * + * The result type depends on the selected encoding format, when PEM the + * result is a string, when DER it will be a buffer containing the data + * encoded as DER, when [JWK](https://tools.ietf.org/html/rfc7517) it will be an object. + * + * When [JWK](https://tools.ietf.org/html/rfc7517) encoding format was selected, all other encoding options are + * ignored. + * + * PKCS#1, SEC1, and PKCS#8 type keys can be encrypted by using a combination of + * the `cipher` and `format` options. The PKCS#8 `type` can be used with any`format` to encrypt any key algorithm (RSA, EC, or DH) by specifying a`cipher`. PKCS#1 and SEC1 can only be + * encrypted by specifying a `cipher`when the PEM `format` is used. For maximum compatibility, use PKCS#8 for + * encrypted private keys. Since PKCS#8 defines its own + * encryption mechanism, PEM-level encryption is not supported when encrypting + * a PKCS#8 key. See [RFC 5208](https://www.rfc-editor.org/rfc/rfc5208.txt) for PKCS#8 encryption and [RFC 1421](https://www.rfc-editor.org/rfc/rfc1421.txt) for + * PKCS#1 and SEC1 encryption. + * @since v11.6.0 + */ + export(options: KeyExportOptions<"pem">): string | Buffer; + export(options?: KeyExportOptions<"der">): Buffer; + export(options?: JwkKeyExportOptions): JsonWebKey; + /** + * For secret keys, this property represents the size of the key in bytes. This + * property is `undefined` for asymmetric keys. + * @since v11.6.0 + */ + symmetricKeySize?: number | undefined; + /** + * Depending on the type of this `KeyObject`, this property is either`'secret'` for secret (symmetric) keys, `'public'` for public (asymmetric) keys + * or `'private'` for private (asymmetric) keys. + * @since v11.6.0 + */ + type: KeyObjectType; + } + type CipherCCMTypes = "aes-128-ccm" | "aes-192-ccm" | "aes-256-ccm" | "chacha20-poly1305"; + type CipherGCMTypes = "aes-128-gcm" | "aes-192-gcm" | "aes-256-gcm"; + type CipherOCBTypes = "aes-128-ocb" | "aes-192-ocb" | "aes-256-ocb"; + type BinaryLike = string | NodeJS.ArrayBufferView; + type CipherKey = BinaryLike | KeyObject; + interface CipherCCMOptions extends stream.TransformOptions { + authTagLength: number; + } + interface CipherGCMOptions extends stream.TransformOptions { + authTagLength?: number | undefined; + } + interface CipherOCBOptions extends stream.TransformOptions { + authTagLength: number; + } + /** + * Creates and returns a `Cipher` object that uses the given `algorithm` and`password`. + * + * The `options` argument controls stream behavior and is optional except when a + * cipher in CCM or OCB mode (e.g. `'aes-128-ccm'`) is used. In that case, the`authTagLength` option is required and specifies the length of the + * authentication tag in bytes, see `CCM mode`. In GCM mode, the `authTagLength`option is not required but can be used to set the length of the authentication + * tag that will be returned by `getAuthTag()` and defaults to 16 bytes. + * For `chacha20-poly1305`, the `authTagLength` option defaults to 16 bytes. + * + * The `algorithm` is dependent on OpenSSL, examples are `'aes192'`, etc. On + * recent OpenSSL releases, `openssl list -cipher-algorithms` will + * display the available cipher algorithms. + * + * The `password` is used to derive the cipher key and initialization vector (IV). + * The value must be either a `'latin1'` encoded string, a `Buffer`, a`TypedArray`, or a `DataView`. + * + * **This function is semantically insecure for all** + * **supported ciphers and fatally flawed for ciphers in counter mode (such as CTR,** + * **GCM, or CCM).** + * + * The implementation of `crypto.createCipher()` derives keys using the OpenSSL + * function [`EVP_BytesToKey`](https://www.openssl.org/docs/man3.0/man3/EVP_BytesToKey.html) with the digest algorithm set to MD5, one + * iteration, and no salt. The lack of salt allows dictionary attacks as the same + * password always creates the same key. The low iteration count and + * non-cryptographically secure hash algorithm allow passwords to be tested very + * rapidly. + * + * In line with OpenSSL's recommendation to use a more modern algorithm instead of [`EVP_BytesToKey`](https://www.openssl.org/docs/man3.0/man3/EVP_BytesToKey.html) it is recommended that + * developers derive a key and IV on + * their own using {@link scrypt} and to use {@link createCipheriv} to create the `Cipher` object. Users should not use ciphers with counter mode + * (e.g. CTR, GCM, or CCM) in `crypto.createCipher()`. A warning is emitted when + * they are used in order to avoid the risk of IV reuse that causes + * vulnerabilities. For the case when IV is reused in GCM, see [Nonce-Disrespecting Adversaries](https://github.com/nonce-disrespect/nonce-disrespect) for details. + * @since v0.1.94 + * @deprecated Since v10.0.0 - Use {@link createCipheriv} instead. + * @param options `stream.transform` options + */ + function createCipher(algorithm: CipherCCMTypes, password: BinaryLike, options: CipherCCMOptions): CipherCCM; + /** @deprecated since v10.0.0 use `createCipheriv()` */ + function createCipher(algorithm: CipherGCMTypes, password: BinaryLike, options?: CipherGCMOptions): CipherGCM; + /** @deprecated since v10.0.0 use `createCipheriv()` */ + function createCipher(algorithm: string, password: BinaryLike, options?: stream.TransformOptions): Cipher; + /** + * Creates and returns a `Cipher` object, with the given `algorithm`, `key` and + * initialization vector (`iv`). + * + * The `options` argument controls stream behavior and is optional except when a + * cipher in CCM or OCB mode (e.g. `'aes-128-ccm'`) is used. In that case, the`authTagLength` option is required and specifies the length of the + * authentication tag in bytes, see `CCM mode`. In GCM mode, the `authTagLength`option is not required but can be used to set the length of the authentication + * tag that will be returned by `getAuthTag()` and defaults to 16 bytes. + * For `chacha20-poly1305`, the `authTagLength` option defaults to 16 bytes. + * + * The `algorithm` is dependent on OpenSSL, examples are `'aes192'`, etc. On + * recent OpenSSL releases, `openssl list -cipher-algorithms` will + * display the available cipher algorithms. + * + * The `key` is the raw key used by the `algorithm` and `iv` is an [initialization vector](https://en.wikipedia.org/wiki/Initialization_vector). Both arguments must be `'utf8'` encoded + * strings,`Buffers`, `TypedArray`, or `DataView`s. The `key` may optionally be + * a `KeyObject` of type `secret`. If the cipher does not need + * an initialization vector, `iv` may be `null`. + * + * When passing strings for `key` or `iv`, please consider `caveats when using strings as inputs to cryptographic APIs`. + * + * Initialization vectors should be unpredictable and unique; ideally, they will be + * cryptographically random. They do not have to be secret: IVs are typically just + * added to ciphertext messages unencrypted. It may sound contradictory that + * something has to be unpredictable and unique, but does not have to be secret; + * remember that an attacker must not be able to predict ahead of time what a + * given IV will be. + * @since v0.1.94 + * @param options `stream.transform` options + */ + function createCipheriv( + algorithm: CipherCCMTypes, + key: CipherKey, + iv: BinaryLike, + options: CipherCCMOptions, + ): CipherCCM; + function createCipheriv( + algorithm: CipherOCBTypes, + key: CipherKey, + iv: BinaryLike, + options: CipherOCBOptions, + ): CipherOCB; + function createCipheriv( + algorithm: CipherGCMTypes, + key: CipherKey, + iv: BinaryLike, + options?: CipherGCMOptions, + ): CipherGCM; + function createCipheriv( + algorithm: string, + key: CipherKey, + iv: BinaryLike | null, + options?: stream.TransformOptions, + ): Cipher; + /** + * Instances of the `Cipher` class are used to encrypt data. The class can be + * used in one of two ways: + * + * * As a `stream` that is both readable and writable, where plain unencrypted + * data is written to produce encrypted data on the readable side, or + * * Using the `cipher.update()` and `cipher.final()` methods to produce + * the encrypted data. + * + * The {@link createCipher} or {@link createCipheriv} methods are + * used to create `Cipher` instances. `Cipher` objects are not to be created + * directly using the `new` keyword. + * + * Example: Using `Cipher` objects as streams: + * + * ```js + * const { + * scrypt, + * randomFill, + * createCipheriv, + * } = await import('node:crypto'); + * + * const algorithm = 'aes-192-cbc'; + * const password = 'Password used to generate key'; + * + * // First, we'll generate the key. The key length is dependent on the algorithm. + * // In this case for aes192, it is 24 bytes (192 bits). + * scrypt(password, 'salt', 24, (err, key) => { + * if (err) throw err; + * // Then, we'll generate a random initialization vector + * randomFill(new Uint8Array(16), (err, iv) => { + * if (err) throw err; + * + * // Once we have the key and iv, we can create and use the cipher... + * const cipher = createCipheriv(algorithm, key, iv); + * + * let encrypted = ''; + * cipher.setEncoding('hex'); + * + * cipher.on('data', (chunk) => encrypted += chunk); + * cipher.on('end', () => console.log(encrypted)); + * + * cipher.write('some clear text data'); + * cipher.end(); + * }); + * }); + * ``` + * + * Example: Using `Cipher` and piped streams: + * + * ```js + * import { + * createReadStream, + * createWriteStream, + * } from 'node:fs'; + * + * import { + * pipeline, + * } from 'node:stream'; + * + * const { + * scrypt, + * randomFill, + * createCipheriv, + * } = await import('node:crypto'); + * + * const algorithm = 'aes-192-cbc'; + * const password = 'Password used to generate key'; + * + * // First, we'll generate the key. The key length is dependent on the algorithm. + * // In this case for aes192, it is 24 bytes (192 bits). + * scrypt(password, 'salt', 24, (err, key) => { + * if (err) throw err; + * // Then, we'll generate a random initialization vector + * randomFill(new Uint8Array(16), (err, iv) => { + * if (err) throw err; + * + * const cipher = createCipheriv(algorithm, key, iv); + * + * const input = createReadStream('test.js'); + * const output = createWriteStream('test.enc'); + * + * pipeline(input, cipher, output, (err) => { + * if (err) throw err; + * }); + * }); + * }); + * ``` + * + * Example: Using the `cipher.update()` and `cipher.final()` methods: + * + * ```js + * const { + * scrypt, + * randomFill, + * createCipheriv, + * } = await import('node:crypto'); + * + * const algorithm = 'aes-192-cbc'; + * const password = 'Password used to generate key'; + * + * // First, we'll generate the key. The key length is dependent on the algorithm. + * // In this case for aes192, it is 24 bytes (192 bits). + * scrypt(password, 'salt', 24, (err, key) => { + * if (err) throw err; + * // Then, we'll generate a random initialization vector + * randomFill(new Uint8Array(16), (err, iv) => { + * if (err) throw err; + * + * const cipher = createCipheriv(algorithm, key, iv); + * + * let encrypted = cipher.update('some clear text data', 'utf8', 'hex'); + * encrypted += cipher.final('hex'); + * console.log(encrypted); + * }); + * }); + * ``` + * @since v0.1.94 + */ + class Cipher extends stream.Transform { + private constructor(); + /** + * Updates the cipher with `data`. If the `inputEncoding` argument is given, + * the `data`argument is a string using the specified encoding. If the `inputEncoding`argument is not given, `data` must be a `Buffer`, `TypedArray`, or`DataView`. If `data` is a `Buffer`, + * `TypedArray`, or `DataView`, then`inputEncoding` is ignored. + * + * The `outputEncoding` specifies the output format of the enciphered + * data. If the `outputEncoding`is specified, a string using the specified encoding is returned. If no`outputEncoding` is provided, a `Buffer` is returned. + * + * The `cipher.update()` method can be called multiple times with new data until `cipher.final()` is called. Calling `cipher.update()` after `cipher.final()` will result in an error being + * thrown. + * @since v0.1.94 + * @param inputEncoding The `encoding` of the data. + * @param outputEncoding The `encoding` of the return value. + */ + update(data: BinaryLike): Buffer; + update(data: string, inputEncoding: Encoding): Buffer; + update(data: NodeJS.ArrayBufferView, inputEncoding: undefined, outputEncoding: Encoding): string; + update(data: string, inputEncoding: Encoding | undefined, outputEncoding: Encoding): string; + /** + * Once the `cipher.final()` method has been called, the `Cipher` object can no + * longer be used to encrypt data. Attempts to call `cipher.final()` more than + * once will result in an error being thrown. + * @since v0.1.94 + * @param outputEncoding The `encoding` of the return value. + * @return Any remaining enciphered contents. If `outputEncoding` is specified, a string is returned. If an `outputEncoding` is not provided, a {@link Buffer} is returned. + */ + final(): Buffer; + final(outputEncoding: BufferEncoding): string; + /** + * When using block encryption algorithms, the `Cipher` class will automatically + * add padding to the input data to the appropriate block size. To disable the + * default padding call `cipher.setAutoPadding(false)`. + * + * When `autoPadding` is `false`, the length of the entire input data must be a + * multiple of the cipher's block size or `cipher.final()` will throw an error. + * Disabling automatic padding is useful for non-standard padding, for instance + * using `0x0` instead of PKCS padding. + * + * The `cipher.setAutoPadding()` method must be called before `cipher.final()`. + * @since v0.7.1 + * @param [autoPadding=true] + * @return for method chaining. + */ + setAutoPadding(autoPadding?: boolean): this; + } + interface CipherCCM extends Cipher { + setAAD( + buffer: NodeJS.ArrayBufferView, + options: { + plaintextLength: number; + }, + ): this; + getAuthTag(): Buffer; + } + interface CipherGCM extends Cipher { + setAAD( + buffer: NodeJS.ArrayBufferView, + options?: { + plaintextLength: number; + }, + ): this; + getAuthTag(): Buffer; + } + interface CipherOCB extends Cipher { + setAAD( + buffer: NodeJS.ArrayBufferView, + options?: { + plaintextLength: number; + }, + ): this; + getAuthTag(): Buffer; + } + /** + * Creates and returns a `Decipher` object that uses the given `algorithm` and`password` (key). + * + * The `options` argument controls stream behavior and is optional except when a + * cipher in CCM or OCB mode (e.g. `'aes-128-ccm'`) is used. In that case, the`authTagLength` option is required and specifies the length of the + * authentication tag in bytes, see `CCM mode`. + * For `chacha20-poly1305`, the `authTagLength` option defaults to 16 bytes. + * + * **This function is semantically insecure for all** + * **supported ciphers and fatally flawed for ciphers in counter mode (such as CTR,** + * **GCM, or CCM).** + * + * The implementation of `crypto.createDecipher()` derives keys using the OpenSSL + * function [`EVP_BytesToKey`](https://www.openssl.org/docs/man3.0/man3/EVP_BytesToKey.html) with the digest algorithm set to MD5, one + * iteration, and no salt. The lack of salt allows dictionary attacks as the same + * password always creates the same key. The low iteration count and + * non-cryptographically secure hash algorithm allow passwords to be tested very + * rapidly. + * + * In line with OpenSSL's recommendation to use a more modern algorithm instead of [`EVP_BytesToKey`](https://www.openssl.org/docs/man3.0/man3/EVP_BytesToKey.html) it is recommended that + * developers derive a key and IV on + * their own using {@link scrypt} and to use {@link createDecipheriv} to create the `Decipher` object. + * @since v0.1.94 + * @deprecated Since v10.0.0 - Use {@link createDecipheriv} instead. + * @param options `stream.transform` options + */ + function createDecipher(algorithm: CipherCCMTypes, password: BinaryLike, options: CipherCCMOptions): DecipherCCM; + /** @deprecated since v10.0.0 use `createDecipheriv()` */ + function createDecipher(algorithm: CipherGCMTypes, password: BinaryLike, options?: CipherGCMOptions): DecipherGCM; + /** @deprecated since v10.0.0 use `createDecipheriv()` */ + function createDecipher(algorithm: string, password: BinaryLike, options?: stream.TransformOptions): Decipher; + /** + * Creates and returns a `Decipher` object that uses the given `algorithm`, `key`and initialization vector (`iv`). + * + * The `options` argument controls stream behavior and is optional except when a + * cipher in CCM or OCB mode (e.g. `'aes-128-ccm'`) is used. In that case, the`authTagLength` option is required and specifies the length of the + * authentication tag in bytes, see `CCM mode`. In GCM mode, the `authTagLength`option is not required but can be used to restrict accepted authentication tags + * to those with the specified length. + * For `chacha20-poly1305`, the `authTagLength` option defaults to 16 bytes. + * + * The `algorithm` is dependent on OpenSSL, examples are `'aes192'`, etc. On + * recent OpenSSL releases, `openssl list -cipher-algorithms` will + * display the available cipher algorithms. + * + * The `key` is the raw key used by the `algorithm` and `iv` is an [initialization vector](https://en.wikipedia.org/wiki/Initialization_vector). Both arguments must be `'utf8'` encoded + * strings,`Buffers`, `TypedArray`, or `DataView`s. The `key` may optionally be + * a `KeyObject` of type `secret`. If the cipher does not need + * an initialization vector, `iv` may be `null`. + * + * When passing strings for `key` or `iv`, please consider `caveats when using strings as inputs to cryptographic APIs`. + * + * Initialization vectors should be unpredictable and unique; ideally, they will be + * cryptographically random. They do not have to be secret: IVs are typically just + * added to ciphertext messages unencrypted. It may sound contradictory that + * something has to be unpredictable and unique, but does not have to be secret; + * remember that an attacker must not be able to predict ahead of time what a given + * IV will be. + * @since v0.1.94 + * @param options `stream.transform` options + */ + function createDecipheriv( + algorithm: CipherCCMTypes, + key: CipherKey, + iv: BinaryLike, + options: CipherCCMOptions, + ): DecipherCCM; + function createDecipheriv( + algorithm: CipherOCBTypes, + key: CipherKey, + iv: BinaryLike, + options: CipherOCBOptions, + ): DecipherOCB; + function createDecipheriv( + algorithm: CipherGCMTypes, + key: CipherKey, + iv: BinaryLike, + options?: CipherGCMOptions, + ): DecipherGCM; + function createDecipheriv( + algorithm: string, + key: CipherKey, + iv: BinaryLike | null, + options?: stream.TransformOptions, + ): Decipher; + /** + * Instances of the `Decipher` class are used to decrypt data. The class can be + * used in one of two ways: + * + * * As a `stream` that is both readable and writable, where plain encrypted + * data is written to produce unencrypted data on the readable side, or + * * Using the `decipher.update()` and `decipher.final()` methods to + * produce the unencrypted data. + * + * The {@link createDecipher} or {@link createDecipheriv} methods are + * used to create `Decipher` instances. `Decipher` objects are not to be created + * directly using the `new` keyword. + * + * Example: Using `Decipher` objects as streams: + * + * ```js + * import { Buffer } from 'node:buffer'; + * const { + * scryptSync, + * createDecipheriv, + * } = await import('node:crypto'); + * + * const algorithm = 'aes-192-cbc'; + * const password = 'Password used to generate key'; + * // Key length is dependent on the algorithm. In this case for aes192, it is + * // 24 bytes (192 bits). + * // Use the async `crypto.scrypt()` instead. + * const key = scryptSync(password, 'salt', 24); + * // The IV is usually passed along with the ciphertext. + * const iv = Buffer.alloc(16, 0); // Initialization vector. + * + * const decipher = createDecipheriv(algorithm, key, iv); + * + * let decrypted = ''; + * decipher.on('readable', () => { + * let chunk; + * while (null !== (chunk = decipher.read())) { + * decrypted += chunk.toString('utf8'); + * } + * }); + * decipher.on('end', () => { + * console.log(decrypted); + * // Prints: some clear text data + * }); + * + * // Encrypted with same algorithm, key and iv. + * const encrypted = + * 'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa'; + * decipher.write(encrypted, 'hex'); + * decipher.end(); + * ``` + * + * Example: Using `Decipher` and piped streams: + * + * ```js + * import { + * createReadStream, + * createWriteStream, + * } from 'node:fs'; + * import { Buffer } from 'node:buffer'; + * const { + * scryptSync, + * createDecipheriv, + * } = await import('node:crypto'); + * + * const algorithm = 'aes-192-cbc'; + * const password = 'Password used to generate key'; + * // Use the async `crypto.scrypt()` instead. + * const key = scryptSync(password, 'salt', 24); + * // The IV is usually passed along with the ciphertext. + * const iv = Buffer.alloc(16, 0); // Initialization vector. + * + * const decipher = createDecipheriv(algorithm, key, iv); + * + * const input = createReadStream('test.enc'); + * const output = createWriteStream('test.js'); + * + * input.pipe(decipher).pipe(output); + * ``` + * + * Example: Using the `decipher.update()` and `decipher.final()` methods: + * + * ```js + * import { Buffer } from 'node:buffer'; + * const { + * scryptSync, + * createDecipheriv, + * } = await import('node:crypto'); + * + * const algorithm = 'aes-192-cbc'; + * const password = 'Password used to generate key'; + * // Use the async `crypto.scrypt()` instead. + * const key = scryptSync(password, 'salt', 24); + * // The IV is usually passed along with the ciphertext. + * const iv = Buffer.alloc(16, 0); // Initialization vector. + * + * const decipher = createDecipheriv(algorithm, key, iv); + * + * // Encrypted using same algorithm, key and iv. + * const encrypted = + * 'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa'; + * let decrypted = decipher.update(encrypted, 'hex', 'utf8'); + * decrypted += decipher.final('utf8'); + * console.log(decrypted); + * // Prints: some clear text data + * ``` + * @since v0.1.94 + */ + class Decipher extends stream.Transform { + private constructor(); + /** + * Updates the decipher with `data`. If the `inputEncoding` argument is given, + * the `data`argument is a string using the specified encoding. If the `inputEncoding`argument is not given, `data` must be a `Buffer`. If `data` is a `Buffer` then `inputEncoding` is + * ignored. + * + * The `outputEncoding` specifies the output format of the enciphered + * data. If the `outputEncoding`is specified, a string using the specified encoding is returned. If no`outputEncoding` is provided, a `Buffer` is returned. + * + * The `decipher.update()` method can be called multiple times with new data until `decipher.final()` is called. Calling `decipher.update()` after `decipher.final()` will result in an error + * being thrown. + * @since v0.1.94 + * @param inputEncoding The `encoding` of the `data` string. + * @param outputEncoding The `encoding` of the return value. + */ + update(data: NodeJS.ArrayBufferView): Buffer; + update(data: string, inputEncoding: Encoding): Buffer; + update(data: NodeJS.ArrayBufferView, inputEncoding: undefined, outputEncoding: Encoding): string; + update(data: string, inputEncoding: Encoding | undefined, outputEncoding: Encoding): string; + /** + * Once the `decipher.final()` method has been called, the `Decipher` object can + * no longer be used to decrypt data. Attempts to call `decipher.final()` more + * than once will result in an error being thrown. + * @since v0.1.94 + * @param outputEncoding The `encoding` of the return value. + * @return Any remaining deciphered contents. If `outputEncoding` is specified, a string is returned. If an `outputEncoding` is not provided, a {@link Buffer} is returned. + */ + final(): Buffer; + final(outputEncoding: BufferEncoding): string; + /** + * When data has been encrypted without standard block padding, calling`decipher.setAutoPadding(false)` will disable automatic padding to prevent `decipher.final()` from checking for and + * removing padding. + * + * Turning auto padding off will only work if the input data's length is a + * multiple of the ciphers block size. + * + * The `decipher.setAutoPadding()` method must be called before `decipher.final()`. + * @since v0.7.1 + * @param [autoPadding=true] + * @return for method chaining. + */ + setAutoPadding(auto_padding?: boolean): this; + } + interface DecipherCCM extends Decipher { + setAuthTag(buffer: NodeJS.ArrayBufferView): this; + setAAD( + buffer: NodeJS.ArrayBufferView, + options: { + plaintextLength: number; + }, + ): this; + } + interface DecipherGCM extends Decipher { + setAuthTag(buffer: NodeJS.ArrayBufferView): this; + setAAD( + buffer: NodeJS.ArrayBufferView, + options?: { + plaintextLength: number; + }, + ): this; + } + interface DecipherOCB extends Decipher { + setAuthTag(buffer: NodeJS.ArrayBufferView): this; + setAAD( + buffer: NodeJS.ArrayBufferView, + options?: { + plaintextLength: number; + }, + ): this; + } + interface PrivateKeyInput { + key: string | Buffer; + format?: KeyFormat | undefined; + type?: "pkcs1" | "pkcs8" | "sec1" | undefined; + passphrase?: string | Buffer | undefined; + encoding?: string | undefined; + } + interface PublicKeyInput { + key: string | Buffer; + format?: KeyFormat | undefined; + type?: "pkcs1" | "spki" | undefined; + encoding?: string | undefined; + } + /** + * Asynchronously generates a new random secret key of the given `length`. The`type` will determine which validations will be performed on the `length`. + * + * ```js + * const { + * generateKey, + * } = await import('node:crypto'); + * + * generateKey('hmac', { length: 512 }, (err, key) => { + * if (err) throw err; + * console.log(key.export().toString('hex')); // 46e..........620 + * }); + * ``` + * + * The size of a generated HMAC key should not exceed the block size of the + * underlying hash function. See {@link createHmac} for more information. + * @since v15.0.0 + * @param type The intended use of the generated secret key. Currently accepted values are `'hmac'` and `'aes'`. + */ + function generateKey( + type: "hmac" | "aes", + options: { + length: number; + }, + callback: (err: Error | null, key: KeyObject) => void, + ): void; + /** + * Synchronously generates a new random secret key of the given `length`. The`type` will determine which validations will be performed on the `length`. + * + * ```js + * const { + * generateKeySync, + * } = await import('node:crypto'); + * + * const key = generateKeySync('hmac', { length: 512 }); + * console.log(key.export().toString('hex')); // e89..........41e + * ``` + * + * The size of a generated HMAC key should not exceed the block size of the + * underlying hash function. See {@link createHmac} for more information. + * @since v15.0.0 + * @param type The intended use of the generated secret key. Currently accepted values are `'hmac'` and `'aes'`. + */ + function generateKeySync( + type: "hmac" | "aes", + options: { + length: number; + }, + ): KeyObject; + interface JsonWebKeyInput { + key: JsonWebKey; + format: "jwk"; + } + /** + * Creates and returns a new key object containing a private key. If `key` is a + * string or `Buffer`, `format` is assumed to be `'pem'`; otherwise, `key`must be an object with the properties described above. + * + * If the private key is encrypted, a `passphrase` must be specified. The length + * of the passphrase is limited to 1024 bytes. + * @since v11.6.0 + */ + function createPrivateKey(key: PrivateKeyInput | string | Buffer | JsonWebKeyInput): KeyObject; + /** + * Creates and returns a new key object containing a public key. If `key` is a + * string or `Buffer`, `format` is assumed to be `'pem'`; if `key` is a `KeyObject`with type `'private'`, the public key is derived from the given private key; + * otherwise, `key` must be an object with the properties described above. + * + * If the format is `'pem'`, the `'key'` may also be an X.509 certificate. + * + * Because public keys can be derived from private keys, a private key may be + * passed instead of a public key. In that case, this function behaves as if {@link createPrivateKey} had been called, except that the type of the + * returned `KeyObject` will be `'public'` and that the private key cannot be + * extracted from the returned `KeyObject`. Similarly, if a `KeyObject` with type`'private'` is given, a new `KeyObject` with type `'public'` will be returned + * and it will be impossible to extract the private key from the returned object. + * @since v11.6.0 + */ + function createPublicKey(key: PublicKeyInput | string | Buffer | KeyObject | JsonWebKeyInput): KeyObject; + /** + * Creates and returns a new key object containing a secret key for symmetric + * encryption or `Hmac`. + * @since v11.6.0 + * @param encoding The string encoding when `key` is a string. + */ + function createSecretKey(key: NodeJS.ArrayBufferView): KeyObject; + function createSecretKey(key: string, encoding: BufferEncoding): KeyObject; + /** + * Creates and returns a `Sign` object that uses the given `algorithm`. Use {@link getHashes} to obtain the names of the available digest algorithms. + * Optional `options` argument controls the `stream.Writable` behavior. + * + * In some cases, a `Sign` instance can be created using the name of a signature + * algorithm, such as `'RSA-SHA256'`, instead of a digest algorithm. This will use + * the corresponding digest algorithm. This does not work for all signature + * algorithms, such as `'ecdsa-with-SHA256'`, so it is best to always use digest + * algorithm names. + * @since v0.1.92 + * @param options `stream.Writable` options + */ + function createSign(algorithm: string, options?: stream.WritableOptions): Sign; + type DSAEncoding = "der" | "ieee-p1363"; + interface SigningOptions { + /** + * @see crypto.constants.RSA_PKCS1_PADDING + */ + padding?: number | undefined; + saltLength?: number | undefined; + dsaEncoding?: DSAEncoding | undefined; + } + interface SignPrivateKeyInput extends PrivateKeyInput, SigningOptions {} + interface SignKeyObjectInput extends SigningOptions { + key: KeyObject; + } + interface VerifyPublicKeyInput extends PublicKeyInput, SigningOptions {} + interface VerifyKeyObjectInput extends SigningOptions { + key: KeyObject; + } + interface VerifyJsonWebKeyInput extends JsonWebKeyInput, SigningOptions {} + type KeyLike = string | Buffer | KeyObject; + /** + * The `Sign` class is a utility for generating signatures. It can be used in one + * of two ways: + * + * * As a writable `stream`, where data to be signed is written and the `sign.sign()` method is used to generate and return the signature, or + * * Using the `sign.update()` and `sign.sign()` methods to produce the + * signature. + * + * The {@link createSign} method is used to create `Sign` instances. The + * argument is the string name of the hash function to use. `Sign` objects are not + * to be created directly using the `new` keyword. + * + * Example: Using `Sign` and `Verify` objects as streams: + * + * ```js + * const { + * generateKeyPairSync, + * createSign, + * createVerify, + * } = await import('node:crypto'); + * + * const { privateKey, publicKey } = generateKeyPairSync('ec', { + * namedCurve: 'sect239k1', + * }); + * + * const sign = createSign('SHA256'); + * sign.write('some data to sign'); + * sign.end(); + * const signature = sign.sign(privateKey, 'hex'); + * + * const verify = createVerify('SHA256'); + * verify.write('some data to sign'); + * verify.end(); + * console.log(verify.verify(publicKey, signature, 'hex')); + * // Prints: true + * ``` + * + * Example: Using the `sign.update()` and `verify.update()` methods: + * + * ```js + * const { + * generateKeyPairSync, + * createSign, + * createVerify, + * } = await import('node:crypto'); + * + * const { privateKey, publicKey } = generateKeyPairSync('rsa', { + * modulusLength: 2048, + * }); + * + * const sign = createSign('SHA256'); + * sign.update('some data to sign'); + * sign.end(); + * const signature = sign.sign(privateKey); + * + * const verify = createVerify('SHA256'); + * verify.update('some data to sign'); + * verify.end(); + * console.log(verify.verify(publicKey, signature)); + * // Prints: true + * ``` + * @since v0.1.92 + */ + class Sign extends stream.Writable { + private constructor(); + /** + * Updates the `Sign` content with the given `data`, the encoding of which + * is given in `inputEncoding`. + * If `encoding` is not provided, and the `data` is a string, an + * encoding of `'utf8'` is enforced. If `data` is a `Buffer`, `TypedArray`, or`DataView`, then `inputEncoding` is ignored. + * + * This can be called many times with new data as it is streamed. + * @since v0.1.92 + * @param inputEncoding The `encoding` of the `data` string. + */ + update(data: BinaryLike): this; + update(data: string, inputEncoding: Encoding): this; + /** + * Calculates the signature on all the data passed through using either `sign.update()` or `sign.write()`. + * + * If `privateKey` is not a `KeyObject`, this function behaves as if`privateKey` had been passed to {@link createPrivateKey}. If it is an + * object, the following additional properties can be passed: + * + * If `outputEncoding` is provided a string is returned; otherwise a `Buffer` is returned. + * + * The `Sign` object can not be again used after `sign.sign()` method has been + * called. Multiple calls to `sign.sign()` will result in an error being thrown. + * @since v0.1.92 + */ + sign(privateKey: KeyLike | SignKeyObjectInput | SignPrivateKeyInput): Buffer; + sign( + privateKey: KeyLike | SignKeyObjectInput | SignPrivateKeyInput, + outputFormat: BinaryToTextEncoding, + ): string; + } + /** + * Creates and returns a `Verify` object that uses the given algorithm. + * Use {@link getHashes} to obtain an array of names of the available + * signing algorithms. Optional `options` argument controls the`stream.Writable` behavior. + * + * In some cases, a `Verify` instance can be created using the name of a signature + * algorithm, such as `'RSA-SHA256'`, instead of a digest algorithm. This will use + * the corresponding digest algorithm. This does not work for all signature + * algorithms, such as `'ecdsa-with-SHA256'`, so it is best to always use digest + * algorithm names. + * @since v0.1.92 + * @param options `stream.Writable` options + */ + function createVerify(algorithm: string, options?: stream.WritableOptions): Verify; + /** + * The `Verify` class is a utility for verifying signatures. It can be used in one + * of two ways: + * + * * As a writable `stream` where written data is used to validate against the + * supplied signature, or + * * Using the `verify.update()` and `verify.verify()` methods to verify + * the signature. + * + * The {@link createVerify} method is used to create `Verify` instances.`Verify` objects are not to be created directly using the `new` keyword. + * + * See `Sign` for examples. + * @since v0.1.92 + */ + class Verify extends stream.Writable { + private constructor(); + /** + * Updates the `Verify` content with the given `data`, the encoding of which + * is given in `inputEncoding`. + * If `inputEncoding` is not provided, and the `data` is a string, an + * encoding of `'utf8'` is enforced. If `data` is a `Buffer`, `TypedArray`, or`DataView`, then `inputEncoding` is ignored. + * + * This can be called many times with new data as it is streamed. + * @since v0.1.92 + * @param inputEncoding The `encoding` of the `data` string. + */ + update(data: BinaryLike): Verify; + update(data: string, inputEncoding: Encoding): Verify; + /** + * Verifies the provided data using the given `object` and `signature`. + * + * If `object` is not a `KeyObject`, this function behaves as if`object` had been passed to {@link createPublicKey}. If it is an + * object, the following additional properties can be passed: + * + * The `signature` argument is the previously calculated signature for the data, in + * the `signatureEncoding`. + * If a `signatureEncoding` is specified, the `signature` is expected to be a + * string; otherwise `signature` is expected to be a `Buffer`,`TypedArray`, or `DataView`. + * + * The `verify` object can not be used again after `verify.verify()` has been + * called. Multiple calls to `verify.verify()` will result in an error being + * thrown. + * + * Because public keys can be derived from private keys, a private key may + * be passed instead of a public key. + * @since v0.1.92 + */ + verify( + object: KeyLike | VerifyKeyObjectInput | VerifyPublicKeyInput | VerifyJsonWebKeyInput, + signature: NodeJS.ArrayBufferView, + ): boolean; + verify( + object: KeyLike | VerifyKeyObjectInput | VerifyPublicKeyInput | VerifyJsonWebKeyInput, + signature: string, + signature_format?: BinaryToTextEncoding, + ): boolean; + } + /** + * Creates a `DiffieHellman` key exchange object using the supplied `prime` and an + * optional specific `generator`. + * + * The `generator` argument can be a number, string, or `Buffer`. If`generator` is not specified, the value `2` is used. + * + * If `primeEncoding` is specified, `prime` is expected to be a string; otherwise + * a `Buffer`, `TypedArray`, or `DataView` is expected. + * + * If `generatorEncoding` is specified, `generator` is expected to be a string; + * otherwise a number, `Buffer`, `TypedArray`, or `DataView` is expected. + * @since v0.11.12 + * @param primeEncoding The `encoding` of the `prime` string. + * @param [generator=2] + * @param generatorEncoding The `encoding` of the `generator` string. + */ + function createDiffieHellman(primeLength: number, generator?: number): DiffieHellman; + function createDiffieHellman( + prime: ArrayBuffer | NodeJS.ArrayBufferView, + generator?: number | ArrayBuffer | NodeJS.ArrayBufferView, + ): DiffieHellman; + function createDiffieHellman( + prime: ArrayBuffer | NodeJS.ArrayBufferView, + generator: string, + generatorEncoding: BinaryToTextEncoding, + ): DiffieHellman; + function createDiffieHellman( + prime: string, + primeEncoding: BinaryToTextEncoding, + generator?: number | ArrayBuffer | NodeJS.ArrayBufferView, + ): DiffieHellman; + function createDiffieHellman( + prime: string, + primeEncoding: BinaryToTextEncoding, + generator: string, + generatorEncoding: BinaryToTextEncoding, + ): DiffieHellman; + /** + * The `DiffieHellman` class is a utility for creating Diffie-Hellman key + * exchanges. + * + * Instances of the `DiffieHellman` class can be created using the {@link createDiffieHellman} function. + * + * ```js + * import assert from 'node:assert'; + * + * const { + * createDiffieHellman, + * } = await import('node:crypto'); + * + * // Generate Alice's keys... + * const alice = createDiffieHellman(2048); + * const aliceKey = alice.generateKeys(); + * + * // Generate Bob's keys... + * const bob = createDiffieHellman(alice.getPrime(), alice.getGenerator()); + * const bobKey = bob.generateKeys(); + * + * // Exchange and generate the secret... + * const aliceSecret = alice.computeSecret(bobKey); + * const bobSecret = bob.computeSecret(aliceKey); + * + * // OK + * assert.strictEqual(aliceSecret.toString('hex'), bobSecret.toString('hex')); + * ``` + * @since v0.5.0 + */ + class DiffieHellman { + private constructor(); + /** + * Generates private and public Diffie-Hellman key values unless they have been + * generated or computed already, and returns + * the public key in the specified `encoding`. This key should be + * transferred to the other party. + * If `encoding` is provided a string is returned; otherwise a `Buffer` is returned. + * + * This function is a thin wrapper around [`DH_generate_key()`](https://www.openssl.org/docs/man3.0/man3/DH_generate_key.html). In particular, + * once a private key has been generated or set, calling this function only updates + * the public key but does not generate a new private key. + * @since v0.5.0 + * @param encoding The `encoding` of the return value. + */ + generateKeys(): Buffer; + generateKeys(encoding: BinaryToTextEncoding): string; + /** + * Computes the shared secret using `otherPublicKey` as the other + * party's public key and returns the computed shared secret. The supplied + * key is interpreted using the specified `inputEncoding`, and secret is + * encoded using specified `outputEncoding`. + * If the `inputEncoding` is not + * provided, `otherPublicKey` is expected to be a `Buffer`,`TypedArray`, or `DataView`. + * + * If `outputEncoding` is given a string is returned; otherwise, a `Buffer` is returned. + * @since v0.5.0 + * @param inputEncoding The `encoding` of an `otherPublicKey` string. + * @param outputEncoding The `encoding` of the return value. + */ + computeSecret(otherPublicKey: NodeJS.ArrayBufferView, inputEncoding?: null, outputEncoding?: null): Buffer; + computeSecret(otherPublicKey: string, inputEncoding: BinaryToTextEncoding, outputEncoding?: null): Buffer; + computeSecret( + otherPublicKey: NodeJS.ArrayBufferView, + inputEncoding: null, + outputEncoding: BinaryToTextEncoding, + ): string; + computeSecret( + otherPublicKey: string, + inputEncoding: BinaryToTextEncoding, + outputEncoding: BinaryToTextEncoding, + ): string; + /** + * Returns the Diffie-Hellman prime in the specified `encoding`. + * If `encoding` is provided a string is + * returned; otherwise a `Buffer` is returned. + * @since v0.5.0 + * @param encoding The `encoding` of the return value. + */ + getPrime(): Buffer; + getPrime(encoding: BinaryToTextEncoding): string; + /** + * Returns the Diffie-Hellman generator in the specified `encoding`. + * If `encoding` is provided a string is + * returned; otherwise a `Buffer` is returned. + * @since v0.5.0 + * @param encoding The `encoding` of the return value. + */ + getGenerator(): Buffer; + getGenerator(encoding: BinaryToTextEncoding): string; + /** + * Returns the Diffie-Hellman public key in the specified `encoding`. + * If `encoding` is provided a + * string is returned; otherwise a `Buffer` is returned. + * @since v0.5.0 + * @param encoding The `encoding` of the return value. + */ + getPublicKey(): Buffer; + getPublicKey(encoding: BinaryToTextEncoding): string; + /** + * Returns the Diffie-Hellman private key in the specified `encoding`. + * If `encoding` is provided a + * string is returned; otherwise a `Buffer` is returned. + * @since v0.5.0 + * @param encoding The `encoding` of the return value. + */ + getPrivateKey(): Buffer; + getPrivateKey(encoding: BinaryToTextEncoding): string; + /** + * Sets the Diffie-Hellman public key. If the `encoding` argument is provided,`publicKey` is expected + * to be a string. If no `encoding` is provided, `publicKey` is expected + * to be a `Buffer`, `TypedArray`, or `DataView`. + * @since v0.5.0 + * @param encoding The `encoding` of the `publicKey` string. + */ + setPublicKey(publicKey: NodeJS.ArrayBufferView): void; + setPublicKey(publicKey: string, encoding: BufferEncoding): void; + /** + * Sets the Diffie-Hellman private key. If the `encoding` argument is provided,`privateKey` is expected + * to be a string. If no `encoding` is provided, `privateKey` is expected + * to be a `Buffer`, `TypedArray`, or `DataView`. + * + * This function does not automatically compute the associated public key. Either `diffieHellman.setPublicKey()` or `diffieHellman.generateKeys()` can be + * used to manually provide the public key or to automatically derive it. + * @since v0.5.0 + * @param encoding The `encoding` of the `privateKey` string. + */ + setPrivateKey(privateKey: NodeJS.ArrayBufferView): void; + setPrivateKey(privateKey: string, encoding: BufferEncoding): void; + /** + * A bit field containing any warnings and/or errors resulting from a check + * performed during initialization of the `DiffieHellman` object. + * + * The following values are valid for this property (as defined in `node:constants` module): + * + * * `DH_CHECK_P_NOT_SAFE_PRIME` + * * `DH_CHECK_P_NOT_PRIME` + * * `DH_UNABLE_TO_CHECK_GENERATOR` + * * `DH_NOT_SUITABLE_GENERATOR` + * @since v0.11.12 + */ + verifyError: number; + } + /** + * The `DiffieHellmanGroup` class takes a well-known modp group as its argument. + * It works the same as `DiffieHellman`, except that it does not allow changing its keys after creation. + * In other words, it does not implement `setPublicKey()` or `setPrivateKey()` methods. + * + * ```js + * const { createDiffieHellmanGroup } = await import('node:crypto'); + * const dh = createDiffieHellmanGroup('modp1'); + * ``` + * The name (e.g. `'modp1'`) is taken from [RFC 2412](https://www.rfc-editor.org/rfc/rfc2412.txt) (modp1 and 2) and [RFC 3526](https://www.rfc-editor.org/rfc/rfc3526.txt): + * ```bash + * $ perl -ne 'print "$1\n" if /"(modp\d+)"/' src/node_crypto_groups.h + * modp1 # 768 bits + * modp2 # 1024 bits + * modp5 # 1536 bits + * modp14 # 2048 bits + * modp15 # etc. + * modp16 + * modp17 + * modp18 + * ``` + * @since v0.7.5 + */ + const DiffieHellmanGroup: DiffieHellmanGroupConstructor; + interface DiffieHellmanGroupConstructor { + new(name: string): DiffieHellmanGroup; + (name: string): DiffieHellmanGroup; + readonly prototype: DiffieHellmanGroup; + } + type DiffieHellmanGroup = Omit; + /** + * Creates a predefined `DiffieHellmanGroup` key exchange object. The + * supported groups are listed in the documentation for `DiffieHellmanGroup`. + * + * The returned object mimics the interface of objects created by {@link createDiffieHellman}, but will not allow changing + * the keys (with `diffieHellman.setPublicKey()`, for example). The + * advantage of using this method is that the parties do not have to + * generate nor exchange a group modulus beforehand, saving both processor + * and communication time. + * + * Example (obtaining a shared secret): + * + * ```js + * const { + * getDiffieHellman, + * } = await import('node:crypto'); + * const alice = getDiffieHellman('modp14'); + * const bob = getDiffieHellman('modp14'); + * + * alice.generateKeys(); + * bob.generateKeys(); + * + * const aliceSecret = alice.computeSecret(bob.getPublicKey(), null, 'hex'); + * const bobSecret = bob.computeSecret(alice.getPublicKey(), null, 'hex'); + * + * // aliceSecret and bobSecret should be the same + * console.log(aliceSecret === bobSecret); + * ``` + * @since v0.7.5 + */ + function getDiffieHellman(groupName: string): DiffieHellmanGroup; + /** + * An alias for {@link getDiffieHellman} + * @since v0.9.3 + */ + function createDiffieHellmanGroup(name: string): DiffieHellmanGroup; + /** + * Provides an asynchronous Password-Based Key Derivation Function 2 (PBKDF2) + * implementation. A selected HMAC digest algorithm specified by `digest` is + * applied to derive a key of the requested byte length (`keylen`) from the`password`, `salt` and `iterations`. + * + * The supplied `callback` function is called with two arguments: `err` and`derivedKey`. If an error occurs while deriving the key, `err` will be set; + * otherwise `err` will be `null`. By default, the successfully generated`derivedKey` will be passed to the callback as a `Buffer`. An error will be + * thrown if any of the input arguments specify invalid values or types. + * + * The `iterations` argument must be a number set as high as possible. The + * higher the number of iterations, the more secure the derived key will be, + * but will take a longer amount of time to complete. + * + * The `salt` should be as unique as possible. It is recommended that a salt is + * random and at least 16 bytes long. See [NIST SP 800-132](https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf) for details. + * + * When passing strings for `password` or `salt`, please consider `caveats when using strings as inputs to cryptographic APIs`. + * + * ```js + * const { + * pbkdf2, + * } = await import('node:crypto'); + * + * pbkdf2('secret', 'salt', 100000, 64, 'sha512', (err, derivedKey) => { + * if (err) throw err; + * console.log(derivedKey.toString('hex')); // '3745e48...08d59ae' + * }); + * ``` + * + * An array of supported digest functions can be retrieved using {@link getHashes}. + * + * This API uses libuv's threadpool, which can have surprising and + * negative performance implications for some applications; see the `UV_THREADPOOL_SIZE` documentation for more information. + * @since v0.5.5 + */ + function pbkdf2( + password: BinaryLike, + salt: BinaryLike, + iterations: number, + keylen: number, + digest: string, + callback: (err: Error | null, derivedKey: Buffer) => void, + ): void; + /** + * Provides a synchronous Password-Based Key Derivation Function 2 (PBKDF2) + * implementation. A selected HMAC digest algorithm specified by `digest` is + * applied to derive a key of the requested byte length (`keylen`) from the`password`, `salt` and `iterations`. + * + * If an error occurs an `Error` will be thrown, otherwise the derived key will be + * returned as a `Buffer`. + * + * The `iterations` argument must be a number set as high as possible. The + * higher the number of iterations, the more secure the derived key will be, + * but will take a longer amount of time to complete. + * + * The `salt` should be as unique as possible. It is recommended that a salt is + * random and at least 16 bytes long. See [NIST SP 800-132](https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf) for details. + * + * When passing strings for `password` or `salt`, please consider `caveats when using strings as inputs to cryptographic APIs`. + * + * ```js + * const { + * pbkdf2Sync, + * } = await import('node:crypto'); + * + * const key = pbkdf2Sync('secret', 'salt', 100000, 64, 'sha512'); + * console.log(key.toString('hex')); // '3745e48...08d59ae' + * ``` + * + * An array of supported digest functions can be retrieved using {@link getHashes}. + * @since v0.9.3 + */ + function pbkdf2Sync( + password: BinaryLike, + salt: BinaryLike, + iterations: number, + keylen: number, + digest: string, + ): Buffer; + /** + * Generates cryptographically strong pseudorandom data. The `size` argument + * is a number indicating the number of bytes to generate. + * + * If a `callback` function is provided, the bytes are generated asynchronously + * and the `callback` function is invoked with two arguments: `err` and `buf`. + * If an error occurs, `err` will be an `Error` object; otherwise it is `null`. The`buf` argument is a `Buffer` containing the generated bytes. + * + * ```js + * // Asynchronous + * const { + * randomBytes, + * } = await import('node:crypto'); + * + * randomBytes(256, (err, buf) => { + * if (err) throw err; + * console.log(`${buf.length} bytes of random data: ${buf.toString('hex')}`); + * }); + * ``` + * + * If the `callback` function is not provided, the random bytes are generated + * synchronously and returned as a `Buffer`. An error will be thrown if + * there is a problem generating the bytes. + * + * ```js + * // Synchronous + * const { + * randomBytes, + * } = await import('node:crypto'); + * + * const buf = randomBytes(256); + * console.log( + * `${buf.length} bytes of random data: ${buf.toString('hex')}`); + * ``` + * + * The `crypto.randomBytes()` method will not complete until there is + * sufficient entropy available. + * This should normally never take longer than a few milliseconds. The only time + * when generating the random bytes may conceivably block for a longer period of + * time is right after boot, when the whole system is still low on entropy. + * + * This API uses libuv's threadpool, which can have surprising and + * negative performance implications for some applications; see the `UV_THREADPOOL_SIZE` documentation for more information. + * + * The asynchronous version of `crypto.randomBytes()` is carried out in a single + * threadpool request. To minimize threadpool task length variation, partition + * large `randomBytes` requests when doing so as part of fulfilling a client + * request. + * @since v0.5.8 + * @param size The number of bytes to generate. The `size` must not be larger than `2**31 - 1`. + * @return if the `callback` function is not provided. + */ + function randomBytes(size: number): Buffer; + function randomBytes(size: number, callback: (err: Error | null, buf: Buffer) => void): void; + function pseudoRandomBytes(size: number): Buffer; + function pseudoRandomBytes(size: number, callback: (err: Error | null, buf: Buffer) => void): void; + /** + * Return a random integer `n` such that `min <= n < max`. This + * implementation avoids [modulo bias](https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#Modulo_bias). + * + * The range (`max - min`) must be less than 248. `min` and `max` must + * be [safe integers](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isSafeInteger). + * + * If the `callback` function is not provided, the random integer is + * generated synchronously. + * + * ```js + * // Asynchronous + * const { + * randomInt, + * } = await import('node:crypto'); + * + * randomInt(3, (err, n) => { + * if (err) throw err; + * console.log(`Random number chosen from (0, 1, 2): ${n}`); + * }); + * ``` + * + * ```js + * // Synchronous + * const { + * randomInt, + * } = await import('node:crypto'); + * + * const n = randomInt(3); + * console.log(`Random number chosen from (0, 1, 2): ${n}`); + * ``` + * + * ```js + * // With `min` argument + * const { + * randomInt, + * } = await import('node:crypto'); + * + * const n = randomInt(1, 7); + * console.log(`The dice rolled: ${n}`); + * ``` + * @since v14.10.0, v12.19.0 + * @param [min=0] Start of random range (inclusive). + * @param max End of random range (exclusive). + * @param callback `function(err, n) {}`. + */ + function randomInt(max: number): number; + function randomInt(min: number, max: number): number; + function randomInt(max: number, callback: (err: Error | null, value: number) => void): void; + function randomInt(min: number, max: number, callback: (err: Error | null, value: number) => void): void; + /** + * Synchronous version of {@link randomFill}. + * + * ```js + * import { Buffer } from 'node:buffer'; + * const { randomFillSync } = await import('node:crypto'); + * + * const buf = Buffer.alloc(10); + * console.log(randomFillSync(buf).toString('hex')); + * + * randomFillSync(buf, 5); + * console.log(buf.toString('hex')); + * + * // The above is equivalent to the following: + * randomFillSync(buf, 5, 5); + * console.log(buf.toString('hex')); + * ``` + * + * Any `ArrayBuffer`, `TypedArray` or `DataView` instance may be passed as`buffer`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * const { randomFillSync } = await import('node:crypto'); + * + * const a = new Uint32Array(10); + * console.log(Buffer.from(randomFillSync(a).buffer, + * a.byteOffset, a.byteLength).toString('hex')); + * + * const b = new DataView(new ArrayBuffer(10)); + * console.log(Buffer.from(randomFillSync(b).buffer, + * b.byteOffset, b.byteLength).toString('hex')); + * + * const c = new ArrayBuffer(10); + * console.log(Buffer.from(randomFillSync(c)).toString('hex')); + * ``` + * @since v7.10.0, v6.13.0 + * @param buffer Must be supplied. The size of the provided `buffer` must not be larger than `2**31 - 1`. + * @param [offset=0] + * @param [size=buffer.length - offset] + * @return The object passed as `buffer` argument. + */ + function randomFillSync(buffer: T, offset?: number, size?: number): T; + /** + * This function is similar to {@link randomBytes} but requires the first + * argument to be a `Buffer` that will be filled. It also + * requires that a callback is passed in. + * + * If the `callback` function is not provided, an error will be thrown. + * + * ```js + * import { Buffer } from 'node:buffer'; + * const { randomFill } = await import('node:crypto'); + * + * const buf = Buffer.alloc(10); + * randomFill(buf, (err, buf) => { + * if (err) throw err; + * console.log(buf.toString('hex')); + * }); + * + * randomFill(buf, 5, (err, buf) => { + * if (err) throw err; + * console.log(buf.toString('hex')); + * }); + * + * // The above is equivalent to the following: + * randomFill(buf, 5, 5, (err, buf) => { + * if (err) throw err; + * console.log(buf.toString('hex')); + * }); + * ``` + * + * Any `ArrayBuffer`, `TypedArray`, or `DataView` instance may be passed as`buffer`. + * + * While this includes instances of `Float32Array` and `Float64Array`, this + * function should not be used to generate random floating-point numbers. The + * result may contain `+Infinity`, `-Infinity`, and `NaN`, and even if the array + * contains finite numbers only, they are not drawn from a uniform random + * distribution and have no meaningful lower or upper bounds. + * + * ```js + * import { Buffer } from 'node:buffer'; + * const { randomFill } = await import('node:crypto'); + * + * const a = new Uint32Array(10); + * randomFill(a, (err, buf) => { + * if (err) throw err; + * console.log(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength) + * .toString('hex')); + * }); + * + * const b = new DataView(new ArrayBuffer(10)); + * randomFill(b, (err, buf) => { + * if (err) throw err; + * console.log(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength) + * .toString('hex')); + * }); + * + * const c = new ArrayBuffer(10); + * randomFill(c, (err, buf) => { + * if (err) throw err; + * console.log(Buffer.from(buf).toString('hex')); + * }); + * ``` + * + * This API uses libuv's threadpool, which can have surprising and + * negative performance implications for some applications; see the `UV_THREADPOOL_SIZE` documentation for more information. + * + * The asynchronous version of `crypto.randomFill()` is carried out in a single + * threadpool request. To minimize threadpool task length variation, partition + * large `randomFill` requests when doing so as part of fulfilling a client + * request. + * @since v7.10.0, v6.13.0 + * @param buffer Must be supplied. The size of the provided `buffer` must not be larger than `2**31 - 1`. + * @param [offset=0] + * @param [size=buffer.length - offset] + * @param callback `function(err, buf) {}`. + */ + function randomFill( + buffer: T, + callback: (err: Error | null, buf: T) => void, + ): void; + function randomFill( + buffer: T, + offset: number, + callback: (err: Error | null, buf: T) => void, + ): void; + function randomFill( + buffer: T, + offset: number, + size: number, + callback: (err: Error | null, buf: T) => void, + ): void; + interface ScryptOptions { + cost?: number | undefined; + blockSize?: number | undefined; + parallelization?: number | undefined; + N?: number | undefined; + r?: number | undefined; + p?: number | undefined; + maxmem?: number | undefined; + } + /** + * Provides an asynchronous [scrypt](https://en.wikipedia.org/wiki/Scrypt) implementation. Scrypt is a password-based + * key derivation function that is designed to be expensive computationally and + * memory-wise in order to make brute-force attacks unrewarding. + * + * The `salt` should be as unique as possible. It is recommended that a salt is + * random and at least 16 bytes long. See [NIST SP 800-132](https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf) for details. + * + * When passing strings for `password` or `salt`, please consider `caveats when using strings as inputs to cryptographic APIs`. + * + * The `callback` function is called with two arguments: `err` and `derivedKey`.`err` is an exception object when key derivation fails, otherwise `err` is`null`. `derivedKey` is passed to the + * callback as a `Buffer`. + * + * An exception is thrown when any of the input arguments specify invalid values + * or types. + * + * ```js + * const { + * scrypt, + * } = await import('node:crypto'); + * + * // Using the factory defaults. + * scrypt('password', 'salt', 64, (err, derivedKey) => { + * if (err) throw err; + * console.log(derivedKey.toString('hex')); // '3745e48...08d59ae' + * }); + * // Using a custom N parameter. Must be a power of two. + * scrypt('password', 'salt', 64, { N: 1024 }, (err, derivedKey) => { + * if (err) throw err; + * console.log(derivedKey.toString('hex')); // '3745e48...aa39b34' + * }); + * ``` + * @since v10.5.0 + */ + function scrypt( + password: BinaryLike, + salt: BinaryLike, + keylen: number, + callback: (err: Error | null, derivedKey: Buffer) => void, + ): void; + function scrypt( + password: BinaryLike, + salt: BinaryLike, + keylen: number, + options: ScryptOptions, + callback: (err: Error | null, derivedKey: Buffer) => void, + ): void; + /** + * Provides a synchronous [scrypt](https://en.wikipedia.org/wiki/Scrypt) implementation. Scrypt is a password-based + * key derivation function that is designed to be expensive computationally and + * memory-wise in order to make brute-force attacks unrewarding. + * + * The `salt` should be as unique as possible. It is recommended that a salt is + * random and at least 16 bytes long. See [NIST SP 800-132](https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf) for details. + * + * When passing strings for `password` or `salt`, please consider `caveats when using strings as inputs to cryptographic APIs`. + * + * An exception is thrown when key derivation fails, otherwise the derived key is + * returned as a `Buffer`. + * + * An exception is thrown when any of the input arguments specify invalid values + * or types. + * + * ```js + * const { + * scryptSync, + * } = await import('node:crypto'); + * // Using the factory defaults. + * + * const key1 = scryptSync('password', 'salt', 64); + * console.log(key1.toString('hex')); // '3745e48...08d59ae' + * // Using a custom N parameter. Must be a power of two. + * const key2 = scryptSync('password', 'salt', 64, { N: 1024 }); + * console.log(key2.toString('hex')); // '3745e48...aa39b34' + * ``` + * @since v10.5.0 + */ + function scryptSync(password: BinaryLike, salt: BinaryLike, keylen: number, options?: ScryptOptions): Buffer; + interface RsaPublicKey { + key: KeyLike; + padding?: number | undefined; + } + interface RsaPrivateKey { + key: KeyLike; + passphrase?: string | undefined; + /** + * @default 'sha1' + */ + oaepHash?: string | undefined; + oaepLabel?: NodeJS.TypedArray | undefined; + padding?: number | undefined; + } + /** + * Encrypts the content of `buffer` with `key` and returns a new `Buffer` with encrypted content. The returned data can be decrypted using + * the corresponding private key, for example using {@link privateDecrypt}. + * + * If `key` is not a `KeyObject`, this function behaves as if`key` had been passed to {@link createPublicKey}. If it is an + * object, the `padding` property can be passed. Otherwise, this function uses`RSA_PKCS1_OAEP_PADDING`. + * + * Because RSA public keys can be derived from private keys, a private key may + * be passed instead of a public key. + * @since v0.11.14 + */ + function publicEncrypt(key: RsaPublicKey | RsaPrivateKey | KeyLike, buffer: NodeJS.ArrayBufferView): Buffer; + /** + * Decrypts `buffer` with `key`.`buffer` was previously encrypted using + * the corresponding private key, for example using {@link privateEncrypt}. + * + * If `key` is not a `KeyObject`, this function behaves as if`key` had been passed to {@link createPublicKey}. If it is an + * object, the `padding` property can be passed. Otherwise, this function uses`RSA_PKCS1_PADDING`. + * + * Because RSA public keys can be derived from private keys, a private key may + * be passed instead of a public key. + * @since v1.1.0 + */ + function publicDecrypt(key: RsaPublicKey | RsaPrivateKey | KeyLike, buffer: NodeJS.ArrayBufferView): Buffer; + /** + * Decrypts `buffer` with `privateKey`. `buffer` was previously encrypted using + * the corresponding public key, for example using {@link publicEncrypt}. + * + * If `privateKey` is not a `KeyObject`, this function behaves as if`privateKey` had been passed to {@link createPrivateKey}. If it is an + * object, the `padding` property can be passed. Otherwise, this function uses`RSA_PKCS1_OAEP_PADDING`. + * @since v0.11.14 + */ + function privateDecrypt(privateKey: RsaPrivateKey | KeyLike, buffer: NodeJS.ArrayBufferView): Buffer; + /** + * Encrypts `buffer` with `privateKey`. The returned data can be decrypted using + * the corresponding public key, for example using {@link publicDecrypt}. + * + * If `privateKey` is not a `KeyObject`, this function behaves as if`privateKey` had been passed to {@link createPrivateKey}. If it is an + * object, the `padding` property can be passed. Otherwise, this function uses`RSA_PKCS1_PADDING`. + * @since v1.1.0 + */ + function privateEncrypt(privateKey: RsaPrivateKey | KeyLike, buffer: NodeJS.ArrayBufferView): Buffer; + /** + * ```js + * const { + * getCiphers, + * } = await import('node:crypto'); + * + * console.log(getCiphers()); // ['aes-128-cbc', 'aes-128-ccm', ...] + * ``` + * @since v0.9.3 + * @return An array with the names of the supported cipher algorithms. + */ + function getCiphers(): string[]; + /** + * ```js + * const { + * getCurves, + * } = await import('node:crypto'); + * + * console.log(getCurves()); // ['Oakley-EC2N-3', 'Oakley-EC2N-4', ...] + * ``` + * @since v2.3.0 + * @return An array with the names of the supported elliptic curves. + */ + function getCurves(): string[]; + /** + * @since v10.0.0 + * @return `1` if and only if a FIPS compliant crypto provider is currently in use, `0` otherwise. A future semver-major release may change the return type of this API to a {boolean}. + */ + function getFips(): 1 | 0; + /** + * Enables the FIPS compliant crypto provider in a FIPS-enabled Node.js build. + * Throws an error if FIPS mode is not available. + * @since v10.0.0 + * @param bool `true` to enable FIPS mode. + */ + function setFips(bool: boolean): void; + /** + * ```js + * const { + * getHashes, + * } = await import('node:crypto'); + * + * console.log(getHashes()); // ['DSA', 'DSA-SHA', 'DSA-SHA1', ...] + * ``` + * @since v0.9.3 + * @return An array of the names of the supported hash algorithms, such as `'RSA-SHA256'`. Hash algorithms are also called "digest" algorithms. + */ + function getHashes(): string[]; + /** + * The `ECDH` class is a utility for creating Elliptic Curve Diffie-Hellman (ECDH) + * key exchanges. + * + * Instances of the `ECDH` class can be created using the {@link createECDH} function. + * + * ```js + * import assert from 'node:assert'; + * + * const { + * createECDH, + * } = await import('node:crypto'); + * + * // Generate Alice's keys... + * const alice = createECDH('secp521r1'); + * const aliceKey = alice.generateKeys(); + * + * // Generate Bob's keys... + * const bob = createECDH('secp521r1'); + * const bobKey = bob.generateKeys(); + * + * // Exchange and generate the secret... + * const aliceSecret = alice.computeSecret(bobKey); + * const bobSecret = bob.computeSecret(aliceKey); + * + * assert.strictEqual(aliceSecret.toString('hex'), bobSecret.toString('hex')); + * // OK + * ``` + * @since v0.11.14 + */ + class ECDH { + private constructor(); + /** + * Converts the EC Diffie-Hellman public key specified by `key` and `curve` to the + * format specified by `format`. The `format` argument specifies point encoding + * and can be `'compressed'`, `'uncompressed'` or `'hybrid'`. The supplied key is + * interpreted using the specified `inputEncoding`, and the returned key is encoded + * using the specified `outputEncoding`. + * + * Use {@link getCurves} to obtain a list of available curve names. + * On recent OpenSSL releases, `openssl ecparam -list_curves` will also display + * the name and description of each available elliptic curve. + * + * If `format` is not specified the point will be returned in `'uncompressed'`format. + * + * If the `inputEncoding` is not provided, `key` is expected to be a `Buffer`,`TypedArray`, or `DataView`. + * + * Example (uncompressing a key): + * + * ```js + * const { + * createECDH, + * ECDH, + * } = await import('node:crypto'); + * + * const ecdh = createECDH('secp256k1'); + * ecdh.generateKeys(); + * + * const compressedKey = ecdh.getPublicKey('hex', 'compressed'); + * + * const uncompressedKey = ECDH.convertKey(compressedKey, + * 'secp256k1', + * 'hex', + * 'hex', + * 'uncompressed'); + * + * // The converted key and the uncompressed public key should be the same + * console.log(uncompressedKey === ecdh.getPublicKey('hex')); + * ``` + * @since v10.0.0 + * @param inputEncoding The `encoding` of the `key` string. + * @param outputEncoding The `encoding` of the return value. + * @param [format='uncompressed'] + */ + static convertKey( + key: BinaryLike, + curve: string, + inputEncoding?: BinaryToTextEncoding, + outputEncoding?: "latin1" | "hex" | "base64" | "base64url", + format?: "uncompressed" | "compressed" | "hybrid", + ): Buffer | string; + /** + * Generates private and public EC Diffie-Hellman key values, and returns + * the public key in the specified `format` and `encoding`. This key should be + * transferred to the other party. + * + * The `format` argument specifies point encoding and can be `'compressed'` or`'uncompressed'`. If `format` is not specified, the point will be returned in`'uncompressed'` format. + * + * If `encoding` is provided a string is returned; otherwise a `Buffer` is returned. + * @since v0.11.14 + * @param encoding The `encoding` of the return value. + * @param [format='uncompressed'] + */ + generateKeys(): Buffer; + generateKeys(encoding: BinaryToTextEncoding, format?: ECDHKeyFormat): string; + /** + * Computes the shared secret using `otherPublicKey` as the other + * party's public key and returns the computed shared secret. The supplied + * key is interpreted using specified `inputEncoding`, and the returned secret + * is encoded using the specified `outputEncoding`. + * If the `inputEncoding` is not + * provided, `otherPublicKey` is expected to be a `Buffer`, `TypedArray`, or`DataView`. + * + * If `outputEncoding` is given a string will be returned; otherwise a `Buffer` is returned. + * + * `ecdh.computeSecret` will throw an`ERR_CRYPTO_ECDH_INVALID_PUBLIC_KEY` error when `otherPublicKey`lies outside of the elliptic curve. Since `otherPublicKey` is + * usually supplied from a remote user over an insecure network, + * be sure to handle this exception accordingly. + * @since v0.11.14 + * @param inputEncoding The `encoding` of the `otherPublicKey` string. + * @param outputEncoding The `encoding` of the return value. + */ + computeSecret(otherPublicKey: NodeJS.ArrayBufferView): Buffer; + computeSecret(otherPublicKey: string, inputEncoding: BinaryToTextEncoding): Buffer; + computeSecret(otherPublicKey: NodeJS.ArrayBufferView, outputEncoding: BinaryToTextEncoding): string; + computeSecret( + otherPublicKey: string, + inputEncoding: BinaryToTextEncoding, + outputEncoding: BinaryToTextEncoding, + ): string; + /** + * If `encoding` is specified, a string is returned; otherwise a `Buffer` is + * returned. + * @since v0.11.14 + * @param encoding The `encoding` of the return value. + * @return The EC Diffie-Hellman in the specified `encoding`. + */ + getPrivateKey(): Buffer; + getPrivateKey(encoding: BinaryToTextEncoding): string; + /** + * The `format` argument specifies point encoding and can be `'compressed'` or`'uncompressed'`. If `format` is not specified the point will be returned in`'uncompressed'` format. + * + * If `encoding` is specified, a string is returned; otherwise a `Buffer` is + * returned. + * @since v0.11.14 + * @param encoding The `encoding` of the return value. + * @param [format='uncompressed'] + * @return The EC Diffie-Hellman public key in the specified `encoding` and `format`. + */ + getPublicKey(encoding?: null, format?: ECDHKeyFormat): Buffer; + getPublicKey(encoding: BinaryToTextEncoding, format?: ECDHKeyFormat): string; + /** + * Sets the EC Diffie-Hellman private key. + * If `encoding` is provided, `privateKey` is expected + * to be a string; otherwise `privateKey` is expected to be a `Buffer`,`TypedArray`, or `DataView`. + * + * If `privateKey` is not valid for the curve specified when the `ECDH` object was + * created, an error is thrown. Upon setting the private key, the associated + * public point (key) is also generated and set in the `ECDH` object. + * @since v0.11.14 + * @param encoding The `encoding` of the `privateKey` string. + */ + setPrivateKey(privateKey: NodeJS.ArrayBufferView): void; + setPrivateKey(privateKey: string, encoding: BinaryToTextEncoding): void; + } + /** + * Creates an Elliptic Curve Diffie-Hellman (`ECDH`) key exchange object using a + * predefined curve specified by the `curveName` string. Use {@link getCurves} to obtain a list of available curve names. On recent + * OpenSSL releases, `openssl ecparam -list_curves` will also display the name + * and description of each available elliptic curve. + * @since v0.11.14 + */ + function createECDH(curveName: string): ECDH; + /** + * This function compares the underlying bytes that represent the given`ArrayBuffer`, `TypedArray`, or `DataView` instances using a constant-time + * algorithm. + * + * This function does not leak timing information that + * would allow an attacker to guess one of the values. This is suitable for + * comparing HMAC digests or secret values like authentication cookies or [capability urls](https://www.w3.org/TR/capability-urls/). + * + * `a` and `b` must both be `Buffer`s, `TypedArray`s, or `DataView`s, and they + * must have the same byte length. An error is thrown if `a` and `b` have + * different byte lengths. + * + * If at least one of `a` and `b` is a `TypedArray` with more than one byte per + * entry, such as `Uint16Array`, the result will be computed using the platform + * byte order. + * + * **When both of the inputs are `Float32Array`s or`Float64Array`s, this function might return unexpected results due to IEEE 754** + * **encoding of floating-point numbers. In particular, neither `x === y` nor`Object.is(x, y)` implies that the byte representations of two floating-point** + * **numbers `x` and `y` are equal.** + * + * Use of `crypto.timingSafeEqual` does not guarantee that the _surrounding_ code + * is timing-safe. Care should be taken to ensure that the surrounding code does + * not introduce timing vulnerabilities. + * @since v6.6.0 + */ + function timingSafeEqual(a: NodeJS.ArrayBufferView, b: NodeJS.ArrayBufferView): boolean; + type KeyType = "rsa" | "rsa-pss" | "dsa" | "ec" | "ed25519" | "ed448" | "x25519" | "x448"; + type KeyFormat = "pem" | "der" | "jwk"; + interface BasePrivateKeyEncodingOptions { + format: T; + cipher?: string | undefined; + passphrase?: string | undefined; + } + interface KeyPairKeyObjectResult { + publicKey: KeyObject; + privateKey: KeyObject; + } + interface ED25519KeyPairKeyObjectOptions {} + interface ED448KeyPairKeyObjectOptions {} + interface X25519KeyPairKeyObjectOptions {} + interface X448KeyPairKeyObjectOptions {} + interface ECKeyPairKeyObjectOptions { + /** + * Name of the curve to use + */ + namedCurve: string; + } + interface RSAKeyPairKeyObjectOptions { + /** + * Key size in bits + */ + modulusLength: number; + /** + * Public exponent + * @default 0x10001 + */ + publicExponent?: number | undefined; + } + interface RSAPSSKeyPairKeyObjectOptions { + /** + * Key size in bits + */ + modulusLength: number; + /** + * Public exponent + * @default 0x10001 + */ + publicExponent?: number | undefined; + /** + * Name of the message digest + */ + hashAlgorithm?: string; + /** + * Name of the message digest used by MGF1 + */ + mgf1HashAlgorithm?: string; + /** + * Minimal salt length in bytes + */ + saltLength?: string; + } + interface DSAKeyPairKeyObjectOptions { + /** + * Key size in bits + */ + modulusLength: number; + /** + * Size of q in bits + */ + divisorLength: number; + } + interface RSAKeyPairOptions { + /** + * Key size in bits + */ + modulusLength: number; + /** + * Public exponent + * @default 0x10001 + */ + publicExponent?: number | undefined; + publicKeyEncoding: { + type: "pkcs1" | "spki"; + format: PubF; + }; + privateKeyEncoding: BasePrivateKeyEncodingOptions & { + type: "pkcs1" | "pkcs8"; + }; + } + interface RSAPSSKeyPairOptions { + /** + * Key size in bits + */ + modulusLength: number; + /** + * Public exponent + * @default 0x10001 + */ + publicExponent?: number | undefined; + /** + * Name of the message digest + */ + hashAlgorithm?: string; + /** + * Name of the message digest used by MGF1 + */ + mgf1HashAlgorithm?: string; + /** + * Minimal salt length in bytes + */ + saltLength?: string; + publicKeyEncoding: { + type: "spki"; + format: PubF; + }; + privateKeyEncoding: BasePrivateKeyEncodingOptions & { + type: "pkcs8"; + }; + } + interface DSAKeyPairOptions { + /** + * Key size in bits + */ + modulusLength: number; + /** + * Size of q in bits + */ + divisorLength: number; + publicKeyEncoding: { + type: "spki"; + format: PubF; + }; + privateKeyEncoding: BasePrivateKeyEncodingOptions & { + type: "pkcs8"; + }; + } + interface ECKeyPairOptions { + /** + * Name of the curve to use. + */ + namedCurve: string; + publicKeyEncoding: { + type: "pkcs1" | "spki"; + format: PubF; + }; + privateKeyEncoding: BasePrivateKeyEncodingOptions & { + type: "sec1" | "pkcs8"; + }; + } + interface ED25519KeyPairOptions { + publicKeyEncoding: { + type: "spki"; + format: PubF; + }; + privateKeyEncoding: BasePrivateKeyEncodingOptions & { + type: "pkcs8"; + }; + } + interface ED448KeyPairOptions { + publicKeyEncoding: { + type: "spki"; + format: PubF; + }; + privateKeyEncoding: BasePrivateKeyEncodingOptions & { + type: "pkcs8"; + }; + } + interface X25519KeyPairOptions { + publicKeyEncoding: { + type: "spki"; + format: PubF; + }; + privateKeyEncoding: BasePrivateKeyEncodingOptions & { + type: "pkcs8"; + }; + } + interface X448KeyPairOptions { + publicKeyEncoding: { + type: "spki"; + format: PubF; + }; + privateKeyEncoding: BasePrivateKeyEncodingOptions & { + type: "pkcs8"; + }; + } + interface KeyPairSyncResult { + publicKey: T1; + privateKey: T2; + } + /** + * Generates a new asymmetric key pair of the given `type`. RSA, RSA-PSS, DSA, EC, + * Ed25519, Ed448, X25519, X448, and DH are currently supported. + * + * If a `publicKeyEncoding` or `privateKeyEncoding` was specified, this function + * behaves as if `keyObject.export()` had been called on its result. Otherwise, + * the respective part of the key is returned as a `KeyObject`. + * + * When encoding public keys, it is recommended to use `'spki'`. When encoding + * private keys, it is recommended to use `'pkcs8'` with a strong passphrase, + * and to keep the passphrase confidential. + * + * ```js + * const { + * generateKeyPairSync, + * } = await import('node:crypto'); + * + * const { + * publicKey, + * privateKey, + * } = generateKeyPairSync('rsa', { + * modulusLength: 4096, + * publicKeyEncoding: { + * type: 'spki', + * format: 'pem', + * }, + * privateKeyEncoding: { + * type: 'pkcs8', + * format: 'pem', + * cipher: 'aes-256-cbc', + * passphrase: 'top secret', + * }, + * }); + * ``` + * + * The return value `{ publicKey, privateKey }` represents the generated key pair. + * When PEM encoding was selected, the respective key will be a string, otherwise + * it will be a buffer containing the data encoded as DER. + * @since v10.12.0 + * @param type Must be `'rsa'`, `'rsa-pss'`, `'dsa'`, `'ec'`, `'ed25519'`, `'ed448'`, `'x25519'`, `'x448'`, or `'dh'`. + */ + function generateKeyPairSync( + type: "rsa", + options: RSAKeyPairOptions<"pem", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "rsa", + options: RSAKeyPairOptions<"pem", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "rsa", + options: RSAKeyPairOptions<"der", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "rsa", + options: RSAKeyPairOptions<"der", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync(type: "rsa", options: RSAKeyPairKeyObjectOptions): KeyPairKeyObjectResult; + function generateKeyPairSync( + type: "rsa-pss", + options: RSAPSSKeyPairOptions<"pem", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "rsa-pss", + options: RSAPSSKeyPairOptions<"pem", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "rsa-pss", + options: RSAPSSKeyPairOptions<"der", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "rsa-pss", + options: RSAPSSKeyPairOptions<"der", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync(type: "rsa-pss", options: RSAPSSKeyPairKeyObjectOptions): KeyPairKeyObjectResult; + function generateKeyPairSync( + type: "dsa", + options: DSAKeyPairOptions<"pem", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "dsa", + options: DSAKeyPairOptions<"pem", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "dsa", + options: DSAKeyPairOptions<"der", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "dsa", + options: DSAKeyPairOptions<"der", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync(type: "dsa", options: DSAKeyPairKeyObjectOptions): KeyPairKeyObjectResult; + function generateKeyPairSync( + type: "ec", + options: ECKeyPairOptions<"pem", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "ec", + options: ECKeyPairOptions<"pem", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "ec", + options: ECKeyPairOptions<"der", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "ec", + options: ECKeyPairOptions<"der", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync(type: "ec", options: ECKeyPairKeyObjectOptions): KeyPairKeyObjectResult; + function generateKeyPairSync( + type: "ed25519", + options: ED25519KeyPairOptions<"pem", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "ed25519", + options: ED25519KeyPairOptions<"pem", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "ed25519", + options: ED25519KeyPairOptions<"der", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "ed25519", + options: ED25519KeyPairOptions<"der", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync(type: "ed25519", options?: ED25519KeyPairKeyObjectOptions): KeyPairKeyObjectResult; + function generateKeyPairSync( + type: "ed448", + options: ED448KeyPairOptions<"pem", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "ed448", + options: ED448KeyPairOptions<"pem", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "ed448", + options: ED448KeyPairOptions<"der", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "ed448", + options: ED448KeyPairOptions<"der", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync(type: "ed448", options?: ED448KeyPairKeyObjectOptions): KeyPairKeyObjectResult; + function generateKeyPairSync( + type: "x25519", + options: X25519KeyPairOptions<"pem", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "x25519", + options: X25519KeyPairOptions<"pem", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "x25519", + options: X25519KeyPairOptions<"der", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "x25519", + options: X25519KeyPairOptions<"der", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync(type: "x25519", options?: X25519KeyPairKeyObjectOptions): KeyPairKeyObjectResult; + function generateKeyPairSync( + type: "x448", + options: X448KeyPairOptions<"pem", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "x448", + options: X448KeyPairOptions<"pem", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "x448", + options: X448KeyPairOptions<"der", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "x448", + options: X448KeyPairOptions<"der", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync(type: "x448", options?: X448KeyPairKeyObjectOptions): KeyPairKeyObjectResult; + /** + * Generates a new asymmetric key pair of the given `type`. RSA, RSA-PSS, DSA, EC, + * Ed25519, Ed448, X25519, X448, and DH are currently supported. + * + * If a `publicKeyEncoding` or `privateKeyEncoding` was specified, this function + * behaves as if `keyObject.export()` had been called on its result. Otherwise, + * the respective part of the key is returned as a `KeyObject`. + * + * It is recommended to encode public keys as `'spki'` and private keys as`'pkcs8'` with encryption for long-term storage: + * + * ```js + * const { + * generateKeyPair, + * } = await import('node:crypto'); + * + * generateKeyPair('rsa', { + * modulusLength: 4096, + * publicKeyEncoding: { + * type: 'spki', + * format: 'pem', + * }, + * privateKeyEncoding: { + * type: 'pkcs8', + * format: 'pem', + * cipher: 'aes-256-cbc', + * passphrase: 'top secret', + * }, + * }, (err, publicKey, privateKey) => { + * // Handle errors and use the generated key pair. + * }); + * ``` + * + * On completion, `callback` will be called with `err` set to `undefined` and`publicKey` / `privateKey` representing the generated key pair. + * + * If this method is invoked as its `util.promisify()` ed version, it returns + * a `Promise` for an `Object` with `publicKey` and `privateKey` properties. + * @since v10.12.0 + * @param type Must be `'rsa'`, `'rsa-pss'`, `'dsa'`, `'ec'`, `'ed25519'`, `'ed448'`, `'x25519'`, `'x448'`, or `'dh'`. + */ + function generateKeyPair( + type: "rsa", + options: RSAKeyPairOptions<"pem", "pem">, + callback: (err: Error | null, publicKey: string, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "rsa", + options: RSAKeyPairOptions<"pem", "der">, + callback: (err: Error | null, publicKey: string, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "rsa", + options: RSAKeyPairOptions<"der", "pem">, + callback: (err: Error | null, publicKey: Buffer, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "rsa", + options: RSAKeyPairOptions<"der", "der">, + callback: (err: Error | null, publicKey: Buffer, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "rsa", + options: RSAKeyPairKeyObjectOptions, + callback: (err: Error | null, publicKey: KeyObject, privateKey: KeyObject) => void, + ): void; + function generateKeyPair( + type: "rsa-pss", + options: RSAPSSKeyPairOptions<"pem", "pem">, + callback: (err: Error | null, publicKey: string, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "rsa-pss", + options: RSAPSSKeyPairOptions<"pem", "der">, + callback: (err: Error | null, publicKey: string, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "rsa-pss", + options: RSAPSSKeyPairOptions<"der", "pem">, + callback: (err: Error | null, publicKey: Buffer, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "rsa-pss", + options: RSAPSSKeyPairOptions<"der", "der">, + callback: (err: Error | null, publicKey: Buffer, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "rsa-pss", + options: RSAPSSKeyPairKeyObjectOptions, + callback: (err: Error | null, publicKey: KeyObject, privateKey: KeyObject) => void, + ): void; + function generateKeyPair( + type: "dsa", + options: DSAKeyPairOptions<"pem", "pem">, + callback: (err: Error | null, publicKey: string, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "dsa", + options: DSAKeyPairOptions<"pem", "der">, + callback: (err: Error | null, publicKey: string, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "dsa", + options: DSAKeyPairOptions<"der", "pem">, + callback: (err: Error | null, publicKey: Buffer, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "dsa", + options: DSAKeyPairOptions<"der", "der">, + callback: (err: Error | null, publicKey: Buffer, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "dsa", + options: DSAKeyPairKeyObjectOptions, + callback: (err: Error | null, publicKey: KeyObject, privateKey: KeyObject) => void, + ): void; + function generateKeyPair( + type: "ec", + options: ECKeyPairOptions<"pem", "pem">, + callback: (err: Error | null, publicKey: string, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "ec", + options: ECKeyPairOptions<"pem", "der">, + callback: (err: Error | null, publicKey: string, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "ec", + options: ECKeyPairOptions<"der", "pem">, + callback: (err: Error | null, publicKey: Buffer, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "ec", + options: ECKeyPairOptions<"der", "der">, + callback: (err: Error | null, publicKey: Buffer, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "ec", + options: ECKeyPairKeyObjectOptions, + callback: (err: Error | null, publicKey: KeyObject, privateKey: KeyObject) => void, + ): void; + function generateKeyPair( + type: "ed25519", + options: ED25519KeyPairOptions<"pem", "pem">, + callback: (err: Error | null, publicKey: string, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "ed25519", + options: ED25519KeyPairOptions<"pem", "der">, + callback: (err: Error | null, publicKey: string, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "ed25519", + options: ED25519KeyPairOptions<"der", "pem">, + callback: (err: Error | null, publicKey: Buffer, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "ed25519", + options: ED25519KeyPairOptions<"der", "der">, + callback: (err: Error | null, publicKey: Buffer, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "ed25519", + options: ED25519KeyPairKeyObjectOptions | undefined, + callback: (err: Error | null, publicKey: KeyObject, privateKey: KeyObject) => void, + ): void; + function generateKeyPair( + type: "ed448", + options: ED448KeyPairOptions<"pem", "pem">, + callback: (err: Error | null, publicKey: string, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "ed448", + options: ED448KeyPairOptions<"pem", "der">, + callback: (err: Error | null, publicKey: string, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "ed448", + options: ED448KeyPairOptions<"der", "pem">, + callback: (err: Error | null, publicKey: Buffer, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "ed448", + options: ED448KeyPairOptions<"der", "der">, + callback: (err: Error | null, publicKey: Buffer, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "ed448", + options: ED448KeyPairKeyObjectOptions | undefined, + callback: (err: Error | null, publicKey: KeyObject, privateKey: KeyObject) => void, + ): void; + function generateKeyPair( + type: "x25519", + options: X25519KeyPairOptions<"pem", "pem">, + callback: (err: Error | null, publicKey: string, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "x25519", + options: X25519KeyPairOptions<"pem", "der">, + callback: (err: Error | null, publicKey: string, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "x25519", + options: X25519KeyPairOptions<"der", "pem">, + callback: (err: Error | null, publicKey: Buffer, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "x25519", + options: X25519KeyPairOptions<"der", "der">, + callback: (err: Error | null, publicKey: Buffer, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "x25519", + options: X25519KeyPairKeyObjectOptions | undefined, + callback: (err: Error | null, publicKey: KeyObject, privateKey: KeyObject) => void, + ): void; + function generateKeyPair( + type: "x448", + options: X448KeyPairOptions<"pem", "pem">, + callback: (err: Error | null, publicKey: string, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "x448", + options: X448KeyPairOptions<"pem", "der">, + callback: (err: Error | null, publicKey: string, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "x448", + options: X448KeyPairOptions<"der", "pem">, + callback: (err: Error | null, publicKey: Buffer, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "x448", + options: X448KeyPairOptions<"der", "der">, + callback: (err: Error | null, publicKey: Buffer, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "x448", + options: X448KeyPairKeyObjectOptions | undefined, + callback: (err: Error | null, publicKey: KeyObject, privateKey: KeyObject) => void, + ): void; + namespace generateKeyPair { + function __promisify__( + type: "rsa", + options: RSAKeyPairOptions<"pem", "pem">, + ): Promise<{ + publicKey: string; + privateKey: string; + }>; + function __promisify__( + type: "rsa", + options: RSAKeyPairOptions<"pem", "der">, + ): Promise<{ + publicKey: string; + privateKey: Buffer; + }>; + function __promisify__( + type: "rsa", + options: RSAKeyPairOptions<"der", "pem">, + ): Promise<{ + publicKey: Buffer; + privateKey: string; + }>; + function __promisify__( + type: "rsa", + options: RSAKeyPairOptions<"der", "der">, + ): Promise<{ + publicKey: Buffer; + privateKey: Buffer; + }>; + function __promisify__(type: "rsa", options: RSAKeyPairKeyObjectOptions): Promise; + function __promisify__( + type: "rsa-pss", + options: RSAPSSKeyPairOptions<"pem", "pem">, + ): Promise<{ + publicKey: string; + privateKey: string; + }>; + function __promisify__( + type: "rsa-pss", + options: RSAPSSKeyPairOptions<"pem", "der">, + ): Promise<{ + publicKey: string; + privateKey: Buffer; + }>; + function __promisify__( + type: "rsa-pss", + options: RSAPSSKeyPairOptions<"der", "pem">, + ): Promise<{ + publicKey: Buffer; + privateKey: string; + }>; + function __promisify__( + type: "rsa-pss", + options: RSAPSSKeyPairOptions<"der", "der">, + ): Promise<{ + publicKey: Buffer; + privateKey: Buffer; + }>; + function __promisify__( + type: "rsa-pss", + options: RSAPSSKeyPairKeyObjectOptions, + ): Promise; + function __promisify__( + type: "dsa", + options: DSAKeyPairOptions<"pem", "pem">, + ): Promise<{ + publicKey: string; + privateKey: string; + }>; + function __promisify__( + type: "dsa", + options: DSAKeyPairOptions<"pem", "der">, + ): Promise<{ + publicKey: string; + privateKey: Buffer; + }>; + function __promisify__( + type: "dsa", + options: DSAKeyPairOptions<"der", "pem">, + ): Promise<{ + publicKey: Buffer; + privateKey: string; + }>; + function __promisify__( + type: "dsa", + options: DSAKeyPairOptions<"der", "der">, + ): Promise<{ + publicKey: Buffer; + privateKey: Buffer; + }>; + function __promisify__(type: "dsa", options: DSAKeyPairKeyObjectOptions): Promise; + function __promisify__( + type: "ec", + options: ECKeyPairOptions<"pem", "pem">, + ): Promise<{ + publicKey: string; + privateKey: string; + }>; + function __promisify__( + type: "ec", + options: ECKeyPairOptions<"pem", "der">, + ): Promise<{ + publicKey: string; + privateKey: Buffer; + }>; + function __promisify__( + type: "ec", + options: ECKeyPairOptions<"der", "pem">, + ): Promise<{ + publicKey: Buffer; + privateKey: string; + }>; + function __promisify__( + type: "ec", + options: ECKeyPairOptions<"der", "der">, + ): Promise<{ + publicKey: Buffer; + privateKey: Buffer; + }>; + function __promisify__(type: "ec", options: ECKeyPairKeyObjectOptions): Promise; + function __promisify__( + type: "ed25519", + options: ED25519KeyPairOptions<"pem", "pem">, + ): Promise<{ + publicKey: string; + privateKey: string; + }>; + function __promisify__( + type: "ed25519", + options: ED25519KeyPairOptions<"pem", "der">, + ): Promise<{ + publicKey: string; + privateKey: Buffer; + }>; + function __promisify__( + type: "ed25519", + options: ED25519KeyPairOptions<"der", "pem">, + ): Promise<{ + publicKey: Buffer; + privateKey: string; + }>; + function __promisify__( + type: "ed25519", + options: ED25519KeyPairOptions<"der", "der">, + ): Promise<{ + publicKey: Buffer; + privateKey: Buffer; + }>; + function __promisify__( + type: "ed25519", + options?: ED25519KeyPairKeyObjectOptions, + ): Promise; + function __promisify__( + type: "ed448", + options: ED448KeyPairOptions<"pem", "pem">, + ): Promise<{ + publicKey: string; + privateKey: string; + }>; + function __promisify__( + type: "ed448", + options: ED448KeyPairOptions<"pem", "der">, + ): Promise<{ + publicKey: string; + privateKey: Buffer; + }>; + function __promisify__( + type: "ed448", + options: ED448KeyPairOptions<"der", "pem">, + ): Promise<{ + publicKey: Buffer; + privateKey: string; + }>; + function __promisify__( + type: "ed448", + options: ED448KeyPairOptions<"der", "der">, + ): Promise<{ + publicKey: Buffer; + privateKey: Buffer; + }>; + function __promisify__(type: "ed448", options?: ED448KeyPairKeyObjectOptions): Promise; + function __promisify__( + type: "x25519", + options: X25519KeyPairOptions<"pem", "pem">, + ): Promise<{ + publicKey: string; + privateKey: string; + }>; + function __promisify__( + type: "x25519", + options: X25519KeyPairOptions<"pem", "der">, + ): Promise<{ + publicKey: string; + privateKey: Buffer; + }>; + function __promisify__( + type: "x25519", + options: X25519KeyPairOptions<"der", "pem">, + ): Promise<{ + publicKey: Buffer; + privateKey: string; + }>; + function __promisify__( + type: "x25519", + options: X25519KeyPairOptions<"der", "der">, + ): Promise<{ + publicKey: Buffer; + privateKey: Buffer; + }>; + function __promisify__( + type: "x25519", + options?: X25519KeyPairKeyObjectOptions, + ): Promise; + function __promisify__( + type: "x448", + options: X448KeyPairOptions<"pem", "pem">, + ): Promise<{ + publicKey: string; + privateKey: string; + }>; + function __promisify__( + type: "x448", + options: X448KeyPairOptions<"pem", "der">, + ): Promise<{ + publicKey: string; + privateKey: Buffer; + }>; + function __promisify__( + type: "x448", + options: X448KeyPairOptions<"der", "pem">, + ): Promise<{ + publicKey: Buffer; + privateKey: string; + }>; + function __promisify__( + type: "x448", + options: X448KeyPairOptions<"der", "der">, + ): Promise<{ + publicKey: Buffer; + privateKey: Buffer; + }>; + function __promisify__(type: "x448", options?: X448KeyPairKeyObjectOptions): Promise; + } + /** + * Calculates and returns the signature for `data` using the given private key and + * algorithm. If `algorithm` is `null` or `undefined`, then the algorithm is + * dependent upon the key type (especially Ed25519 and Ed448). + * + * If `key` is not a `KeyObject`, this function behaves as if `key` had been + * passed to {@link createPrivateKey}. If it is an object, the following + * additional properties can be passed: + * + * If the `callback` function is provided this function uses libuv's threadpool. + * @since v12.0.0 + */ + function sign( + algorithm: string | null | undefined, + data: NodeJS.ArrayBufferView, + key: KeyLike | SignKeyObjectInput | SignPrivateKeyInput, + ): Buffer; + function sign( + algorithm: string | null | undefined, + data: NodeJS.ArrayBufferView, + key: KeyLike | SignKeyObjectInput | SignPrivateKeyInput, + callback: (error: Error | null, data: Buffer) => void, + ): void; + /** + * Verifies the given signature for `data` using the given key and algorithm. If`algorithm` is `null` or `undefined`, then the algorithm is dependent upon the + * key type (especially Ed25519 and Ed448). + * + * If `key` is not a `KeyObject`, this function behaves as if `key` had been + * passed to {@link createPublicKey}. If it is an object, the following + * additional properties can be passed: + * + * The `signature` argument is the previously calculated signature for the `data`. + * + * Because public keys can be derived from private keys, a private key or a public + * key may be passed for `key`. + * + * If the `callback` function is provided this function uses libuv's threadpool. + * @since v12.0.0 + */ + function verify( + algorithm: string | null | undefined, + data: NodeJS.ArrayBufferView, + key: KeyLike | VerifyKeyObjectInput | VerifyPublicKeyInput | VerifyJsonWebKeyInput, + signature: NodeJS.ArrayBufferView, + ): boolean; + function verify( + algorithm: string | null | undefined, + data: NodeJS.ArrayBufferView, + key: KeyLike | VerifyKeyObjectInput | VerifyPublicKeyInput | VerifyJsonWebKeyInput, + signature: NodeJS.ArrayBufferView, + callback: (error: Error | null, result: boolean) => void, + ): void; + /** + * Computes the Diffie-Hellman secret based on a `privateKey` and a `publicKey`. + * Both keys must have the same `asymmetricKeyType`, which must be one of `'dh'`(for Diffie-Hellman), `'ec'` (for ECDH), `'x448'`, or `'x25519'` (for ECDH-ES). + * @since v13.9.0, v12.17.0 + */ + function diffieHellman(options: { privateKey: KeyObject; publicKey: KeyObject }): Buffer; + type CipherMode = "cbc" | "ccm" | "cfb" | "ctr" | "ecb" | "gcm" | "ocb" | "ofb" | "stream" | "wrap" | "xts"; + interface CipherInfoOptions { + /** + * A test key length. + */ + keyLength?: number | undefined; + /** + * A test IV length. + */ + ivLength?: number | undefined; + } + interface CipherInfo { + /** + * The name of the cipher. + */ + name: string; + /** + * The nid of the cipher. + */ + nid: number; + /** + * The block size of the cipher in bytes. + * This property is omitted when mode is 'stream'. + */ + blockSize?: number | undefined; + /** + * The expected or default initialization vector length in bytes. + * This property is omitted if the cipher does not use an initialization vector. + */ + ivLength?: number | undefined; + /** + * The expected or default key length in bytes. + */ + keyLength: number; + /** + * The cipher mode. + */ + mode: CipherMode; + } + /** + * Returns information about a given cipher. + * + * Some ciphers accept variable length keys and initialization vectors. By default, + * the `crypto.getCipherInfo()` method will return the default values for these + * ciphers. To test if a given key length or iv length is acceptable for given + * cipher, use the `keyLength` and `ivLength` options. If the given values are + * unacceptable, `undefined` will be returned. + * @since v15.0.0 + * @param nameOrNid The name or nid of the cipher to query. + */ + function getCipherInfo(nameOrNid: string | number, options?: CipherInfoOptions): CipherInfo | undefined; + /** + * HKDF is a simple key derivation function defined in RFC 5869\. The given `ikm`,`salt` and `info` are used with the `digest` to derive a key of `keylen` bytes. + * + * The supplied `callback` function is called with two arguments: `err` and`derivedKey`. If an errors occurs while deriving the key, `err` will be set; + * otherwise `err` will be `null`. The successfully generated `derivedKey` will + * be passed to the callback as an [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer). An error will be thrown if any + * of the input arguments specify invalid values or types. + * + * ```js + * import { Buffer } from 'node:buffer'; + * const { + * hkdf, + * } = await import('node:crypto'); + * + * hkdf('sha512', 'key', 'salt', 'info', 64, (err, derivedKey) => { + * if (err) throw err; + * console.log(Buffer.from(derivedKey).toString('hex')); // '24156e2...5391653' + * }); + * ``` + * @since v15.0.0 + * @param digest The digest algorithm to use. + * @param ikm The input keying material. Must be provided but can be zero-length. + * @param salt The salt value. Must be provided but can be zero-length. + * @param info Additional info value. Must be provided but can be zero-length, and cannot be more than 1024 bytes. + * @param keylen The length of the key to generate. Must be greater than 0. The maximum allowable value is `255` times the number of bytes produced by the selected digest function (e.g. `sha512` + * generates 64-byte hashes, making the maximum HKDF output 16320 bytes). + */ + function hkdf( + digest: string, + irm: BinaryLike | KeyObject, + salt: BinaryLike, + info: BinaryLike, + keylen: number, + callback: (err: Error | null, derivedKey: ArrayBuffer) => void, + ): void; + /** + * Provides a synchronous HKDF key derivation function as defined in RFC 5869\. The + * given `ikm`, `salt` and `info` are used with the `digest` to derive a key of`keylen` bytes. + * + * The successfully generated `derivedKey` will be returned as an [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer). + * + * An error will be thrown if any of the input arguments specify invalid values or + * types, or if the derived key cannot be generated. + * + * ```js + * import { Buffer } from 'node:buffer'; + * const { + * hkdfSync, + * } = await import('node:crypto'); + * + * const derivedKey = hkdfSync('sha512', 'key', 'salt', 'info', 64); + * console.log(Buffer.from(derivedKey).toString('hex')); // '24156e2...5391653' + * ``` + * @since v15.0.0 + * @param digest The digest algorithm to use. + * @param ikm The input keying material. Must be provided but can be zero-length. + * @param salt The salt value. Must be provided but can be zero-length. + * @param info Additional info value. Must be provided but can be zero-length, and cannot be more than 1024 bytes. + * @param keylen The length of the key to generate. Must be greater than 0. The maximum allowable value is `255` times the number of bytes produced by the selected digest function (e.g. `sha512` + * generates 64-byte hashes, making the maximum HKDF output 16320 bytes). + */ + function hkdfSync( + digest: string, + ikm: BinaryLike | KeyObject, + salt: BinaryLike, + info: BinaryLike, + keylen: number, + ): ArrayBuffer; + interface SecureHeapUsage { + /** + * The total allocated secure heap size as specified using the `--secure-heap=n` command-line flag. + */ + total: number; + /** + * The minimum allocation from the secure heap as specified using the `--secure-heap-min` command-line flag. + */ + min: number; + /** + * The total number of bytes currently allocated from the secure heap. + */ + used: number; + /** + * The calculated ratio of `used` to `total` allocated bytes. + */ + utilization: number; + } + /** + * @since v15.6.0 + */ + function secureHeapUsed(): SecureHeapUsage; + interface RandomUUIDOptions { + /** + * By default, to improve performance, + * Node.js will pre-emptively generate and persistently cache enough + * random data to generate up to 128 random UUIDs. To generate a UUID + * without using the cache, set `disableEntropyCache` to `true`. + * + * @default `false` + */ + disableEntropyCache?: boolean | undefined; + } + type UUID = `${string}-${string}-${string}-${string}-${string}`; + /** + * Generates a random [RFC 4122](https://www.rfc-editor.org/rfc/rfc4122.txt) version 4 UUID. The UUID is generated using a + * cryptographic pseudorandom number generator. + * @since v15.6.0, v14.17.0 + */ + function randomUUID(options?: RandomUUIDOptions): UUID; + interface X509CheckOptions { + /** + * @default 'always' + */ + subject?: "always" | "default" | "never"; + /** + * @default true + */ + wildcards?: boolean; + /** + * @default true + */ + partialWildcards?: boolean; + /** + * @default false + */ + multiLabelWildcards?: boolean; + /** + * @default false + */ + singleLabelSubdomains?: boolean; + } + /** + * Encapsulates an X509 certificate and provides read-only access to + * its information. + * + * ```js + * const { X509Certificate } = await import('node:crypto'); + * + * const x509 = new X509Certificate('{... pem encoded cert ...}'); + * + * console.log(x509.subject); + * ``` + * @since v15.6.0 + */ + class X509Certificate { + /** + * Will be \`true\` if this is a Certificate Authority (CA) certificate. + * @since v15.6.0 + */ + readonly ca: boolean; + /** + * The SHA-1 fingerprint of this certificate. + * + * Because SHA-1 is cryptographically broken and because the security of SHA-1 is + * significantly worse than that of algorithms that are commonly used to sign + * certificates, consider using `x509.fingerprint256` instead. + * @since v15.6.0 + */ + readonly fingerprint: string; + /** + * The SHA-256 fingerprint of this certificate. + * @since v15.6.0 + */ + readonly fingerprint256: string; + /** + * The SHA-512 fingerprint of this certificate. + * + * Because computing the SHA-256 fingerprint is usually faster and because it is + * only half the size of the SHA-512 fingerprint, `x509.fingerprint256` may be + * a better choice. While SHA-512 presumably provides a higher level of security in + * general, the security of SHA-256 matches that of most algorithms that are + * commonly used to sign certificates. + * @since v17.2.0, v16.14.0 + */ + readonly fingerprint512: string; + /** + * The complete subject of this certificate. + * @since v15.6.0 + */ + readonly subject: string; + /** + * The subject alternative name specified for this certificate. + * + * This is a comma-separated list of subject alternative names. Each entry begins + * with a string identifying the kind of the subject alternative name followed by + * a colon and the value associated with the entry. + * + * Earlier versions of Node.js incorrectly assumed that it is safe to split this + * property at the two-character sequence `', '` (see [CVE-2021-44532](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-44532)). However, + * both malicious and legitimate certificates can contain subject alternative names + * that include this sequence when represented as a string. + * + * After the prefix denoting the type of the entry, the remainder of each entry + * might be enclosed in quotes to indicate that the value is a JSON string literal. + * For backward compatibility, Node.js only uses JSON string literals within this + * property when necessary to avoid ambiguity. Third-party code should be prepared + * to handle both possible entry formats. + * @since v15.6.0 + */ + readonly subjectAltName: string | undefined; + /** + * A textual representation of the certificate's authority information access + * extension. + * + * This is a line feed separated list of access descriptions. Each line begins with + * the access method and the kind of the access location, followed by a colon and + * the value associated with the access location. + * + * After the prefix denoting the access method and the kind of the access location, + * the remainder of each line might be enclosed in quotes to indicate that the + * value is a JSON string literal. For backward compatibility, Node.js only uses + * JSON string literals within this property when necessary to avoid ambiguity. + * Third-party code should be prepared to handle both possible entry formats. + * @since v15.6.0 + */ + readonly infoAccess: string | undefined; + /** + * An array detailing the key usages for this certificate. + * @since v15.6.0 + */ + readonly keyUsage: string[]; + /** + * The issuer identification included in this certificate. + * @since v15.6.0 + */ + readonly issuer: string; + /** + * The issuer certificate or `undefined` if the issuer certificate is not + * available. + * @since v15.9.0 + */ + readonly issuerCertificate?: X509Certificate | undefined; + /** + * The public key `KeyObject` for this certificate. + * @since v15.6.0 + */ + readonly publicKey: KeyObject; + /** + * A `Buffer` containing the DER encoding of this certificate. + * @since v15.6.0 + */ + readonly raw: Buffer; + /** + * The serial number of this certificate. + * + * Serial numbers are assigned by certificate authorities and do not uniquely + * identify certificates. Consider using `x509.fingerprint256` as a unique + * identifier instead. + * @since v15.6.0 + */ + readonly serialNumber: string; + /** + * The date/time from which this certificate is considered valid. + * @since v15.6.0 + */ + readonly validFrom: string; + /** + * The date/time until which this certificate is considered valid. + * @since v15.6.0 + */ + readonly validTo: string; + constructor(buffer: BinaryLike); + /** + * Checks whether the certificate matches the given email address. + * + * If the `'subject'` option is undefined or set to `'default'`, the certificate + * subject is only considered if the subject alternative name extension either does + * not exist or does not contain any email addresses. + * + * If the `'subject'` option is set to `'always'` and if the subject alternative + * name extension either does not exist or does not contain a matching email + * address, the certificate subject is considered. + * + * If the `'subject'` option is set to `'never'`, the certificate subject is never + * considered, even if the certificate contains no subject alternative names. + * @since v15.6.0 + * @return Returns `email` if the certificate matches, `undefined` if it does not. + */ + checkEmail(email: string, options?: Pick): string | undefined; + /** + * Checks whether the certificate matches the given host name. + * + * If the certificate matches the given host name, the matching subject name is + * returned. The returned name might be an exact match (e.g., `foo.example.com`) + * or it might contain wildcards (e.g., `*.example.com`). Because host name + * comparisons are case-insensitive, the returned subject name might also differ + * from the given `name` in capitalization. + * + * If the `'subject'` option is undefined or set to `'default'`, the certificate + * subject is only considered if the subject alternative name extension either does + * not exist or does not contain any DNS names. This behavior is consistent with [RFC 2818](https://www.rfc-editor.org/rfc/rfc2818.txt) ("HTTP Over TLS"). + * + * If the `'subject'` option is set to `'always'` and if the subject alternative + * name extension either does not exist or does not contain a matching DNS name, + * the certificate subject is considered. + * + * If the `'subject'` option is set to `'never'`, the certificate subject is never + * considered, even if the certificate contains no subject alternative names. + * @since v15.6.0 + * @return Returns a subject name that matches `name`, or `undefined` if no subject name matches `name`. + */ + checkHost(name: string, options?: X509CheckOptions): string | undefined; + /** + * Checks whether the certificate matches the given IP address (IPv4 or IPv6). + * + * Only [RFC 5280](https://www.rfc-editor.org/rfc/rfc5280.txt) `iPAddress` subject alternative names are considered, and they + * must match the given `ip` address exactly. Other subject alternative names as + * well as the subject field of the certificate are ignored. + * @since v15.6.0 + * @return Returns `ip` if the certificate matches, `undefined` if it does not. + */ + checkIP(ip: string): string | undefined; + /** + * Checks whether this certificate was issued by the given `otherCert`. + * @since v15.6.0 + */ + checkIssued(otherCert: X509Certificate): boolean; + /** + * Checks whether the public key for this certificate is consistent with + * the given private key. + * @since v15.6.0 + * @param privateKey A private key. + */ + checkPrivateKey(privateKey: KeyObject): boolean; + /** + * There is no standard JSON encoding for X509 certificates. The`toJSON()` method returns a string containing the PEM encoded + * certificate. + * @since v15.6.0 + */ + toJSON(): string; + /** + * Returns information about this certificate using the legacy `certificate object` encoding. + * @since v15.6.0 + */ + toLegacyObject(): PeerCertificate; + /** + * Returns the PEM-encoded certificate. + * @since v15.6.0 + */ + toString(): string; + /** + * Verifies that this certificate was signed by the given public key. + * Does not perform any other validation checks on the certificate. + * @since v15.6.0 + * @param publicKey A public key. + */ + verify(publicKey: KeyObject): boolean; + } + type LargeNumberLike = NodeJS.ArrayBufferView | SharedArrayBuffer | ArrayBuffer | bigint; + interface GeneratePrimeOptions { + add?: LargeNumberLike | undefined; + rem?: LargeNumberLike | undefined; + /** + * @default false + */ + safe?: boolean | undefined; + bigint?: boolean | undefined; + } + interface GeneratePrimeOptionsBigInt extends GeneratePrimeOptions { + bigint: true; + } + interface GeneratePrimeOptionsArrayBuffer extends GeneratePrimeOptions { + bigint?: false | undefined; + } + /** + * Generates a pseudorandom prime of `size` bits. + * + * If `options.safe` is `true`, the prime will be a safe prime -- that is,`(prime - 1) / 2` will also be a prime. + * + * The `options.add` and `options.rem` parameters can be used to enforce additional + * requirements, e.g., for Diffie-Hellman: + * + * * If `options.add` and `options.rem` are both set, the prime will satisfy the + * condition that `prime % add = rem`. + * * If only `options.add` is set and `options.safe` is not `true`, the prime will + * satisfy the condition that `prime % add = 1`. + * * If only `options.add` is set and `options.safe` is set to `true`, the prime + * will instead satisfy the condition that `prime % add = 3`. This is necessary + * because `prime % add = 1` for `options.add > 2` would contradict the condition + * enforced by `options.safe`. + * * `options.rem` is ignored if `options.add` is not given. + * + * Both `options.add` and `options.rem` must be encoded as big-endian sequences + * if given as an `ArrayBuffer`, `SharedArrayBuffer`, `TypedArray`, `Buffer`, or`DataView`. + * + * By default, the prime is encoded as a big-endian sequence of octets + * in an [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer). If the `bigint` option is `true`, then a + * [bigint](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt) is provided. + * @since v15.8.0 + * @param size The size (in bits) of the prime to generate. + */ + function generatePrime(size: number, callback: (err: Error | null, prime: ArrayBuffer) => void): void; + function generatePrime( + size: number, + options: GeneratePrimeOptionsBigInt, + callback: (err: Error | null, prime: bigint) => void, + ): void; + function generatePrime( + size: number, + options: GeneratePrimeOptionsArrayBuffer, + callback: (err: Error | null, prime: ArrayBuffer) => void, + ): void; + function generatePrime( + size: number, + options: GeneratePrimeOptions, + callback: (err: Error | null, prime: ArrayBuffer | bigint) => void, + ): void; + /** + * Generates a pseudorandom prime of `size` bits. + * + * If `options.safe` is `true`, the prime will be a safe prime -- that is,`(prime - 1) / 2` will also be a prime. + * + * The `options.add` and `options.rem` parameters can be used to enforce additional + * requirements, e.g., for Diffie-Hellman: + * + * * If `options.add` and `options.rem` are both set, the prime will satisfy the + * condition that `prime % add = rem`. + * * If only `options.add` is set and `options.safe` is not `true`, the prime will + * satisfy the condition that `prime % add = 1`. + * * If only `options.add` is set and `options.safe` is set to `true`, the prime + * will instead satisfy the condition that `prime % add = 3`. This is necessary + * because `prime % add = 1` for `options.add > 2` would contradict the condition + * enforced by `options.safe`. + * * `options.rem` is ignored if `options.add` is not given. + * + * Both `options.add` and `options.rem` must be encoded as big-endian sequences + * if given as an `ArrayBuffer`, `SharedArrayBuffer`, `TypedArray`, `Buffer`, or`DataView`. + * + * By default, the prime is encoded as a big-endian sequence of octets + * in an [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer). If the `bigint` option is `true`, then a + * [bigint](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt) is provided. + * @since v15.8.0 + * @param size The size (in bits) of the prime to generate. + */ + function generatePrimeSync(size: number): ArrayBuffer; + function generatePrimeSync(size: number, options: GeneratePrimeOptionsBigInt): bigint; + function generatePrimeSync(size: number, options: GeneratePrimeOptionsArrayBuffer): ArrayBuffer; + function generatePrimeSync(size: number, options: GeneratePrimeOptions): ArrayBuffer | bigint; + interface CheckPrimeOptions { + /** + * The number of Miller-Rabin probabilistic primality iterations to perform. + * When the value is 0 (zero), a number of checks is used that yields a false positive rate of at most `2**-64` for random input. + * Care must be used when selecting a number of checks. + * Refer to the OpenSSL documentation for the BN_is_prime_ex function nchecks options for more details. + * + * @default 0 + */ + checks?: number | undefined; + } + /** + * Checks the primality of the `candidate`. + * @since v15.8.0 + * @param candidate A possible prime encoded as a sequence of big endian octets of arbitrary length. + */ + function checkPrime(value: LargeNumberLike, callback: (err: Error | null, result: boolean) => void): void; + function checkPrime( + value: LargeNumberLike, + options: CheckPrimeOptions, + callback: (err: Error | null, result: boolean) => void, + ): void; + /** + * Checks the primality of the `candidate`. + * @since v15.8.0 + * @param candidate A possible prime encoded as a sequence of big endian octets of arbitrary length. + * @return `true` if the candidate is a prime with an error probability less than `0.25 ** options.checks`. + */ + function checkPrimeSync(candidate: LargeNumberLike, options?: CheckPrimeOptions): boolean; + /** + * Load and set the `engine` for some or all OpenSSL functions (selected by flags). + * + * `engine` could be either an id or a path to the engine's shared library. + * + * The optional `flags` argument uses `ENGINE_METHOD_ALL` by default. The `flags`is a bit field taking one of or a mix of the following flags (defined in`crypto.constants`): + * + * * `crypto.constants.ENGINE_METHOD_RSA` + * * `crypto.constants.ENGINE_METHOD_DSA` + * * `crypto.constants.ENGINE_METHOD_DH` + * * `crypto.constants.ENGINE_METHOD_RAND` + * * `crypto.constants.ENGINE_METHOD_EC` + * * `crypto.constants.ENGINE_METHOD_CIPHERS` + * * `crypto.constants.ENGINE_METHOD_DIGESTS` + * * `crypto.constants.ENGINE_METHOD_PKEY_METHS` + * * `crypto.constants.ENGINE_METHOD_PKEY_ASN1_METHS` + * * `crypto.constants.ENGINE_METHOD_ALL` + * * `crypto.constants.ENGINE_METHOD_NONE` + * @since v0.11.11 + * @param flags + */ + function setEngine(engine: string, flags?: number): void; + /** + * A convenient alias for {@link webcrypto.getRandomValues}. This + * implementation is not compliant with the Web Crypto spec, to write + * web-compatible code use {@link webcrypto.getRandomValues} instead. + * @since v17.4.0 + * @return Returns `typedArray`. + */ + function getRandomValues(typedArray: T): T; + /** + * A convenient alias for `crypto.webcrypto.subtle`. + * @since v17.4.0 + */ + const subtle: webcrypto.SubtleCrypto; + /** + * An implementation of the Web Crypto API standard. + * + * See the {@link https://nodejs.org/docs/latest/api/webcrypto.html Web Crypto API documentation} for details. + * @since v15.0.0 + */ + const webcrypto: webcrypto.Crypto; + namespace webcrypto { + type BufferSource = ArrayBufferView | ArrayBuffer; + type KeyFormat = "jwk" | "pkcs8" | "raw" | "spki"; + type KeyType = "private" | "public" | "secret"; + type KeyUsage = + | "decrypt" + | "deriveBits" + | "deriveKey" + | "encrypt" + | "sign" + | "unwrapKey" + | "verify" + | "wrapKey"; + type AlgorithmIdentifier = Algorithm | string; + type HashAlgorithmIdentifier = AlgorithmIdentifier; + type NamedCurve = string; + type BigInteger = Uint8Array; + interface AesCbcParams extends Algorithm { + iv: BufferSource; + } + interface AesCtrParams extends Algorithm { + counter: BufferSource; + length: number; + } + interface AesDerivedKeyParams extends Algorithm { + length: number; + } + interface AesGcmParams extends Algorithm { + additionalData?: BufferSource; + iv: BufferSource; + tagLength?: number; + } + interface AesKeyAlgorithm extends KeyAlgorithm { + length: number; + } + interface AesKeyGenParams extends Algorithm { + length: number; + } + interface Algorithm { + name: string; + } + interface EcKeyAlgorithm extends KeyAlgorithm { + namedCurve: NamedCurve; + } + interface EcKeyGenParams extends Algorithm { + namedCurve: NamedCurve; + } + interface EcKeyImportParams extends Algorithm { + namedCurve: NamedCurve; + } + interface EcdhKeyDeriveParams extends Algorithm { + public: CryptoKey; + } + interface EcdsaParams extends Algorithm { + hash: HashAlgorithmIdentifier; + } + interface Ed448Params extends Algorithm { + context?: BufferSource; + } + interface HkdfParams extends Algorithm { + hash: HashAlgorithmIdentifier; + info: BufferSource; + salt: BufferSource; + } + interface HmacImportParams extends Algorithm { + hash: HashAlgorithmIdentifier; + length?: number; + } + interface HmacKeyAlgorithm extends KeyAlgorithm { + hash: KeyAlgorithm; + length: number; + } + interface HmacKeyGenParams extends Algorithm { + hash: HashAlgorithmIdentifier; + length?: number; + } + interface JsonWebKey { + alg?: string; + crv?: string; + d?: string; + dp?: string; + dq?: string; + e?: string; + ext?: boolean; + k?: string; + key_ops?: string[]; + kty?: string; + n?: string; + oth?: RsaOtherPrimesInfo[]; + p?: string; + q?: string; + qi?: string; + use?: string; + x?: string; + y?: string; + } + interface KeyAlgorithm { + name: string; + } + interface Pbkdf2Params extends Algorithm { + hash: HashAlgorithmIdentifier; + iterations: number; + salt: BufferSource; + } + interface RsaHashedImportParams extends Algorithm { + hash: HashAlgorithmIdentifier; + } + interface RsaHashedKeyAlgorithm extends RsaKeyAlgorithm { + hash: KeyAlgorithm; + } + interface RsaHashedKeyGenParams extends RsaKeyGenParams { + hash: HashAlgorithmIdentifier; + } + interface RsaKeyAlgorithm extends KeyAlgorithm { + modulusLength: number; + publicExponent: BigInteger; + } + interface RsaKeyGenParams extends Algorithm { + modulusLength: number; + publicExponent: BigInteger; + } + interface RsaOaepParams extends Algorithm { + label?: BufferSource; + } + interface RsaOtherPrimesInfo { + d?: string; + r?: string; + t?: string; + } + interface RsaPssParams extends Algorithm { + saltLength: number; + } + /** + * Calling `require('node:crypto').webcrypto` returns an instance of the `Crypto` class. + * `Crypto` is a singleton that provides access to the remainder of the crypto API. + * @since v15.0.0 + */ + interface Crypto { + /** + * Provides access to the `SubtleCrypto` API. + * @since v15.0.0 + */ + readonly subtle: SubtleCrypto; + /** + * Generates cryptographically strong random values. + * The given `typedArray` is filled with random values, and a reference to `typedArray` is returned. + * + * The given `typedArray` must be an integer-based instance of {@link NodeJS.TypedArray}, i.e. `Float32Array` and `Float64Array` are not accepted. + * + * An error will be thrown if the given `typedArray` is larger than 65,536 bytes. + * @since v15.0.0 + */ + getRandomValues>(typedArray: T): T; + /** + * Generates a random {@link https://www.rfc-editor.org/rfc/rfc4122.txt RFC 4122} version 4 UUID. + * The UUID is generated using a cryptographic pseudorandom number generator. + * @since v16.7.0 + */ + randomUUID(): UUID; + CryptoKey: CryptoKeyConstructor; + } + // This constructor throws ILLEGAL_CONSTRUCTOR so it should not be newable. + interface CryptoKeyConstructor { + /** Illegal constructor */ + (_: { readonly _: unique symbol }): never; // Allows instanceof to work but not be callable by the user. + readonly length: 0; + readonly name: "CryptoKey"; + readonly prototype: CryptoKey; + } + /** + * @since v15.0.0 + */ + interface CryptoKey { + /** + * An object detailing the algorithm for which the key can be used along with additional algorithm-specific parameters. + * @since v15.0.0 + */ + readonly algorithm: KeyAlgorithm; + /** + * When `true`, the {@link CryptoKey} can be extracted using either `subtleCrypto.exportKey()` or `subtleCrypto.wrapKey()`. + * @since v15.0.0 + */ + readonly extractable: boolean; + /** + * A string identifying whether the key is a symmetric (`'secret'`) or asymmetric (`'private'` or `'public'`) key. + * @since v15.0.0 + */ + readonly type: KeyType; + /** + * An array of strings identifying the operations for which the key may be used. + * + * The possible usages are: + * - `'encrypt'` - The key may be used to encrypt data. + * - `'decrypt'` - The key may be used to decrypt data. + * - `'sign'` - The key may be used to generate digital signatures. + * - `'verify'` - The key may be used to verify digital signatures. + * - `'deriveKey'` - The key may be used to derive a new key. + * - `'deriveBits'` - The key may be used to derive bits. + * - `'wrapKey'` - The key may be used to wrap another key. + * - `'unwrapKey'` - The key may be used to unwrap another key. + * + * Valid key usages depend on the key algorithm (identified by `cryptokey.algorithm.name`). + * @since v15.0.0 + */ + readonly usages: KeyUsage[]; + } + /** + * The `CryptoKeyPair` is a simple dictionary object with `publicKey` and `privateKey` properties, representing an asymmetric key pair. + * @since v15.0.0 + */ + interface CryptoKeyPair { + /** + * A {@link CryptoKey} whose type will be `'private'`. + * @since v15.0.0 + */ + privateKey: CryptoKey; + /** + * A {@link CryptoKey} whose type will be `'public'`. + * @since v15.0.0 + */ + publicKey: CryptoKey; + } + /** + * @since v15.0.0 + */ + interface SubtleCrypto { + /** + * Using the method and parameters specified in `algorithm` and the keying material provided by `key`, + * `subtle.decrypt()` attempts to decipher the provided `data`. If successful, + * the returned promise will be resolved with an `` containing the plaintext result. + * + * The algorithms currently supported include: + * + * - `'RSA-OAEP'` + * - `'AES-CTR'` + * - `'AES-CBC'` + * - `'AES-GCM'` + * @since v15.0.0 + */ + decrypt( + algorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, + key: CryptoKey, + data: BufferSource, + ): Promise; + /** + * Using the method and parameters specified in `algorithm` and the keying material provided by `baseKey`, + * `subtle.deriveBits()` attempts to generate `length` bits. + * The Node.js implementation requires that when `length` is a number it must be multiple of `8`. + * When `length` is `null` the maximum number of bits for a given algorithm is generated. This is allowed + * for the `'ECDH'`, `'X25519'`, and `'X448'` algorithms. + * If successful, the returned promise will be resolved with an `` containing the generated data. + * + * The algorithms currently supported include: + * + * - `'ECDH'` + * - `'X25519'` + * - `'X448'` + * - `'HKDF'` + * - `'PBKDF2'` + * @since v15.0.0 + */ + deriveBits(algorithm: EcdhKeyDeriveParams, baseKey: CryptoKey, length: number | null): Promise; + deriveBits( + algorithm: AlgorithmIdentifier | HkdfParams | Pbkdf2Params, + baseKey: CryptoKey, + length: number, + ): Promise; + /** + * Using the method and parameters specified in `algorithm`, and the keying material provided by `baseKey`, + * `subtle.deriveKey()` attempts to generate a new ` based on the method and parameters in `derivedKeyAlgorithm`. + * + * Calling `subtle.deriveKey()` is equivalent to calling `subtle.deriveBits()` to generate raw keying material, + * then passing the result into the `subtle.importKey()` method using the `deriveKeyAlgorithm`, `extractable`, and `keyUsages` parameters as input. + * + * The algorithms currently supported include: + * + * - `'ECDH'` + * - `'X25519'` + * - `'X448'` + * - `'HKDF'` + * - `'PBKDF2'` + * @param keyUsages See {@link https://nodejs.org/docs/latest/api/webcrypto.html#cryptokeyusages Key usages}. + * @since v15.0.0 + */ + deriveKey( + algorithm: AlgorithmIdentifier | EcdhKeyDeriveParams | HkdfParams | Pbkdf2Params, + baseKey: CryptoKey, + derivedKeyAlgorithm: + | AlgorithmIdentifier + | AesDerivedKeyParams + | HmacImportParams + | HkdfParams + | Pbkdf2Params, + extractable: boolean, + keyUsages: readonly KeyUsage[], + ): Promise; + /** + * Using the method identified by `algorithm`, `subtle.digest()` attempts to generate a digest of `data`. + * If successful, the returned promise is resolved with an `` containing the computed digest. + * + * If `algorithm` is provided as a ``, it must be one of: + * + * - `'SHA-1'` + * - `'SHA-256'` + * - `'SHA-384'` + * - `'SHA-512'` + * + * If `algorithm` is provided as an ``, it must have a `name` property whose value is one of the above. + * @since v15.0.0 + */ + digest(algorithm: AlgorithmIdentifier, data: BufferSource): Promise; + /** + * Using the method and parameters specified by `algorithm` and the keying material provided by `key`, + * `subtle.encrypt()` attempts to encipher `data`. If successful, + * the returned promise is resolved with an `` containing the encrypted result. + * + * The algorithms currently supported include: + * + * - `'RSA-OAEP'` + * - `'AES-CTR'` + * - `'AES-CBC'` + * - `'AES-GCM'` + * @since v15.0.0 + */ + encrypt( + algorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, + key: CryptoKey, + data: BufferSource, + ): Promise; + /** + * Exports the given key into the specified format, if supported. + * + * If the `` is not extractable, the returned promise will reject. + * + * When `format` is either `'pkcs8'` or `'spki'` and the export is successful, + * the returned promise will be resolved with an `` containing the exported key data. + * + * When `format` is `'jwk'` and the export is successful, the returned promise will be resolved with a + * JavaScript object conforming to the {@link https://tools.ietf.org/html/rfc7517 JSON Web Key} specification. + * @param format Must be one of `'raw'`, `'pkcs8'`, `'spki'`, or `'jwk'`. + * @returns `` containing ``. + * @since v15.0.0 + */ + exportKey(format: "jwk", key: CryptoKey): Promise; + exportKey(format: Exclude, key: CryptoKey): Promise; + /** + * Using the method and parameters provided in `algorithm`, + * `subtle.generateKey()` attempts to generate new keying material. + * Depending the method used, the method may generate either a single `` or a ``. + * + * The `` (public and private key) generating algorithms supported include: + * + * - `'RSASSA-PKCS1-v1_5'` + * - `'RSA-PSS'` + * - `'RSA-OAEP'` + * - `'ECDSA'` + * - `'Ed25519'` + * - `'Ed448'` + * - `'ECDH'` + * - `'X25519'` + * - `'X448'` + * The `` (secret key) generating algorithms supported include: + * + * - `'HMAC'` + * - `'AES-CTR'` + * - `'AES-CBC'` + * - `'AES-GCM'` + * - `'AES-KW'` + * @param keyUsages See {@link https://nodejs.org/docs/latest/api/webcrypto.html#cryptokeyusages Key usages}. + * @since v15.0.0 + */ + generateKey( + algorithm: RsaHashedKeyGenParams | EcKeyGenParams, + extractable: boolean, + keyUsages: readonly KeyUsage[], + ): Promise; + generateKey( + algorithm: AesKeyGenParams | HmacKeyGenParams | Pbkdf2Params, + extractable: boolean, + keyUsages: readonly KeyUsage[], + ): Promise; + generateKey( + algorithm: AlgorithmIdentifier, + extractable: boolean, + keyUsages: KeyUsage[], + ): Promise; + /** + * The `subtle.importKey()` method attempts to interpret the provided `keyData` as the given `format` + * to create a `` instance using the provided `algorithm`, `extractable`, and `keyUsages` arguments. + * If the import is successful, the returned promise will be resolved with the created ``. + * + * If importing a `'PBKDF2'` key, `extractable` must be `false`. + * @param format Must be one of `'raw'`, `'pkcs8'`, `'spki'`, or `'jwk'`. + * @param keyUsages See {@link https://nodejs.org/docs/latest/api/webcrypto.html#cryptokeyusages Key usages}. + * @since v15.0.0 + */ + importKey( + format: "jwk", + keyData: JsonWebKey, + algorithm: + | AlgorithmIdentifier + | RsaHashedImportParams + | EcKeyImportParams + | HmacImportParams + | AesKeyAlgorithm, + extractable: boolean, + keyUsages: readonly KeyUsage[], + ): Promise; + importKey( + format: Exclude, + keyData: BufferSource, + algorithm: + | AlgorithmIdentifier + | RsaHashedImportParams + | EcKeyImportParams + | HmacImportParams + | AesKeyAlgorithm, + extractable: boolean, + keyUsages: KeyUsage[], + ): Promise; + /** + * Using the method and parameters given by `algorithm` and the keying material provided by `key`, + * `subtle.sign()` attempts to generate a cryptographic signature of `data`. If successful, + * the returned promise is resolved with an `` containing the generated signature. + * + * The algorithms currently supported include: + * + * - `'RSASSA-PKCS1-v1_5'` + * - `'RSA-PSS'` + * - `'ECDSA'` + * - `'Ed25519'` + * - `'Ed448'` + * - `'HMAC'` + * @since v15.0.0 + */ + sign( + algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams | Ed448Params, + key: CryptoKey, + data: BufferSource, + ): Promise; + /** + * In cryptography, "wrapping a key" refers to exporting and then encrypting the keying material. + * The `subtle.unwrapKey()` method attempts to decrypt a wrapped key and create a `` instance. + * It is equivalent to calling `subtle.decrypt()` first on the encrypted key data (using the `wrappedKey`, `unwrapAlgo`, and `unwrappingKey` arguments as input) + * then passing the results in to the `subtle.importKey()` method using the `unwrappedKeyAlgo`, `extractable`, and `keyUsages` arguments as inputs. + * If successful, the returned promise is resolved with a `` object. + * + * The wrapping algorithms currently supported include: + * + * - `'RSA-OAEP'` + * - `'AES-CTR'` + * - `'AES-CBC'` + * - `'AES-GCM'` + * - `'AES-KW'` + * + * The unwrapped key algorithms supported include: + * + * - `'RSASSA-PKCS1-v1_5'` + * - `'RSA-PSS'` + * - `'RSA-OAEP'` + * - `'ECDSA'` + * - `'Ed25519'` + * - `'Ed448'` + * - `'ECDH'` + * - `'X25519'` + * - `'X448'` + * - `'HMAC'` + * - `'AES-CTR'` + * - `'AES-CBC'` + * - `'AES-GCM'` + * - `'AES-KW'` + * @param format Must be one of `'raw'`, `'pkcs8'`, `'spki'`, or `'jwk'`. + * @param keyUsages See {@link https://nodejs.org/docs/latest/api/webcrypto.html#cryptokeyusages Key usages}. + * @since v15.0.0 + */ + unwrapKey( + format: KeyFormat, + wrappedKey: BufferSource, + unwrappingKey: CryptoKey, + unwrapAlgorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, + unwrappedKeyAlgorithm: + | AlgorithmIdentifier + | RsaHashedImportParams + | EcKeyImportParams + | HmacImportParams + | AesKeyAlgorithm, + extractable: boolean, + keyUsages: KeyUsage[], + ): Promise; + /** + * Using the method and parameters given in `algorithm` and the keying material provided by `key`, + * `subtle.verify()` attempts to verify that `signature` is a valid cryptographic signature of `data`. + * The returned promise is resolved with either `true` or `false`. + * + * The algorithms currently supported include: + * + * - `'RSASSA-PKCS1-v1_5'` + * - `'RSA-PSS'` + * - `'ECDSA'` + * - `'Ed25519'` + * - `'Ed448'` + * - `'HMAC'` + * @since v15.0.0 + */ + verify( + algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams | Ed448Params, + key: CryptoKey, + signature: BufferSource, + data: BufferSource, + ): Promise; + /** + * In cryptography, "wrapping a key" refers to exporting and then encrypting the keying material. + * The `subtle.wrapKey()` method exports the keying material into the format identified by `format`, + * then encrypts it using the method and parameters specified by `wrapAlgo` and the keying material provided by `wrappingKey`. + * It is the equivalent to calling `subtle.exportKey()` using `format` and `key` as the arguments, + * then passing the result to the `subtle.encrypt()` method using `wrappingKey` and `wrapAlgo` as inputs. + * If successful, the returned promise will be resolved with an `` containing the encrypted key data. + * + * The wrapping algorithms currently supported include: + * + * - `'RSA-OAEP'` + * - `'AES-CTR'` + * - `'AES-CBC'` + * - `'AES-GCM'` + * - `'AES-KW'` + * @param format Must be one of `'raw'`, `'pkcs8'`, `'spki'`, or `'jwk'`. + * @since v15.0.0 + */ + wrapKey( + format: KeyFormat, + key: CryptoKey, + wrappingKey: CryptoKey, + wrapAlgorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, + ): Promise; + } + } +} +declare module "node:crypto" { + export * from "crypto"; +} diff --git a/task/node_modules/@types/node/dgram.d.ts b/task/node_modules/@types/node/dgram.d.ts new file mode 100644 index 0000000..692e547 --- /dev/null +++ b/task/node_modules/@types/node/dgram.d.ts @@ -0,0 +1,586 @@ +/** + * The `node:dgram` module provides an implementation of UDP datagram sockets. + * + * ```js + * import dgram from 'node:dgram'; + * + * const server = dgram.createSocket('udp4'); + * + * server.on('error', (err) => { + * console.error(`server error:\n${err.stack}`); + * server.close(); + * }); + * + * server.on('message', (msg, rinfo) => { + * console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`); + * }); + * + * server.on('listening', () => { + * const address = server.address(); + * console.log(`server listening ${address.address}:${address.port}`); + * }); + * + * server.bind(41234); + * // Prints: server listening 0.0.0.0:41234 + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/dgram.js) + */ +declare module "dgram" { + import { AddressInfo } from "node:net"; + import * as dns from "node:dns"; + import { Abortable, EventEmitter } from "node:events"; + interface RemoteInfo { + address: string; + family: "IPv4" | "IPv6"; + port: number; + size: number; + } + interface BindOptions { + port?: number | undefined; + address?: string | undefined; + exclusive?: boolean | undefined; + fd?: number | undefined; + } + type SocketType = "udp4" | "udp6"; + interface SocketOptions extends Abortable { + type: SocketType; + reuseAddr?: boolean | undefined; + /** + * @default false + */ + ipv6Only?: boolean | undefined; + recvBufferSize?: number | undefined; + sendBufferSize?: number | undefined; + lookup?: + | (( + hostname: string, + options: dns.LookupOneOptions, + callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void, + ) => void) + | undefined; + } + /** + * Creates a `dgram.Socket` object. Once the socket is created, calling `socket.bind()` will instruct the socket to begin listening for datagram + * messages. When `address` and `port` are not passed to `socket.bind()` the + * method will bind the socket to the "all interfaces" address on a random port + * (it does the right thing for both `udp4` and `udp6` sockets). The bound address + * and port can be retrieved using `socket.address().address` and `socket.address().port`. + * + * If the `signal` option is enabled, calling `.abort()` on the corresponding`AbortController` is similar to calling `.close()` on the socket: + * + * ```js + * const controller = new AbortController(); + * const { signal } = controller; + * const server = dgram.createSocket({ type: 'udp4', signal }); + * server.on('message', (msg, rinfo) => { + * console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`); + * }); + * // Later, when you want to close the server. + * controller.abort(); + * ``` + * @since v0.11.13 + * @param options Available options are: + * @param callback Attached as a listener for `'message'` events. Optional. + */ + function createSocket(type: SocketType, callback?: (msg: Buffer, rinfo: RemoteInfo) => void): Socket; + function createSocket(options: SocketOptions, callback?: (msg: Buffer, rinfo: RemoteInfo) => void): Socket; + /** + * Encapsulates the datagram functionality. + * + * New instances of `dgram.Socket` are created using {@link createSocket}. + * The `new` keyword is not to be used to create `dgram.Socket` instances. + * @since v0.1.99 + */ + class Socket extends EventEmitter { + /** + * Tells the kernel to join a multicast group at the given `multicastAddress` and`multicastInterface` using the `IP_ADD_MEMBERSHIP` socket option. If the`multicastInterface` argument is not + * specified, the operating system will choose + * one interface and will add membership to it. To add membership to every + * available interface, call `addMembership` multiple times, once per interface. + * + * When called on an unbound socket, this method will implicitly bind to a random + * port, listening on all interfaces. + * + * When sharing a UDP socket across multiple `cluster` workers, the`socket.addMembership()` function must be called only once or an`EADDRINUSE` error will occur: + * + * ```js + * import cluster from 'node:cluster'; + * import dgram from 'node:dgram'; + * + * if (cluster.isPrimary) { + * cluster.fork(); // Works ok. + * cluster.fork(); // Fails with EADDRINUSE. + * } else { + * const s = dgram.createSocket('udp4'); + * s.bind(1234, () => { + * s.addMembership('224.0.0.114'); + * }); + * } + * ``` + * @since v0.6.9 + */ + addMembership(multicastAddress: string, multicastInterface?: string): void; + /** + * Returns an object containing the address information for a socket. + * For UDP sockets, this object will contain `address`, `family`, and `port`properties. + * + * This method throws `EBADF` if called on an unbound socket. + * @since v0.1.99 + */ + address(): AddressInfo; + /** + * For UDP sockets, causes the `dgram.Socket` to listen for datagram + * messages on a named `port` and optional `address`. If `port` is not + * specified or is `0`, the operating system will attempt to bind to a + * random port. If `address` is not specified, the operating system will + * attempt to listen on all addresses. Once binding is complete, a`'listening'` event is emitted and the optional `callback` function is + * called. + * + * Specifying both a `'listening'` event listener and passing a`callback` to the `socket.bind()` method is not harmful but not very + * useful. + * + * A bound datagram socket keeps the Node.js process running to receive + * datagram messages. + * + * If binding fails, an `'error'` event is generated. In rare case (e.g. + * attempting to bind with a closed socket), an `Error` may be thrown. + * + * Example of a UDP server listening on port 41234: + * + * ```js + * import dgram from 'node:dgram'; + * + * const server = dgram.createSocket('udp4'); + * + * server.on('error', (err) => { + * console.error(`server error:\n${err.stack}`); + * server.close(); + * }); + * + * server.on('message', (msg, rinfo) => { + * console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`); + * }); + * + * server.on('listening', () => { + * const address = server.address(); + * console.log(`server listening ${address.address}:${address.port}`); + * }); + * + * server.bind(41234); + * // Prints: server listening 0.0.0.0:41234 + * ``` + * @since v0.1.99 + * @param callback with no parameters. Called when binding is complete. + */ + bind(port?: number, address?: string, callback?: () => void): this; + bind(port?: number, callback?: () => void): this; + bind(callback?: () => void): this; + bind(options: BindOptions, callback?: () => void): this; + /** + * Close the underlying socket and stop listening for data on it. If a callback is + * provided, it is added as a listener for the `'close'` event. + * @since v0.1.99 + * @param callback Called when the socket has been closed. + */ + close(callback?: () => void): this; + /** + * Associates the `dgram.Socket` to a remote address and port. Every + * message sent by this handle is automatically sent to that destination. Also, + * the socket will only receive messages from that remote peer. + * Trying to call `connect()` on an already connected socket will result + * in an `ERR_SOCKET_DGRAM_IS_CONNECTED` exception. If `address` is not + * provided, `'127.0.0.1'` (for `udp4` sockets) or `'::1'` (for `udp6` sockets) + * will be used by default. Once the connection is complete, a `'connect'` event + * is emitted and the optional `callback` function is called. In case of failure, + * the `callback` is called or, failing this, an `'error'` event is emitted. + * @since v12.0.0 + * @param callback Called when the connection is completed or on error. + */ + connect(port: number, address?: string, callback?: () => void): void; + connect(port: number, callback: () => void): void; + /** + * A synchronous function that disassociates a connected `dgram.Socket` from + * its remote address. Trying to call `disconnect()` on an unbound or already + * disconnected socket will result in an `ERR_SOCKET_DGRAM_NOT_CONNECTED` exception. + * @since v12.0.0 + */ + disconnect(): void; + /** + * Instructs the kernel to leave a multicast group at `multicastAddress` using the`IP_DROP_MEMBERSHIP` socket option. This method is automatically called by the + * kernel when the socket is closed or the process terminates, so most apps will + * never have reason to call this. + * + * If `multicastInterface` is not specified, the operating system will attempt to + * drop membership on all valid interfaces. + * @since v0.6.9 + */ + dropMembership(multicastAddress: string, multicastInterface?: string): void; + /** + * This method throws `ERR_SOCKET_BUFFER_SIZE` if called on an unbound socket. + * @since v8.7.0 + * @return the `SO_RCVBUF` socket receive buffer size in bytes. + */ + getRecvBufferSize(): number; + /** + * This method throws `ERR_SOCKET_BUFFER_SIZE` if called on an unbound socket. + * @since v8.7.0 + * @return the `SO_SNDBUF` socket send buffer size in bytes. + */ + getSendBufferSize(): number; + /** + * By default, binding a socket will cause it to block the Node.js process from + * exiting as long as the socket is open. The `socket.unref()` method can be used + * to exclude the socket from the reference counting that keeps the Node.js + * process active. The `socket.ref()` method adds the socket back to the reference + * counting and restores the default behavior. + * + * Calling `socket.ref()` multiples times will have no additional effect. + * + * The `socket.ref()` method returns a reference to the socket so calls can be + * chained. + * @since v0.9.1 + */ + ref(): this; + /** + * Returns an object containing the `address`, `family`, and `port` of the remote + * endpoint. This method throws an `ERR_SOCKET_DGRAM_NOT_CONNECTED` exception + * if the socket is not connected. + * @since v12.0.0 + */ + remoteAddress(): AddressInfo; + /** + * Broadcasts a datagram on the socket. + * For connectionless sockets, the destination `port` and `address` must be + * specified. Connected sockets, on the other hand, will use their associated + * remote endpoint, so the `port` and `address` arguments must not be set. + * + * The `msg` argument contains the message to be sent. + * Depending on its type, different behavior can apply. If `msg` is a `Buffer`, + * any `TypedArray` or a `DataView`, + * the `offset` and `length` specify the offset within the `Buffer` where the + * message begins and the number of bytes in the message, respectively. + * If `msg` is a `String`, then it is automatically converted to a `Buffer`with `'utf8'` encoding. With messages that + * contain multi-byte characters, `offset` and `length` will be calculated with + * respect to `byte length` and not the character position. + * If `msg` is an array, `offset` and `length` must not be specified. + * + * The `address` argument is a string. If the value of `address` is a host name, + * DNS will be used to resolve the address of the host. If `address` is not + * provided or otherwise nullish, `'127.0.0.1'` (for `udp4` sockets) or `'::1'`(for `udp6` sockets) will be used by default. + * + * If the socket has not been previously bound with a call to `bind`, the socket + * is assigned a random port number and is bound to the "all interfaces" address + * (`'0.0.0.0'` for `udp4` sockets, `'::0'` for `udp6` sockets.) + * + * An optional `callback` function may be specified to as a way of reporting + * DNS errors or for determining when it is safe to reuse the `buf` object. + * DNS lookups delay the time to send for at least one tick of the + * Node.js event loop. + * + * The only way to know for sure that the datagram has been sent is by using a`callback`. If an error occurs and a `callback` is given, the error will be + * passed as the first argument to the `callback`. If a `callback` is not given, + * the error is emitted as an `'error'` event on the `socket` object. + * + * Offset and length are optional but both _must_ be set if either are used. + * They are supported only when the first argument is a `Buffer`, a `TypedArray`, + * or a `DataView`. + * + * This method throws `ERR_SOCKET_BAD_PORT` if called on an unbound socket. + * + * Example of sending a UDP packet to a port on `localhost`; + * + * ```js + * import dgram from 'node:dgram'; + * import { Buffer } from 'node:buffer'; + * + * const message = Buffer.from('Some bytes'); + * const client = dgram.createSocket('udp4'); + * client.send(message, 41234, 'localhost', (err) => { + * client.close(); + * }); + * ``` + * + * Example of sending a UDP packet composed of multiple buffers to a port on`127.0.0.1`; + * + * ```js + * import dgram from 'node:dgram'; + * import { Buffer } from 'node:buffer'; + * + * const buf1 = Buffer.from('Some '); + * const buf2 = Buffer.from('bytes'); + * const client = dgram.createSocket('udp4'); + * client.send([buf1, buf2], 41234, (err) => { + * client.close(); + * }); + * ``` + * + * Sending multiple buffers might be faster or slower depending on the + * application and operating system. Run benchmarks to + * determine the optimal strategy on a case-by-case basis. Generally speaking, + * however, sending multiple buffers is faster. + * + * Example of sending a UDP packet using a socket connected to a port on`localhost`: + * + * ```js + * import dgram from 'node:dgram'; + * import { Buffer } from 'node:buffer'; + * + * const message = Buffer.from('Some bytes'); + * const client = dgram.createSocket('udp4'); + * client.connect(41234, 'localhost', (err) => { + * client.send(message, (err) => { + * client.close(); + * }); + * }); + * ``` + * @since v0.1.99 + * @param msg Message to be sent. + * @param offset Offset in the buffer where the message starts. + * @param length Number of bytes in the message. + * @param port Destination port. + * @param address Destination host name or IP address. + * @param callback Called when the message has been sent. + */ + send( + msg: string | Uint8Array | readonly any[], + port?: number, + address?: string, + callback?: (error: Error | null, bytes: number) => void, + ): void; + send( + msg: string | Uint8Array | readonly any[], + port?: number, + callback?: (error: Error | null, bytes: number) => void, + ): void; + send( + msg: string | Uint8Array | readonly any[], + callback?: (error: Error | null, bytes: number) => void, + ): void; + send( + msg: string | Uint8Array, + offset: number, + length: number, + port?: number, + address?: string, + callback?: (error: Error | null, bytes: number) => void, + ): void; + send( + msg: string | Uint8Array, + offset: number, + length: number, + port?: number, + callback?: (error: Error | null, bytes: number) => void, + ): void; + send( + msg: string | Uint8Array, + offset: number, + length: number, + callback?: (error: Error | null, bytes: number) => void, + ): void; + /** + * Sets or clears the `SO_BROADCAST` socket option. When set to `true`, UDP + * packets may be sent to a local interface's broadcast address. + * + * This method throws `EBADF` if called on an unbound socket. + * @since v0.6.9 + */ + setBroadcast(flag: boolean): void; + /** + * _All references to scope in this section are referring to [IPv6 Zone Indices](https://en.wikipedia.org/wiki/IPv6_address#Scoped_literal_IPv6_addresses), which are defined by [RFC + * 4007](https://tools.ietf.org/html/rfc4007). In string form, an IP_ + * _with a scope index is written as `'IP%scope'` where scope is an interface name_ + * _or interface number._ + * + * Sets the default outgoing multicast interface of the socket to a chosen + * interface or back to system interface selection. The `multicastInterface` must + * be a valid string representation of an IP from the socket's family. + * + * For IPv4 sockets, this should be the IP configured for the desired physical + * interface. All packets sent to multicast on the socket will be sent on the + * interface determined by the most recent successful use of this call. + * + * For IPv6 sockets, `multicastInterface` should include a scope to indicate the + * interface as in the examples that follow. In IPv6, individual `send` calls can + * also use explicit scope in addresses, so only packets sent to a multicast + * address without specifying an explicit scope are affected by the most recent + * successful use of this call. + * + * This method throws `EBADF` if called on an unbound socket. + * + * #### Example: IPv6 outgoing multicast interface + * + * On most systems, where scope format uses the interface name: + * + * ```js + * const socket = dgram.createSocket('udp6'); + * + * socket.bind(1234, () => { + * socket.setMulticastInterface('::%eth1'); + * }); + * ``` + * + * On Windows, where scope format uses an interface number: + * + * ```js + * const socket = dgram.createSocket('udp6'); + * + * socket.bind(1234, () => { + * socket.setMulticastInterface('::%2'); + * }); + * ``` + * + * #### Example: IPv4 outgoing multicast interface + * + * All systems use an IP of the host on the desired physical interface: + * + * ```js + * const socket = dgram.createSocket('udp4'); + * + * socket.bind(1234, () => { + * socket.setMulticastInterface('10.0.0.2'); + * }); + * ``` + * @since v8.6.0 + */ + setMulticastInterface(multicastInterface: string): void; + /** + * Sets or clears the `IP_MULTICAST_LOOP` socket option. When set to `true`, + * multicast packets will also be received on the local interface. + * + * This method throws `EBADF` if called on an unbound socket. + * @since v0.3.8 + */ + setMulticastLoopback(flag: boolean): boolean; + /** + * Sets the `IP_MULTICAST_TTL` socket option. While TTL generally stands for + * "Time to Live", in this context it specifies the number of IP hops that a + * packet is allowed to travel through, specifically for multicast traffic. Each + * router or gateway that forwards a packet decrements the TTL. If the TTL is + * decremented to 0 by a router, it will not be forwarded. + * + * The `ttl` argument may be between 0 and 255\. The default on most systems is `1`. + * + * This method throws `EBADF` if called on an unbound socket. + * @since v0.3.8 + */ + setMulticastTTL(ttl: number): number; + /** + * Sets the `SO_RCVBUF` socket option. Sets the maximum socket receive buffer + * in bytes. + * + * This method throws `ERR_SOCKET_BUFFER_SIZE` if called on an unbound socket. + * @since v8.7.0 + */ + setRecvBufferSize(size: number): void; + /** + * Sets the `SO_SNDBUF` socket option. Sets the maximum socket send buffer + * in bytes. + * + * This method throws `ERR_SOCKET_BUFFER_SIZE` if called on an unbound socket. + * @since v8.7.0 + */ + setSendBufferSize(size: number): void; + /** + * Sets the `IP_TTL` socket option. While TTL generally stands for "Time to Live", + * in this context it specifies the number of IP hops that a packet is allowed to + * travel through. Each router or gateway that forwards a packet decrements the + * TTL. If the TTL is decremented to 0 by a router, it will not be forwarded. + * Changing TTL values is typically done for network probes or when multicasting. + * + * The `ttl` argument may be between 1 and 255\. The default on most systems + * is 64. + * + * This method throws `EBADF` if called on an unbound socket. + * @since v0.1.101 + */ + setTTL(ttl: number): number; + /** + * By default, binding a socket will cause it to block the Node.js process from + * exiting as long as the socket is open. The `socket.unref()` method can be used + * to exclude the socket from the reference counting that keeps the Node.js + * process active, allowing the process to exit even if the socket is still + * listening. + * + * Calling `socket.unref()` multiple times will have no additional effect. + * + * The `socket.unref()` method returns a reference to the socket so calls can be + * chained. + * @since v0.9.1 + */ + unref(): this; + /** + * Tells the kernel to join a source-specific multicast channel at the given`sourceAddress` and `groupAddress`, using the `multicastInterface` with the`IP_ADD_SOURCE_MEMBERSHIP` socket + * option. If the `multicastInterface` argument + * is not specified, the operating system will choose one interface and will add + * membership to it. To add membership to every available interface, call`socket.addSourceSpecificMembership()` multiple times, once per interface. + * + * When called on an unbound socket, this method will implicitly bind to a random + * port, listening on all interfaces. + * @since v13.1.0, v12.16.0 + */ + addSourceSpecificMembership(sourceAddress: string, groupAddress: string, multicastInterface?: string): void; + /** + * Instructs the kernel to leave a source-specific multicast channel at the given`sourceAddress` and `groupAddress` using the `IP_DROP_SOURCE_MEMBERSHIP`socket option. This method is + * automatically called by the kernel when the + * socket is closed or the process terminates, so most apps will never have + * reason to call this. + * + * If `multicastInterface` is not specified, the operating system will attempt to + * drop membership on all valid interfaces. + * @since v13.1.0, v12.16.0 + */ + dropSourceSpecificMembership(sourceAddress: string, groupAddress: string, multicastInterface?: string): void; + /** + * events.EventEmitter + * 1. close + * 2. connect + * 3. error + * 4. listening + * 5. message + */ + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "connect", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "listening", listener: () => void): this; + addListener(event: "message", listener: (msg: Buffer, rinfo: RemoteInfo) => void): this; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close"): boolean; + emit(event: "connect"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "listening"): boolean; + emit(event: "message", msg: Buffer, rinfo: RemoteInfo): boolean; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "close", listener: () => void): this; + on(event: "connect", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "listening", listener: () => void): this; + on(event: "message", listener: (msg: Buffer, rinfo: RemoteInfo) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "connect", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "listening", listener: () => void): this; + once(event: "message", listener: (msg: Buffer, rinfo: RemoteInfo) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "connect", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "listening", listener: () => void): this; + prependListener(event: "message", listener: (msg: Buffer, rinfo: RemoteInfo) => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "connect", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "listening", listener: () => void): this; + prependOnceListener(event: "message", listener: (msg: Buffer, rinfo: RemoteInfo) => void): this; + /** + * Calls `socket.close()` and returns a promise that fulfills when the socket has closed. + * @since v20.5.0 + */ + [Symbol.asyncDispose](): Promise; + } +} +declare module "node:dgram" { + export * from "dgram"; +} diff --git a/task/node_modules/@types/node/diagnostics_channel.d.ts b/task/node_modules/@types/node/diagnostics_channel.d.ts new file mode 100644 index 0000000..b02f591 --- /dev/null +++ b/task/node_modules/@types/node/diagnostics_channel.d.ts @@ -0,0 +1,191 @@ +/** + * The `node:diagnostics_channel` module provides an API to create named channels + * to report arbitrary message data for diagnostics purposes. + * + * It can be accessed using: + * + * ```js + * import diagnostics_channel from 'node:diagnostics_channel'; + * ``` + * + * It is intended that a module writer wanting to report diagnostics messages + * will create one or many top-level channels to report messages through. + * Channels may also be acquired at runtime but it is not encouraged + * due to the additional overhead of doing so. Channels may be exported for + * convenience, but as long as the name is known it can be acquired anywhere. + * + * If you intend for your module to produce diagnostics data for others to + * consume it is recommended that you include documentation of what named + * channels are used along with the shape of the message data. Channel names + * should generally include the module name to avoid collisions with data from + * other modules. + * @since v15.1.0, v14.17.0 + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/diagnostics_channel.js) + */ +declare module "diagnostics_channel" { + /** + * Check if there are active subscribers to the named channel. This is helpful if + * the message you want to send might be expensive to prepare. + * + * This API is optional but helpful when trying to publish messages from very + * performance-sensitive code. + * + * ```js + * import diagnostics_channel from 'node:diagnostics_channel'; + * + * if (diagnostics_channel.hasSubscribers('my-channel')) { + * // There are subscribers, prepare and publish message + * } + * ``` + * @since v15.1.0, v14.17.0 + * @param name The channel name + * @return If there are active subscribers + */ + function hasSubscribers(name: string | symbol): boolean; + /** + * This is the primary entry-point for anyone wanting to publish to a named + * channel. It produces a channel object which is optimized to reduce overhead at + * publish time as much as possible. + * + * ```js + * import diagnostics_channel from 'node:diagnostics_channel'; + * + * const channel = diagnostics_channel.channel('my-channel'); + * ``` + * @since v15.1.0, v14.17.0 + * @param name The channel name + * @return The named channel object + */ + function channel(name: string | symbol): Channel; + type ChannelListener = (message: unknown, name: string | symbol) => void; + /** + * Register a message handler to subscribe to this channel. This message handler + * will be run synchronously whenever a message is published to the channel. Any + * errors thrown in the message handler will trigger an `'uncaughtException'`. + * + * ```js + * import diagnostics_channel from 'node:diagnostics_channel'; + * + * diagnostics_channel.subscribe('my-channel', (message, name) => { + * // Received data + * }); + * ``` + * @since v18.7.0, v16.17.0 + * @param name The channel name + * @param onMessage The handler to receive channel messages + */ + function subscribe(name: string | symbol, onMessage: ChannelListener): void; + /** + * Remove a message handler previously registered to this channel with {@link subscribe}. + * + * ```js + * import diagnostics_channel from 'node:diagnostics_channel'; + * + * function onMessage(message, name) { + * // Received data + * } + * + * diagnostics_channel.subscribe('my-channel', onMessage); + * + * diagnostics_channel.unsubscribe('my-channel', onMessage); + * ``` + * @since v18.7.0, v16.17.0 + * @param name The channel name + * @param onMessage The previous subscribed handler to remove + * @return `true` if the handler was found, `false` otherwise. + */ + function unsubscribe(name: string | symbol, onMessage: ChannelListener): boolean; + /** + * The class `Channel` represents an individual named channel within the data + * pipeline. It is used to track subscribers and to publish messages when there + * are subscribers present. It exists as a separate object to avoid channel + * lookups at publish time, enabling very fast publish speeds and allowing + * for heavy use while incurring very minimal cost. Channels are created with {@link channel}, constructing a channel directly + * with `new Channel(name)` is not supported. + * @since v15.1.0, v14.17.0 + */ + class Channel { + readonly name: string | symbol; + /** + * Check if there are active subscribers to this channel. This is helpful if + * the message you want to send might be expensive to prepare. + * + * This API is optional but helpful when trying to publish messages from very + * performance-sensitive code. + * + * ```js + * import diagnostics_channel from 'node:diagnostics_channel'; + * + * const channel = diagnostics_channel.channel('my-channel'); + * + * if (channel.hasSubscribers) { + * // There are subscribers, prepare and publish message + * } + * ``` + * @since v15.1.0, v14.17.0 + */ + readonly hasSubscribers: boolean; + private constructor(name: string | symbol); + /** + * Publish a message to any subscribers to the channel. This will trigger + * message handlers synchronously so they will execute within the same context. + * + * ```js + * import diagnostics_channel from 'node:diagnostics_channel'; + * + * const channel = diagnostics_channel.channel('my-channel'); + * + * channel.publish({ + * some: 'message', + * }); + * ``` + * @since v15.1.0, v14.17.0 + * @param message The message to send to the channel subscribers + */ + publish(message: unknown): void; + /** + * Register a message handler to subscribe to this channel. This message handler + * will be run synchronously whenever a message is published to the channel. Any + * errors thrown in the message handler will trigger an `'uncaughtException'`. + * + * ```js + * import diagnostics_channel from 'node:diagnostics_channel'; + * + * const channel = diagnostics_channel.channel('my-channel'); + * + * channel.subscribe((message, name) => { + * // Received data + * }); + * ``` + * @since v15.1.0, v14.17.0 + * @deprecated Since v18.7.0,v16.17.0 - Use {@link subscribe(name, onMessage)} + * @param onMessage The handler to receive channel messages + */ + subscribe(onMessage: ChannelListener): void; + /** + * Remove a message handler previously registered to this channel with `channel.subscribe(onMessage)`. + * + * ```js + * import diagnostics_channel from 'node:diagnostics_channel'; + * + * const channel = diagnostics_channel.channel('my-channel'); + * + * function onMessage(message, name) { + * // Received data + * } + * + * channel.subscribe(onMessage); + * + * channel.unsubscribe(onMessage); + * ``` + * @since v15.1.0, v14.17.0 + * @deprecated Since v18.7.0,v16.17.0 - Use {@link unsubscribe(name, onMessage)} + * @param onMessage The previous subscribed handler to remove + * @return `true` if the handler was found, `false` otherwise. + */ + unsubscribe(onMessage: ChannelListener): void; + } +} +declare module "node:diagnostics_channel" { + export * from "diagnostics_channel"; +} diff --git a/task/node_modules/@types/node/dns.d.ts b/task/node_modules/@types/node/dns.d.ts new file mode 100644 index 0000000..380cf7d --- /dev/null +++ b/task/node_modules/@types/node/dns.d.ts @@ -0,0 +1,809 @@ +/** + * The `node:dns` module enables name resolution. For example, use it to look up IP + * addresses of host names. + * + * Although named for the [Domain Name System (DNS)](https://en.wikipedia.org/wiki/Domain_Name_System), it does not always use the + * DNS protocol for lookups. {@link lookup} uses the operating system + * facilities to perform name resolution. It may not need to perform any network + * communication. To perform name resolution the way other applications on the same + * system do, use {@link lookup}. + * + * ```js + * const dns = require('node:dns'); + * + * dns.lookup('example.org', (err, address, family) => { + * console.log('address: %j family: IPv%s', address, family); + * }); + * // address: "93.184.216.34" family: IPv4 + * ``` + * + * All other functions in the `node:dns` module connect to an actual DNS server to + * perform name resolution. They will always use the network to perform DNS + * queries. These functions do not use the same set of configuration files used by {@link lookup} (e.g. `/etc/hosts`). Use these functions to always perform + * DNS queries, bypassing other name-resolution facilities. + * + * ```js + * const dns = require('node:dns'); + * + * dns.resolve4('archive.org', (err, addresses) => { + * if (err) throw err; + * + * console.log(`addresses: ${JSON.stringify(addresses)}`); + * + * addresses.forEach((a) => { + * dns.reverse(a, (err, hostnames) => { + * if (err) { + * throw err; + * } + * console.log(`reverse for ${a}: ${JSON.stringify(hostnames)}`); + * }); + * }); + * }); + * ``` + * + * See the `Implementation considerations section` for more information. + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/dns.js) + */ +declare module "dns" { + import * as dnsPromises from "node:dns/promises"; + // Supported getaddrinfo flags. + export const ADDRCONFIG: number; + export const V4MAPPED: number; + /** + * If `dns.V4MAPPED` is specified, return resolved IPv6 addresses as + * well as IPv4 mapped IPv6 addresses. + */ + export const ALL: number; + export interface LookupOptions { + family?: number | undefined; + hints?: number | undefined; + all?: boolean | undefined; + /** + * @default true + */ + verbatim?: boolean | undefined; + } + export interface LookupOneOptions extends LookupOptions { + all?: false | undefined; + } + export interface LookupAllOptions extends LookupOptions { + all: true; + } + export interface LookupAddress { + address: string; + family: number; + } + /** + * Resolves a host name (e.g. `'nodejs.org'`) into the first found A (IPv4) or + * AAAA (IPv6) record. All `option` properties are optional. If `options` is an + * integer, then it must be `4` or `6` – if `options` is `0` or not provided, then + * IPv4 and IPv6 addresses are both returned if found. + * + * With the `all` option set to `true`, the arguments for `callback` change to`(err, addresses)`, with `addresses` being an array of objects with the + * properties `address` and `family`. + * + * On error, `err` is an `Error` object, where `err.code` is the error code. + * Keep in mind that `err.code` will be set to `'ENOTFOUND'` not only when + * the host name does not exist but also when the lookup fails in other ways + * such as no available file descriptors. + * + * `dns.lookup()` does not necessarily have anything to do with the DNS protocol. + * The implementation uses an operating system facility that can associate names + * with addresses and vice versa. This implementation can have subtle but + * important consequences on the behavior of any Node.js program. Please take some + * time to consult the `Implementation considerations section` before using`dns.lookup()`. + * + * Example usage: + * + * ```js + * const dns = require('node:dns'); + * const options = { + * family: 6, + * hints: dns.ADDRCONFIG | dns.V4MAPPED, + * }; + * dns.lookup('example.com', options, (err, address, family) => + * console.log('address: %j family: IPv%s', address, family)); + * // address: "2606:2800:220:1:248:1893:25c8:1946" family: IPv6 + * + * // When options.all is true, the result will be an Array. + * options.all = true; + * dns.lookup('example.com', options, (err, addresses) => + * console.log('addresses: %j', addresses)); + * // addresses: [{"address":"2606:2800:220:1:248:1893:25c8:1946","family":6}] + * ``` + * + * If this method is invoked as its `util.promisify()` ed version, and `all`is not set to `true`, it returns a `Promise` for an `Object` with `address` and`family` properties. + * @since v0.1.90 + */ + export function lookup( + hostname: string, + family: number, + callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void, + ): void; + export function lookup( + hostname: string, + options: LookupOneOptions, + callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void, + ): void; + export function lookup( + hostname: string, + options: LookupAllOptions, + callback: (err: NodeJS.ErrnoException | null, addresses: LookupAddress[]) => void, + ): void; + export function lookup( + hostname: string, + options: LookupOptions, + callback: (err: NodeJS.ErrnoException | null, address: string | LookupAddress[], family: number) => void, + ): void; + export function lookup( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void, + ): void; + export namespace lookup { + function __promisify__(hostname: string, options: LookupAllOptions): Promise; + function __promisify__(hostname: string, options?: LookupOneOptions | number): Promise; + function __promisify__(hostname: string, options: LookupOptions): Promise; + } + /** + * Resolves the given `address` and `port` into a host name and service using + * the operating system's underlying `getnameinfo` implementation. + * + * If `address` is not a valid IP address, a `TypeError` will be thrown. + * The `port` will be coerced to a number. If it is not a legal port, a `TypeError`will be thrown. + * + * On an error, `err` is an `Error` object, where `err.code` is the error code. + * + * ```js + * const dns = require('node:dns'); + * dns.lookupService('127.0.0.1', 22, (err, hostname, service) => { + * console.log(hostname, service); + * // Prints: localhost ssh + * }); + * ``` + * + * If this method is invoked as its `util.promisify()` ed version, it returns a`Promise` for an `Object` with `hostname` and `service` properties. + * @since v0.11.14 + */ + export function lookupService( + address: string, + port: number, + callback: (err: NodeJS.ErrnoException | null, hostname: string, service: string) => void, + ): void; + export namespace lookupService { + function __promisify__( + address: string, + port: number, + ): Promise<{ + hostname: string; + service: string; + }>; + } + export interface ResolveOptions { + ttl: boolean; + } + export interface ResolveWithTtlOptions extends ResolveOptions { + ttl: true; + } + export interface RecordWithTtl { + address: string; + ttl: number; + } + /** @deprecated Use `AnyARecord` or `AnyAaaaRecord` instead. */ + export type AnyRecordWithTtl = AnyARecord | AnyAaaaRecord; + export interface AnyARecord extends RecordWithTtl { + type: "A"; + } + export interface AnyAaaaRecord extends RecordWithTtl { + type: "AAAA"; + } + export interface CaaRecord { + critical: number; + issue?: string | undefined; + issuewild?: string | undefined; + iodef?: string | undefined; + contactemail?: string | undefined; + contactphone?: string | undefined; + } + export interface MxRecord { + priority: number; + exchange: string; + } + export interface AnyMxRecord extends MxRecord { + type: "MX"; + } + export interface NaptrRecord { + flags: string; + service: string; + regexp: string; + replacement: string; + order: number; + preference: number; + } + export interface AnyNaptrRecord extends NaptrRecord { + type: "NAPTR"; + } + export interface SoaRecord { + nsname: string; + hostmaster: string; + serial: number; + refresh: number; + retry: number; + expire: number; + minttl: number; + } + export interface AnySoaRecord extends SoaRecord { + type: "SOA"; + } + export interface SrvRecord { + priority: number; + weight: number; + port: number; + name: string; + } + export interface AnySrvRecord extends SrvRecord { + type: "SRV"; + } + export interface AnyTxtRecord { + type: "TXT"; + entries: string[]; + } + export interface AnyNsRecord { + type: "NS"; + value: string; + } + export interface AnyPtrRecord { + type: "PTR"; + value: string; + } + export interface AnyCnameRecord { + type: "CNAME"; + value: string; + } + export type AnyRecord = + | AnyARecord + | AnyAaaaRecord + | AnyCnameRecord + | AnyMxRecord + | AnyNaptrRecord + | AnyNsRecord + | AnyPtrRecord + | AnySoaRecord + | AnySrvRecord + | AnyTxtRecord; + /** + * Uses the DNS protocol to resolve a host name (e.g. `'nodejs.org'`) into an array + * of the resource records. The `callback` function has arguments`(err, records)`. When successful, `records` will be an array of resource + * records. The type and structure of individual results varies based on `rrtype`: + * + * + * + * On error, `err` is an `Error` object, where `err.code` is one of the `DNS error codes`. + * @since v0.1.27 + * @param hostname Host name to resolve. + * @param [rrtype='A'] Resource record type. + */ + export function resolve( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, addresses: string[]) => void, + ): void; + export function resolve( + hostname: string, + rrtype: "A", + callback: (err: NodeJS.ErrnoException | null, addresses: string[]) => void, + ): void; + export function resolve( + hostname: string, + rrtype: "AAAA", + callback: (err: NodeJS.ErrnoException | null, addresses: string[]) => void, + ): void; + export function resolve( + hostname: string, + rrtype: "ANY", + callback: (err: NodeJS.ErrnoException | null, addresses: AnyRecord[]) => void, + ): void; + export function resolve( + hostname: string, + rrtype: "CNAME", + callback: (err: NodeJS.ErrnoException | null, addresses: string[]) => void, + ): void; + export function resolve( + hostname: string, + rrtype: "MX", + callback: (err: NodeJS.ErrnoException | null, addresses: MxRecord[]) => void, + ): void; + export function resolve( + hostname: string, + rrtype: "NAPTR", + callback: (err: NodeJS.ErrnoException | null, addresses: NaptrRecord[]) => void, + ): void; + export function resolve( + hostname: string, + rrtype: "NS", + callback: (err: NodeJS.ErrnoException | null, addresses: string[]) => void, + ): void; + export function resolve( + hostname: string, + rrtype: "PTR", + callback: (err: NodeJS.ErrnoException | null, addresses: string[]) => void, + ): void; + export function resolve( + hostname: string, + rrtype: "SOA", + callback: (err: NodeJS.ErrnoException | null, addresses: SoaRecord) => void, + ): void; + export function resolve( + hostname: string, + rrtype: "SRV", + callback: (err: NodeJS.ErrnoException | null, addresses: SrvRecord[]) => void, + ): void; + export function resolve( + hostname: string, + rrtype: "TXT", + callback: (err: NodeJS.ErrnoException | null, addresses: string[][]) => void, + ): void; + export function resolve( + hostname: string, + rrtype: string, + callback: ( + err: NodeJS.ErrnoException | null, + addresses: string[] | MxRecord[] | NaptrRecord[] | SoaRecord | SrvRecord[] | string[][] | AnyRecord[], + ) => void, + ): void; + export namespace resolve { + function __promisify__(hostname: string, rrtype?: "A" | "AAAA" | "CNAME" | "NS" | "PTR"): Promise; + function __promisify__(hostname: string, rrtype: "ANY"): Promise; + function __promisify__(hostname: string, rrtype: "MX"): Promise; + function __promisify__(hostname: string, rrtype: "NAPTR"): Promise; + function __promisify__(hostname: string, rrtype: "SOA"): Promise; + function __promisify__(hostname: string, rrtype: "SRV"): Promise; + function __promisify__(hostname: string, rrtype: "TXT"): Promise; + function __promisify__( + hostname: string, + rrtype: string, + ): Promise; + } + /** + * Uses the DNS protocol to resolve a IPv4 addresses (`A` records) for the`hostname`. The `addresses` argument passed to the `callback` function + * will contain an array of IPv4 addresses (e.g.`['74.125.79.104', '74.125.79.105', '74.125.79.106']`). + * @since v0.1.16 + * @param hostname Host name to resolve. + */ + export function resolve4( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, addresses: string[]) => void, + ): void; + export function resolve4( + hostname: string, + options: ResolveWithTtlOptions, + callback: (err: NodeJS.ErrnoException | null, addresses: RecordWithTtl[]) => void, + ): void; + export function resolve4( + hostname: string, + options: ResolveOptions, + callback: (err: NodeJS.ErrnoException | null, addresses: string[] | RecordWithTtl[]) => void, + ): void; + export namespace resolve4 { + function __promisify__(hostname: string): Promise; + function __promisify__(hostname: string, options: ResolveWithTtlOptions): Promise; + function __promisify__(hostname: string, options?: ResolveOptions): Promise; + } + /** + * Uses the DNS protocol to resolve IPv6 addresses (`AAAA` records) for the`hostname`. The `addresses` argument passed to the `callback` function + * will contain an array of IPv6 addresses. + * @since v0.1.16 + * @param hostname Host name to resolve. + */ + export function resolve6( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, addresses: string[]) => void, + ): void; + export function resolve6( + hostname: string, + options: ResolveWithTtlOptions, + callback: (err: NodeJS.ErrnoException | null, addresses: RecordWithTtl[]) => void, + ): void; + export function resolve6( + hostname: string, + options: ResolveOptions, + callback: (err: NodeJS.ErrnoException | null, addresses: string[] | RecordWithTtl[]) => void, + ): void; + export namespace resolve6 { + function __promisify__(hostname: string): Promise; + function __promisify__(hostname: string, options: ResolveWithTtlOptions): Promise; + function __promisify__(hostname: string, options?: ResolveOptions): Promise; + } + /** + * Uses the DNS protocol to resolve `CNAME` records for the `hostname`. The`addresses` argument passed to the `callback` function + * will contain an array of canonical name records available for the `hostname`(e.g. `['bar.example.com']`). + * @since v0.3.2 + */ + export function resolveCname( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, addresses: string[]) => void, + ): void; + export namespace resolveCname { + function __promisify__(hostname: string): Promise; + } + /** + * Uses the DNS protocol to resolve `CAA` records for the `hostname`. The`addresses` argument passed to the `callback` function + * will contain an array of certification authority authorization records + * available for the `hostname` (e.g. `[{critical: 0, iodef: 'mailto:pki@example.com'}, {critical: 128, issue: 'pki.example.com'}]`). + * @since v15.0.0, v14.17.0 + */ + export function resolveCaa( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, records: CaaRecord[]) => void, + ): void; + export namespace resolveCaa { + function __promisify__(hostname: string): Promise; + } + /** + * Uses the DNS protocol to resolve mail exchange records (`MX` records) for the`hostname`. The `addresses` argument passed to the `callback` function will + * contain an array of objects containing both a `priority` and `exchange`property (e.g. `[{priority: 10, exchange: 'mx.example.com'}, ...]`). + * @since v0.1.27 + */ + export function resolveMx( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, addresses: MxRecord[]) => void, + ): void; + export namespace resolveMx { + function __promisify__(hostname: string): Promise; + } + /** + * Uses the DNS protocol to resolve regular expression-based records (`NAPTR`records) for the `hostname`. The `addresses` argument passed to the `callback`function will contain an array of + * objects with the following properties: + * + * * `flags` + * * `service` + * * `regexp` + * * `replacement` + * * `order` + * * `preference` + * + * ```js + * { + * flags: 's', + * service: 'SIP+D2U', + * regexp: '', + * replacement: '_sip._udp.example.com', + * order: 30, + * preference: 100 + * } + * ``` + * @since v0.9.12 + */ + export function resolveNaptr( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, addresses: NaptrRecord[]) => void, + ): void; + export namespace resolveNaptr { + function __promisify__(hostname: string): Promise; + } + /** + * Uses the DNS protocol to resolve name server records (`NS` records) for the`hostname`. The `addresses` argument passed to the `callback` function will + * contain an array of name server records available for `hostname`(e.g. `['ns1.example.com', 'ns2.example.com']`). + * @since v0.1.90 + */ + export function resolveNs( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, addresses: string[]) => void, + ): void; + export namespace resolveNs { + function __promisify__(hostname: string): Promise; + } + /** + * Uses the DNS protocol to resolve pointer records (`PTR` records) for the`hostname`. The `addresses` argument passed to the `callback` function will + * be an array of strings containing the reply records. + * @since v6.0.0 + */ + export function resolvePtr( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, addresses: string[]) => void, + ): void; + export namespace resolvePtr { + function __promisify__(hostname: string): Promise; + } + /** + * Uses the DNS protocol to resolve a start of authority record (`SOA` record) for + * the `hostname`. The `address` argument passed to the `callback` function will + * be an object with the following properties: + * + * * `nsname` + * * `hostmaster` + * * `serial` + * * `refresh` + * * `retry` + * * `expire` + * * `minttl` + * + * ```js + * { + * nsname: 'ns.example.com', + * hostmaster: 'root.example.com', + * serial: 2013101809, + * refresh: 10000, + * retry: 2400, + * expire: 604800, + * minttl: 3600 + * } + * ``` + * @since v0.11.10 + */ + export function resolveSoa( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, address: SoaRecord) => void, + ): void; + export namespace resolveSoa { + function __promisify__(hostname: string): Promise; + } + /** + * Uses the DNS protocol to resolve service records (`SRV` records) for the`hostname`. The `addresses` argument passed to the `callback` function will + * be an array of objects with the following properties: + * + * * `priority` + * * `weight` + * * `port` + * * `name` + * + * ```js + * { + * priority: 10, + * weight: 5, + * port: 21223, + * name: 'service.example.com' + * } + * ``` + * @since v0.1.27 + */ + export function resolveSrv( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, addresses: SrvRecord[]) => void, + ): void; + export namespace resolveSrv { + function __promisify__(hostname: string): Promise; + } + /** + * Uses the DNS protocol to resolve text queries (`TXT` records) for the`hostname`. The `records` argument passed to the `callback` function is a + * two-dimensional array of the text records available for `hostname` (e.g.`[ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]`). Each sub-array contains TXT chunks of + * one record. Depending on the use case, these could be either joined together or + * treated separately. + * @since v0.1.27 + */ + export function resolveTxt( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, addresses: string[][]) => void, + ): void; + export namespace resolveTxt { + function __promisify__(hostname: string): Promise; + } + /** + * Uses the DNS protocol to resolve all records (also known as `ANY` or `*` query). + * The `ret` argument passed to the `callback` function will be an array containing + * various types of records. Each object has a property `type` that indicates the + * type of the current record. And depending on the `type`, additional properties + * will be present on the object: + * + * + * + * Here is an example of the `ret` object passed to the callback: + * + * ```js + * [ { type: 'A', address: '127.0.0.1', ttl: 299 }, + * { type: 'CNAME', value: 'example.com' }, + * { type: 'MX', exchange: 'alt4.aspmx.l.example.com', priority: 50 }, + * { type: 'NS', value: 'ns1.example.com' }, + * { type: 'TXT', entries: [ 'v=spf1 include:_spf.example.com ~all' ] }, + * { type: 'SOA', + * nsname: 'ns1.example.com', + * hostmaster: 'admin.example.com', + * serial: 156696742, + * refresh: 900, + * retry: 900, + * expire: 1800, + * minttl: 60 } ] + * ``` + * + * DNS server operators may choose not to respond to `ANY`queries. It may be better to call individual methods like {@link resolve4},{@link resolveMx}, and so on. For more details, see [RFC + * 8482](https://tools.ietf.org/html/rfc8482). + */ + export function resolveAny( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, addresses: AnyRecord[]) => void, + ): void; + export namespace resolveAny { + function __promisify__(hostname: string): Promise; + } + /** + * Performs a reverse DNS query that resolves an IPv4 or IPv6 address to an + * array of host names. + * + * On error, `err` is an `Error` object, where `err.code` is + * one of the `DNS error codes`. + * @since v0.1.16 + */ + export function reverse( + ip: string, + callback: (err: NodeJS.ErrnoException | null, hostnames: string[]) => void, + ): void; + /** + * Get the default value for `verbatim` in {@link lookup} and `dnsPromises.lookup()`. The value could be: + * + * * `ipv4first`: for `verbatim` defaulting to `false`. + * * `verbatim`: for `verbatim` defaulting to `true`. + * @since v20.1.0 + */ + export function getDefaultResultOrder(): "ipv4first" | "verbatim"; + /** + * Sets the IP address and port of servers to be used when performing DNS + * resolution. The `servers` argument is an array of [RFC 5952](https://tools.ietf.org/html/rfc5952#section-6) formatted + * addresses. If the port is the IANA default DNS port (53) it can be omitted. + * + * ```js + * dns.setServers([ + * '4.4.4.4', + * '[2001:4860:4860::8888]', + * '4.4.4.4:1053', + * '[2001:4860:4860::8888]:1053', + * ]); + * ``` + * + * An error will be thrown if an invalid address is provided. + * + * The `dns.setServers()` method must not be called while a DNS query is in + * progress. + * + * The {@link setServers} method affects only {@link resolve},`dns.resolve*()` and {@link reverse} (and specifically _not_ {@link lookup}). + * + * This method works much like [resolve.conf](https://man7.org/linux/man-pages/man5/resolv.conf.5.html). + * That is, if attempting to resolve with the first server provided results in a`NOTFOUND` error, the `resolve()` method will _not_ attempt to resolve with + * subsequent servers provided. Fallback DNS servers will only be used if the + * earlier ones time out or result in some other error. + * @since v0.11.3 + * @param servers array of `RFC 5952` formatted addresses + */ + export function setServers(servers: readonly string[]): void; + /** + * Returns an array of IP address strings, formatted according to [RFC 5952](https://tools.ietf.org/html/rfc5952#section-6), + * that are currently configured for DNS resolution. A string will include a port + * section if a custom port is used. + * + * ```js + * [ + * '4.4.4.4', + * '2001:4860:4860::8888', + * '4.4.4.4:1053', + * '[2001:4860:4860::8888]:1053', + * ] + * ``` + * @since v0.11.3 + */ + export function getServers(): string[]; + /** + * Set the default value of `verbatim` in {@link lookup} and `dnsPromises.lookup()`. The value could be: + * + * * `ipv4first`: sets default `verbatim` `false`. + * * `verbatim`: sets default `verbatim` `true`. + * + * The default is `verbatim` and {@link setDefaultResultOrder} have higher + * priority than `--dns-result-order`. When using `worker threads`,{@link setDefaultResultOrder} from the main thread won't affect the default + * dns orders in workers. + * @since v16.4.0, v14.18.0 + * @param order must be `'ipv4first'` or `'verbatim'`. + */ + export function setDefaultResultOrder(order: "ipv4first" | "verbatim"): void; + // Error codes + export const NODATA: string; + export const FORMERR: string; + export const SERVFAIL: string; + export const NOTFOUND: string; + export const NOTIMP: string; + export const REFUSED: string; + export const BADQUERY: string; + export const BADNAME: string; + export const BADFAMILY: string; + export const BADRESP: string; + export const CONNREFUSED: string; + export const TIMEOUT: string; + export const EOF: string; + export const FILE: string; + export const NOMEM: string; + export const DESTRUCTION: string; + export const BADSTR: string; + export const BADFLAGS: string; + export const NONAME: string; + export const BADHINTS: string; + export const NOTINITIALIZED: string; + export const LOADIPHLPAPI: string; + export const ADDRGETNETWORKPARAMS: string; + export const CANCELLED: string; + export interface ResolverOptions { + timeout?: number | undefined; + /** + * @default 4 + */ + tries?: number; + } + /** + * An independent resolver for DNS requests. + * + * Creating a new resolver uses the default server settings. Setting + * the servers used for a resolver using `resolver.setServers()` does not affect + * other resolvers: + * + * ```js + * const { Resolver } = require('node:dns'); + * const resolver = new Resolver(); + * resolver.setServers(['4.4.4.4']); + * + * // This request will use the server at 4.4.4.4, independent of global settings. + * resolver.resolve4('example.org', (err, addresses) => { + * // ... + * }); + * ``` + * + * The following methods from the `node:dns` module are available: + * + * * `resolver.getServers()` + * * `resolver.resolve()` + * * `resolver.resolve4()` + * * `resolver.resolve6()` + * * `resolver.resolveAny()` + * * `resolver.resolveCaa()` + * * `resolver.resolveCname()` + * * `resolver.resolveMx()` + * * `resolver.resolveNaptr()` + * * `resolver.resolveNs()` + * * `resolver.resolvePtr()` + * * `resolver.resolveSoa()` + * * `resolver.resolveSrv()` + * * `resolver.resolveTxt()` + * * `resolver.reverse()` + * * `resolver.setServers()` + * @since v8.3.0 + */ + export class Resolver { + constructor(options?: ResolverOptions); + /** + * Cancel all outstanding DNS queries made by this resolver. The corresponding + * callbacks will be called with an error with code `ECANCELLED`. + * @since v8.3.0 + */ + cancel(): void; + getServers: typeof getServers; + resolve: typeof resolve; + resolve4: typeof resolve4; + resolve6: typeof resolve6; + resolveAny: typeof resolveAny; + resolveCaa: typeof resolveCaa; + resolveCname: typeof resolveCname; + resolveMx: typeof resolveMx; + resolveNaptr: typeof resolveNaptr; + resolveNs: typeof resolveNs; + resolvePtr: typeof resolvePtr; + resolveSoa: typeof resolveSoa; + resolveSrv: typeof resolveSrv; + resolveTxt: typeof resolveTxt; + reverse: typeof reverse; + /** + * The resolver instance will send its requests from the specified IP address. + * This allows programs to specify outbound interfaces when used on multi-homed + * systems. + * + * If a v4 or v6 address is not specified, it is set to the default and the + * operating system will choose a local address automatically. + * + * The resolver will use the v4 local address when making requests to IPv4 DNS + * servers, and the v6 local address when making requests to IPv6 DNS servers. + * The `rrtype` of resolution requests has no impact on the local address used. + * @since v15.1.0, v14.17.0 + * @param [ipv4='0.0.0.0'] A string representation of an IPv4 address. + * @param [ipv6='::0'] A string representation of an IPv6 address. + */ + setLocalAddress(ipv4?: string, ipv6?: string): void; + setServers: typeof setServers; + } + export { dnsPromises as promises }; +} +declare module "node:dns" { + export * from "dns"; +} diff --git a/task/node_modules/@types/node/dns/promises.d.ts b/task/node_modules/@types/node/dns/promises.d.ts new file mode 100644 index 0000000..ef9b222 --- /dev/null +++ b/task/node_modules/@types/node/dns/promises.d.ts @@ -0,0 +1,425 @@ +/** + * The `dns.promises` API provides an alternative set of asynchronous DNS methods + * that return `Promise` objects rather than using callbacks. The API is accessible + * via `require('node:dns').promises` or `require('node:dns/promises')`. + * @since v10.6.0 + */ +declare module "dns/promises" { + import { + AnyRecord, + CaaRecord, + LookupAddress, + LookupAllOptions, + LookupOneOptions, + LookupOptions, + MxRecord, + NaptrRecord, + RecordWithTtl, + ResolveOptions, + ResolverOptions, + ResolveWithTtlOptions, + SoaRecord, + SrvRecord, + } from "node:dns"; + /** + * Returns an array of IP address strings, formatted according to [RFC 5952](https://tools.ietf.org/html/rfc5952#section-6), + * that are currently configured for DNS resolution. A string will include a port + * section if a custom port is used. + * + * ```js + * [ + * '4.4.4.4', + * '2001:4860:4860::8888', + * '4.4.4.4:1053', + * '[2001:4860:4860::8888]:1053', + * ] + * ``` + * @since v10.6.0 + */ + function getServers(): string[]; + /** + * Resolves a host name (e.g. `'nodejs.org'`) into the first found A (IPv4) or + * AAAA (IPv6) record. All `option` properties are optional. If `options` is an + * integer, then it must be `4` or `6` – if `options` is not provided, then IPv4 + * and IPv6 addresses are both returned if found. + * + * With the `all` option set to `true`, the `Promise` is resolved with `addresses`being an array of objects with the properties `address` and `family`. + * + * On error, the `Promise` is rejected with an `Error` object, where `err.code`is the error code. + * Keep in mind that `err.code` will be set to `'ENOTFOUND'` not only when + * the host name does not exist but also when the lookup fails in other ways + * such as no available file descriptors. + * + * `dnsPromises.lookup()` does not necessarily have anything to do with the DNS + * protocol. The implementation uses an operating system facility that can + * associate names with addresses and vice versa. This implementation can have + * subtle but important consequences on the behavior of any Node.js program. Please + * take some time to consult the `Implementation considerations section` before + * using `dnsPromises.lookup()`. + * + * Example usage: + * + * ```js + * const dns = require('node:dns'); + * const dnsPromises = dns.promises; + * const options = { + * family: 6, + * hints: dns.ADDRCONFIG | dns.V4MAPPED, + * }; + * + * dnsPromises.lookup('example.com', options).then((result) => { + * console.log('address: %j family: IPv%s', result.address, result.family); + * // address: "2606:2800:220:1:248:1893:25c8:1946" family: IPv6 + * }); + * + * // When options.all is true, the result will be an Array. + * options.all = true; + * dnsPromises.lookup('example.com', options).then((result) => { + * console.log('addresses: %j', result); + * // addresses: [{"address":"2606:2800:220:1:248:1893:25c8:1946","family":6}] + * }); + * ``` + * @since v10.6.0 + */ + function lookup(hostname: string, family: number): Promise; + function lookup(hostname: string, options: LookupOneOptions): Promise; + function lookup(hostname: string, options: LookupAllOptions): Promise; + function lookup(hostname: string, options: LookupOptions): Promise; + function lookup(hostname: string): Promise; + /** + * Resolves the given `address` and `port` into a host name and service using + * the operating system's underlying `getnameinfo` implementation. + * + * If `address` is not a valid IP address, a `TypeError` will be thrown. + * The `port` will be coerced to a number. If it is not a legal port, a `TypeError`will be thrown. + * + * On error, the `Promise` is rejected with an `Error` object, where `err.code`is the error code. + * + * ```js + * const dnsPromises = require('node:dns').promises; + * dnsPromises.lookupService('127.0.0.1', 22).then((result) => { + * console.log(result.hostname, result.service); + * // Prints: localhost ssh + * }); + * ``` + * @since v10.6.0 + */ + function lookupService( + address: string, + port: number, + ): Promise<{ + hostname: string; + service: string; + }>; + /** + * Uses the DNS protocol to resolve a host name (e.g. `'nodejs.org'`) into an array + * of the resource records. When successful, the `Promise` is resolved with an + * array of resource records. The type and structure of individual results vary + * based on `rrtype`: + * + * + * + * On error, the `Promise` is rejected with an `Error` object, where `err.code`is one of the `DNS error codes`. + * @since v10.6.0 + * @param hostname Host name to resolve. + * @param [rrtype='A'] Resource record type. + */ + function resolve(hostname: string): Promise; + function resolve(hostname: string, rrtype: "A"): Promise; + function resolve(hostname: string, rrtype: "AAAA"): Promise; + function resolve(hostname: string, rrtype: "ANY"): Promise; + function resolve(hostname: string, rrtype: "CAA"): Promise; + function resolve(hostname: string, rrtype: "CNAME"): Promise; + function resolve(hostname: string, rrtype: "MX"): Promise; + function resolve(hostname: string, rrtype: "NAPTR"): Promise; + function resolve(hostname: string, rrtype: "NS"): Promise; + function resolve(hostname: string, rrtype: "PTR"): Promise; + function resolve(hostname: string, rrtype: "SOA"): Promise; + function resolve(hostname: string, rrtype: "SRV"): Promise; + function resolve(hostname: string, rrtype: "TXT"): Promise; + function resolve( + hostname: string, + rrtype: string, + ): Promise; + /** + * Uses the DNS protocol to resolve IPv4 addresses (`A` records) for the`hostname`. On success, the `Promise` is resolved with an array of IPv4 + * addresses (e.g. `['74.125.79.104', '74.125.79.105', '74.125.79.106']`). + * @since v10.6.0 + * @param hostname Host name to resolve. + */ + function resolve4(hostname: string): Promise; + function resolve4(hostname: string, options: ResolveWithTtlOptions): Promise; + function resolve4(hostname: string, options: ResolveOptions): Promise; + /** + * Uses the DNS protocol to resolve IPv6 addresses (`AAAA` records) for the`hostname`. On success, the `Promise` is resolved with an array of IPv6 + * addresses. + * @since v10.6.0 + * @param hostname Host name to resolve. + */ + function resolve6(hostname: string): Promise; + function resolve6(hostname: string, options: ResolveWithTtlOptions): Promise; + function resolve6(hostname: string, options: ResolveOptions): Promise; + /** + * Uses the DNS protocol to resolve all records (also known as `ANY` or `*` query). + * On success, the `Promise` is resolved with an array containing various types of + * records. Each object has a property `type` that indicates the type of the + * current record. And depending on the `type`, additional properties will be + * present on the object: + * + * + * + * Here is an example of the result object: + * + * ```js + * [ { type: 'A', address: '127.0.0.1', ttl: 299 }, + * { type: 'CNAME', value: 'example.com' }, + * { type: 'MX', exchange: 'alt4.aspmx.l.example.com', priority: 50 }, + * { type: 'NS', value: 'ns1.example.com' }, + * { type: 'TXT', entries: [ 'v=spf1 include:_spf.example.com ~all' ] }, + * { type: 'SOA', + * nsname: 'ns1.example.com', + * hostmaster: 'admin.example.com', + * serial: 156696742, + * refresh: 900, + * retry: 900, + * expire: 1800, + * minttl: 60 } ] + * ``` + * @since v10.6.0 + */ + function resolveAny(hostname: string): Promise; + /** + * Uses the DNS protocol to resolve `CAA` records for the `hostname`. On success, + * the `Promise` is resolved with an array of objects containing available + * certification authority authorization records available for the `hostname`(e.g. `[{critical: 0, iodef: 'mailto:pki@example.com'},{critical: 128, issue: 'pki.example.com'}]`). + * @since v15.0.0, v14.17.0 + */ + function resolveCaa(hostname: string): Promise; + /** + * Uses the DNS protocol to resolve `CNAME` records for the `hostname`. On success, + * the `Promise` is resolved with an array of canonical name records available for + * the `hostname` (e.g. `['bar.example.com']`). + * @since v10.6.0 + */ + function resolveCname(hostname: string): Promise; + /** + * Uses the DNS protocol to resolve mail exchange records (`MX` records) for the`hostname`. On success, the `Promise` is resolved with an array of objects + * containing both a `priority` and `exchange` property (e.g.`[{priority: 10, exchange: 'mx.example.com'}, ...]`). + * @since v10.6.0 + */ + function resolveMx(hostname: string): Promise; + /** + * Uses the DNS protocol to resolve regular expression-based records (`NAPTR`records) for the `hostname`. On success, the `Promise` is resolved with an array + * of objects with the following properties: + * + * * `flags` + * * `service` + * * `regexp` + * * `replacement` + * * `order` + * * `preference` + * + * ```js + * { + * flags: 's', + * service: 'SIP+D2U', + * regexp: '', + * replacement: '_sip._udp.example.com', + * order: 30, + * preference: 100 + * } + * ``` + * @since v10.6.0 + */ + function resolveNaptr(hostname: string): Promise; + /** + * Uses the DNS protocol to resolve name server records (`NS` records) for the`hostname`. On success, the `Promise` is resolved with an array of name server + * records available for `hostname` (e.g.`['ns1.example.com', 'ns2.example.com']`). + * @since v10.6.0 + */ + function resolveNs(hostname: string): Promise; + /** + * Uses the DNS protocol to resolve pointer records (`PTR` records) for the`hostname`. On success, the `Promise` is resolved with an array of strings + * containing the reply records. + * @since v10.6.0 + */ + function resolvePtr(hostname: string): Promise; + /** + * Uses the DNS protocol to resolve a start of authority record (`SOA` record) for + * the `hostname`. On success, the `Promise` is resolved with an object with the + * following properties: + * + * * `nsname` + * * `hostmaster` + * * `serial` + * * `refresh` + * * `retry` + * * `expire` + * * `minttl` + * + * ```js + * { + * nsname: 'ns.example.com', + * hostmaster: 'root.example.com', + * serial: 2013101809, + * refresh: 10000, + * retry: 2400, + * expire: 604800, + * minttl: 3600 + * } + * ``` + * @since v10.6.0 + */ + function resolveSoa(hostname: string): Promise; + /** + * Uses the DNS protocol to resolve service records (`SRV` records) for the`hostname`. On success, the `Promise` is resolved with an array of objects with + * the following properties: + * + * * `priority` + * * `weight` + * * `port` + * * `name` + * + * ```js + * { + * priority: 10, + * weight: 5, + * port: 21223, + * name: 'service.example.com' + * } + * ``` + * @since v10.6.0 + */ + function resolveSrv(hostname: string): Promise; + /** + * Uses the DNS protocol to resolve text queries (`TXT` records) for the`hostname`. On success, the `Promise` is resolved with a two-dimensional array + * of the text records available for `hostname` (e.g.`[ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]`). Each sub-array contains TXT chunks of + * one record. Depending on the use case, these could be either joined together or + * treated separately. + * @since v10.6.0 + */ + function resolveTxt(hostname: string): Promise; + /** + * Performs a reverse DNS query that resolves an IPv4 or IPv6 address to an + * array of host names. + * + * On error, the `Promise` is rejected with an `Error` object, where `err.code`is one of the `DNS error codes`. + * @since v10.6.0 + */ + function reverse(ip: string): Promise; + /** + * Get the default value for `verbatim` in {@link lookup} and `dnsPromises.lookup()`. The value could be: + * + * * `ipv4first`: for `verbatim` defaulting to `false`. + * * `verbatim`: for `verbatim` defaulting to `true`. + * @since v20.1.0 + */ + function getDefaultResultOrder(): "ipv4first" | "verbatim"; + /** + * Sets the IP address and port of servers to be used when performing DNS + * resolution. The `servers` argument is an array of [RFC 5952](https://tools.ietf.org/html/rfc5952#section-6) formatted + * addresses. If the port is the IANA default DNS port (53) it can be omitted. + * + * ```js + * dnsPromises.setServers([ + * '4.4.4.4', + * '[2001:4860:4860::8888]', + * '4.4.4.4:1053', + * '[2001:4860:4860::8888]:1053', + * ]); + * ``` + * + * An error will be thrown if an invalid address is provided. + * + * The `dnsPromises.setServers()` method must not be called while a DNS query is in + * progress. + * + * This method works much like [resolve.conf](https://man7.org/linux/man-pages/man5/resolv.conf.5.html). + * That is, if attempting to resolve with the first server provided results in a`NOTFOUND` error, the `resolve()` method will _not_ attempt to resolve with + * subsequent servers provided. Fallback DNS servers will only be used if the + * earlier ones time out or result in some other error. + * @since v10.6.0 + * @param servers array of `RFC 5952` formatted addresses + */ + function setServers(servers: readonly string[]): void; + /** + * Set the default value of `verbatim` in `dns.lookup()` and `dnsPromises.lookup()`. The value could be: + * + * * `ipv4first`: sets default `verbatim` `false`. + * * `verbatim`: sets default `verbatim` `true`. + * + * The default is `verbatim` and `dnsPromises.setDefaultResultOrder()` have + * higher priority than `--dns-result-order`. When using `worker threads`,`dnsPromises.setDefaultResultOrder()` from the main thread won't affect the + * default dns orders in workers. + * @since v16.4.0, v14.18.0 + * @param order must be `'ipv4first'` or `'verbatim'`. + */ + function setDefaultResultOrder(order: "ipv4first" | "verbatim"): void; + /** + * An independent resolver for DNS requests. + * + * Creating a new resolver uses the default server settings. Setting + * the servers used for a resolver using `resolver.setServers()` does not affect + * other resolvers: + * + * ```js + * const { Resolver } = require('node:dns').promises; + * const resolver = new Resolver(); + * resolver.setServers(['4.4.4.4']); + * + * // This request will use the server at 4.4.4.4, independent of global settings. + * resolver.resolve4('example.org').then((addresses) => { + * // ... + * }); + * + * // Alternatively, the same code can be written using async-await style. + * (async function() { + * const addresses = await resolver.resolve4('example.org'); + * })(); + * ``` + * + * The following methods from the `dnsPromises` API are available: + * + * * `resolver.getServers()` + * * `resolver.resolve()` + * * `resolver.resolve4()` + * * `resolver.resolve6()` + * * `resolver.resolveAny()` + * * `resolver.resolveCaa()` + * * `resolver.resolveCname()` + * * `resolver.resolveMx()` + * * `resolver.resolveNaptr()` + * * `resolver.resolveNs()` + * * `resolver.resolvePtr()` + * * `resolver.resolveSoa()` + * * `resolver.resolveSrv()` + * * `resolver.resolveTxt()` + * * `resolver.reverse()` + * * `resolver.setServers()` + * @since v10.6.0 + */ + class Resolver { + constructor(options?: ResolverOptions); + cancel(): void; + getServers: typeof getServers; + resolve: typeof resolve; + resolve4: typeof resolve4; + resolve6: typeof resolve6; + resolveAny: typeof resolveAny; + resolveCaa: typeof resolveCaa; + resolveCname: typeof resolveCname; + resolveMx: typeof resolveMx; + resolveNaptr: typeof resolveNaptr; + resolveNs: typeof resolveNs; + resolvePtr: typeof resolvePtr; + resolveSoa: typeof resolveSoa; + resolveSrv: typeof resolveSrv; + resolveTxt: typeof resolveTxt; + reverse: typeof reverse; + setLocalAddress(ipv4?: string, ipv6?: string): void; + setServers: typeof setServers; + } +} +declare module "node:dns/promises" { + export * from "dns/promises"; +} diff --git a/task/node_modules/@types/node/dom-events.d.ts b/task/node_modules/@types/node/dom-events.d.ts new file mode 100644 index 0000000..147a7b6 --- /dev/null +++ b/task/node_modules/@types/node/dom-events.d.ts @@ -0,0 +1,122 @@ +export {}; // Don't export anything! + +//// DOM-like Events +// NB: The Event / EventTarget / EventListener implementations below were copied +// from lib.dom.d.ts, then edited to reflect Node's documentation at +// https://nodejs.org/api/events.html#class-eventtarget. +// Please read that link to understand important implementation differences. + +// This conditional type will be the existing global Event in a browser, or +// the copy below in a Node environment. +type __Event = typeof globalThis extends { onmessage: any; Event: any } ? {} + : { + /** This is not used in Node.js and is provided purely for completeness. */ + readonly bubbles: boolean; + /** Alias for event.stopPropagation(). This is not used in Node.js and is provided purely for completeness. */ + cancelBubble: () => void; + /** True if the event was created with the cancelable option */ + readonly cancelable: boolean; + /** This is not used in Node.js and is provided purely for completeness. */ + readonly composed: boolean; + /** Returns an array containing the current EventTarget as the only entry or empty if the event is not being dispatched. This is not used in Node.js and is provided purely for completeness. */ + composedPath(): [EventTarget?]; + /** Alias for event.target. */ + readonly currentTarget: EventTarget | null; + /** Is true if cancelable is true and event.preventDefault() has been called. */ + readonly defaultPrevented: boolean; + /** This is not used in Node.js and is provided purely for completeness. */ + readonly eventPhase: 0 | 2; + /** The `AbortSignal` "abort" event is emitted with `isTrusted` set to `true`. The value is `false` in all other cases. */ + readonly isTrusted: boolean; + /** Sets the `defaultPrevented` property to `true` if `cancelable` is `true`. */ + preventDefault(): void; + /** This is not used in Node.js and is provided purely for completeness. */ + returnValue: boolean; + /** Alias for event.target. */ + readonly srcElement: EventTarget | null; + /** Stops the invocation of event listeners after the current one completes. */ + stopImmediatePropagation(): void; + /** This is not used in Node.js and is provided purely for completeness. */ + stopPropagation(): void; + /** The `EventTarget` dispatching the event */ + readonly target: EventTarget | null; + /** The millisecond timestamp when the Event object was created. */ + readonly timeStamp: number; + /** Returns the type of event, e.g. "click", "hashchange", or "submit". */ + readonly type: string; + }; + +// See comment above explaining conditional type +type __EventTarget = typeof globalThis extends { onmessage: any; EventTarget: any } ? {} + : { + /** + * Adds a new handler for the `type` event. Any given `listener` is added only once per `type` and per `capture` option value. + * + * If the `once` option is true, the `listener` is removed after the next time a `type` event is dispatched. + * + * The `capture` option is not used by Node.js in any functional way other than tracking registered event listeners per the `EventTarget` specification. + * Specifically, the `capture` option is used as part of the key when registering a `listener`. + * Any individual `listener` may be added once with `capture = false`, and once with `capture = true`. + */ + addEventListener( + type: string, + listener: EventListener | EventListenerObject, + options?: AddEventListenerOptions | boolean, + ): void; + /** Dispatches a synthetic event event to target and returns true if either event's cancelable attribute value is false or its preventDefault() method was not invoked, and false otherwise. */ + dispatchEvent(event: Event): boolean; + /** Removes the event listener in target's event listener list with the same type, callback, and options. */ + removeEventListener( + type: string, + listener: EventListener | EventListenerObject, + options?: EventListenerOptions | boolean, + ): void; + }; + +interface EventInit { + bubbles?: boolean; + cancelable?: boolean; + composed?: boolean; +} + +interface EventListenerOptions { + /** Not directly used by Node.js. Added for API completeness. Default: `false`. */ + capture?: boolean; +} + +interface AddEventListenerOptions extends EventListenerOptions { + /** When `true`, the listener is automatically removed when it is first invoked. Default: `false`. */ + once?: boolean; + /** When `true`, serves as a hint that the listener will not call the `Event` object's `preventDefault()` method. Default: false. */ + passive?: boolean; +} + +interface EventListener { + (evt: Event): void; +} + +interface EventListenerObject { + handleEvent(object: Event): void; +} + +import {} from "events"; // Make this an ambient declaration +declare global { + /** An event which takes place in the DOM. */ + interface Event extends __Event {} + var Event: typeof globalThis extends { onmessage: any; Event: infer T } ? T + : { + prototype: __Event; + new(type: string, eventInitDict?: EventInit): __Event; + }; + + /** + * EventTarget is a DOM interface implemented by objects that can + * receive events and may have listeners for them. + */ + interface EventTarget extends __EventTarget {} + var EventTarget: typeof globalThis extends { onmessage: any; EventTarget: infer T } ? T + : { + prototype: __EventTarget; + new(): __EventTarget; + }; +} diff --git a/task/node_modules/@types/node/domain.d.ts b/task/node_modules/@types/node/domain.d.ts new file mode 100644 index 0000000..72f17bd --- /dev/null +++ b/task/node_modules/@types/node/domain.d.ts @@ -0,0 +1,170 @@ +/** + * **This module is pending deprecation.** Once a replacement API has been + * finalized, this module will be fully deprecated. Most developers should + * **not** have cause to use this module. Users who absolutely must have + * the functionality that domains provide may rely on it for the time being + * but should expect to have to migrate to a different solution + * in the future. + * + * Domains provide a way to handle multiple different IO operations as a + * single group. If any of the event emitters or callbacks registered to a + * domain emit an `'error'` event, or throw an error, then the domain object + * will be notified, rather than losing the context of the error in the`process.on('uncaughtException')` handler, or causing the program to + * exit immediately with an error code. + * @deprecated Since v1.4.2 - Deprecated + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/domain.js) + */ +declare module "domain" { + import EventEmitter = require("node:events"); + /** + * The `Domain` class encapsulates the functionality of routing errors and + * uncaught exceptions to the active `Domain` object. + * + * To handle the errors that it catches, listen to its `'error'` event. + */ + class Domain extends EventEmitter { + /** + * An array of timers and event emitters that have been explicitly added + * to the domain. + */ + members: Array; + /** + * The `enter()` method is plumbing used by the `run()`, `bind()`, and`intercept()` methods to set the active domain. It sets `domain.active` and`process.domain` to the domain, and implicitly + * pushes the domain onto the domain + * stack managed by the domain module (see {@link exit} for details on the + * domain stack). The call to `enter()` delimits the beginning of a chain of + * asynchronous calls and I/O operations bound to a domain. + * + * Calling `enter()` changes only the active domain, and does not alter the domain + * itself. `enter()` and `exit()` can be called an arbitrary number of times on a + * single domain. + */ + enter(): void; + /** + * The `exit()` method exits the current domain, popping it off the domain stack. + * Any time execution is going to switch to the context of a different chain of + * asynchronous calls, it's important to ensure that the current domain is exited. + * The call to `exit()` delimits either the end of or an interruption to the chain + * of asynchronous calls and I/O operations bound to a domain. + * + * If there are multiple, nested domains bound to the current execution context,`exit()` will exit any domains nested within this domain. + * + * Calling `exit()` changes only the active domain, and does not alter the domain + * itself. `enter()` and `exit()` can be called an arbitrary number of times on a + * single domain. + */ + exit(): void; + /** + * Run the supplied function in the context of the domain, implicitly + * binding all event emitters, timers, and low-level requests that are + * created in that context. Optionally, arguments can be passed to + * the function. + * + * This is the most basic way to use a domain. + * + * ```js + * const domain = require('node:domain'); + * const fs = require('node:fs'); + * const d = domain.create(); + * d.on('error', (er) => { + * console.error('Caught error!', er); + * }); + * d.run(() => { + * process.nextTick(() => { + * setTimeout(() => { // Simulating some various async stuff + * fs.open('non-existent file', 'r', (er, fd) => { + * if (er) throw er; + * // proceed... + * }); + * }, 100); + * }); + * }); + * ``` + * + * In this example, the `d.on('error')` handler will be triggered, rather + * than crashing the program. + */ + run(fn: (...args: any[]) => T, ...args: any[]): T; + /** + * Explicitly adds an emitter to the domain. If any event handlers called by + * the emitter throw an error, or if the emitter emits an `'error'` event, it + * will be routed to the domain's `'error'` event, just like with implicit + * binding. + * + * This also works with timers that are returned from `setInterval()` and `setTimeout()`. If their callback function throws, it will be caught by + * the domain `'error'` handler. + * + * If the Timer or `EventEmitter` was already bound to a domain, it is removed + * from that one, and bound to this one instead. + * @param emitter emitter or timer to be added to the domain + */ + add(emitter: EventEmitter | NodeJS.Timer): void; + /** + * The opposite of {@link add}. Removes domain handling from the + * specified emitter. + * @param emitter emitter or timer to be removed from the domain + */ + remove(emitter: EventEmitter | NodeJS.Timer): void; + /** + * The returned function will be a wrapper around the supplied callback + * function. When the returned function is called, any errors that are + * thrown will be routed to the domain's `'error'` event. + * + * ```js + * const d = domain.create(); + * + * function readSomeFile(filename, cb) { + * fs.readFile(filename, 'utf8', d.bind((er, data) => { + * // If this throws, it will also be passed to the domain. + * return cb(er, data ? JSON.parse(data) : null); + * })); + * } + * + * d.on('error', (er) => { + * // An error occurred somewhere. If we throw it now, it will crash the program + * // with the normal line number and stack message. + * }); + * ``` + * @param callback The callback function + * @return The bound function + */ + bind(callback: T): T; + /** + * This method is almost identical to {@link bind}. However, in + * addition to catching thrown errors, it will also intercept `Error` objects sent as the first argument to the function. + * + * In this way, the common `if (err) return callback(err);` pattern can be replaced + * with a single error handler in a single place. + * + * ```js + * const d = domain.create(); + * + * function readSomeFile(filename, cb) { + * fs.readFile(filename, 'utf8', d.intercept((data) => { + * // Note, the first argument is never passed to the + * // callback since it is assumed to be the 'Error' argument + * // and thus intercepted by the domain. + * + * // If this throws, it will also be passed to the domain + * // so the error-handling logic can be moved to the 'error' + * // event on the domain instead of being repeated throughout + * // the program. + * return cb(null, JSON.parse(data)); + * })); + * } + * + * d.on('error', (er) => { + * // An error occurred somewhere. If we throw it now, it will crash the program + * // with the normal line number and stack message. + * }); + * ``` + * @param callback The callback function + * @return The intercepted function + */ + intercept(callback: T): T; + } + function create(): Domain; +} +declare module "node:domain" { + export * from "domain"; +} diff --git a/task/node_modules/@types/node/events.d.ts b/task/node_modules/@types/node/events.d.ts new file mode 100644 index 0000000..6ed47c5 --- /dev/null +++ b/task/node_modules/@types/node/events.d.ts @@ -0,0 +1,879 @@ +/** + * Much of the Node.js core API is built around an idiomatic asynchronous + * event-driven architecture in which certain kinds of objects (called "emitters") + * emit named events that cause `Function` objects ("listeners") to be called. + * + * For instance: a `net.Server` object emits an event each time a peer + * connects to it; a `fs.ReadStream` emits an event when the file is opened; + * a `stream` emits an event whenever data is available to be read. + * + * All objects that emit events are instances of the `EventEmitter` class. These + * objects expose an `eventEmitter.on()` function that allows one or more + * functions to be attached to named events emitted by the object. Typically, + * event names are camel-cased strings but any valid JavaScript property key + * can be used. + * + * When the `EventEmitter` object emits an event, all of the functions attached + * to that specific event are called _synchronously_. Any values returned by the + * called listeners are _ignored_ and discarded. + * + * The following example shows a simple `EventEmitter` instance with a single + * listener. The `eventEmitter.on()` method is used to register listeners, while + * the `eventEmitter.emit()` method is used to trigger the event. + * + * ```js + * import { EventEmitter } from 'node:events'; + * + * class MyEmitter extends EventEmitter {} + * + * const myEmitter = new MyEmitter(); + * myEmitter.on('event', () => { + * console.log('an event occurred!'); + * }); + * myEmitter.emit('event'); + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/events.js) + */ +declare module "events" { + import { AsyncResource, AsyncResourceOptions } from "node:async_hooks"; + // NOTE: This class is in the docs but is **not actually exported** by Node. + // If https://github.com/nodejs/node/issues/39903 gets resolved and Node + // actually starts exporting the class, uncomment below. + // import { EventListener, EventListenerObject } from '__dom-events'; + // /** The NodeEventTarget is a Node.js-specific extension to EventTarget that emulates a subset of the EventEmitter API. */ + // interface NodeEventTarget extends EventTarget { + // /** + // * Node.js-specific extension to the `EventTarget` class that emulates the equivalent `EventEmitter` API. + // * The only difference between `addListener()` and `addEventListener()` is that addListener() will return a reference to the EventTarget. + // */ + // addListener(type: string, listener: EventListener | EventListenerObject, options?: { once: boolean }): this; + // /** Node.js-specific extension to the `EventTarget` class that returns an array of event `type` names for which event listeners are registered. */ + // eventNames(): string[]; + // /** Node.js-specific extension to the `EventTarget` class that returns the number of event listeners registered for the `type`. */ + // listenerCount(type: string): number; + // /** Node.js-specific alias for `eventTarget.removeListener()`. */ + // off(type: string, listener: EventListener | EventListenerObject): this; + // /** Node.js-specific alias for `eventTarget.addListener()`. */ + // on(type: string, listener: EventListener | EventListenerObject, options?: { once: boolean }): this; + // /** Node.js-specific extension to the `EventTarget` class that adds a `once` listener for the given event `type`. This is equivalent to calling `on` with the `once` option set to `true`. */ + // once(type: string, listener: EventListener | EventListenerObject): this; + // /** + // * Node.js-specific extension to the `EventTarget` class. + // * If `type` is specified, removes all registered listeners for `type`, + // * otherwise removes all registered listeners. + // */ + // removeAllListeners(type: string): this; + // /** + // * Node.js-specific extension to the `EventTarget` class that removes the listener for the given `type`. + // * The only difference between `removeListener()` and `removeEventListener()` is that `removeListener()` will return a reference to the `EventTarget`. + // */ + // removeListener(type: string, listener: EventListener | EventListenerObject): this; + // } + interface EventEmitterOptions { + /** + * Enables automatic capturing of promise rejection. + */ + captureRejections?: boolean | undefined; + } + // Any EventTarget with a Node-style `once` function + interface _NodeEventTarget { + once(eventName: string | symbol, listener: (...args: any[]) => void): this; + } + // Any EventTarget with a DOM-style `addEventListener` + interface _DOMEventTarget { + addEventListener( + eventName: string, + listener: (...args: any[]) => void, + opts?: { + once: boolean; + }, + ): any; + } + interface StaticEventEmitterOptions { + signal?: AbortSignal | undefined; + } + interface EventEmitter extends NodeJS.EventEmitter {} + /** + * The `EventEmitter` class is defined and exposed by the `node:events` module: + * + * ```js + * import { EventEmitter } from 'node:events'; + * ``` + * + * All `EventEmitter`s emit the event `'newListener'` when new listeners are + * added and `'removeListener'` when existing listeners are removed. + * + * It supports the following option: + * @since v0.1.26 + */ + class EventEmitter { + constructor(options?: EventEmitterOptions); + + [EventEmitter.captureRejectionSymbol]?(error: Error, event: string, ...args: any[]): void; + + /** + * Creates a `Promise` that is fulfilled when the `EventEmitter` emits the given + * event or that is rejected if the `EventEmitter` emits `'error'` while waiting. + * The `Promise` will resolve with an array of all the arguments emitted to the + * given event. + * + * This method is intentionally generic and works with the web platform [EventTarget](https://dom.spec.whatwg.org/#interface-eventtarget) interface, which has no special`'error'` event + * semantics and does not listen to the `'error'` event. + * + * ```js + * import { once, EventEmitter } from 'node:events'; + * import process from 'node:process'; + * + * const ee = new EventEmitter(); + * + * process.nextTick(() => { + * ee.emit('myevent', 42); + * }); + * + * const [value] = await once(ee, 'myevent'); + * console.log(value); + * + * const err = new Error('kaboom'); + * process.nextTick(() => { + * ee.emit('error', err); + * }); + * + * try { + * await once(ee, 'myevent'); + * } catch (err) { + * console.error('error happened', err); + * } + * ``` + * + * The special handling of the `'error'` event is only used when `events.once()`is used to wait for another event. If `events.once()` is used to wait for the + * '`error'` event itself, then it is treated as any other kind of event without + * special handling: + * + * ```js + * import { EventEmitter, once } from 'node:events'; + * + * const ee = new EventEmitter(); + * + * once(ee, 'error') + * .then(([err]) => console.log('ok', err.message)) + * .catch((err) => console.error('error', err.message)); + * + * ee.emit('error', new Error('boom')); + * + * // Prints: ok boom + * ``` + * + * An `AbortSignal` can be used to cancel waiting for the event: + * + * ```js + * import { EventEmitter, once } from 'node:events'; + * + * const ee = new EventEmitter(); + * const ac = new AbortController(); + * + * async function foo(emitter, event, signal) { + * try { + * await once(emitter, event, { signal }); + * console.log('event emitted!'); + * } catch (error) { + * if (error.name === 'AbortError') { + * console.error('Waiting for the event was canceled!'); + * } else { + * console.error('There was an error', error.message); + * } + * } + * } + * + * foo(ee, 'foo', ac.signal); + * ac.abort(); // Abort waiting for the event + * ee.emit('foo'); // Prints: Waiting for the event was canceled! + * ``` + * @since v11.13.0, v10.16.0 + */ + static once( + emitter: _NodeEventTarget, + eventName: string | symbol, + options?: StaticEventEmitterOptions, + ): Promise; + static once(emitter: _DOMEventTarget, eventName: string, options?: StaticEventEmitterOptions): Promise; + /** + * ```js + * import { on, EventEmitter } from 'node:events'; + * import process from 'node:process'; + * + * const ee = new EventEmitter(); + * + * // Emit later on + * process.nextTick(() => { + * ee.emit('foo', 'bar'); + * ee.emit('foo', 42); + * }); + * + * for await (const event of on(ee, 'foo')) { + * // The execution of this inner block is synchronous and it + * // processes one event at a time (even with await). Do not use + * // if concurrent execution is required. + * console.log(event); // prints ['bar'] [42] + * } + * // Unreachable here + * ``` + * + * Returns an `AsyncIterator` that iterates `eventName` events. It will throw + * if the `EventEmitter` emits `'error'`. It removes all listeners when + * exiting the loop. The `value` returned by each iteration is an array + * composed of the emitted event arguments. + * + * An `AbortSignal` can be used to cancel waiting on events: + * + * ```js + * import { on, EventEmitter } from 'node:events'; + * import process from 'node:process'; + * + * const ac = new AbortController(); + * + * (async () => { + * const ee = new EventEmitter(); + * + * // Emit later on + * process.nextTick(() => { + * ee.emit('foo', 'bar'); + * ee.emit('foo', 42); + * }); + * + * for await (const event of on(ee, 'foo', { signal: ac.signal })) { + * // The execution of this inner block is synchronous and it + * // processes one event at a time (even with await). Do not use + * // if concurrent execution is required. + * console.log(event); // prints ['bar'] [42] + * } + * // Unreachable here + * })(); + * + * process.nextTick(() => ac.abort()); + * ``` + * @since v13.6.0, v12.16.0 + * @param eventName The name of the event being listened for + * @return that iterates `eventName` events emitted by the `emitter` + */ + static on( + emitter: NodeJS.EventEmitter, + eventName: string, + options?: StaticEventEmitterOptions, + ): AsyncIterableIterator; + /** + * A class method that returns the number of listeners for the given `eventName`registered on the given `emitter`. + * + * ```js + * import { EventEmitter, listenerCount } from 'node:events'; + * + * const myEmitter = new EventEmitter(); + * myEmitter.on('event', () => {}); + * myEmitter.on('event', () => {}); + * console.log(listenerCount(myEmitter, 'event')); + * // Prints: 2 + * ``` + * @since v0.9.12 + * @deprecated Since v3.2.0 - Use `listenerCount` instead. + * @param emitter The emitter to query + * @param eventName The event name + */ + static listenerCount(emitter: NodeJS.EventEmitter, eventName: string | symbol): number; + /** + * Returns a copy of the array of listeners for the event named `eventName`. + * + * For `EventEmitter`s this behaves exactly the same as calling `.listeners` on + * the emitter. + * + * For `EventTarget`s this is the only way to get the event listeners for the + * event target. This is useful for debugging and diagnostic purposes. + * + * ```js + * import { getEventListeners, EventEmitter } from 'node:events'; + * + * { + * const ee = new EventEmitter(); + * const listener = () => console.log('Events are fun'); + * ee.on('foo', listener); + * console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ] + * } + * { + * const et = new EventTarget(); + * const listener = () => console.log('Events are fun'); + * et.addEventListener('foo', listener); + * console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ] + * } + * ``` + * @since v15.2.0, v14.17.0 + */ + static getEventListeners(emitter: _DOMEventTarget | NodeJS.EventEmitter, name: string | symbol): Function[]; + /** + * Returns the currently set max amount of listeners. + * + * For `EventEmitter`s this behaves exactly the same as calling `.getMaxListeners` on + * the emitter. + * + * For `EventTarget`s this is the only way to get the max event listeners for the + * event target. If the number of event handlers on a single EventTarget exceeds + * the max set, the EventTarget will print a warning. + * + * ```js + * import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events'; + * + * { + * const ee = new EventEmitter(); + * console.log(getMaxListeners(ee)); // 10 + * setMaxListeners(11, ee); + * console.log(getMaxListeners(ee)); // 11 + * } + * { + * const et = new EventTarget(); + * console.log(getMaxListeners(et)); // 10 + * setMaxListeners(11, et); + * console.log(getMaxListeners(et)); // 11 + * } + * ``` + * @since v19.9.0 + */ + static getMaxListeners(emitter: _DOMEventTarget | NodeJS.EventEmitter): number; + /** + * ```js + * import { setMaxListeners, EventEmitter } from 'node:events'; + * + * const target = new EventTarget(); + * const emitter = new EventEmitter(); + * + * setMaxListeners(5, target, emitter); + * ``` + * @since v15.4.0 + * @param n A non-negative number. The maximum number of listeners per `EventTarget` event. + * @param eventsTargets Zero or more {EventTarget} or {EventEmitter} instances. If none are specified, `n` is set as the default max for all newly created {EventTarget} and {EventEmitter} + * objects. + */ + static setMaxListeners(n?: number, ...eventTargets: Array<_DOMEventTarget | NodeJS.EventEmitter>): void; + /** + * Listens once to the `abort` event on the provided `signal`. + * + * Listening to the `abort` event on abort signals is unsafe and may + * lead to resource leaks since another third party with the signal can + * call `e.stopImmediatePropagation()`. Unfortunately Node.js cannot change + * this since it would violate the web standard. Additionally, the original + * API makes it easy to forget to remove listeners. + * + * This API allows safely using `AbortSignal`s in Node.js APIs by solving these + * two issues by listening to the event such that `stopImmediatePropagation` does + * not prevent the listener from running. + * + * Returns a disposable so that it may be unsubscribed from more easily. + * + * ```js + * import { addAbortListener } from 'node:events'; + * + * function example(signal) { + * let disposable; + * try { + * signal.addEventListener('abort', (e) => e.stopImmediatePropagation()); + * disposable = addAbortListener(signal, (e) => { + * // Do something when signal is aborted. + * }); + * } finally { + * disposable?.[Symbol.dispose](); + * } + * } + * ``` + * @since v20.5.0 + * @experimental + * @return Disposable that removes the `abort` listener. + */ + static addAbortListener(signal: AbortSignal, resource: (event: Event) => void): Disposable; + /** + * This symbol shall be used to install a listener for only monitoring `'error'`events. Listeners installed using this symbol are called before the regular`'error'` listeners are called. + * + * Installing a listener using this symbol does not change the behavior once an`'error'` event is emitted. Therefore, the process will still crash if no + * regular `'error'` listener is installed. + * @since v13.6.0, v12.17.0 + */ + static readonly errorMonitor: unique symbol; + /** + * Value: `Symbol.for('nodejs.rejection')` + * + * See how to write a custom `rejection handler`. + * @since v13.4.0, v12.16.0 + */ + static readonly captureRejectionSymbol: unique symbol; + /** + * Value: [boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) + * + * Change the default `captureRejections` option on all new `EventEmitter` objects. + * @since v13.4.0, v12.16.0 + */ + static captureRejections: boolean; + /** + * By default, a maximum of `10` listeners can be registered for any single + * event. This limit can be changed for individual `EventEmitter` instances + * using the `emitter.setMaxListeners(n)` method. To change the default + * for _all_`EventEmitter` instances, the `events.defaultMaxListeners`property can be used. If this value is not a positive number, a `RangeError`is thrown. + * + * Take caution when setting the `events.defaultMaxListeners` because the + * change affects _all_`EventEmitter` instances, including those created before + * the change is made. However, calling `emitter.setMaxListeners(n)` still has + * precedence over `events.defaultMaxListeners`. + * + * This is not a hard limit. The `EventEmitter` instance will allow + * more listeners to be added but will output a trace warning to stderr indicating + * that a "possible EventEmitter memory leak" has been detected. For any single`EventEmitter`, the `emitter.getMaxListeners()` and `emitter.setMaxListeners()`methods can be used to + * temporarily avoid this warning: + * + * ```js + * import { EventEmitter } from 'node:events'; + * const emitter = new EventEmitter(); + * emitter.setMaxListeners(emitter.getMaxListeners() + 1); + * emitter.once('event', () => { + * // do stuff + * emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0)); + * }); + * ``` + * + * The `--trace-warnings` command-line flag can be used to display the + * stack trace for such warnings. + * + * The emitted warning can be inspected with `process.on('warning')` and will + * have the additional `emitter`, `type`, and `count` properties, referring to + * the event emitter instance, the event's name and the number of attached + * listeners, respectively. + * Its `name` property is set to `'MaxListenersExceededWarning'`. + * @since v0.11.2 + */ + static defaultMaxListeners: number; + } + import internal = require("node:events"); + namespace EventEmitter { + // Should just be `export { EventEmitter }`, but that doesn't work in TypeScript 3.4 + export { internal as EventEmitter }; + export interface Abortable { + /** + * When provided the corresponding `AbortController` can be used to cancel an asynchronous action. + */ + signal?: AbortSignal | undefined; + } + + export interface EventEmitterReferencingAsyncResource extends AsyncResource { + readonly eventEmitter: EventEmitterAsyncResource; + } + + export interface EventEmitterAsyncResourceOptions extends AsyncResourceOptions, EventEmitterOptions { + /** + * The type of async event, this is required when instantiating `EventEmitterAsyncResource` + * directly rather than as a child class. + * @default new.target.name if instantiated as a child class. + */ + name?: string; + } + + /** + * Integrates `EventEmitter` with `AsyncResource` for `EventEmitter`s that + * require manual async tracking. Specifically, all events emitted by instances + * of `events.EventEmitterAsyncResource` will run within its `async context`. + * + * ```js + * import { EventEmitterAsyncResource, EventEmitter } from 'node:events'; + * import { notStrictEqual, strictEqual } from 'node:assert'; + * import { executionAsyncId, triggerAsyncId } from 'node:async_hooks'; + * + * // Async tracking tooling will identify this as 'Q'. + * const ee1 = new EventEmitterAsyncResource({ name: 'Q' }); + * + * // 'foo' listeners will run in the EventEmitters async context. + * ee1.on('foo', () => { + * strictEqual(executionAsyncId(), ee1.asyncId); + * strictEqual(triggerAsyncId(), ee1.triggerAsyncId); + * }); + * + * const ee2 = new EventEmitter(); + * + * // 'foo' listeners on ordinary EventEmitters that do not track async + * // context, however, run in the same async context as the emit(). + * ee2.on('foo', () => { + * notStrictEqual(executionAsyncId(), ee2.asyncId); + * notStrictEqual(triggerAsyncId(), ee2.triggerAsyncId); + * }); + * + * Promise.resolve().then(() => { + * ee1.emit('foo'); + * ee2.emit('foo'); + * }); + * ``` + * + * The `EventEmitterAsyncResource` class has the same methods and takes the + * same options as `EventEmitter` and `AsyncResource` themselves. + * @since v17.4.0, v16.14.0 + */ + export class EventEmitterAsyncResource extends EventEmitter { + /** + * @param options Only optional in child class. + */ + constructor(options?: EventEmitterAsyncResourceOptions); + /** + * Call all `destroy` hooks. This should only ever be called once. An error will + * be thrown if it is called more than once. This **must** be manually called. If + * the resource is left to be collected by the GC then the `destroy` hooks will + * never be called. + */ + emitDestroy(): void; + /** + * The unique `asyncId` assigned to the resource. + */ + readonly asyncId: number; + /** + * The same triggerAsyncId that is passed to the AsyncResource constructor. + */ + readonly triggerAsyncId: number; + /** + * The returned `AsyncResource` object has an additional `eventEmitter` property + * that provides a reference to this `EventEmitterAsyncResource`. + */ + readonly asyncResource: EventEmitterReferencingAsyncResource; + } + } + global { + namespace NodeJS { + interface EventEmitter { + [EventEmitter.captureRejectionSymbol]?(error: Error, event: string, ...args: any[]): void; + /** + * Alias for `emitter.on(eventName, listener)`. + * @since v0.1.26 + */ + addListener(eventName: string | symbol, listener: (...args: any[]) => void): this; + /** + * Adds the `listener` function to the end of the listeners array for the + * event named `eventName`. No checks are made to see if the `listener` has + * already been added. Multiple calls passing the same combination of `eventName`and `listener` will result in the `listener` being added, and called, multiple + * times. + * + * ```js + * server.on('connection', (stream) => { + * console.log('someone connected!'); + * }); + * ``` + * + * Returns a reference to the `EventEmitter`, so that calls can be chained. + * + * By default, event listeners are invoked in the order they are added. The`emitter.prependListener()` method can be used as an alternative to add the + * event listener to the beginning of the listeners array. + * + * ```js + * import { EventEmitter } from 'node:events'; + * const myEE = new EventEmitter(); + * myEE.on('foo', () => console.log('a')); + * myEE.prependListener('foo', () => console.log('b')); + * myEE.emit('foo'); + * // Prints: + * // b + * // a + * ``` + * @since v0.1.101 + * @param eventName The name of the event. + * @param listener The callback function + */ + on(eventName: string | symbol, listener: (...args: any[]) => void): this; + /** + * Adds a **one-time**`listener` function for the event named `eventName`. The + * next time `eventName` is triggered, this listener is removed and then invoked. + * + * ```js + * server.once('connection', (stream) => { + * console.log('Ah, we have our first user!'); + * }); + * ``` + * + * Returns a reference to the `EventEmitter`, so that calls can be chained. + * + * By default, event listeners are invoked in the order they are added. The`emitter.prependOnceListener()` method can be used as an alternative to add the + * event listener to the beginning of the listeners array. + * + * ```js + * import { EventEmitter } from 'node:events'; + * const myEE = new EventEmitter(); + * myEE.once('foo', () => console.log('a')); + * myEE.prependOnceListener('foo', () => console.log('b')); + * myEE.emit('foo'); + * // Prints: + * // b + * // a + * ``` + * @since v0.3.0 + * @param eventName The name of the event. + * @param listener The callback function + */ + once(eventName: string | symbol, listener: (...args: any[]) => void): this; + /** + * Removes the specified `listener` from the listener array for the event named`eventName`. + * + * ```js + * const callback = (stream) => { + * console.log('someone connected!'); + * }; + * server.on('connection', callback); + * // ... + * server.removeListener('connection', callback); + * ``` + * + * `removeListener()` will remove, at most, one instance of a listener from the + * listener array. If any single listener has been added multiple times to the + * listener array for the specified `eventName`, then `removeListener()` must be + * called multiple times to remove each instance. + * + * Once an event is emitted, all listeners attached to it at the + * time of emitting are called in order. This implies that any`removeListener()` or `removeAllListeners()` calls _after_ emitting and _before_ the last listener finishes execution + * will not remove them from`emit()` in progress. Subsequent events behave as expected. + * + * ```js + * import { EventEmitter } from 'node:events'; + * class MyEmitter extends EventEmitter {} + * const myEmitter = new MyEmitter(); + * + * const callbackA = () => { + * console.log('A'); + * myEmitter.removeListener('event', callbackB); + * }; + * + * const callbackB = () => { + * console.log('B'); + * }; + * + * myEmitter.on('event', callbackA); + * + * myEmitter.on('event', callbackB); + * + * // callbackA removes listener callbackB but it will still be called. + * // Internal listener array at time of emit [callbackA, callbackB] + * myEmitter.emit('event'); + * // Prints: + * // A + * // B + * + * // callbackB is now removed. + * // Internal listener array [callbackA] + * myEmitter.emit('event'); + * // Prints: + * // A + * ``` + * + * Because listeners are managed using an internal array, calling this will + * change the position indices of any listener registered _after_ the listener + * being removed. This will not impact the order in which listeners are called, + * but it means that any copies of the listener array as returned by + * the `emitter.listeners()` method will need to be recreated. + * + * When a single function has been added as a handler multiple times for a single + * event (as in the example below), `removeListener()` will remove the most + * recently added instance. In the example the `once('ping')`listener is removed: + * + * ```js + * import { EventEmitter } from 'node:events'; + * const ee = new EventEmitter(); + * + * function pong() { + * console.log('pong'); + * } + * + * ee.on('ping', pong); + * ee.once('ping', pong); + * ee.removeListener('ping', pong); + * + * ee.emit('ping'); + * ee.emit('ping'); + * ``` + * + * Returns a reference to the `EventEmitter`, so that calls can be chained. + * @since v0.1.26 + */ + removeListener(eventName: string | symbol, listener: (...args: any[]) => void): this; + /** + * Alias for `emitter.removeListener()`. + * @since v10.0.0 + */ + off(eventName: string | symbol, listener: (...args: any[]) => void): this; + /** + * Removes all listeners, or those of the specified `eventName`. + * + * It is bad practice to remove listeners added elsewhere in the code, + * particularly when the `EventEmitter` instance was created by some other + * component or module (e.g. sockets or file streams). + * + * Returns a reference to the `EventEmitter`, so that calls can be chained. + * @since v0.1.26 + */ + removeAllListeners(event?: string | symbol): this; + /** + * By default `EventEmitter`s will print a warning if more than `10` listeners are + * added for a particular event. This is a useful default that helps finding + * memory leaks. The `emitter.setMaxListeners()` method allows the limit to be + * modified for this specific `EventEmitter` instance. The value can be set to`Infinity` (or `0`) to indicate an unlimited number of listeners. + * + * Returns a reference to the `EventEmitter`, so that calls can be chained. + * @since v0.3.5 + */ + setMaxListeners(n: number): this; + /** + * Returns the current max listener value for the `EventEmitter` which is either + * set by `emitter.setMaxListeners(n)` or defaults to {@link defaultMaxListeners}. + * @since v1.0.0 + */ + getMaxListeners(): number; + /** + * Returns a copy of the array of listeners for the event named `eventName`. + * + * ```js + * server.on('connection', (stream) => { + * console.log('someone connected!'); + * }); + * console.log(util.inspect(server.listeners('connection'))); + * // Prints: [ [Function] ] + * ``` + * @since v0.1.26 + */ + listeners(eventName: string | symbol): Function[]; + /** + * Returns a copy of the array of listeners for the event named `eventName`, + * including any wrappers (such as those created by `.once()`). + * + * ```js + * import { EventEmitter } from 'node:events'; + * const emitter = new EventEmitter(); + * emitter.once('log', () => console.log('log once')); + * + * // Returns a new Array with a function `onceWrapper` which has a property + * // `listener` which contains the original listener bound above + * const listeners = emitter.rawListeners('log'); + * const logFnWrapper = listeners[0]; + * + * // Logs "log once" to the console and does not unbind the `once` event + * logFnWrapper.listener(); + * + * // Logs "log once" to the console and removes the listener + * logFnWrapper(); + * + * emitter.on('log', () => console.log('log persistently')); + * // Will return a new Array with a single function bound by `.on()` above + * const newListeners = emitter.rawListeners('log'); + * + * // Logs "log persistently" twice + * newListeners[0](); + * emitter.emit('log'); + * ``` + * @since v9.4.0 + */ + rawListeners(eventName: string | symbol): Function[]; + /** + * Synchronously calls each of the listeners registered for the event named`eventName`, in the order they were registered, passing the supplied arguments + * to each. + * + * Returns `true` if the event had listeners, `false` otherwise. + * + * ```js + * import { EventEmitter } from 'node:events'; + * const myEmitter = new EventEmitter(); + * + * // First listener + * myEmitter.on('event', function firstListener() { + * console.log('Helloooo! first listener'); + * }); + * // Second listener + * myEmitter.on('event', function secondListener(arg1, arg2) { + * console.log(`event with parameters ${arg1}, ${arg2} in second listener`); + * }); + * // Third listener + * myEmitter.on('event', function thirdListener(...args) { + * const parameters = args.join(', '); + * console.log(`event with parameters ${parameters} in third listener`); + * }); + * + * console.log(myEmitter.listeners('event')); + * + * myEmitter.emit('event', 1, 2, 3, 4, 5); + * + * // Prints: + * // [ + * // [Function: firstListener], + * // [Function: secondListener], + * // [Function: thirdListener] + * // ] + * // Helloooo! first listener + * // event with parameters 1, 2 in second listener + * // event with parameters 1, 2, 3, 4, 5 in third listener + * ``` + * @since v0.1.26 + */ + emit(eventName: string | symbol, ...args: any[]): boolean; + /** + * Returns the number of listeners listening for the event named `eventName`. + * If `listener` is provided, it will return how many times the listener is found + * in the list of the listeners of the event. + * @since v3.2.0 + * @param eventName The name of the event being listened for + * @param listener The event handler function + */ + listenerCount(eventName: string | symbol, listener?: Function): number; + /** + * Adds the `listener` function to the _beginning_ of the listeners array for the + * event named `eventName`. No checks are made to see if the `listener` has + * already been added. Multiple calls passing the same combination of `eventName`and `listener` will result in the `listener` being added, and called, multiple + * times. + * + * ```js + * server.prependListener('connection', (stream) => { + * console.log('someone connected!'); + * }); + * ``` + * + * Returns a reference to the `EventEmitter`, so that calls can be chained. + * @since v6.0.0 + * @param eventName The name of the event. + * @param listener The callback function + */ + prependListener(eventName: string | symbol, listener: (...args: any[]) => void): this; + /** + * Adds a **one-time**`listener` function for the event named `eventName` to the _beginning_ of the listeners array. The next time `eventName` is triggered, this + * listener is removed, and then invoked. + * + * ```js + * server.prependOnceListener('connection', (stream) => { + * console.log('Ah, we have our first user!'); + * }); + * ``` + * + * Returns a reference to the `EventEmitter`, so that calls can be chained. + * @since v6.0.0 + * @param eventName The name of the event. + * @param listener The callback function + */ + prependOnceListener(eventName: string | symbol, listener: (...args: any[]) => void): this; + /** + * Returns an array listing the events for which the emitter has registered + * listeners. The values in the array are strings or `Symbol`s. + * + * ```js + * import { EventEmitter } from 'node:events'; + * + * const myEE = new EventEmitter(); + * myEE.on('foo', () => {}); + * myEE.on('bar', () => {}); + * + * const sym = Symbol('symbol'); + * myEE.on(sym, () => {}); + * + * console.log(myEE.eventNames()); + * // Prints: [ 'foo', 'bar', Symbol(symbol) ] + * ``` + * @since v6.0.0 + */ + eventNames(): Array; + } + } + } + export = EventEmitter; +} +declare module "node:events" { + import events = require("events"); + export = events; +} diff --git a/task/node_modules/@types/node/fs.d.ts b/task/node_modules/@types/node/fs.d.ts new file mode 100644 index 0000000..f98453a --- /dev/null +++ b/task/node_modules/@types/node/fs.d.ts @@ -0,0 +1,4291 @@ +/** + * The `node:fs` module enables interacting with the file system in a + * way modeled on standard POSIX functions. + * + * To use the promise-based APIs: + * + * ```js + * import * as fs from 'node:fs/promises'; + * ``` + * + * To use the callback and sync APIs: + * + * ```js + * import * as fs from 'node:fs'; + * ``` + * + * All file system operations have synchronous, callback, and promise-based + * forms, and are accessible using both CommonJS syntax and ES6 Modules (ESM). + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/fs.js) + */ +declare module "fs" { + import * as stream from "node:stream"; + import { Abortable, EventEmitter } from "node:events"; + import { URL } from "node:url"; + import * as promises from "node:fs/promises"; + export { promises }; + /** + * Valid types for path values in "fs". + */ + export type PathLike = string | Buffer | URL; + export type PathOrFileDescriptor = PathLike | number; + export type TimeLike = string | number | Date; + export type NoParamCallback = (err: NodeJS.ErrnoException | null) => void; + export type BufferEncodingOption = + | "buffer" + | { + encoding: "buffer"; + }; + export interface ObjectEncodingOptions { + encoding?: BufferEncoding | null | undefined; + } + export type EncodingOption = ObjectEncodingOptions | BufferEncoding | undefined | null; + export type OpenMode = number | string; + export type Mode = number | string; + export interface StatsBase { + isFile(): boolean; + isDirectory(): boolean; + isBlockDevice(): boolean; + isCharacterDevice(): boolean; + isSymbolicLink(): boolean; + isFIFO(): boolean; + isSocket(): boolean; + dev: T; + ino: T; + mode: T; + nlink: T; + uid: T; + gid: T; + rdev: T; + size: T; + blksize: T; + blocks: T; + atimeMs: T; + mtimeMs: T; + ctimeMs: T; + birthtimeMs: T; + atime: Date; + mtime: Date; + ctime: Date; + birthtime: Date; + } + export interface Stats extends StatsBase {} + /** + * A `fs.Stats` object provides information about a file. + * + * Objects returned from {@link stat}, {@link lstat}, {@link fstat}, and + * their synchronous counterparts are of this type. + * If `bigint` in the `options` passed to those methods is true, the numeric values + * will be `bigint` instead of `number`, and the object will contain additional + * nanosecond-precision properties suffixed with `Ns`. + * + * ```console + * Stats { + * dev: 2114, + * ino: 48064969, + * mode: 33188, + * nlink: 1, + * uid: 85, + * gid: 100, + * rdev: 0, + * size: 527, + * blksize: 4096, + * blocks: 8, + * atimeMs: 1318289051000.1, + * mtimeMs: 1318289051000.1, + * ctimeMs: 1318289051000.1, + * birthtimeMs: 1318289051000.1, + * atime: Mon, 10 Oct 2011 23:24:11 GMT, + * mtime: Mon, 10 Oct 2011 23:24:11 GMT, + * ctime: Mon, 10 Oct 2011 23:24:11 GMT, + * birthtime: Mon, 10 Oct 2011 23:24:11 GMT } + * ``` + * + * `bigint` version: + * + * ```console + * BigIntStats { + * dev: 2114n, + * ino: 48064969n, + * mode: 33188n, + * nlink: 1n, + * uid: 85n, + * gid: 100n, + * rdev: 0n, + * size: 527n, + * blksize: 4096n, + * blocks: 8n, + * atimeMs: 1318289051000n, + * mtimeMs: 1318289051000n, + * ctimeMs: 1318289051000n, + * birthtimeMs: 1318289051000n, + * atimeNs: 1318289051000000000n, + * mtimeNs: 1318289051000000000n, + * ctimeNs: 1318289051000000000n, + * birthtimeNs: 1318289051000000000n, + * atime: Mon, 10 Oct 2011 23:24:11 GMT, + * mtime: Mon, 10 Oct 2011 23:24:11 GMT, + * ctime: Mon, 10 Oct 2011 23:24:11 GMT, + * birthtime: Mon, 10 Oct 2011 23:24:11 GMT } + * ``` + * @since v0.1.21 + */ + export class Stats {} + export interface StatsFsBase { + /** Type of file system. */ + type: T; + /** Optimal transfer block size. */ + bsize: T; + /** Total data blocks in file system. */ + blocks: T; + /** Free blocks in file system. */ + bfree: T; + /** Available blocks for unprivileged users */ + bavail: T; + /** Total file nodes in file system. */ + files: T; + /** Free file nodes in file system. */ + ffree: T; + } + export interface StatsFs extends StatsFsBase {} + /** + * Provides information about a mounted file system. + * + * Objects returned from {@link statfs} and its synchronous counterpart are of + * this type. If `bigint` in the `options` passed to those methods is `true`, the + * numeric values will be `bigint` instead of `number`. + * + * ```console + * StatFs { + * type: 1397114950, + * bsize: 4096, + * blocks: 121938943, + * bfree: 61058895, + * bavail: 61058895, + * files: 999, + * ffree: 1000000 + * } + * ``` + * + * `bigint` version: + * + * ```console + * StatFs { + * type: 1397114950n, + * bsize: 4096n, + * blocks: 121938943n, + * bfree: 61058895n, + * bavail: 61058895n, + * files: 999n, + * ffree: 1000000n + * } + * ``` + * @since v19.6.0, v18.15.0 + */ + export class StatsFs {} + export interface BigIntStatsFs extends StatsFsBase {} + export interface StatFsOptions { + bigint?: boolean | undefined; + } + /** + * A representation of a directory entry, which can be a file or a subdirectory + * within the directory, as returned by reading from an `fs.Dir`. The + * directory entry is a combination of the file name and file type pairs. + * + * Additionally, when {@link readdir} or {@link readdirSync} is called with + * the `withFileTypes` option set to `true`, the resulting array is filled with `fs.Dirent` objects, rather than strings or `Buffer` s. + * @since v10.10.0 + */ + export class Dirent { + /** + * Returns `true` if the `fs.Dirent` object describes a regular file. + * @since v10.10.0 + */ + isFile(): boolean; + /** + * Returns `true` if the `fs.Dirent` object describes a file system + * directory. + * @since v10.10.0 + */ + isDirectory(): boolean; + /** + * Returns `true` if the `fs.Dirent` object describes a block device. + * @since v10.10.0 + */ + isBlockDevice(): boolean; + /** + * Returns `true` if the `fs.Dirent` object describes a character device. + * @since v10.10.0 + */ + isCharacterDevice(): boolean; + /** + * Returns `true` if the `fs.Dirent` object describes a symbolic link. + * @since v10.10.0 + */ + isSymbolicLink(): boolean; + /** + * Returns `true` if the `fs.Dirent` object describes a first-in-first-out + * (FIFO) pipe. + * @since v10.10.0 + */ + isFIFO(): boolean; + /** + * Returns `true` if the `fs.Dirent` object describes a socket. + * @since v10.10.0 + */ + isSocket(): boolean; + /** + * The file name that this `fs.Dirent` object refers to. The type of this + * value is determined by the `options.encoding` passed to {@link readdir} or {@link readdirSync}. + * @since v10.10.0 + */ + name: string; + /** + * The base path that this `fs.Dirent` object refers to. + * @since v20.1.0 + */ + path: string; + } + /** + * A class representing a directory stream. + * + * Created by {@link opendir}, {@link opendirSync}, or `fsPromises.opendir()`. + * + * ```js + * import { opendir } from 'node:fs/promises'; + * + * try { + * const dir = await opendir('./'); + * for await (const dirent of dir) + * console.log(dirent.name); + * } catch (err) { + * console.error(err); + * } + * ``` + * + * When using the async iterator, the `fs.Dir` object will be automatically + * closed after the iterator exits. + * @since v12.12.0 + */ + export class Dir implements AsyncIterable { + /** + * The read-only path of this directory as was provided to {@link opendir},{@link opendirSync}, or `fsPromises.opendir()`. + * @since v12.12.0 + */ + readonly path: string; + /** + * Asynchronously iterates over the directory via `readdir(3)` until all entries have been read. + */ + [Symbol.asyncIterator](): AsyncIterableIterator; + /** + * Asynchronously close the directory's underlying resource handle. + * Subsequent reads will result in errors. + * + * A promise is returned that will be resolved after the resource has been + * closed. + * @since v12.12.0 + */ + close(): Promise; + close(cb: NoParamCallback): void; + /** + * Synchronously close the directory's underlying resource handle. + * Subsequent reads will result in errors. + * @since v12.12.0 + */ + closeSync(): void; + /** + * Asynchronously read the next directory entry via [`readdir(3)`](http://man7.org/linux/man-pages/man3/readdir.3.html) as an `fs.Dirent`. + * + * A promise is returned that will be resolved with an `fs.Dirent`, or `null`if there are no more directory entries to read. + * + * Directory entries returned by this function are in no particular order as + * provided by the operating system's underlying directory mechanisms. + * Entries added or removed while iterating over the directory might not be + * included in the iteration results. + * @since v12.12.0 + * @return containing {fs.Dirent|null} + */ + read(): Promise; + read(cb: (err: NodeJS.ErrnoException | null, dirEnt: Dirent | null) => void): void; + /** + * Synchronously read the next directory entry as an `fs.Dirent`. See the + * POSIX [`readdir(3)`](http://man7.org/linux/man-pages/man3/readdir.3.html) documentation for more detail. + * + * If there are no more directory entries to read, `null` will be returned. + * + * Directory entries returned by this function are in no particular order as + * provided by the operating system's underlying directory mechanisms. + * Entries added or removed while iterating over the directory might not be + * included in the iteration results. + * @since v12.12.0 + */ + readSync(): Dirent | null; + } + /** + * Class: fs.StatWatcher + * @since v14.3.0, v12.20.0 + * Extends `EventEmitter` + * A successful call to {@link watchFile} method will return a new fs.StatWatcher object. + */ + export interface StatWatcher extends EventEmitter { + /** + * When called, requests that the Node.js event loop _not_ exit so long as the `fs.StatWatcher` is active. Calling `watcher.ref()` multiple times will have + * no effect. + * + * By default, all `fs.StatWatcher` objects are "ref'ed", making it normally + * unnecessary to call `watcher.ref()` unless `watcher.unref()` had been + * called previously. + * @since v14.3.0, v12.20.0 + */ + ref(): this; + /** + * When called, the active `fs.StatWatcher` object will not require the Node.js + * event loop to remain active. If there is no other activity keeping the + * event loop running, the process may exit before the `fs.StatWatcher` object's + * callback is invoked. Calling `watcher.unref()` multiple times will have + * no effect. + * @since v14.3.0, v12.20.0 + */ + unref(): this; + } + export interface FSWatcher extends EventEmitter { + /** + * Stop watching for changes on the given `fs.FSWatcher`. Once stopped, the `fs.FSWatcher` object is no longer usable. + * @since v0.5.8 + */ + close(): void; + /** + * events.EventEmitter + * 1. change + * 2. error + */ + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; + addListener(event: "error", listener: (error: Error) => void): this; + addListener(event: "close", listener: () => void): this; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; + on(event: "error", listener: (error: Error) => void): this; + on(event: "close", listener: () => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; + once(event: "error", listener: (error: Error) => void): this; + once(event: "close", listener: () => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; + prependListener(event: "error", listener: (error: Error) => void): this; + prependListener(event: "close", listener: () => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; + prependOnceListener(event: "error", listener: (error: Error) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + } + /** + * Instances of `fs.ReadStream` are created and returned using the {@link createReadStream} function. + * @since v0.1.93 + */ + export class ReadStream extends stream.Readable { + close(callback?: (err?: NodeJS.ErrnoException | null) => void): void; + /** + * The number of bytes that have been read so far. + * @since v6.4.0 + */ + bytesRead: number; + /** + * The path to the file the stream is reading from as specified in the first + * argument to `fs.createReadStream()`. If `path` is passed as a string, then`readStream.path` will be a string. If `path` is passed as a `Buffer`, then`readStream.path` will be a + * `Buffer`. If `fd` is specified, then`readStream.path` will be `undefined`. + * @since v0.1.93 + */ + path: string | Buffer; + /** + * This property is `true` if the underlying file has not been opened yet, + * i.e. before the `'ready'` event is emitted. + * @since v11.2.0, v10.16.0 + */ + pending: boolean; + /** + * events.EventEmitter + * 1. open + * 2. close + * 3. ready + */ + addListener(event: "close", listener: () => void): this; + addListener(event: "data", listener: (chunk: Buffer | string) => void): this; + addListener(event: "end", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "open", listener: (fd: number) => void): this; + addListener(event: "pause", listener: () => void): this; + addListener(event: "readable", listener: () => void): this; + addListener(event: "ready", listener: () => void): this; + addListener(event: "resume", listener: () => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + on(event: "close", listener: () => void): this; + on(event: "data", listener: (chunk: Buffer | string) => void): this; + on(event: "end", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "open", listener: (fd: number) => void): this; + on(event: "pause", listener: () => void): this; + on(event: "readable", listener: () => void): this; + on(event: "ready", listener: () => void): this; + on(event: "resume", listener: () => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "data", listener: (chunk: Buffer | string) => void): this; + once(event: "end", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "open", listener: (fd: number) => void): this; + once(event: "pause", listener: () => void): this; + once(event: "readable", listener: () => void): this; + once(event: "ready", listener: () => void): this; + once(event: "resume", listener: () => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "data", listener: (chunk: Buffer | string) => void): this; + prependListener(event: "end", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "open", listener: (fd: number) => void): this; + prependListener(event: "pause", listener: () => void): this; + prependListener(event: "readable", listener: () => void): this; + prependListener(event: "ready", listener: () => void): this; + prependListener(event: "resume", listener: () => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "data", listener: (chunk: Buffer | string) => void): this; + prependOnceListener(event: "end", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "open", listener: (fd: number) => void): this; + prependOnceListener(event: "pause", listener: () => void): this; + prependOnceListener(event: "readable", listener: () => void): this; + prependOnceListener(event: "ready", listener: () => void): this; + prependOnceListener(event: "resume", listener: () => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + /** + * * Extends `stream.Writable` + * + * Instances of `fs.WriteStream` are created and returned using the {@link createWriteStream} function. + * @since v0.1.93 + */ + export class WriteStream extends stream.Writable { + /** + * Closes `writeStream`. Optionally accepts a + * callback that will be executed once the `writeStream`is closed. + * @since v0.9.4 + */ + close(callback?: (err?: NodeJS.ErrnoException | null) => void): void; + /** + * The number of bytes written so far. Does not include data that is still queued + * for writing. + * @since v0.4.7 + */ + bytesWritten: number; + /** + * The path to the file the stream is writing to as specified in the first + * argument to {@link createWriteStream}. If `path` is passed as a string, then`writeStream.path` will be a string. If `path` is passed as a `Buffer`, then`writeStream.path` will be a + * `Buffer`. + * @since v0.1.93 + */ + path: string | Buffer; + /** + * This property is `true` if the underlying file has not been opened yet, + * i.e. before the `'ready'` event is emitted. + * @since v11.2.0 + */ + pending: boolean; + /** + * events.EventEmitter + * 1. open + * 2. close + * 3. ready + */ + addListener(event: "close", listener: () => void): this; + addListener(event: "drain", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "finish", listener: () => void): this; + addListener(event: "open", listener: (fd: number) => void): this; + addListener(event: "pipe", listener: (src: stream.Readable) => void): this; + addListener(event: "ready", listener: () => void): this; + addListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + on(event: "close", listener: () => void): this; + on(event: "drain", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "finish", listener: () => void): this; + on(event: "open", listener: (fd: number) => void): this; + on(event: "pipe", listener: (src: stream.Readable) => void): this; + on(event: "ready", listener: () => void): this; + on(event: "unpipe", listener: (src: stream.Readable) => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "drain", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "finish", listener: () => void): this; + once(event: "open", listener: (fd: number) => void): this; + once(event: "pipe", listener: (src: stream.Readable) => void): this; + once(event: "ready", listener: () => void): this; + once(event: "unpipe", listener: (src: stream.Readable) => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "drain", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "finish", listener: () => void): this; + prependListener(event: "open", listener: (fd: number) => void): this; + prependListener(event: "pipe", listener: (src: stream.Readable) => void): this; + prependListener(event: "ready", listener: () => void): this; + prependListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "drain", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "finish", listener: () => void): this; + prependOnceListener(event: "open", listener: (fd: number) => void): this; + prependOnceListener(event: "pipe", listener: (src: stream.Readable) => void): this; + prependOnceListener(event: "ready", listener: () => void): this; + prependOnceListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + /** + * Asynchronously rename file at `oldPath` to the pathname provided + * as `newPath`. In the case that `newPath` already exists, it will + * be overwritten. If there is a directory at `newPath`, an error will + * be raised instead. No arguments other than a possible exception are + * given to the completion callback. + * + * See also: [`rename(2)`](http://man7.org/linux/man-pages/man2/rename.2.html). + * + * ```js + * import { rename } from 'node:fs'; + * + * rename('oldFile.txt', 'newFile.txt', (err) => { + * if (err) throw err; + * console.log('Rename complete!'); + * }); + * ``` + * @since v0.0.2 + */ + export function rename(oldPath: PathLike, newPath: PathLike, callback: NoParamCallback): void; + export namespace rename { + /** + * Asynchronous rename(2) - Change the name or location of a file or directory. + * @param oldPath A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * @param newPath A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + */ + function __promisify__(oldPath: PathLike, newPath: PathLike): Promise; + } + /** + * Renames the file from `oldPath` to `newPath`. Returns `undefined`. + * + * See the POSIX [`rename(2)`](http://man7.org/linux/man-pages/man2/rename.2.html) documentation for more details. + * @since v0.1.21 + */ + export function renameSync(oldPath: PathLike, newPath: PathLike): void; + /** + * Truncates the file. No arguments other than a possible exception are + * given to the completion callback. A file descriptor can also be passed as the + * first argument. In this case, `fs.ftruncate()` is called. + * + * ```js + * import { truncate } from 'node:fs'; + * // Assuming that 'path/file.txt' is a regular file. + * truncate('path/file.txt', (err) => { + * if (err) throw err; + * console.log('path/file.txt was truncated'); + * }); + * ``` + * + * Passing a file descriptor is deprecated and may result in an error being thrown + * in the future. + * + * See the POSIX [`truncate(2)`](http://man7.org/linux/man-pages/man2/truncate.2.html) documentation for more details. + * @since v0.8.6 + * @param [len=0] + */ + export function truncate(path: PathLike, len: number | undefined | null, callback: NoParamCallback): void; + /** + * Asynchronous truncate(2) - Truncate a file to a specified length. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function truncate(path: PathLike, callback: NoParamCallback): void; + export namespace truncate { + /** + * Asynchronous truncate(2) - Truncate a file to a specified length. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param len If not specified, defaults to `0`. + */ + function __promisify__(path: PathLike, len?: number | null): Promise; + } + /** + * Truncates the file. Returns `undefined`. A file descriptor can also be + * passed as the first argument. In this case, `fs.ftruncateSync()` is called. + * + * Passing a file descriptor is deprecated and may result in an error being thrown + * in the future. + * @since v0.8.6 + * @param [len=0] + */ + export function truncateSync(path: PathLike, len?: number | null): void; + /** + * Truncates the file descriptor. No arguments other than a possible exception are + * given to the completion callback. + * + * See the POSIX [`ftruncate(2)`](http://man7.org/linux/man-pages/man2/ftruncate.2.html) documentation for more detail. + * + * If the file referred to by the file descriptor was larger than `len` bytes, only + * the first `len` bytes will be retained in the file. + * + * For example, the following program retains only the first four bytes of the + * file: + * + * ```js + * import { open, close, ftruncate } from 'node:fs'; + * + * function closeFd(fd) { + * close(fd, (err) => { + * if (err) throw err; + * }); + * } + * + * open('temp.txt', 'r+', (err, fd) => { + * if (err) throw err; + * + * try { + * ftruncate(fd, 4, (err) => { + * closeFd(fd); + * if (err) throw err; + * }); + * } catch (err) { + * closeFd(fd); + * if (err) throw err; + * } + * }); + * ``` + * + * If the file previously was shorter than `len` bytes, it is extended, and the + * extended part is filled with null bytes (`'\0'`): + * + * If `len` is negative then `0` will be used. + * @since v0.8.6 + * @param [len=0] + */ + export function ftruncate(fd: number, len: number | undefined | null, callback: NoParamCallback): void; + /** + * Asynchronous ftruncate(2) - Truncate a file to a specified length. + * @param fd A file descriptor. + */ + export function ftruncate(fd: number, callback: NoParamCallback): void; + export namespace ftruncate { + /** + * Asynchronous ftruncate(2) - Truncate a file to a specified length. + * @param fd A file descriptor. + * @param len If not specified, defaults to `0`. + */ + function __promisify__(fd: number, len?: number | null): Promise; + } + /** + * Truncates the file descriptor. Returns `undefined`. + * + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link ftruncate}. + * @since v0.8.6 + * @param [len=0] + */ + export function ftruncateSync(fd: number, len?: number | null): void; + /** + * Asynchronously changes owner and group of a file. No arguments other than a + * possible exception are given to the completion callback. + * + * See the POSIX [`chown(2)`](http://man7.org/linux/man-pages/man2/chown.2.html) documentation for more detail. + * @since v0.1.97 + */ + export function chown(path: PathLike, uid: number, gid: number, callback: NoParamCallback): void; + export namespace chown { + /** + * Asynchronous chown(2) - Change ownership of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + function __promisify__(path: PathLike, uid: number, gid: number): Promise; + } + /** + * Synchronously changes owner and group of a file. Returns `undefined`. + * This is the synchronous version of {@link chown}. + * + * See the POSIX [`chown(2)`](http://man7.org/linux/man-pages/man2/chown.2.html) documentation for more detail. + * @since v0.1.97 + */ + export function chownSync(path: PathLike, uid: number, gid: number): void; + /** + * Sets the owner of the file. No arguments other than a possible exception are + * given to the completion callback. + * + * See the POSIX [`fchown(2)`](http://man7.org/linux/man-pages/man2/fchown.2.html) documentation for more detail. + * @since v0.4.7 + */ + export function fchown(fd: number, uid: number, gid: number, callback: NoParamCallback): void; + export namespace fchown { + /** + * Asynchronous fchown(2) - Change ownership of a file. + * @param fd A file descriptor. + */ + function __promisify__(fd: number, uid: number, gid: number): Promise; + } + /** + * Sets the owner of the file. Returns `undefined`. + * + * See the POSIX [`fchown(2)`](http://man7.org/linux/man-pages/man2/fchown.2.html) documentation for more detail. + * @since v0.4.7 + * @param uid The file's new owner's user id. + * @param gid The file's new group's group id. + */ + export function fchownSync(fd: number, uid: number, gid: number): void; + /** + * Set the owner of the symbolic link. No arguments other than a possible + * exception are given to the completion callback. + * + * See the POSIX [`lchown(2)`](http://man7.org/linux/man-pages/man2/lchown.2.html) documentation for more detail. + */ + export function lchown(path: PathLike, uid: number, gid: number, callback: NoParamCallback): void; + export namespace lchown { + /** + * Asynchronous lchown(2) - Change ownership of a file. Does not dereference symbolic links. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + function __promisify__(path: PathLike, uid: number, gid: number): Promise; + } + /** + * Set the owner for the path. Returns `undefined`. + * + * See the POSIX [`lchown(2)`](http://man7.org/linux/man-pages/man2/lchown.2.html) documentation for more details. + * @param uid The file's new owner's user id. + * @param gid The file's new group's group id. + */ + export function lchownSync(path: PathLike, uid: number, gid: number): void; + /** + * Changes the access and modification times of a file in the same way as {@link utimes}, with the difference that if the path refers to a symbolic + * link, then the link is not dereferenced: instead, the timestamps of the + * symbolic link itself are changed. + * + * No arguments other than a possible exception are given to the completion + * callback. + * @since v14.5.0, v12.19.0 + */ + export function lutimes(path: PathLike, atime: TimeLike, mtime: TimeLike, callback: NoParamCallback): void; + export namespace lutimes { + /** + * Changes the access and modification times of a file in the same way as `fsPromises.utimes()`, + * with the difference that if the path refers to a symbolic link, then the link is not + * dereferenced: instead, the timestamps of the symbolic link itself are changed. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param atime The last access time. If a string is provided, it will be coerced to number. + * @param mtime The last modified time. If a string is provided, it will be coerced to number. + */ + function __promisify__(path: PathLike, atime: TimeLike, mtime: TimeLike): Promise; + } + /** + * Change the file system timestamps of the symbolic link referenced by `path`. + * Returns `undefined`, or throws an exception when parameters are incorrect or + * the operation fails. This is the synchronous version of {@link lutimes}. + * @since v14.5.0, v12.19.0 + */ + export function lutimesSync(path: PathLike, atime: TimeLike, mtime: TimeLike): void; + /** + * Asynchronously changes the permissions of a file. No arguments other than a + * possible exception are given to the completion callback. + * + * See the POSIX [`chmod(2)`](http://man7.org/linux/man-pages/man2/chmod.2.html) documentation for more detail. + * + * ```js + * import { chmod } from 'node:fs'; + * + * chmod('my_file.txt', 0o775, (err) => { + * if (err) throw err; + * console.log('The permissions for file "my_file.txt" have been changed!'); + * }); + * ``` + * @since v0.1.30 + */ + export function chmod(path: PathLike, mode: Mode, callback: NoParamCallback): void; + export namespace chmod { + /** + * Asynchronous chmod(2) - Change permissions of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param mode A file mode. If a string is passed, it is parsed as an octal integer. + */ + function __promisify__(path: PathLike, mode: Mode): Promise; + } + /** + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link chmod}. + * + * See the POSIX [`chmod(2)`](http://man7.org/linux/man-pages/man2/chmod.2.html) documentation for more detail. + * @since v0.6.7 + */ + export function chmodSync(path: PathLike, mode: Mode): void; + /** + * Sets the permissions on the file. No arguments other than a possible exception + * are given to the completion callback. + * + * See the POSIX [`fchmod(2)`](http://man7.org/linux/man-pages/man2/fchmod.2.html) documentation for more detail. + * @since v0.4.7 + */ + export function fchmod(fd: number, mode: Mode, callback: NoParamCallback): void; + export namespace fchmod { + /** + * Asynchronous fchmod(2) - Change permissions of a file. + * @param fd A file descriptor. + * @param mode A file mode. If a string is passed, it is parsed as an octal integer. + */ + function __promisify__(fd: number, mode: Mode): Promise; + } + /** + * Sets the permissions on the file. Returns `undefined`. + * + * See the POSIX [`fchmod(2)`](http://man7.org/linux/man-pages/man2/fchmod.2.html) documentation for more detail. + * @since v0.4.7 + */ + export function fchmodSync(fd: number, mode: Mode): void; + /** + * Changes the permissions on a symbolic link. No arguments other than a possible + * exception are given to the completion callback. + * + * This method is only implemented on macOS. + * + * See the POSIX [`lchmod(2)`](https://www.freebsd.org/cgi/man.cgi?query=lchmod&sektion=2) documentation for more detail. + * @deprecated Since v0.4.7 + */ + export function lchmod(path: PathLike, mode: Mode, callback: NoParamCallback): void; + /** @deprecated */ + export namespace lchmod { + /** + * Asynchronous lchmod(2) - Change permissions of a file. Does not dereference symbolic links. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param mode A file mode. If a string is passed, it is parsed as an octal integer. + */ + function __promisify__(path: PathLike, mode: Mode): Promise; + } + /** + * Changes the permissions on a symbolic link. Returns `undefined`. + * + * This method is only implemented on macOS. + * + * See the POSIX [`lchmod(2)`](https://www.freebsd.org/cgi/man.cgi?query=lchmod&sektion=2) documentation for more detail. + * @deprecated Since v0.4.7 + */ + export function lchmodSync(path: PathLike, mode: Mode): void; + /** + * Asynchronous [`stat(2)`](http://man7.org/linux/man-pages/man2/stat.2.html). The callback gets two arguments `(err, stats)` where`stats` is an `fs.Stats` object. + * + * In case of an error, the `err.code` will be one of `Common System Errors`. + * + * {@link stat} follows symbolic links. Use {@link lstat} to look at the + * links themselves. + * + * Using `fs.stat()` to check for the existence of a file before calling`fs.open()`, `fs.readFile()`, or `fs.writeFile()` is not recommended. + * Instead, user code should open/read/write the file directly and handle the + * error raised if the file is not available. + * + * To check if a file exists without manipulating it afterwards, {@link access} is recommended. + * + * For example, given the following directory structure: + * + * ```text + * - txtDir + * -- file.txt + * - app.js + * ``` + * + * The next program will check for the stats of the given paths: + * + * ```js + * import { stat } from 'node:fs'; + * + * const pathsToCheck = ['./txtDir', './txtDir/file.txt']; + * + * for (let i = 0; i < pathsToCheck.length; i++) { + * stat(pathsToCheck[i], (err, stats) => { + * console.log(stats.isDirectory()); + * console.log(stats); + * }); + * } + * ``` + * + * The resulting output will resemble: + * + * ```console + * true + * Stats { + * dev: 16777220, + * mode: 16877, + * nlink: 3, + * uid: 501, + * gid: 20, + * rdev: 0, + * blksize: 4096, + * ino: 14214262, + * size: 96, + * blocks: 0, + * atimeMs: 1561174653071.963, + * mtimeMs: 1561174614583.3518, + * ctimeMs: 1561174626623.5366, + * birthtimeMs: 1561174126937.2893, + * atime: 2019-06-22T03:37:33.072Z, + * mtime: 2019-06-22T03:36:54.583Z, + * ctime: 2019-06-22T03:37:06.624Z, + * birthtime: 2019-06-22T03:28:46.937Z + * } + * false + * Stats { + * dev: 16777220, + * mode: 33188, + * nlink: 1, + * uid: 501, + * gid: 20, + * rdev: 0, + * blksize: 4096, + * ino: 14214074, + * size: 8, + * blocks: 8, + * atimeMs: 1561174616618.8555, + * mtimeMs: 1561174614584, + * ctimeMs: 1561174614583.8145, + * birthtimeMs: 1561174007710.7478, + * atime: 2019-06-22T03:36:56.619Z, + * mtime: 2019-06-22T03:36:54.584Z, + * ctime: 2019-06-22T03:36:54.584Z, + * birthtime: 2019-06-22T03:26:47.711Z + * } + * ``` + * @since v0.0.2 + */ + export function stat(path: PathLike, callback: (err: NodeJS.ErrnoException | null, stats: Stats) => void): void; + export function stat( + path: PathLike, + options: + | (StatOptions & { + bigint?: false | undefined; + }) + | undefined, + callback: (err: NodeJS.ErrnoException | null, stats: Stats) => void, + ): void; + export function stat( + path: PathLike, + options: StatOptions & { + bigint: true; + }, + callback: (err: NodeJS.ErrnoException | null, stats: BigIntStats) => void, + ): void; + export function stat( + path: PathLike, + options: StatOptions | undefined, + callback: (err: NodeJS.ErrnoException | null, stats: Stats | BigIntStats) => void, + ): void; + export namespace stat { + /** + * Asynchronous stat(2) - Get file status. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + function __promisify__( + path: PathLike, + options?: StatOptions & { + bigint?: false | undefined; + }, + ): Promise; + function __promisify__( + path: PathLike, + options: StatOptions & { + bigint: true; + }, + ): Promise; + function __promisify__(path: PathLike, options?: StatOptions): Promise; + } + export interface StatSyncFn extends Function { + (path: PathLike, options?: undefined): Stats; + ( + path: PathLike, + options?: StatSyncOptions & { + bigint?: false | undefined; + throwIfNoEntry: false; + }, + ): Stats | undefined; + ( + path: PathLike, + options: StatSyncOptions & { + bigint: true; + throwIfNoEntry: false; + }, + ): BigIntStats | undefined; + ( + path: PathLike, + options?: StatSyncOptions & { + bigint?: false | undefined; + }, + ): Stats; + ( + path: PathLike, + options: StatSyncOptions & { + bigint: true; + }, + ): BigIntStats; + ( + path: PathLike, + options: StatSyncOptions & { + bigint: boolean; + throwIfNoEntry?: false | undefined; + }, + ): Stats | BigIntStats; + (path: PathLike, options?: StatSyncOptions): Stats | BigIntStats | undefined; + } + /** + * Synchronous stat(2) - Get file status. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export const statSync: StatSyncFn; + /** + * Invokes the callback with the `fs.Stats` for the file descriptor. + * + * See the POSIX [`fstat(2)`](http://man7.org/linux/man-pages/man2/fstat.2.html) documentation for more detail. + * @since v0.1.95 + */ + export function fstat(fd: number, callback: (err: NodeJS.ErrnoException | null, stats: Stats) => void): void; + export function fstat( + fd: number, + options: + | (StatOptions & { + bigint?: false | undefined; + }) + | undefined, + callback: (err: NodeJS.ErrnoException | null, stats: Stats) => void, + ): void; + export function fstat( + fd: number, + options: StatOptions & { + bigint: true; + }, + callback: (err: NodeJS.ErrnoException | null, stats: BigIntStats) => void, + ): void; + export function fstat( + fd: number, + options: StatOptions | undefined, + callback: (err: NodeJS.ErrnoException | null, stats: Stats | BigIntStats) => void, + ): void; + export namespace fstat { + /** + * Asynchronous fstat(2) - Get file status. + * @param fd A file descriptor. + */ + function __promisify__( + fd: number, + options?: StatOptions & { + bigint?: false | undefined; + }, + ): Promise; + function __promisify__( + fd: number, + options: StatOptions & { + bigint: true; + }, + ): Promise; + function __promisify__(fd: number, options?: StatOptions): Promise; + } + /** + * Retrieves the `fs.Stats` for the file descriptor. + * + * See the POSIX [`fstat(2)`](http://man7.org/linux/man-pages/man2/fstat.2.html) documentation for more detail. + * @since v0.1.95 + */ + export function fstatSync( + fd: number, + options?: StatOptions & { + bigint?: false | undefined; + }, + ): Stats; + export function fstatSync( + fd: number, + options: StatOptions & { + bigint: true; + }, + ): BigIntStats; + export function fstatSync(fd: number, options?: StatOptions): Stats | BigIntStats; + /** + * Retrieves the `fs.Stats` for the symbolic link referred to by the path. + * The callback gets two arguments `(err, stats)` where `stats` is a `fs.Stats` object. `lstat()` is identical to `stat()`, except that if `path` is a symbolic + * link, then the link itself is stat-ed, not the file that it refers to. + * + * See the POSIX [`lstat(2)`](http://man7.org/linux/man-pages/man2/lstat.2.html) documentation for more details. + * @since v0.1.30 + */ + export function lstat(path: PathLike, callback: (err: NodeJS.ErrnoException | null, stats: Stats) => void): void; + export function lstat( + path: PathLike, + options: + | (StatOptions & { + bigint?: false | undefined; + }) + | undefined, + callback: (err: NodeJS.ErrnoException | null, stats: Stats) => void, + ): void; + export function lstat( + path: PathLike, + options: StatOptions & { + bigint: true; + }, + callback: (err: NodeJS.ErrnoException | null, stats: BigIntStats) => void, + ): void; + export function lstat( + path: PathLike, + options: StatOptions | undefined, + callback: (err: NodeJS.ErrnoException | null, stats: Stats | BigIntStats) => void, + ): void; + export namespace lstat { + /** + * Asynchronous lstat(2) - Get file status. Does not dereference symbolic links. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + function __promisify__( + path: PathLike, + options?: StatOptions & { + bigint?: false | undefined; + }, + ): Promise; + function __promisify__( + path: PathLike, + options: StatOptions & { + bigint: true; + }, + ): Promise; + function __promisify__(path: PathLike, options?: StatOptions): Promise; + } + /** + * Asynchronous [`statfs(2)`](http://man7.org/linux/man-pages/man2/statfs.2.html). Returns information about the mounted file system which + * contains `path`. The callback gets two arguments `(err, stats)` where `stats`is an `fs.StatFs` object. + * + * In case of an error, the `err.code` will be one of `Common System Errors`. + * @since v19.6.0, v18.15.0 + * @param path A path to an existing file or directory on the file system to be queried. + */ + export function statfs(path: PathLike, callback: (err: NodeJS.ErrnoException | null, stats: StatsFs) => void): void; + export function statfs( + path: PathLike, + options: + | (StatFsOptions & { + bigint?: false | undefined; + }) + | undefined, + callback: (err: NodeJS.ErrnoException | null, stats: StatsFs) => void, + ): void; + export function statfs( + path: PathLike, + options: StatFsOptions & { + bigint: true; + }, + callback: (err: NodeJS.ErrnoException | null, stats: BigIntStatsFs) => void, + ): void; + export function statfs( + path: PathLike, + options: StatFsOptions | undefined, + callback: (err: NodeJS.ErrnoException | null, stats: StatsFs | BigIntStatsFs) => void, + ): void; + export namespace statfs { + /** + * Asynchronous statfs(2) - Returns information about the mounted file system which contains path. The callback gets two arguments (err, stats) where stats is an object. + * @param path A path to an existing file or directory on the file system to be queried. + */ + function __promisify__( + path: PathLike, + options?: StatFsOptions & { + bigint?: false | undefined; + }, + ): Promise; + function __promisify__( + path: PathLike, + options: StatFsOptions & { + bigint: true; + }, + ): Promise; + function __promisify__(path: PathLike, options?: StatFsOptions): Promise; + } + /** + * Synchronous [`statfs(2)`](http://man7.org/linux/man-pages/man2/statfs.2.html). Returns information about the mounted file system which + * contains `path`. + * + * In case of an error, the `err.code` will be one of `Common System Errors`. + * @since v19.6.0, v18.15.0 + * @param path A path to an existing file or directory on the file system to be queried. + */ + export function statfsSync( + path: PathLike, + options?: StatFsOptions & { + bigint?: false | undefined; + }, + ): StatsFs; + export function statfsSync( + path: PathLike, + options: StatFsOptions & { + bigint: true; + }, + ): BigIntStatsFs; + export function statfsSync(path: PathLike, options?: StatFsOptions): StatsFs | BigIntStatsFs; + /** + * Synchronous lstat(2) - Get file status. Does not dereference symbolic links. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export const lstatSync: StatSyncFn; + /** + * Creates a new link from the `existingPath` to the `newPath`. See the POSIX [`link(2)`](http://man7.org/linux/man-pages/man2/link.2.html) documentation for more detail. No arguments other than + * a possible + * exception are given to the completion callback. + * @since v0.1.31 + */ + export function link(existingPath: PathLike, newPath: PathLike, callback: NoParamCallback): void; + export namespace link { + /** + * Asynchronous link(2) - Create a new link (also known as a hard link) to an existing file. + * @param existingPath A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param newPath A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + function __promisify__(existingPath: PathLike, newPath: PathLike): Promise; + } + /** + * Creates a new link from the `existingPath` to the `newPath`. See the POSIX [`link(2)`](http://man7.org/linux/man-pages/man2/link.2.html) documentation for more detail. Returns `undefined`. + * @since v0.1.31 + */ + export function linkSync(existingPath: PathLike, newPath: PathLike): void; + /** + * Creates the link called `path` pointing to `target`. No arguments other than a + * possible exception are given to the completion callback. + * + * See the POSIX [`symlink(2)`](http://man7.org/linux/man-pages/man2/symlink.2.html) documentation for more details. + * + * The `type` argument is only available on Windows and ignored on other platforms. + * It can be set to `'dir'`, `'file'`, or `'junction'`. If the `type` argument is + * not a string, Node.js will autodetect `target` type and use `'file'` or `'dir'`. + * If the `target` does not exist, `'file'` will be used. Windows junction points + * require the destination path to be absolute. When using `'junction'`, the`target` argument will automatically be normalized to absolute path. Junction + * points on NTFS volumes can only point to directories. + * + * Relative targets are relative to the link's parent directory. + * + * ```js + * import { symlink } from 'node:fs'; + * + * symlink('./mew', './mewtwo', callback); + * ``` + * + * The above example creates a symbolic link `mewtwo` which points to `mew` in the + * same directory: + * + * ```bash + * $ tree . + * . + * ├── mew + * └── mewtwo -> ./mew + * ``` + * @since v0.1.31 + * @param [type='null'] + */ + export function symlink( + target: PathLike, + path: PathLike, + type: symlink.Type | undefined | null, + callback: NoParamCallback, + ): void; + /** + * Asynchronous symlink(2) - Create a new symbolic link to an existing file. + * @param target A path to an existing file. If a URL is provided, it must use the `file:` protocol. + * @param path A path to the new symlink. If a URL is provided, it must use the `file:` protocol. + */ + export function symlink(target: PathLike, path: PathLike, callback: NoParamCallback): void; + export namespace symlink { + /** + * Asynchronous symlink(2) - Create a new symbolic link to an existing file. + * @param target A path to an existing file. If a URL is provided, it must use the `file:` protocol. + * @param path A path to the new symlink. If a URL is provided, it must use the `file:` protocol. + * @param type May be set to `'dir'`, `'file'`, or `'junction'` (default is `'file'`) and is only available on Windows (ignored on other platforms). + * When using `'junction'`, the `target` argument will automatically be normalized to an absolute path. + */ + function __promisify__(target: PathLike, path: PathLike, type?: string | null): Promise; + type Type = "dir" | "file" | "junction"; + } + /** + * Returns `undefined`. + * + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link symlink}. + * @since v0.1.31 + * @param [type='null'] + */ + export function symlinkSync(target: PathLike, path: PathLike, type?: symlink.Type | null): void; + /** + * Reads the contents of the symbolic link referred to by `path`. The callback gets + * two arguments `(err, linkString)`. + * + * See the POSIX [`readlink(2)`](http://man7.org/linux/man-pages/man2/readlink.2.html) documentation for more details. + * + * The optional `options` argument can be a string specifying an encoding, or an + * object with an `encoding` property specifying the character encoding to use for + * the link path passed to the callback. If the `encoding` is set to `'buffer'`, + * the link path returned will be passed as a `Buffer` object. + * @since v0.1.31 + */ + export function readlink( + path: PathLike, + options: EncodingOption, + callback: (err: NodeJS.ErrnoException | null, linkString: string) => void, + ): void; + /** + * Asynchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readlink( + path: PathLike, + options: BufferEncodingOption, + callback: (err: NodeJS.ErrnoException | null, linkString: Buffer) => void, + ): void; + /** + * Asynchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readlink( + path: PathLike, + options: EncodingOption, + callback: (err: NodeJS.ErrnoException | null, linkString: string | Buffer) => void, + ): void; + /** + * Asynchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function readlink( + path: PathLike, + callback: (err: NodeJS.ErrnoException | null, linkString: string) => void, + ): void; + export namespace readlink { + /** + * Asynchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function __promisify__(path: PathLike, options?: EncodingOption): Promise; + /** + * Asynchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function __promisify__(path: PathLike, options: BufferEncodingOption): Promise; + /** + * Asynchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function __promisify__(path: PathLike, options?: EncodingOption): Promise; + } + /** + * Returns the symbolic link's string value. + * + * See the POSIX [`readlink(2)`](http://man7.org/linux/man-pages/man2/readlink.2.html) documentation for more details. + * + * The optional `options` argument can be a string specifying an encoding, or an + * object with an `encoding` property specifying the character encoding to use for + * the link path returned. If the `encoding` is set to `'buffer'`, + * the link path returned will be passed as a `Buffer` object. + * @since v0.1.31 + */ + export function readlinkSync(path: PathLike, options?: EncodingOption): string; + /** + * Synchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readlinkSync(path: PathLike, options: BufferEncodingOption): Buffer; + /** + * Synchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readlinkSync(path: PathLike, options?: EncodingOption): string | Buffer; + /** + * Asynchronously computes the canonical pathname by resolving `.`, `..`, and + * symbolic links. + * + * A canonical pathname is not necessarily unique. Hard links and bind mounts can + * expose a file system entity through many pathnames. + * + * This function behaves like [`realpath(3)`](http://man7.org/linux/man-pages/man3/realpath.3.html), with some exceptions: + * + * 1. No case conversion is performed on case-insensitive file systems. + * 2. The maximum number of symbolic links is platform-independent and generally + * (much) higher than what the native [`realpath(3)`](http://man7.org/linux/man-pages/man3/realpath.3.html) implementation supports. + * + * The `callback` gets two arguments `(err, resolvedPath)`. May use `process.cwd`to resolve relative paths. + * + * Only paths that can be converted to UTF8 strings are supported. + * + * The optional `options` argument can be a string specifying an encoding, or an + * object with an `encoding` property specifying the character encoding to use for + * the path passed to the callback. If the `encoding` is set to `'buffer'`, + * the path returned will be passed as a `Buffer` object. + * + * If `path` resolves to a socket or a pipe, the function will return a system + * dependent name for that object. + * @since v0.1.31 + */ + export function realpath( + path: PathLike, + options: EncodingOption, + callback: (err: NodeJS.ErrnoException | null, resolvedPath: string) => void, + ): void; + /** + * Asynchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function realpath( + path: PathLike, + options: BufferEncodingOption, + callback: (err: NodeJS.ErrnoException | null, resolvedPath: Buffer) => void, + ): void; + /** + * Asynchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function realpath( + path: PathLike, + options: EncodingOption, + callback: (err: NodeJS.ErrnoException | null, resolvedPath: string | Buffer) => void, + ): void; + /** + * Asynchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function realpath( + path: PathLike, + callback: (err: NodeJS.ErrnoException | null, resolvedPath: string) => void, + ): void; + export namespace realpath { + /** + * Asynchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function __promisify__(path: PathLike, options?: EncodingOption): Promise; + /** + * Asynchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function __promisify__(path: PathLike, options: BufferEncodingOption): Promise; + /** + * Asynchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function __promisify__(path: PathLike, options?: EncodingOption): Promise; + /** + * Asynchronous [`realpath(3)`](http://man7.org/linux/man-pages/man3/realpath.3.html). + * + * The `callback` gets two arguments `(err, resolvedPath)`. + * + * Only paths that can be converted to UTF8 strings are supported. + * + * The optional `options` argument can be a string specifying an encoding, or an + * object with an `encoding` property specifying the character encoding to use for + * the path passed to the callback. If the `encoding` is set to `'buffer'`, + * the path returned will be passed as a `Buffer` object. + * + * On Linux, when Node.js is linked against musl libc, the procfs file system must + * be mounted on `/proc` in order for this function to work. Glibc does not have + * this restriction. + * @since v9.2.0 + */ + function native( + path: PathLike, + options: EncodingOption, + callback: (err: NodeJS.ErrnoException | null, resolvedPath: string) => void, + ): void; + function native( + path: PathLike, + options: BufferEncodingOption, + callback: (err: NodeJS.ErrnoException | null, resolvedPath: Buffer) => void, + ): void; + function native( + path: PathLike, + options: EncodingOption, + callback: (err: NodeJS.ErrnoException | null, resolvedPath: string | Buffer) => void, + ): void; + function native( + path: PathLike, + callback: (err: NodeJS.ErrnoException | null, resolvedPath: string) => void, + ): void; + } + /** + * Returns the resolved pathname. + * + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link realpath}. + * @since v0.1.31 + */ + export function realpathSync(path: PathLike, options?: EncodingOption): string; + /** + * Synchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function realpathSync(path: PathLike, options: BufferEncodingOption): Buffer; + /** + * Synchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function realpathSync(path: PathLike, options?: EncodingOption): string | Buffer; + export namespace realpathSync { + function native(path: PathLike, options?: EncodingOption): string; + function native(path: PathLike, options: BufferEncodingOption): Buffer; + function native(path: PathLike, options?: EncodingOption): string | Buffer; + } + /** + * Asynchronously removes a file or symbolic link. No arguments other than a + * possible exception are given to the completion callback. + * + * ```js + * import { unlink } from 'node:fs'; + * // Assuming that 'path/file.txt' is a regular file. + * unlink('path/file.txt', (err) => { + * if (err) throw err; + * console.log('path/file.txt was deleted'); + * }); + * ``` + * + * `fs.unlink()` will not work on a directory, empty or otherwise. To remove a + * directory, use {@link rmdir}. + * + * See the POSIX [`unlink(2)`](http://man7.org/linux/man-pages/man2/unlink.2.html) documentation for more details. + * @since v0.0.2 + */ + export function unlink(path: PathLike, callback: NoParamCallback): void; + export namespace unlink { + /** + * Asynchronous unlink(2) - delete a name and possibly the file it refers to. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + function __promisify__(path: PathLike): Promise; + } + /** + * Synchronous [`unlink(2)`](http://man7.org/linux/man-pages/man2/unlink.2.html). Returns `undefined`. + * @since v0.1.21 + */ + export function unlinkSync(path: PathLike): void; + export interface RmDirOptions { + /** + * If an `EBUSY`, `EMFILE`, `ENFILE`, `ENOTEMPTY`, or + * `EPERM` error is encountered, Node.js will retry the operation with a linear + * backoff wait of `retryDelay` ms longer on each try. This option represents the + * number of retries. This option is ignored if the `recursive` option is not + * `true`. + * @default 0 + */ + maxRetries?: number | undefined; + /** + * @deprecated since v14.14.0 In future versions of Node.js and will trigger a warning + * `fs.rmdir(path, { recursive: true })` will throw if `path` does not exist or is a file. + * Use `fs.rm(path, { recursive: true, force: true })` instead. + * + * If `true`, perform a recursive directory removal. In + * recursive mode, operations are retried on failure. + * @default false + */ + recursive?: boolean | undefined; + /** + * The amount of time in milliseconds to wait between retries. + * This option is ignored if the `recursive` option is not `true`. + * @default 100 + */ + retryDelay?: number | undefined; + } + /** + * Asynchronous [`rmdir(2)`](http://man7.org/linux/man-pages/man2/rmdir.2.html). No arguments other than a possible exception are given + * to the completion callback. + * + * Using `fs.rmdir()` on a file (not a directory) results in an `ENOENT` error on + * Windows and an `ENOTDIR` error on POSIX. + * + * To get a behavior similar to the `rm -rf` Unix command, use {@link rm} with options `{ recursive: true, force: true }`. + * @since v0.0.2 + */ + export function rmdir(path: PathLike, callback: NoParamCallback): void; + export function rmdir(path: PathLike, options: RmDirOptions, callback: NoParamCallback): void; + export namespace rmdir { + /** + * Asynchronous rmdir(2) - delete a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + function __promisify__(path: PathLike, options?: RmDirOptions): Promise; + } + /** + * Synchronous [`rmdir(2)`](http://man7.org/linux/man-pages/man2/rmdir.2.html). Returns `undefined`. + * + * Using `fs.rmdirSync()` on a file (not a directory) results in an `ENOENT` error + * on Windows and an `ENOTDIR` error on POSIX. + * + * To get a behavior similar to the `rm -rf` Unix command, use {@link rmSync} with options `{ recursive: true, force: true }`. + * @since v0.1.21 + */ + export function rmdirSync(path: PathLike, options?: RmDirOptions): void; + export interface RmOptions { + /** + * When `true`, exceptions will be ignored if `path` does not exist. + * @default false + */ + force?: boolean | undefined; + /** + * If an `EBUSY`, `EMFILE`, `ENFILE`, `ENOTEMPTY`, or + * `EPERM` error is encountered, Node.js will retry the operation with a linear + * backoff wait of `retryDelay` ms longer on each try. This option represents the + * number of retries. This option is ignored if the `recursive` option is not + * `true`. + * @default 0 + */ + maxRetries?: number | undefined; + /** + * If `true`, perform a recursive directory removal. In + * recursive mode, operations are retried on failure. + * @default false + */ + recursive?: boolean | undefined; + /** + * The amount of time in milliseconds to wait between retries. + * This option is ignored if the `recursive` option is not `true`. + * @default 100 + */ + retryDelay?: number | undefined; + } + /** + * Asynchronously removes files and directories (modeled on the standard POSIX `rm`utility). No arguments other than a possible exception are given to the + * completion callback. + * @since v14.14.0 + */ + export function rm(path: PathLike, callback: NoParamCallback): void; + export function rm(path: PathLike, options: RmOptions, callback: NoParamCallback): void; + export namespace rm { + /** + * Asynchronously removes files and directories (modeled on the standard POSIX `rm` utility). + */ + function __promisify__(path: PathLike, options?: RmOptions): Promise; + } + /** + * Synchronously removes files and directories (modeled on the standard POSIX `rm`utility). Returns `undefined`. + * @since v14.14.0 + */ + export function rmSync(path: PathLike, options?: RmOptions): void; + export interface MakeDirectoryOptions { + /** + * Indicates whether parent folders should be created. + * If a folder was created, the path to the first created folder will be returned. + * @default false + */ + recursive?: boolean | undefined; + /** + * A file mode. If a string is passed, it is parsed as an octal integer. If not specified + * @default 0o777 + */ + mode?: Mode | undefined; + } + /** + * Asynchronously creates a directory. + * + * The callback is given a possible exception and, if `recursive` is `true`, the + * first directory path created, `(err[, path])`.`path` can still be `undefined` when `recursive` is `true`, if no directory was + * created (for instance, if it was previously created). + * + * The optional `options` argument can be an integer specifying `mode` (permission + * and sticky bits), or an object with a `mode` property and a `recursive`property indicating whether parent directories should be created. Calling`fs.mkdir()` when `path` is a directory that + * exists results in an error only + * when `recursive` is false. If `recursive` is false and the directory exists, + * an `EEXIST` error occurs. + * + * ```js + * import { mkdir } from 'node:fs'; + * + * // Create ./tmp/a/apple, regardless of whether ./tmp and ./tmp/a exist. + * mkdir('./tmp/a/apple', { recursive: true }, (err) => { + * if (err) throw err; + * }); + * ``` + * + * On Windows, using `fs.mkdir()` on the root directory even with recursion will + * result in an error: + * + * ```js + * import { mkdir } from 'node:fs'; + * + * mkdir('/', { recursive: true }, (err) => { + * // => [Error: EPERM: operation not permitted, mkdir 'C:\'] + * }); + * ``` + * + * See the POSIX [`mkdir(2)`](http://man7.org/linux/man-pages/man2/mkdir.2.html) documentation for more details. + * @since v0.1.8 + */ + export function mkdir( + path: PathLike, + options: MakeDirectoryOptions & { + recursive: true; + }, + callback: (err: NodeJS.ErrnoException | null, path?: string) => void, + ): void; + /** + * Asynchronous mkdir(2) - create a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options Either the file mode, or an object optionally specifying the file mode and whether parent folders + * should be created. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. + */ + export function mkdir( + path: PathLike, + options: + | Mode + | (MakeDirectoryOptions & { + recursive?: false | undefined; + }) + | null + | undefined, + callback: NoParamCallback, + ): void; + /** + * Asynchronous mkdir(2) - create a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options Either the file mode, or an object optionally specifying the file mode and whether parent folders + * should be created. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. + */ + export function mkdir( + path: PathLike, + options: Mode | MakeDirectoryOptions | null | undefined, + callback: (err: NodeJS.ErrnoException | null, path?: string) => void, + ): void; + /** + * Asynchronous mkdir(2) - create a directory with a mode of `0o777`. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function mkdir(path: PathLike, callback: NoParamCallback): void; + export namespace mkdir { + /** + * Asynchronous mkdir(2) - create a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options Either the file mode, or an object optionally specifying the file mode and whether parent folders + * should be created. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. + */ + function __promisify__( + path: PathLike, + options: MakeDirectoryOptions & { + recursive: true; + }, + ): Promise; + /** + * Asynchronous mkdir(2) - create a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options Either the file mode, or an object optionally specifying the file mode and whether parent folders + * should be created. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. + */ + function __promisify__( + path: PathLike, + options?: + | Mode + | (MakeDirectoryOptions & { + recursive?: false | undefined; + }) + | null, + ): Promise; + /** + * Asynchronous mkdir(2) - create a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options Either the file mode, or an object optionally specifying the file mode and whether parent folders + * should be created. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. + */ + function __promisify__( + path: PathLike, + options?: Mode | MakeDirectoryOptions | null, + ): Promise; + } + /** + * Synchronously creates a directory. Returns `undefined`, or if `recursive` is`true`, the first directory path created. + * This is the synchronous version of {@link mkdir}. + * + * See the POSIX [`mkdir(2)`](http://man7.org/linux/man-pages/man2/mkdir.2.html) documentation for more details. + * @since v0.1.21 + */ + export function mkdirSync( + path: PathLike, + options: MakeDirectoryOptions & { + recursive: true; + }, + ): string | undefined; + /** + * Synchronous mkdir(2) - create a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options Either the file mode, or an object optionally specifying the file mode and whether parent folders + * should be created. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. + */ + export function mkdirSync( + path: PathLike, + options?: + | Mode + | (MakeDirectoryOptions & { + recursive?: false | undefined; + }) + | null, + ): void; + /** + * Synchronous mkdir(2) - create a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options Either the file mode, or an object optionally specifying the file mode and whether parent folders + * should be created. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. + */ + export function mkdirSync(path: PathLike, options?: Mode | MakeDirectoryOptions | null): string | undefined; + /** + * Creates a unique temporary directory. + * + * Generates six random characters to be appended behind a required`prefix` to create a unique temporary directory. Due to platform + * inconsistencies, avoid trailing `X` characters in `prefix`. Some platforms, + * notably the BSDs, can return more than six random characters, and replace + * trailing `X` characters in `prefix` with random characters. + * + * The created directory path is passed as a string to the callback's second + * parameter. + * + * The optional `options` argument can be a string specifying an encoding, or an + * object with an `encoding` property specifying the character encoding to use. + * + * ```js + * import { mkdtemp } from 'node:fs'; + * import { join } from 'node:path'; + * import { tmpdir } from 'node:os'; + * + * mkdtemp(join(tmpdir(), 'foo-'), (err, directory) => { + * if (err) throw err; + * console.log(directory); + * // Prints: /tmp/foo-itXde2 or C:\Users\...\AppData\Local\Temp\foo-itXde2 + * }); + * ``` + * + * The `fs.mkdtemp()` method will append the six randomly selected characters + * directly to the `prefix` string. For instance, given a directory `/tmp`, if the + * intention is to create a temporary directory _within_`/tmp`, the `prefix`must end with a trailing platform-specific path separator + * (`require('node:path').sep`). + * + * ```js + * import { tmpdir } from 'node:os'; + * import { mkdtemp } from 'node:fs'; + * + * // The parent directory for the new temporary directory + * const tmpDir = tmpdir(); + * + * // This method is *INCORRECT*: + * mkdtemp(tmpDir, (err, directory) => { + * if (err) throw err; + * console.log(directory); + * // Will print something similar to `/tmpabc123`. + * // A new temporary directory is created at the file system root + * // rather than *within* the /tmp directory. + * }); + * + * // This method is *CORRECT*: + * import { sep } from 'node:path'; + * mkdtemp(`${tmpDir}${sep}`, (err, directory) => { + * if (err) throw err; + * console.log(directory); + * // Will print something similar to `/tmp/abc123`. + * // A new temporary directory is created within + * // the /tmp directory. + * }); + * ``` + * @since v5.10.0 + */ + export function mkdtemp( + prefix: string, + options: EncodingOption, + callback: (err: NodeJS.ErrnoException | null, folder: string) => void, + ): void; + /** + * Asynchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function mkdtemp( + prefix: string, + options: + | "buffer" + | { + encoding: "buffer"; + }, + callback: (err: NodeJS.ErrnoException | null, folder: Buffer) => void, + ): void; + /** + * Asynchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function mkdtemp( + prefix: string, + options: EncodingOption, + callback: (err: NodeJS.ErrnoException | null, folder: string | Buffer) => void, + ): void; + /** + * Asynchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + */ + export function mkdtemp( + prefix: string, + callback: (err: NodeJS.ErrnoException | null, folder: string) => void, + ): void; + export namespace mkdtemp { + /** + * Asynchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function __promisify__(prefix: string, options?: EncodingOption): Promise; + /** + * Asynchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function __promisify__(prefix: string, options: BufferEncodingOption): Promise; + /** + * Asynchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function __promisify__(prefix: string, options?: EncodingOption): Promise; + } + /** + * Returns the created directory path. + * + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link mkdtemp}. + * + * The optional `options` argument can be a string specifying an encoding, or an + * object with an `encoding` property specifying the character encoding to use. + * @since v5.10.0 + */ + export function mkdtempSync(prefix: string, options?: EncodingOption): string; + /** + * Synchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function mkdtempSync(prefix: string, options: BufferEncodingOption): Buffer; + /** + * Synchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function mkdtempSync(prefix: string, options?: EncodingOption): string | Buffer; + /** + * Reads the contents of a directory. The callback gets two arguments `(err, files)`where `files` is an array of the names of the files in the directory excluding`'.'` and `'..'`. + * + * See the POSIX [`readdir(3)`](http://man7.org/linux/man-pages/man3/readdir.3.html) documentation for more details. + * + * The optional `options` argument can be a string specifying an encoding, or an + * object with an `encoding` property specifying the character encoding to use for + * the filenames passed to the callback. If the `encoding` is set to `'buffer'`, + * the filenames returned will be passed as `Buffer` objects. + * + * If `options.withFileTypes` is set to `true`, the `files` array will contain `fs.Dirent` objects. + * @since v0.1.8 + */ + export function readdir( + path: PathLike, + options: + | { + encoding: BufferEncoding | null; + withFileTypes?: false | undefined; + recursive?: boolean | undefined; + } + | BufferEncoding + | undefined + | null, + callback: (err: NodeJS.ErrnoException | null, files: string[]) => void, + ): void; + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readdir( + path: PathLike, + options: + | { + encoding: "buffer"; + withFileTypes?: false | undefined; + recursive?: boolean | undefined; + } + | "buffer", + callback: (err: NodeJS.ErrnoException | null, files: Buffer[]) => void, + ): void; + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readdir( + path: PathLike, + options: + | (ObjectEncodingOptions & { + withFileTypes?: false | undefined; + recursive?: boolean | undefined; + }) + | BufferEncoding + | undefined + | null, + callback: (err: NodeJS.ErrnoException | null, files: string[] | Buffer[]) => void, + ): void; + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function readdir( + path: PathLike, + callback: (err: NodeJS.ErrnoException | null, files: string[]) => void, + ): void; + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options If called with `withFileTypes: true` the result data will be an array of Dirent. + */ + export function readdir( + path: PathLike, + options: ObjectEncodingOptions & { + withFileTypes: true; + recursive?: boolean | undefined; + }, + callback: (err: NodeJS.ErrnoException | null, files: Dirent[]) => void, + ): void; + export namespace readdir { + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function __promisify__( + path: PathLike, + options?: + | { + encoding: BufferEncoding | null; + withFileTypes?: false | undefined; + recursive?: boolean | undefined; + } + | BufferEncoding + | null, + ): Promise; + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function __promisify__( + path: PathLike, + options: + | "buffer" + | { + encoding: "buffer"; + withFileTypes?: false | undefined; + recursive?: boolean | undefined; + }, + ): Promise; + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function __promisify__( + path: PathLike, + options?: + | (ObjectEncodingOptions & { + withFileTypes?: false | undefined; + recursive?: boolean | undefined; + }) + | BufferEncoding + | null, + ): Promise; + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options If called with `withFileTypes: true` the result data will be an array of Dirent + */ + function __promisify__( + path: PathLike, + options: ObjectEncodingOptions & { + withFileTypes: true; + recursive?: boolean | undefined; + }, + ): Promise; + } + /** + * Reads the contents of the directory. + * + * See the POSIX [`readdir(3)`](http://man7.org/linux/man-pages/man3/readdir.3.html) documentation for more details. + * + * The optional `options` argument can be a string specifying an encoding, or an + * object with an `encoding` property specifying the character encoding to use for + * the filenames returned. If the `encoding` is set to `'buffer'`, + * the filenames returned will be passed as `Buffer` objects. + * + * If `options.withFileTypes` is set to `true`, the result will contain `fs.Dirent` objects. + * @since v0.1.21 + */ + export function readdirSync( + path: PathLike, + options?: + | { + encoding: BufferEncoding | null; + withFileTypes?: false | undefined; + recursive?: boolean | undefined; + } + | BufferEncoding + | null, + ): string[]; + /** + * Synchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readdirSync( + path: PathLike, + options: + | { + encoding: "buffer"; + withFileTypes?: false | undefined; + recursive?: boolean | undefined; + } + | "buffer", + ): Buffer[]; + /** + * Synchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readdirSync( + path: PathLike, + options?: + | (ObjectEncodingOptions & { + withFileTypes?: false | undefined; + recursive?: boolean | undefined; + }) + | BufferEncoding + | null, + ): string[] | Buffer[]; + /** + * Synchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options If called with `withFileTypes: true` the result data will be an array of Dirent. + */ + export function readdirSync( + path: PathLike, + options: ObjectEncodingOptions & { + withFileTypes: true; + recursive?: boolean | undefined; + }, + ): Dirent[]; + /** + * Closes the file descriptor. No arguments other than a possible exception are + * given to the completion callback. + * + * Calling `fs.close()` on any file descriptor (`fd`) that is currently in use + * through any other `fs` operation may lead to undefined behavior. + * + * See the POSIX [`close(2)`](http://man7.org/linux/man-pages/man2/close.2.html) documentation for more detail. + * @since v0.0.2 + */ + export function close(fd: number, callback?: NoParamCallback): void; + export namespace close { + /** + * Asynchronous close(2) - close a file descriptor. + * @param fd A file descriptor. + */ + function __promisify__(fd: number): Promise; + } + /** + * Closes the file descriptor. Returns `undefined`. + * + * Calling `fs.closeSync()` on any file descriptor (`fd`) that is currently in use + * through any other `fs` operation may lead to undefined behavior. + * + * See the POSIX [`close(2)`](http://man7.org/linux/man-pages/man2/close.2.html) documentation for more detail. + * @since v0.1.21 + */ + export function closeSync(fd: number): void; + /** + * Asynchronous file open. See the POSIX [`open(2)`](http://man7.org/linux/man-pages/man2/open.2.html) documentation for more details. + * + * `mode` sets the file mode (permission and sticky bits), but only if the file was + * created. On Windows, only the write permission can be manipulated; see {@link chmod}. + * + * The callback gets two arguments `(err, fd)`. + * + * Some characters (`< > : " / \ | ? *`) are reserved under Windows as documented + * by [Naming Files, Paths, and Namespaces](https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file). Under NTFS, if the filename contains + * a colon, Node.js will open a file system stream, as described by [this MSDN page](https://docs.microsoft.com/en-us/windows/desktop/FileIO/using-streams). + * + * Functions based on `fs.open()` exhibit this behavior as well:`fs.writeFile()`, `fs.readFile()`, etc. + * @since v0.0.2 + * @param [flags='r'] See `support of file system `flags``. + * @param [mode=0o666] + */ + export function open( + path: PathLike, + flags: OpenMode | undefined, + mode: Mode | undefined | null, + callback: (err: NodeJS.ErrnoException | null, fd: number) => void, + ): void; + /** + * Asynchronous open(2) - open and possibly create a file. If the file is created, its mode will be `0o666`. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param [flags='r'] See `support of file system `flags``. + */ + export function open( + path: PathLike, + flags: OpenMode | undefined, + callback: (err: NodeJS.ErrnoException | null, fd: number) => void, + ): void; + /** + * Asynchronous open(2) - open and possibly create a file. If the file is created, its mode will be `0o666`. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function open(path: PathLike, callback: (err: NodeJS.ErrnoException | null, fd: number) => void): void; + export namespace open { + /** + * Asynchronous open(2) - open and possibly create a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param mode A file mode. If a string is passed, it is parsed as an octal integer. If not supplied, defaults to `0o666`. + */ + function __promisify__(path: PathLike, flags: OpenMode, mode?: Mode | null): Promise; + } + /** + * Returns an integer representing the file descriptor. + * + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link open}. + * @since v0.1.21 + * @param [flags='r'] + * @param [mode=0o666] + */ + export function openSync(path: PathLike, flags: OpenMode, mode?: Mode | null): number; + /** + * Change the file system timestamps of the object referenced by `path`. + * + * The `atime` and `mtime` arguments follow these rules: + * + * * Values can be either numbers representing Unix epoch time in seconds,`Date`s, or a numeric string like `'123456789.0'`. + * * If the value can not be converted to a number, or is `NaN`, `Infinity`, or`-Infinity`, an `Error` will be thrown. + * @since v0.4.2 + */ + export function utimes(path: PathLike, atime: TimeLike, mtime: TimeLike, callback: NoParamCallback): void; + export namespace utimes { + /** + * Asynchronously change file timestamps of the file referenced by the supplied path. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param atime The last access time. If a string is provided, it will be coerced to number. + * @param mtime The last modified time. If a string is provided, it will be coerced to number. + */ + function __promisify__(path: PathLike, atime: TimeLike, mtime: TimeLike): Promise; + } + /** + * Returns `undefined`. + * + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link utimes}. + * @since v0.4.2 + */ + export function utimesSync(path: PathLike, atime: TimeLike, mtime: TimeLike): void; + /** + * Change the file system timestamps of the object referenced by the supplied file + * descriptor. See {@link utimes}. + * @since v0.4.2 + */ + export function futimes(fd: number, atime: TimeLike, mtime: TimeLike, callback: NoParamCallback): void; + export namespace futimes { + /** + * Asynchronously change file timestamps of the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param atime The last access time. If a string is provided, it will be coerced to number. + * @param mtime The last modified time. If a string is provided, it will be coerced to number. + */ + function __promisify__(fd: number, atime: TimeLike, mtime: TimeLike): Promise; + } + /** + * Synchronous version of {@link futimes}. Returns `undefined`. + * @since v0.4.2 + */ + export function futimesSync(fd: number, atime: TimeLike, mtime: TimeLike): void; + /** + * Request that all data for the open file descriptor is flushed to the storage + * device. The specific implementation is operating system and device specific. + * Refer to the POSIX [`fsync(2)`](http://man7.org/linux/man-pages/man2/fsync.2.html) documentation for more detail. No arguments other + * than a possible exception are given to the completion callback. + * @since v0.1.96 + */ + export function fsync(fd: number, callback: NoParamCallback): void; + export namespace fsync { + /** + * Asynchronous fsync(2) - synchronize a file's in-core state with the underlying storage device. + * @param fd A file descriptor. + */ + function __promisify__(fd: number): Promise; + } + /** + * Request that all data for the open file descriptor is flushed to the storage + * device. The specific implementation is operating system and device specific. + * Refer to the POSIX [`fsync(2)`](http://man7.org/linux/man-pages/man2/fsync.2.html) documentation for more detail. Returns `undefined`. + * @since v0.1.96 + */ + export function fsyncSync(fd: number): void; + /** + * Write `buffer` to the file specified by `fd`. + * + * `offset` determines the part of the buffer to be written, and `length` is + * an integer specifying the number of bytes to write. + * + * `position` refers to the offset from the beginning of the file where this data + * should be written. If `typeof position !== 'number'`, the data will be written + * at the current position. See [`pwrite(2)`](http://man7.org/linux/man-pages/man2/pwrite.2.html). + * + * The callback will be given three arguments `(err, bytesWritten, buffer)` where`bytesWritten` specifies how many _bytes_ were written from `buffer`. + * + * If this method is invoked as its `util.promisify()` ed version, it returns + * a promise for an `Object` with `bytesWritten` and `buffer` properties. + * + * It is unsafe to use `fs.write()` multiple times on the same file without waiting + * for the callback. For this scenario, {@link createWriteStream} is + * recommended. + * + * On Linux, positional writes don't work when the file is opened in append mode. + * The kernel ignores the position argument and always appends the data to + * the end of the file. + * @since v0.0.2 + * @param [offset=0] + * @param [length=buffer.byteLength - offset] + * @param [position='null'] + */ + export function write( + fd: number, + buffer: TBuffer, + offset: number | undefined | null, + length: number | undefined | null, + position: number | undefined | null, + callback: (err: NodeJS.ErrnoException | null, written: number, buffer: TBuffer) => void, + ): void; + /** + * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param offset The part of the buffer to be written. If not supplied, defaults to `0`. + * @param length The number of bytes to write. If not supplied, defaults to `buffer.length - offset`. + */ + export function write( + fd: number, + buffer: TBuffer, + offset: number | undefined | null, + length: number | undefined | null, + callback: (err: NodeJS.ErrnoException | null, written: number, buffer: TBuffer) => void, + ): void; + /** + * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param offset The part of the buffer to be written. If not supplied, defaults to `0`. + */ + export function write( + fd: number, + buffer: TBuffer, + offset: number | undefined | null, + callback: (err: NodeJS.ErrnoException | null, written: number, buffer: TBuffer) => void, + ): void; + /** + * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + */ + export function write( + fd: number, + buffer: TBuffer, + callback: (err: NodeJS.ErrnoException | null, written: number, buffer: TBuffer) => void, + ): void; + /** + * Asynchronously writes `string` to the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param string A string to write. + * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. + * @param encoding The expected string encoding. + */ + export function write( + fd: number, + string: string, + position: number | undefined | null, + encoding: BufferEncoding | undefined | null, + callback: (err: NodeJS.ErrnoException | null, written: number, str: string) => void, + ): void; + /** + * Asynchronously writes `string` to the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param string A string to write. + * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. + */ + export function write( + fd: number, + string: string, + position: number | undefined | null, + callback: (err: NodeJS.ErrnoException | null, written: number, str: string) => void, + ): void; + /** + * Asynchronously writes `string` to the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param string A string to write. + */ + export function write( + fd: number, + string: string, + callback: (err: NodeJS.ErrnoException | null, written: number, str: string) => void, + ): void; + export namespace write { + /** + * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param offset The part of the buffer to be written. If not supplied, defaults to `0`. + * @param length The number of bytes to write. If not supplied, defaults to `buffer.length - offset`. + * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. + */ + function __promisify__( + fd: number, + buffer?: TBuffer, + offset?: number, + length?: number, + position?: number | null, + ): Promise<{ + bytesWritten: number; + buffer: TBuffer; + }>; + /** + * Asynchronously writes `string` to the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param string A string to write. + * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. + * @param encoding The expected string encoding. + */ + function __promisify__( + fd: number, + string: string, + position?: number | null, + encoding?: BufferEncoding | null, + ): Promise<{ + bytesWritten: number; + buffer: string; + }>; + } + /** + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link write}. + * @since v0.1.21 + * @param [offset=0] + * @param [length=buffer.byteLength - offset] + * @param [position='null'] + * @return The number of bytes written. + */ + export function writeSync( + fd: number, + buffer: NodeJS.ArrayBufferView, + offset?: number | null, + length?: number | null, + position?: number | null, + ): number; + /** + * Synchronously writes `string` to the file referenced by the supplied file descriptor, returning the number of bytes written. + * @param fd A file descriptor. + * @param string A string to write. + * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. + * @param encoding The expected string encoding. + */ + export function writeSync( + fd: number, + string: string, + position?: number | null, + encoding?: BufferEncoding | null, + ): number; + export type ReadPosition = number | bigint; + export interface ReadSyncOptions { + /** + * @default 0 + */ + offset?: number | undefined; + /** + * @default `length of buffer` + */ + length?: number | undefined; + /** + * @default null + */ + position?: ReadPosition | null | undefined; + } + export interface ReadAsyncOptions extends ReadSyncOptions { + buffer?: TBuffer; + } + /** + * Read data from the file specified by `fd`. + * + * The callback is given the three arguments, `(err, bytesRead, buffer)`. + * + * If the file is not modified concurrently, the end-of-file is reached when the + * number of bytes read is zero. + * + * If this method is invoked as its `util.promisify()` ed version, it returns + * a promise for an `Object` with `bytesRead` and `buffer` properties. + * @since v0.0.2 + * @param buffer The buffer that the data will be written to. + * @param offset The position in `buffer` to write the data to. + * @param length The number of bytes to read. + * @param position Specifies where to begin reading from in the file. If `position` is `null` or `-1 `, data will be read from the current file position, and the file position will be updated. If + * `position` is an integer, the file position will be unchanged. + */ + export function read( + fd: number, + buffer: TBuffer, + offset: number, + length: number, + position: ReadPosition | null, + callback: (err: NodeJS.ErrnoException | null, bytesRead: number, buffer: TBuffer) => void, + ): void; + /** + * Similar to the above `fs.read` function, this version takes an optional `options` object. + * If not otherwise specified in an `options` object, + * `buffer` defaults to `Buffer.alloc(16384)`, + * `offset` defaults to `0`, + * `length` defaults to `buffer.byteLength`, `- offset` as of Node 17.6.0 + * `position` defaults to `null` + * @since v12.17.0, 13.11.0 + */ + export function read( + fd: number, + options: ReadAsyncOptions, + callback: (err: NodeJS.ErrnoException | null, bytesRead: number, buffer: TBuffer) => void, + ): void; + export function read( + fd: number, + callback: (err: NodeJS.ErrnoException | null, bytesRead: number, buffer: NodeJS.ArrayBufferView) => void, + ): void; + export namespace read { + /** + * @param fd A file descriptor. + * @param buffer The buffer that the data will be written to. + * @param offset The offset in the buffer at which to start writing. + * @param length The number of bytes to read. + * @param position The offset from the beginning of the file from which data should be read. If `null`, data will be read from the current position. + */ + function __promisify__( + fd: number, + buffer: TBuffer, + offset: number, + length: number, + position: number | null, + ): Promise<{ + bytesRead: number; + buffer: TBuffer; + }>; + function __promisify__( + fd: number, + options: ReadAsyncOptions, + ): Promise<{ + bytesRead: number; + buffer: TBuffer; + }>; + function __promisify__(fd: number): Promise<{ + bytesRead: number; + buffer: NodeJS.ArrayBufferView; + }>; + } + /** + * Returns the number of `bytesRead`. + * + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link read}. + * @since v0.1.21 + * @param [position='null'] + */ + export function readSync( + fd: number, + buffer: NodeJS.ArrayBufferView, + offset: number, + length: number, + position: ReadPosition | null, + ): number; + /** + * Similar to the above `fs.readSync` function, this version takes an optional `options` object. + * If no `options` object is specified, it will default with the above values. + */ + export function readSync(fd: number, buffer: NodeJS.ArrayBufferView, opts?: ReadSyncOptions): number; + /** + * Asynchronously reads the entire contents of a file. + * + * ```js + * import { readFile } from 'node:fs'; + * + * readFile('/etc/passwd', (err, data) => { + * if (err) throw err; + * console.log(data); + * }); + * ``` + * + * The callback is passed two arguments `(err, data)`, where `data` is the + * contents of the file. + * + * If no encoding is specified, then the raw buffer is returned. + * + * If `options` is a string, then it specifies the encoding: + * + * ```js + * import { readFile } from 'node:fs'; + * + * readFile('/etc/passwd', 'utf8', callback); + * ``` + * + * When the path is a directory, the behavior of `fs.readFile()` and {@link readFileSync} is platform-specific. On macOS, Linux, and Windows, an + * error will be returned. On FreeBSD, a representation of the directory's contents + * will be returned. + * + * ```js + * import { readFile } from 'node:fs'; + * + * // macOS, Linux, and Windows + * readFile('', (err, data) => { + * // => [Error: EISDIR: illegal operation on a directory, read ] + * }); + * + * // FreeBSD + * readFile('', (err, data) => { + * // => null, + * }); + * ``` + * + * It is possible to abort an ongoing request using an `AbortSignal`. If a + * request is aborted the callback is called with an `AbortError`: + * + * ```js + * import { readFile } from 'node:fs'; + * + * const controller = new AbortController(); + * const signal = controller.signal; + * readFile(fileInfo[0].name, { signal }, (err, buf) => { + * // ... + * }); + * // When you want to abort the request + * controller.abort(); + * ``` + * + * The `fs.readFile()` function buffers the entire file. To minimize memory costs, + * when possible prefer streaming via `fs.createReadStream()`. + * + * Aborting an ongoing request does not abort individual operating + * system requests but rather the internal buffering `fs.readFile` performs. + * @since v0.1.29 + * @param path filename or file descriptor + */ + export function readFile( + path: PathOrFileDescriptor, + options: + | ({ + encoding?: null | undefined; + flag?: string | undefined; + } & Abortable) + | undefined + | null, + callback: (err: NodeJS.ErrnoException | null, data: Buffer) => void, + ): void; + /** + * Asynchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + export function readFile( + path: PathOrFileDescriptor, + options: + | ({ + encoding: BufferEncoding; + flag?: string | undefined; + } & Abortable) + | BufferEncoding, + callback: (err: NodeJS.ErrnoException | null, data: string) => void, + ): void; + /** + * Asynchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + export function readFile( + path: PathOrFileDescriptor, + options: + | (ObjectEncodingOptions & { + flag?: string | undefined; + } & Abortable) + | BufferEncoding + | undefined + | null, + callback: (err: NodeJS.ErrnoException | null, data: string | Buffer) => void, + ): void; + /** + * Asynchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + */ + export function readFile( + path: PathOrFileDescriptor, + callback: (err: NodeJS.ErrnoException | null, data: Buffer) => void, + ): void; + export namespace readFile { + /** + * Asynchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param options An object that may contain an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + function __promisify__( + path: PathOrFileDescriptor, + options?: { + encoding?: null | undefined; + flag?: string | undefined; + } | null, + ): Promise; + /** + * Asynchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + function __promisify__( + path: PathOrFileDescriptor, + options: + | { + encoding: BufferEncoding; + flag?: string | undefined; + } + | BufferEncoding, + ): Promise; + /** + * Asynchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + function __promisify__( + path: PathOrFileDescriptor, + options?: + | (ObjectEncodingOptions & { + flag?: string | undefined; + }) + | BufferEncoding + | null, + ): Promise; + } + /** + * Returns the contents of the `path`. + * + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link readFile}. + * + * If the `encoding` option is specified then this function returns a + * string. Otherwise it returns a buffer. + * + * Similar to {@link readFile}, when the path is a directory, the behavior of`fs.readFileSync()` is platform-specific. + * + * ```js + * import { readFileSync } from 'node:fs'; + * + * // macOS, Linux, and Windows + * readFileSync(''); + * // => [Error: EISDIR: illegal operation on a directory, read ] + * + * // FreeBSD + * readFileSync(''); // => + * ``` + * @since v0.1.8 + * @param path filename or file descriptor + */ + export function readFileSync( + path: PathOrFileDescriptor, + options?: { + encoding?: null | undefined; + flag?: string | undefined; + } | null, + ): Buffer; + /** + * Synchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + export function readFileSync( + path: PathOrFileDescriptor, + options: + | { + encoding: BufferEncoding; + flag?: string | undefined; + } + | BufferEncoding, + ): string; + /** + * Synchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + export function readFileSync( + path: PathOrFileDescriptor, + options?: + | (ObjectEncodingOptions & { + flag?: string | undefined; + }) + | BufferEncoding + | null, + ): string | Buffer; + export type WriteFileOptions = + | ( + & ObjectEncodingOptions + & Abortable + & { + mode?: Mode | undefined; + flag?: string | undefined; + flush?: boolean | undefined; + } + ) + | BufferEncoding + | null; + /** + * When `file` is a filename, asynchronously writes data to the file, replacing the + * file if it already exists. `data` can be a string or a buffer. + * + * When `file` is a file descriptor, the behavior is similar to calling`fs.write()` directly (which is recommended). See the notes below on using + * a file descriptor. + * + * The `encoding` option is ignored if `data` is a buffer. + * + * The `mode` option only affects the newly created file. See {@link open} for more details. + * + * ```js + * import { writeFile } from 'node:fs'; + * import { Buffer } from 'node:buffer'; + * + * const data = new Uint8Array(Buffer.from('Hello Node.js')); + * writeFile('message.txt', data, (err) => { + * if (err) throw err; + * console.log('The file has been saved!'); + * }); + * ``` + * + * If `options` is a string, then it specifies the encoding: + * + * ```js + * import { writeFile } from 'node:fs'; + * + * writeFile('message.txt', 'Hello Node.js', 'utf8', callback); + * ``` + * + * It is unsafe to use `fs.writeFile()` multiple times on the same file without + * waiting for the callback. For this scenario, {@link createWriteStream} is + * recommended. + * + * Similarly to `fs.readFile` \- `fs.writeFile` is a convenience method that + * performs multiple `write` calls internally to write the buffer passed to it. + * For performance sensitive code consider using {@link createWriteStream}. + * + * It is possible to use an `AbortSignal` to cancel an `fs.writeFile()`. + * Cancelation is "best effort", and some amount of data is likely still + * to be written. + * + * ```js + * import { writeFile } from 'node:fs'; + * import { Buffer } from 'node:buffer'; + * + * const controller = new AbortController(); + * const { signal } = controller; + * const data = new Uint8Array(Buffer.from('Hello Node.js')); + * writeFile('message.txt', data, { signal }, (err) => { + * // When a request is aborted - the callback is called with an AbortError + * }); + * // When the request should be aborted + * controller.abort(); + * ``` + * + * Aborting an ongoing request does not abort individual operating + * system requests but rather the internal buffering `fs.writeFile` performs. + * @since v0.1.29 + * @param file filename or file descriptor + */ + export function writeFile( + file: PathOrFileDescriptor, + data: string | NodeJS.ArrayBufferView, + options: WriteFileOptions, + callback: NoParamCallback, + ): void; + /** + * Asynchronously writes data to a file, replacing the file if it already exists. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. + */ + export function writeFile( + path: PathOrFileDescriptor, + data: string | NodeJS.ArrayBufferView, + callback: NoParamCallback, + ): void; + export namespace writeFile { + /** + * Asynchronously writes data to a file, replacing the file if it already exists. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. + * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. + * If `encoding` is not supplied, the default of `'utf8'` is used. + * If `mode` is not supplied, the default of `0o666` is used. + * If `mode` is a string, it is parsed as an octal integer. + * If `flag` is not supplied, the default of `'w'` is used. + */ + function __promisify__( + path: PathOrFileDescriptor, + data: string | NodeJS.ArrayBufferView, + options?: WriteFileOptions, + ): Promise; + } + /** + * Returns `undefined`. + * + * The `mode` option only affects the newly created file. See {@link open} for more details. + * + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link writeFile}. + * @since v0.1.29 + * @param file filename or file descriptor + */ + export function writeFileSync( + file: PathOrFileDescriptor, + data: string | NodeJS.ArrayBufferView, + options?: WriteFileOptions, + ): void; + /** + * Asynchronously append data to a file, creating the file if it does not yet + * exist. `data` can be a string or a `Buffer`. + * + * The `mode` option only affects the newly created file. See {@link open} for more details. + * + * ```js + * import { appendFile } from 'node:fs'; + * + * appendFile('message.txt', 'data to append', (err) => { + * if (err) throw err; + * console.log('The "data to append" was appended to file!'); + * }); + * ``` + * + * If `options` is a string, then it specifies the encoding: + * + * ```js + * import { appendFile } from 'node:fs'; + * + * appendFile('message.txt', 'data to append', 'utf8', callback); + * ``` + * + * The `path` may be specified as a numeric file descriptor that has been opened + * for appending (using `fs.open()` or `fs.openSync()`). The file descriptor will + * not be closed automatically. + * + * ```js + * import { open, close, appendFile } from 'node:fs'; + * + * function closeFd(fd) { + * close(fd, (err) => { + * if (err) throw err; + * }); + * } + * + * open('message.txt', 'a', (err, fd) => { + * if (err) throw err; + * + * try { + * appendFile(fd, 'data to append', 'utf8', (err) => { + * closeFd(fd); + * if (err) throw err; + * }); + * } catch (err) { + * closeFd(fd); + * throw err; + * } + * }); + * ``` + * @since v0.6.7 + * @param path filename or file descriptor + */ + export function appendFile( + path: PathOrFileDescriptor, + data: string | Uint8Array, + options: WriteFileOptions, + callback: NoParamCallback, + ): void; + /** + * Asynchronously append data to a file, creating the file if it does not exist. + * @param file A path to a file. If a URL is provided, it must use the `file:` protocol. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. + */ + export function appendFile(file: PathOrFileDescriptor, data: string | Uint8Array, callback: NoParamCallback): void; + export namespace appendFile { + /** + * Asynchronously append data to a file, creating the file if it does not exist. + * @param file A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. + * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. + * If `encoding` is not supplied, the default of `'utf8'` is used. + * If `mode` is not supplied, the default of `0o666` is used. + * If `mode` is a string, it is parsed as an octal integer. + * If `flag` is not supplied, the default of `'a'` is used. + */ + function __promisify__( + file: PathOrFileDescriptor, + data: string | Uint8Array, + options?: WriteFileOptions, + ): Promise; + } + /** + * Synchronously append data to a file, creating the file if it does not yet + * exist. `data` can be a string or a `Buffer`. + * + * The `mode` option only affects the newly created file. See {@link open} for more details. + * + * ```js + * import { appendFileSync } from 'node:fs'; + * + * try { + * appendFileSync('message.txt', 'data to append'); + * console.log('The "data to append" was appended to file!'); + * } catch (err) { + * // Handle the error + * } + * ``` + * + * If `options` is a string, then it specifies the encoding: + * + * ```js + * import { appendFileSync } from 'node:fs'; + * + * appendFileSync('message.txt', 'data to append', 'utf8'); + * ``` + * + * The `path` may be specified as a numeric file descriptor that has been opened + * for appending (using `fs.open()` or `fs.openSync()`). The file descriptor will + * not be closed automatically. + * + * ```js + * import { openSync, closeSync, appendFileSync } from 'node:fs'; + * + * let fd; + * + * try { + * fd = openSync('message.txt', 'a'); + * appendFileSync(fd, 'data to append', 'utf8'); + * } catch (err) { + * // Handle the error + * } finally { + * if (fd !== undefined) + * closeSync(fd); + * } + * ``` + * @since v0.6.7 + * @param path filename or file descriptor + */ + export function appendFileSync( + path: PathOrFileDescriptor, + data: string | Uint8Array, + options?: WriteFileOptions, + ): void; + /** + * Watch for changes on `filename`. The callback `listener` will be called each + * time the file is accessed. + * + * The `options` argument may be omitted. If provided, it should be an object. The`options` object may contain a boolean named `persistent` that indicates + * whether the process should continue to run as long as files are being watched. + * The `options` object may specify an `interval` property indicating how often the + * target should be polled in milliseconds. + * + * The `listener` gets two arguments the current stat object and the previous + * stat object: + * + * ```js + * import { watchFile } from 'fs'; + * + * watchFile('message.text', (curr, prev) => { + * console.log(`the current mtime is: ${curr.mtime}`); + * console.log(`the previous mtime was: ${prev.mtime}`); + * }); + * ``` + * + * These stat objects are instances of `fs.Stat`. If the `bigint` option is `true`, + * the numeric values in these objects are specified as `BigInt`s. + * + * To be notified when the file was modified, not just accessed, it is necessary + * to compare `curr.mtimeMs` and `prev.mtimeMs`. + * + * When an `fs.watchFile` operation results in an `ENOENT` error, it + * will invoke the listener once, with all the fields zeroed (or, for dates, the + * Unix Epoch). If the file is created later on, the listener will be called + * again, with the latest stat objects. This is a change in functionality since + * v0.10. + * + * Using {@link watch} is more efficient than `fs.watchFile` and`fs.unwatchFile`. `fs.watch` should be used instead of `fs.watchFile` and`fs.unwatchFile` when possible. + * + * When a file being watched by `fs.watchFile()` disappears and reappears, + * then the contents of `previous` in the second callback event (the file's + * reappearance) will be the same as the contents of `previous` in the first + * callback event (its disappearance). + * + * This happens when: + * + * * the file is deleted, followed by a restore + * * the file is renamed and then renamed a second time back to its original name + * @since v0.1.31 + */ + export interface WatchFileOptions { + bigint?: boolean | undefined; + persistent?: boolean | undefined; + interval?: number | undefined; + } + /** + * Watch for changes on `filename`. The callback `listener` will be called each + * time the file is accessed. + * + * The `options` argument may be omitted. If provided, it should be an object. The`options` object may contain a boolean named `persistent` that indicates + * whether the process should continue to run as long as files are being watched. + * The `options` object may specify an `interval` property indicating how often the + * target should be polled in milliseconds. + * + * The `listener` gets two arguments the current stat object and the previous + * stat object: + * + * ```js + * import { watchFile } from 'node:fs'; + * + * watchFile('message.text', (curr, prev) => { + * console.log(`the current mtime is: ${curr.mtime}`); + * console.log(`the previous mtime was: ${prev.mtime}`); + * }); + * ``` + * + * These stat objects are instances of `fs.Stat`. If the `bigint` option is `true`, + * the numeric values in these objects are specified as `BigInt`s. + * + * To be notified when the file was modified, not just accessed, it is necessary + * to compare `curr.mtimeMs` and `prev.mtimeMs`. + * + * When an `fs.watchFile` operation results in an `ENOENT` error, it + * will invoke the listener once, with all the fields zeroed (or, for dates, the + * Unix Epoch). If the file is created later on, the listener will be called + * again, with the latest stat objects. This is a change in functionality since + * v0.10. + * + * Using {@link watch} is more efficient than `fs.watchFile` and`fs.unwatchFile`. `fs.watch` should be used instead of `fs.watchFile` and`fs.unwatchFile` when possible. + * + * When a file being watched by `fs.watchFile()` disappears and reappears, + * then the contents of `previous` in the second callback event (the file's + * reappearance) will be the same as the contents of `previous` in the first + * callback event (its disappearance). + * + * This happens when: + * + * * the file is deleted, followed by a restore + * * the file is renamed and then renamed a second time back to its original name + * @since v0.1.31 + */ + export function watchFile( + filename: PathLike, + options: + | (WatchFileOptions & { + bigint?: false | undefined; + }) + | undefined, + listener: StatsListener, + ): StatWatcher; + export function watchFile( + filename: PathLike, + options: + | (WatchFileOptions & { + bigint: true; + }) + | undefined, + listener: BigIntStatsListener, + ): StatWatcher; + /** + * Watch for changes on `filename`. The callback `listener` will be called each time the file is accessed. + * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + */ + export function watchFile(filename: PathLike, listener: StatsListener): StatWatcher; + /** + * Stop watching for changes on `filename`. If `listener` is specified, only that + * particular listener is removed. Otherwise, _all_ listeners are removed, + * effectively stopping watching of `filename`. + * + * Calling `fs.unwatchFile()` with a filename that is not being watched is a + * no-op, not an error. + * + * Using {@link watch} is more efficient than `fs.watchFile()` and`fs.unwatchFile()`. `fs.watch()` should be used instead of `fs.watchFile()`and `fs.unwatchFile()` when possible. + * @since v0.1.31 + * @param listener Optional, a listener previously attached using `fs.watchFile()` + */ + export function unwatchFile(filename: PathLike, listener?: StatsListener): void; + export function unwatchFile(filename: PathLike, listener?: BigIntStatsListener): void; + export interface WatchOptions extends Abortable { + encoding?: BufferEncoding | "buffer" | undefined; + persistent?: boolean | undefined; + recursive?: boolean | undefined; + } + export type WatchEventType = "rename" | "change"; + export type WatchListener = (event: WatchEventType, filename: T | null) => void; + export type StatsListener = (curr: Stats, prev: Stats) => void; + export type BigIntStatsListener = (curr: BigIntStats, prev: BigIntStats) => void; + /** + * Watch for changes on `filename`, where `filename` is either a file or a + * directory. + * + * The second argument is optional. If `options` is provided as a string, it + * specifies the `encoding`. Otherwise `options` should be passed as an object. + * + * The listener callback gets two arguments `(eventType, filename)`. `eventType`is either `'rename'` or `'change'`, and `filename` is the name of the file + * which triggered the event. + * + * On most platforms, `'rename'` is emitted whenever a filename appears or + * disappears in the directory. + * + * The listener callback is attached to the `'change'` event fired by `fs.FSWatcher`, but it is not the same thing as the `'change'` value of`eventType`. + * + * If a `signal` is passed, aborting the corresponding AbortController will close + * the returned `fs.FSWatcher`. + * @since v0.5.10 + * @param listener + */ + export function watch( + filename: PathLike, + options: + | (WatchOptions & { + encoding: "buffer"; + }) + | "buffer", + listener?: WatchListener, + ): FSWatcher; + /** + * Watch for changes on `filename`, where `filename` is either a file or a directory, returning an `FSWatcher`. + * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + * @param options Either the encoding for the filename provided to the listener, or an object optionally specifying encoding, persistent, and recursive options. + * If `encoding` is not supplied, the default of `'utf8'` is used. + * If `persistent` is not supplied, the default of `true` is used. + * If `recursive` is not supplied, the default of `false` is used. + */ + export function watch( + filename: PathLike, + options?: WatchOptions | BufferEncoding | null, + listener?: WatchListener, + ): FSWatcher; + /** + * Watch for changes on `filename`, where `filename` is either a file or a directory, returning an `FSWatcher`. + * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + * @param options Either the encoding for the filename provided to the listener, or an object optionally specifying encoding, persistent, and recursive options. + * If `encoding` is not supplied, the default of `'utf8'` is used. + * If `persistent` is not supplied, the default of `true` is used. + * If `recursive` is not supplied, the default of `false` is used. + */ + export function watch( + filename: PathLike, + options: WatchOptions | string, + listener?: WatchListener, + ): FSWatcher; + /** + * Watch for changes on `filename`, where `filename` is either a file or a directory, returning an `FSWatcher`. + * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + */ + export function watch(filename: PathLike, listener?: WatchListener): FSWatcher; + /** + * Test whether or not the given path exists by checking with the file system. + * Then call the `callback` argument with either true or false: + * + * ```js + * import { exists } from 'node:fs'; + * + * exists('/etc/passwd', (e) => { + * console.log(e ? 'it exists' : 'no passwd!'); + * }); + * ``` + * + * **The parameters for this callback are not consistent with other Node.js** + * **callbacks.** Normally, the first parameter to a Node.js callback is an `err`parameter, optionally followed by other parameters. The `fs.exists()` callback + * has only one boolean parameter. This is one reason `fs.access()` is recommended + * instead of `fs.exists()`. + * + * Using `fs.exists()` to check for the existence of a file before calling`fs.open()`, `fs.readFile()`, or `fs.writeFile()` is not recommended. Doing + * so introduces a race condition, since other processes may change the file's + * state between the two calls. Instead, user code should open/read/write the + * file directly and handle the error raised if the file does not exist. + * + * **write (NOT RECOMMENDED)** + * + * ```js + * import { exists, open, close } from 'node:fs'; + * + * exists('myfile', (e) => { + * if (e) { + * console.error('myfile already exists'); + * } else { + * open('myfile', 'wx', (err, fd) => { + * if (err) throw err; + * + * try { + * writeMyData(fd); + * } finally { + * close(fd, (err) => { + * if (err) throw err; + * }); + * } + * }); + * } + * }); + * ``` + * + * **write (RECOMMENDED)** + * + * ```js + * import { open, close } from 'node:fs'; + * open('myfile', 'wx', (err, fd) => { + * if (err) { + * if (err.code === 'EEXIST') { + * console.error('myfile already exists'); + * return; + * } + * + * throw err; + * } + * + * try { + * writeMyData(fd); + * } finally { + * close(fd, (err) => { + * if (err) throw err; + * }); + * } + * }); + * ``` + * + * **read (NOT RECOMMENDED)** + * + * ```js + * import { open, close, exists } from 'node:fs'; + * + * exists('myfile', (e) => { + * if (e) { + * open('myfile', 'r', (err, fd) => { + * if (err) throw err; + * + * try { + * readMyData(fd); + * } finally { + * close(fd, (err) => { + * if (err) throw err; + * }); + * } + * }); + * } else { + * console.error('myfile does not exist'); + * } + * }); + * ``` + * + * **read (RECOMMENDED)** + * + * ```js + * import { open, close } from 'node:fs'; + * + * open('myfile', 'r', (err, fd) => { + * if (err) { + * if (err.code === 'ENOENT') { + * console.error('myfile does not exist'); + * return; + * } + * + * throw err; + * } + * + * try { + * readMyData(fd); + * } finally { + * close(fd, (err) => { + * if (err) throw err; + * }); + * } + * }); + * ``` + * + * The "not recommended" examples above check for existence and then use the + * file; the "recommended" examples are better because they use the file directly + * and handle the error, if any. + * + * In general, check for the existence of a file only if the file won't be + * used directly, for example when its existence is a signal from another + * process. + * @since v0.0.2 + * @deprecated Since v1.0.0 - Use {@link stat} or {@link access} instead. + */ + export function exists(path: PathLike, callback: (exists: boolean) => void): void; + /** @deprecated */ + export namespace exists { + /** + * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + */ + function __promisify__(path: PathLike): Promise; + } + /** + * Returns `true` if the path exists, `false` otherwise. + * + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link exists}. + * + * `fs.exists()` is deprecated, but `fs.existsSync()` is not. The `callback`parameter to `fs.exists()` accepts parameters that are inconsistent with other + * Node.js callbacks. `fs.existsSync()` does not use a callback. + * + * ```js + * import { existsSync } from 'node:fs'; + * + * if (existsSync('/etc/passwd')) + * console.log('The path exists.'); + * ``` + * @since v0.1.21 + */ + export function existsSync(path: PathLike): boolean; + export namespace constants { + // File Access Constants + /** Constant for fs.access(). File is visible to the calling process. */ + const F_OK: number; + /** Constant for fs.access(). File can be read by the calling process. */ + const R_OK: number; + /** Constant for fs.access(). File can be written by the calling process. */ + const W_OK: number; + /** Constant for fs.access(). File can be executed by the calling process. */ + const X_OK: number; + // File Copy Constants + /** Constant for fs.copyFile. Flag indicating the destination file should not be overwritten if it already exists. */ + const COPYFILE_EXCL: number; + /** + * Constant for fs.copyFile. copy operation will attempt to create a copy-on-write reflink. + * If the underlying platform does not support copy-on-write, then a fallback copy mechanism is used. + */ + const COPYFILE_FICLONE: number; + /** + * Constant for fs.copyFile. Copy operation will attempt to create a copy-on-write reflink. + * If the underlying platform does not support copy-on-write, then the operation will fail with an error. + */ + const COPYFILE_FICLONE_FORCE: number; + // File Open Constants + /** Constant for fs.open(). Flag indicating to open a file for read-only access. */ + const O_RDONLY: number; + /** Constant for fs.open(). Flag indicating to open a file for write-only access. */ + const O_WRONLY: number; + /** Constant for fs.open(). Flag indicating to open a file for read-write access. */ + const O_RDWR: number; + /** Constant for fs.open(). Flag indicating to create the file if it does not already exist. */ + const O_CREAT: number; + /** Constant for fs.open(). Flag indicating that opening a file should fail if the O_CREAT flag is set and the file already exists. */ + const O_EXCL: number; + /** + * Constant for fs.open(). Flag indicating that if path identifies a terminal device, + * opening the path shall not cause that terminal to become the controlling terminal for the process + * (if the process does not already have one). + */ + const O_NOCTTY: number; + /** Constant for fs.open(). Flag indicating that if the file exists and is a regular file, and the file is opened successfully for write access, its length shall be truncated to zero. */ + const O_TRUNC: number; + /** Constant for fs.open(). Flag indicating that data will be appended to the end of the file. */ + const O_APPEND: number; + /** Constant for fs.open(). Flag indicating that the open should fail if the path is not a directory. */ + const O_DIRECTORY: number; + /** + * constant for fs.open(). + * Flag indicating reading accesses to the file system will no longer result in + * an update to the atime information associated with the file. + * This flag is available on Linux operating systems only. + */ + const O_NOATIME: number; + /** Constant for fs.open(). Flag indicating that the open should fail if the path is a symbolic link. */ + const O_NOFOLLOW: number; + /** Constant for fs.open(). Flag indicating that the file is opened for synchronous I/O. */ + const O_SYNC: number; + /** Constant for fs.open(). Flag indicating that the file is opened for synchronous I/O with write operations waiting for data integrity. */ + const O_DSYNC: number; + /** Constant for fs.open(). Flag indicating to open the symbolic link itself rather than the resource it is pointing to. */ + const O_SYMLINK: number; + /** Constant for fs.open(). When set, an attempt will be made to minimize caching effects of file I/O. */ + const O_DIRECT: number; + /** Constant for fs.open(). Flag indicating to open the file in nonblocking mode when possible. */ + const O_NONBLOCK: number; + // File Type Constants + /** Constant for fs.Stats mode property for determining a file's type. Bit mask used to extract the file type code. */ + const S_IFMT: number; + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a regular file. */ + const S_IFREG: number; + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a directory. */ + const S_IFDIR: number; + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a character-oriented device file. */ + const S_IFCHR: number; + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a block-oriented device file. */ + const S_IFBLK: number; + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a FIFO/pipe. */ + const S_IFIFO: number; + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a symbolic link. */ + const S_IFLNK: number; + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a socket. */ + const S_IFSOCK: number; + // File Mode Constants + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable, writable and executable by owner. */ + const S_IRWXU: number; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable by owner. */ + const S_IRUSR: number; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating writable by owner. */ + const S_IWUSR: number; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating executable by owner. */ + const S_IXUSR: number; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable, writable and executable by group. */ + const S_IRWXG: number; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable by group. */ + const S_IRGRP: number; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating writable by group. */ + const S_IWGRP: number; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating executable by group. */ + const S_IXGRP: number; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable, writable and executable by others. */ + const S_IRWXO: number; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable by others. */ + const S_IROTH: number; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating writable by others. */ + const S_IWOTH: number; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating executable by others. */ + const S_IXOTH: number; + /** + * When set, a memory file mapping is used to access the file. This flag + * is available on Windows operating systems only. On other operating systems, + * this flag is ignored. + */ + const UV_FS_O_FILEMAP: number; + } + /** + * Tests a user's permissions for the file or directory specified by `path`. + * The `mode` argument is an optional integer that specifies the accessibility + * checks to be performed. `mode` should be either the value `fs.constants.F_OK`or a mask consisting of the bitwise OR of any of `fs.constants.R_OK`,`fs.constants.W_OK`, and `fs.constants.X_OK` + * (e.g.`fs.constants.W_OK | fs.constants.R_OK`). Check `File access constants` for + * possible values of `mode`. + * + * The final argument, `callback`, is a callback function that is invoked with + * a possible error argument. If any of the accessibility checks fail, the error + * argument will be an `Error` object. The following examples check if`package.json` exists, and if it is readable or writable. + * + * ```js + * import { access, constants } from 'node:fs'; + * + * const file = 'package.json'; + * + * // Check if the file exists in the current directory. + * access(file, constants.F_OK, (err) => { + * console.log(`${file} ${err ? 'does not exist' : 'exists'}`); + * }); + * + * // Check if the file is readable. + * access(file, constants.R_OK, (err) => { + * console.log(`${file} ${err ? 'is not readable' : 'is readable'}`); + * }); + * + * // Check if the file is writable. + * access(file, constants.W_OK, (err) => { + * console.log(`${file} ${err ? 'is not writable' : 'is writable'}`); + * }); + * + * // Check if the file is readable and writable. + * access(file, constants.R_OK | constants.W_OK, (err) => { + * console.log(`${file} ${err ? 'is not' : 'is'} readable and writable`); + * }); + * ``` + * + * Do not use `fs.access()` to check for the accessibility of a file before calling`fs.open()`, `fs.readFile()`, or `fs.writeFile()`. Doing + * so introduces a race condition, since other processes may change the file's + * state between the two calls. Instead, user code should open/read/write the + * file directly and handle the error raised if the file is not accessible. + * + * **write (NOT RECOMMENDED)** + * + * ```js + * import { access, open, close } from 'node:fs'; + * + * access('myfile', (err) => { + * if (!err) { + * console.error('myfile already exists'); + * return; + * } + * + * open('myfile', 'wx', (err, fd) => { + * if (err) throw err; + * + * try { + * writeMyData(fd); + * } finally { + * close(fd, (err) => { + * if (err) throw err; + * }); + * } + * }); + * }); + * ``` + * + * **write (RECOMMENDED)** + * + * ```js + * import { open, close } from 'node:fs'; + * + * open('myfile', 'wx', (err, fd) => { + * if (err) { + * if (err.code === 'EEXIST') { + * console.error('myfile already exists'); + * return; + * } + * + * throw err; + * } + * + * try { + * writeMyData(fd); + * } finally { + * close(fd, (err) => { + * if (err) throw err; + * }); + * } + * }); + * ``` + * + * **read (NOT RECOMMENDED)** + * + * ```js + * import { access, open, close } from 'node:fs'; + * access('myfile', (err) => { + * if (err) { + * if (err.code === 'ENOENT') { + * console.error('myfile does not exist'); + * return; + * } + * + * throw err; + * } + * + * open('myfile', 'r', (err, fd) => { + * if (err) throw err; + * + * try { + * readMyData(fd); + * } finally { + * close(fd, (err) => { + * if (err) throw err; + * }); + * } + * }); + * }); + * ``` + * + * **read (RECOMMENDED)** + * + * ```js + * import { open, close } from 'node:fs'; + * + * open('myfile', 'r', (err, fd) => { + * if (err) { + * if (err.code === 'ENOENT') { + * console.error('myfile does not exist'); + * return; + * } + * + * throw err; + * } + * + * try { + * readMyData(fd); + * } finally { + * close(fd, (err) => { + * if (err) throw err; + * }); + * } + * }); + * ``` + * + * The "not recommended" examples above check for accessibility and then use the + * file; the "recommended" examples are better because they use the file directly + * and handle the error, if any. + * + * In general, check for the accessibility of a file only if the file will not be + * used directly, for example when its accessibility is a signal from another + * process. + * + * On Windows, access-control policies (ACLs) on a directory may limit access to + * a file or directory. The `fs.access()` function, however, does not check the + * ACL and therefore may report that a path is accessible even if the ACL restricts + * the user from reading or writing to it. + * @since v0.11.15 + * @param [mode=fs.constants.F_OK] + */ + export function access(path: PathLike, mode: number | undefined, callback: NoParamCallback): void; + /** + * Asynchronously tests a user's permissions for the file specified by path. + * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + */ + export function access(path: PathLike, callback: NoParamCallback): void; + export namespace access { + /** + * Asynchronously tests a user's permissions for the file specified by path. + * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + */ + function __promisify__(path: PathLike, mode?: number): Promise; + } + /** + * Synchronously tests a user's permissions for the file or directory specified + * by `path`. The `mode` argument is an optional integer that specifies the + * accessibility checks to be performed. `mode` should be either the value`fs.constants.F_OK` or a mask consisting of the bitwise OR of any of`fs.constants.R_OK`, `fs.constants.W_OK`, and + * `fs.constants.X_OK` (e.g.`fs.constants.W_OK | fs.constants.R_OK`). Check `File access constants` for + * possible values of `mode`. + * + * If any of the accessibility checks fail, an `Error` will be thrown. Otherwise, + * the method will return `undefined`. + * + * ```js + * import { accessSync, constants } from 'node:fs'; + * + * try { + * accessSync('etc/passwd', constants.R_OK | constants.W_OK); + * console.log('can read/write'); + * } catch (err) { + * console.error('no access!'); + * } + * ``` + * @since v0.11.15 + * @param [mode=fs.constants.F_OK] + */ + export function accessSync(path: PathLike, mode?: number): void; + interface StreamOptions { + flags?: string | undefined; + encoding?: BufferEncoding | undefined; + fd?: number | promises.FileHandle | undefined; + mode?: number | undefined; + autoClose?: boolean | undefined; + emitClose?: boolean | undefined; + start?: number | undefined; + signal?: AbortSignal | null | undefined; + highWaterMark?: number | undefined; + } + interface FSImplementation { + open?: (...args: any[]) => any; + close?: (...args: any[]) => any; + } + interface CreateReadStreamFSImplementation extends FSImplementation { + read: (...args: any[]) => any; + } + interface CreateWriteStreamFSImplementation extends FSImplementation { + write: (...args: any[]) => any; + writev?: (...args: any[]) => any; + } + interface ReadStreamOptions extends StreamOptions { + fs?: CreateReadStreamFSImplementation | null | undefined; + end?: number | undefined; + } + interface WriteStreamOptions extends StreamOptions { + fs?: CreateWriteStreamFSImplementation | null | undefined; + flush?: boolean | undefined; + } + /** + * Unlike the 16 KiB default `highWaterMark` for a `stream.Readable`, the stream + * returned by this method has a default `highWaterMark` of 64 KiB. + * + * `options` can include `start` and `end` values to read a range of bytes from + * the file instead of the entire file. Both `start` and `end` are inclusive and + * start counting at 0, allowed values are in the + * \[0, [`Number.MAX_SAFE_INTEGER`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)\] range. If `fd` is specified and `start` is + * omitted or `undefined`, `fs.createReadStream()` reads sequentially from the + * current file position. The `encoding` can be any one of those accepted by `Buffer`. + * + * If `fd` is specified, `ReadStream` will ignore the `path` argument and will use + * the specified file descriptor. This means that no `'open'` event will be + * emitted. `fd` should be blocking; non-blocking `fd`s should be passed to `net.Socket`. + * + * If `fd` points to a character device that only supports blocking reads + * (such as keyboard or sound card), read operations do not finish until data is + * available. This can prevent the process from exiting and the stream from + * closing naturally. + * + * By default, the stream will emit a `'close'` event after it has been + * destroyed. Set the `emitClose` option to `false` to change this behavior. + * + * By providing the `fs` option, it is possible to override the corresponding `fs`implementations for `open`, `read`, and `close`. When providing the `fs` option, + * an override for `read` is required. If no `fd` is provided, an override for`open` is also required. If `autoClose` is `true`, an override for `close` is + * also required. + * + * ```js + * import { createReadStream } from 'node:fs'; + * + * // Create a stream from some character device. + * const stream = createReadStream('/dev/input/event0'); + * setTimeout(() => { + * stream.close(); // This may not close the stream. + * // Artificially marking end-of-stream, as if the underlying resource had + * // indicated end-of-file by itself, allows the stream to close. + * // This does not cancel pending read operations, and if there is such an + * // operation, the process may still not be able to exit successfully + * // until it finishes. + * stream.push(null); + * stream.read(0); + * }, 100); + * ``` + * + * If `autoClose` is false, then the file descriptor won't be closed, even if + * there's an error. It is the application's responsibility to close it and make + * sure there's no file descriptor leak. If `autoClose` is set to true (default + * behavior), on `'error'` or `'end'` the file descriptor will be closed + * automatically. + * + * `mode` sets the file mode (permission and sticky bits), but only if the + * file was created. + * + * An example to read the last 10 bytes of a file which is 100 bytes long: + * + * ```js + * import { createReadStream } from 'node:fs'; + * + * createReadStream('sample.txt', { start: 90, end: 99 }); + * ``` + * + * If `options` is a string, then it specifies the encoding. + * @since v0.1.31 + */ + export function createReadStream(path: PathLike, options?: BufferEncoding | ReadStreamOptions): ReadStream; + /** + * `options` may also include a `start` option to allow writing data at some + * position past the beginning of the file, allowed values are in the + * \[0, [`Number.MAX_SAFE_INTEGER`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)\] range. Modifying a file rather than + * replacing it may require the `flags` option to be set to `r+` rather than the + * default `w`. The `encoding` can be any one of those accepted by `Buffer`. + * + * If `autoClose` is set to true (default behavior) on `'error'` or `'finish'`the file descriptor will be closed automatically. If `autoClose` is false, + * then the file descriptor won't be closed, even if there's an error. + * It is the application's responsibility to close it and make sure there's no + * file descriptor leak. + * + * By default, the stream will emit a `'close'` event after it has been + * destroyed. Set the `emitClose` option to `false` to change this behavior. + * + * By providing the `fs` option it is possible to override the corresponding `fs`implementations for `open`, `write`, `writev`, and `close`. Overriding `write()`without `writev()` can reduce + * performance as some optimizations (`_writev()`) + * will be disabled. When providing the `fs` option, overrides for at least one of`write` and `writev` are required. If no `fd` option is supplied, an override + * for `open` is also required. If `autoClose` is `true`, an override for `close`is also required. + * + * Like `fs.ReadStream`, if `fd` is specified, `fs.WriteStream` will ignore the`path` argument and will use the specified file descriptor. This means that no`'open'` event will be + * emitted. `fd` should be blocking; non-blocking `fd`s + * should be passed to `net.Socket`. + * + * If `options` is a string, then it specifies the encoding. + * @since v0.1.31 + */ + export function createWriteStream(path: PathLike, options?: BufferEncoding | WriteStreamOptions): WriteStream; + /** + * Forces all currently queued I/O operations associated with the file to the + * operating system's synchronized I/O completion state. Refer to the POSIX [`fdatasync(2)`](http://man7.org/linux/man-pages/man2/fdatasync.2.html) documentation for details. No arguments other + * than a possible + * exception are given to the completion callback. + * @since v0.1.96 + */ + export function fdatasync(fd: number, callback: NoParamCallback): void; + export namespace fdatasync { + /** + * Asynchronous fdatasync(2) - synchronize a file's in-core state with storage device. + * @param fd A file descriptor. + */ + function __promisify__(fd: number): Promise; + } + /** + * Forces all currently queued I/O operations associated with the file to the + * operating system's synchronized I/O completion state. Refer to the POSIX [`fdatasync(2)`](http://man7.org/linux/man-pages/man2/fdatasync.2.html) documentation for details. Returns `undefined`. + * @since v0.1.96 + */ + export function fdatasyncSync(fd: number): void; + /** + * Asynchronously copies `src` to `dest`. By default, `dest` is overwritten if it + * already exists. No arguments other than a possible exception are given to the + * callback function. Node.js makes no guarantees about the atomicity of the copy + * operation. If an error occurs after the destination file has been opened for + * writing, Node.js will attempt to remove the destination. + * + * `mode` is an optional integer that specifies the behavior + * of the copy operation. It is possible to create a mask consisting of the bitwise + * OR of two or more values (e.g.`fs.constants.COPYFILE_EXCL | fs.constants.COPYFILE_FICLONE`). + * + * * `fs.constants.COPYFILE_EXCL`: The copy operation will fail if `dest` already + * exists. + * * `fs.constants.COPYFILE_FICLONE`: The copy operation will attempt to create a + * copy-on-write reflink. If the platform does not support copy-on-write, then a + * fallback copy mechanism is used. + * * `fs.constants.COPYFILE_FICLONE_FORCE`: The copy operation will attempt to + * create a copy-on-write reflink. If the platform does not support + * copy-on-write, then the operation will fail. + * + * ```js + * import { copyFile, constants } from 'node:fs'; + * + * function callback(err) { + * if (err) throw err; + * console.log('source.txt was copied to destination.txt'); + * } + * + * // destination.txt will be created or overwritten by default. + * copyFile('source.txt', 'destination.txt', callback); + * + * // By using COPYFILE_EXCL, the operation will fail if destination.txt exists. + * copyFile('source.txt', 'destination.txt', constants.COPYFILE_EXCL, callback); + * ``` + * @since v8.5.0 + * @param src source filename to copy + * @param dest destination filename of the copy operation + * @param [mode=0] modifiers for copy operation. + */ + export function copyFile(src: PathLike, dest: PathLike, callback: NoParamCallback): void; + export function copyFile(src: PathLike, dest: PathLike, mode: number, callback: NoParamCallback): void; + export namespace copyFile { + function __promisify__(src: PathLike, dst: PathLike, mode?: number): Promise; + } + /** + * Synchronously copies `src` to `dest`. By default, `dest` is overwritten if it + * already exists. Returns `undefined`. Node.js makes no guarantees about the + * atomicity of the copy operation. If an error occurs after the destination file + * has been opened for writing, Node.js will attempt to remove the destination. + * + * `mode` is an optional integer that specifies the behavior + * of the copy operation. It is possible to create a mask consisting of the bitwise + * OR of two or more values (e.g.`fs.constants.COPYFILE_EXCL | fs.constants.COPYFILE_FICLONE`). + * + * * `fs.constants.COPYFILE_EXCL`: The copy operation will fail if `dest` already + * exists. + * * `fs.constants.COPYFILE_FICLONE`: The copy operation will attempt to create a + * copy-on-write reflink. If the platform does not support copy-on-write, then a + * fallback copy mechanism is used. + * * `fs.constants.COPYFILE_FICLONE_FORCE`: The copy operation will attempt to + * create a copy-on-write reflink. If the platform does not support + * copy-on-write, then the operation will fail. + * + * ```js + * import { copyFileSync, constants } from 'node:fs'; + * + * // destination.txt will be created or overwritten by default. + * copyFileSync('source.txt', 'destination.txt'); + * console.log('source.txt was copied to destination.txt'); + * + * // By using COPYFILE_EXCL, the operation will fail if destination.txt exists. + * copyFileSync('source.txt', 'destination.txt', constants.COPYFILE_EXCL); + * ``` + * @since v8.5.0 + * @param src source filename to copy + * @param dest destination filename of the copy operation + * @param [mode=0] modifiers for copy operation. + */ + export function copyFileSync(src: PathLike, dest: PathLike, mode?: number): void; + /** + * Write an array of `ArrayBufferView`s to the file specified by `fd` using`writev()`. + * + * `position` is the offset from the beginning of the file where this data + * should be written. If `typeof position !== 'number'`, the data will be written + * at the current position. + * + * The callback will be given three arguments: `err`, `bytesWritten`, and`buffers`. `bytesWritten` is how many bytes were written from `buffers`. + * + * If this method is `util.promisify()` ed, it returns a promise for an`Object` with `bytesWritten` and `buffers` properties. + * + * It is unsafe to use `fs.writev()` multiple times on the same file without + * waiting for the callback. For this scenario, use {@link createWriteStream}. + * + * On Linux, positional writes don't work when the file is opened in append mode. + * The kernel ignores the position argument and always appends the data to + * the end of the file. + * @since v12.9.0 + * @param [position='null'] + */ + export function writev( + fd: number, + buffers: readonly NodeJS.ArrayBufferView[], + cb: (err: NodeJS.ErrnoException | null, bytesWritten: number, buffers: NodeJS.ArrayBufferView[]) => void, + ): void; + export function writev( + fd: number, + buffers: readonly NodeJS.ArrayBufferView[], + position: number, + cb: (err: NodeJS.ErrnoException | null, bytesWritten: number, buffers: NodeJS.ArrayBufferView[]) => void, + ): void; + export interface WriteVResult { + bytesWritten: number; + buffers: NodeJS.ArrayBufferView[]; + } + export namespace writev { + function __promisify__( + fd: number, + buffers: readonly NodeJS.ArrayBufferView[], + position?: number, + ): Promise; + } + /** + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link writev}. + * @since v12.9.0 + * @param [position='null'] + * @return The number of bytes written. + */ + export function writevSync(fd: number, buffers: readonly NodeJS.ArrayBufferView[], position?: number): number; + /** + * Read from a file specified by `fd` and write to an array of `ArrayBufferView`s + * using `readv()`. + * + * `position` is the offset from the beginning of the file from where data + * should be read. If `typeof position !== 'number'`, the data will be read + * from the current position. + * + * The callback will be given three arguments: `err`, `bytesRead`, and`buffers`. `bytesRead` is how many bytes were read from the file. + * + * If this method is invoked as its `util.promisify()` ed version, it returns + * a promise for an `Object` with `bytesRead` and `buffers` properties. + * @since v13.13.0, v12.17.0 + * @param [position='null'] + */ + export function readv( + fd: number, + buffers: readonly NodeJS.ArrayBufferView[], + cb: (err: NodeJS.ErrnoException | null, bytesRead: number, buffers: NodeJS.ArrayBufferView[]) => void, + ): void; + export function readv( + fd: number, + buffers: readonly NodeJS.ArrayBufferView[], + position: number, + cb: (err: NodeJS.ErrnoException | null, bytesRead: number, buffers: NodeJS.ArrayBufferView[]) => void, + ): void; + export interface ReadVResult { + bytesRead: number; + buffers: NodeJS.ArrayBufferView[]; + } + export namespace readv { + function __promisify__( + fd: number, + buffers: readonly NodeJS.ArrayBufferView[], + position?: number, + ): Promise; + } + /** + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link readv}. + * @since v13.13.0, v12.17.0 + * @param [position='null'] + * @return The number of bytes read. + */ + export function readvSync(fd: number, buffers: readonly NodeJS.ArrayBufferView[], position?: number): number; + + export interface OpenAsBlobOptions { + /** + * An optional mime type for the blob. + * + * @default 'undefined' + */ + type?: string | undefined; + } + + /** + * Returns a `Blob` whose data is backed by the given file. + * + * The file must not be modified after the `Blob` is created. Any modifications + * will cause reading the `Blob` data to fail with a `DOMException` error. + * Synchronous stat operations on the file when the `Blob` is created, and before + * each read in order to detect whether the file data has been modified on disk. + * + * ```js + * import { openAsBlob } from 'node:fs'; + * + * const blob = await openAsBlob('the.file.txt'); + * const ab = await blob.arrayBuffer(); + * blob.stream(); + * ``` + * @since v19.8.0 + * @experimental + */ + export function openAsBlob(path: PathLike, options?: OpenAsBlobOptions): Promise; + + export interface OpenDirOptions { + /** + * @default 'utf8' + */ + encoding?: BufferEncoding | undefined; + /** + * Number of directory entries that are buffered + * internally when reading from the directory. Higher values lead to better + * performance but higher memory usage. + * @default 32 + */ + bufferSize?: number | undefined; + /** + * @default false + */ + recursive?: boolean; + } + /** + * Synchronously open a directory. See [`opendir(3)`](http://man7.org/linux/man-pages/man3/opendir.3.html). + * + * Creates an `fs.Dir`, which contains all further functions for reading from + * and cleaning up the directory. + * + * The `encoding` option sets the encoding for the `path` while opening the + * directory and subsequent read operations. + * @since v12.12.0 + */ + export function opendirSync(path: PathLike, options?: OpenDirOptions): Dir; + /** + * Asynchronously open a directory. See the POSIX [`opendir(3)`](http://man7.org/linux/man-pages/man3/opendir.3.html) documentation for + * more details. + * + * Creates an `fs.Dir`, which contains all further functions for reading from + * and cleaning up the directory. + * + * The `encoding` option sets the encoding for the `path` while opening the + * directory and subsequent read operations. + * @since v12.12.0 + */ + export function opendir(path: PathLike, cb: (err: NodeJS.ErrnoException | null, dir: Dir) => void): void; + export function opendir( + path: PathLike, + options: OpenDirOptions, + cb: (err: NodeJS.ErrnoException | null, dir: Dir) => void, + ): void; + export namespace opendir { + function __promisify__(path: PathLike, options?: OpenDirOptions): Promise; + } + export interface BigIntStats extends StatsBase { + atimeNs: bigint; + mtimeNs: bigint; + ctimeNs: bigint; + birthtimeNs: bigint; + } + export interface BigIntOptions { + bigint: true; + } + export interface StatOptions { + bigint?: boolean | undefined; + } + export interface StatSyncOptions extends StatOptions { + throwIfNoEntry?: boolean | undefined; + } + interface CopyOptionsBase { + /** + * Dereference symlinks + * @default false + */ + dereference?: boolean; + /** + * When `force` is `false`, and the destination + * exists, throw an error. + * @default false + */ + errorOnExist?: boolean; + /** + * Overwrite existing file or directory. _The copy + * operation will ignore errors if you set this to false and the destination + * exists. Use the `errorOnExist` option to change this behavior. + * @default true + */ + force?: boolean; + /** + * Modifiers for copy operation. See `mode` flag of {@link copyFileSync()} + */ + mode?: number; + /** + * When `true` timestamps from `src` will + * be preserved. + * @default false + */ + preserveTimestamps?: boolean; + /** + * Copy directories recursively. + * @default false + */ + recursive?: boolean; + /** + * When true, path resolution for symlinks will be skipped + * @default false + */ + verbatimSymlinks?: boolean; + } + export interface CopyOptions extends CopyOptionsBase { + /** + * Function to filter copied files/directories. Return + * `true` to copy the item, `false` to ignore it. + */ + filter?(source: string, destination: string): boolean | Promise; + } + export interface CopySyncOptions extends CopyOptionsBase { + /** + * Function to filter copied files/directories. Return + * `true` to copy the item, `false` to ignore it. + */ + filter?(source: string, destination: string): boolean; + } + /** + * Asynchronously copies the entire directory structure from `src` to `dest`, + * including subdirectories and files. + * + * When copying a directory to another directory, globs are not supported and + * behavior is similar to `cp dir1/ dir2/`. + * @since v16.7.0 + * @experimental + * @param src source path to copy. + * @param dest destination path to copy to. + */ + export function cp( + source: string | URL, + destination: string | URL, + callback: (err: NodeJS.ErrnoException | null) => void, + ): void; + export function cp( + source: string | URL, + destination: string | URL, + opts: CopyOptions, + callback: (err: NodeJS.ErrnoException | null) => void, + ): void; + /** + * Synchronously copies the entire directory structure from `src` to `dest`, + * including subdirectories and files. + * + * When copying a directory to another directory, globs are not supported and + * behavior is similar to `cp dir1/ dir2/`. + * @since v16.7.0 + * @experimental + * @param src source path to copy. + * @param dest destination path to copy to. + */ + export function cpSync(source: string | URL, destination: string | URL, opts?: CopySyncOptions): void; +} +declare module "node:fs" { + export * from "fs"; +} diff --git a/task/node_modules/@types/node/fs/promises.d.ts b/task/node_modules/@types/node/fs/promises.d.ts new file mode 100644 index 0000000..88a9fc3 --- /dev/null +++ b/task/node_modules/@types/node/fs/promises.d.ts @@ -0,0 +1,1239 @@ +/** + * The `fs/promises` API provides asynchronous file system methods that return + * promises. + * + * The promise APIs use the underlying Node.js threadpool to perform file + * system operations off the event loop thread. These operations are not + * synchronized or threadsafe. Care must be taken when performing multiple + * concurrent modifications on the same file or data corruption may occur. + * @since v10.0.0 + */ +declare module "fs/promises" { + import { Abortable } from "node:events"; + import { Stream } from "node:stream"; + import { ReadableStream } from "node:stream/web"; + import { + BigIntStats, + BigIntStatsFs, + BufferEncodingOption, + constants as fsConstants, + CopyOptions, + Dir, + Dirent, + MakeDirectoryOptions, + Mode, + ObjectEncodingOptions, + OpenDirOptions, + OpenMode, + PathLike, + ReadStream, + ReadVResult, + RmDirOptions, + RmOptions, + StatFsOptions, + StatOptions, + Stats, + StatsFs, + TimeLike, + WatchEventType, + WatchOptions, + WriteStream, + WriteVResult, + } from "node:fs"; + import { Interface as ReadlineInterface } from "node:readline"; + interface FileChangeInfo { + eventType: WatchEventType; + filename: T | null; + } + interface FlagAndOpenMode { + mode?: Mode | undefined; + flag?: OpenMode | undefined; + } + interface FileReadResult { + bytesRead: number; + buffer: T; + } + interface FileReadOptions { + /** + * @default `Buffer.alloc(0xffff)` + */ + buffer?: T; + /** + * @default 0 + */ + offset?: number | null; + /** + * @default `buffer.byteLength` + */ + length?: number | null; + position?: number | null; + } + interface CreateReadStreamOptions { + encoding?: BufferEncoding | null | undefined; + autoClose?: boolean | undefined; + emitClose?: boolean | undefined; + start?: number | undefined; + end?: number | undefined; + highWaterMark?: number | undefined; + } + interface CreateWriteStreamOptions { + encoding?: BufferEncoding | null | undefined; + autoClose?: boolean | undefined; + emitClose?: boolean | undefined; + start?: number | undefined; + highWaterMark?: number | undefined; + flush?: boolean | undefined; + } + interface ReadableWebStreamOptions { + /** + * Whether to open a normal or a `'bytes'` stream. + * @since v20.0.0 + */ + type?: "bytes" | undefined; + } + // TODO: Add `EventEmitter` close + interface FileHandle { + /** + * The numeric file descriptor managed by the {FileHandle} object. + * @since v10.0.0 + */ + readonly fd: number; + /** + * Alias of `filehandle.writeFile()`. + * + * When operating on file handles, the mode cannot be changed from what it was set + * to with `fsPromises.open()`. Therefore, this is equivalent to `filehandle.writeFile()`. + * @since v10.0.0 + * @return Fulfills with `undefined` upon success. + */ + appendFile( + data: string | Uint8Array, + options?: + | (ObjectEncodingOptions & FlagAndOpenMode & { flush?: boolean | undefined }) + | BufferEncoding + | null, + ): Promise; + /** + * Changes the ownership of the file. A wrapper for [`chown(2)`](http://man7.org/linux/man-pages/man2/chown.2.html). + * @since v10.0.0 + * @param uid The file's new owner's user id. + * @param gid The file's new group's group id. + * @return Fulfills with `undefined` upon success. + */ + chown(uid: number, gid: number): Promise; + /** + * Modifies the permissions on the file. See [`chmod(2)`](http://man7.org/linux/man-pages/man2/chmod.2.html). + * @since v10.0.0 + * @param mode the file mode bit mask. + * @return Fulfills with `undefined` upon success. + */ + chmod(mode: Mode): Promise; + /** + * Unlike the 16 KiB default `highWaterMark` for a `stream.Readable`, the stream + * returned by this method has a default `highWaterMark` of 64 KiB. + * + * `options` can include `start` and `end` values to read a range of bytes from + * the file instead of the entire file. Both `start` and `end` are inclusive and + * start counting at 0, allowed values are in the + * \[0, [`Number.MAX_SAFE_INTEGER`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)\] range. If `start` is + * omitted or `undefined`, `filehandle.createReadStream()` reads sequentially from + * the current file position. The `encoding` can be any one of those accepted by `Buffer`. + * + * If the `FileHandle` points to a character device that only supports blocking + * reads (such as keyboard or sound card), read operations do not finish until data + * is available. This can prevent the process from exiting and the stream from + * closing naturally. + * + * By default, the stream will emit a `'close'` event after it has been + * destroyed. Set the `emitClose` option to `false` to change this behavior. + * + * ```js + * import { open } from 'node:fs/promises'; + * + * const fd = await open('/dev/input/event0'); + * // Create a stream from some character device. + * const stream = fd.createReadStream(); + * setTimeout(() => { + * stream.close(); // This may not close the stream. + * // Artificially marking end-of-stream, as if the underlying resource had + * // indicated end-of-file by itself, allows the stream to close. + * // This does not cancel pending read operations, and if there is such an + * // operation, the process may still not be able to exit successfully + * // until it finishes. + * stream.push(null); + * stream.read(0); + * }, 100); + * ``` + * + * If `autoClose` is false, then the file descriptor won't be closed, even if + * there's an error. It is the application's responsibility to close it and make + * sure there's no file descriptor leak. If `autoClose` is set to true (default + * behavior), on `'error'` or `'end'` the file descriptor will be closed + * automatically. + * + * An example to read the last 10 bytes of a file which is 100 bytes long: + * + * ```js + * import { open } from 'node:fs/promises'; + * + * const fd = await open('sample.txt'); + * fd.createReadStream({ start: 90, end: 99 }); + * ``` + * @since v16.11.0 + */ + createReadStream(options?: CreateReadStreamOptions): ReadStream; + /** + * `options` may also include a `start` option to allow writing data at some + * position past the beginning of the file, allowed values are in the + * \[0, [`Number.MAX_SAFE_INTEGER`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)\] range. Modifying a file rather than + * replacing it may require the `flags` `open` option to be set to `r+` rather than + * the default `r`. The `encoding` can be any one of those accepted by `Buffer`. + * + * If `autoClose` is set to true (default behavior) on `'error'` or `'finish'`the file descriptor will be closed automatically. If `autoClose` is false, + * then the file descriptor won't be closed, even if there's an error. + * It is the application's responsibility to close it and make sure there's no + * file descriptor leak. + * + * By default, the stream will emit a `'close'` event after it has been + * destroyed. Set the `emitClose` option to `false` to change this behavior. + * @since v16.11.0 + */ + createWriteStream(options?: CreateWriteStreamOptions): WriteStream; + /** + * Forces all currently queued I/O operations associated with the file to the + * operating system's synchronized I/O completion state. Refer to the POSIX [`fdatasync(2)`](http://man7.org/linux/man-pages/man2/fdatasync.2.html) documentation for details. + * + * Unlike `filehandle.sync` this method does not flush modified metadata. + * @since v10.0.0 + * @return Fulfills with `undefined` upon success. + */ + datasync(): Promise; + /** + * Request that all data for the open file descriptor is flushed to the storage + * device. The specific implementation is operating system and device specific. + * Refer to the POSIX [`fsync(2)`](http://man7.org/linux/man-pages/man2/fsync.2.html) documentation for more detail. + * @since v10.0.0 + * @return Fulfills with `undefined` upon success. + */ + sync(): Promise; + /** + * Reads data from the file and stores that in the given buffer. + * + * If the file is not modified concurrently, the end-of-file is reached when the + * number of bytes read is zero. + * @since v10.0.0 + * @param buffer A buffer that will be filled with the file data read. + * @param offset The location in the buffer at which to start filling. + * @param length The number of bytes to read. + * @param position The location where to begin reading data from the file. If `null`, data will be read from the current file position, and the position will be updated. If `position` is an + * integer, the current file position will remain unchanged. + * @return Fulfills upon success with an object with two properties: + */ + read( + buffer: T, + offset?: number | null, + length?: number | null, + position?: number | null, + ): Promise>; + read(options?: FileReadOptions): Promise>; + /** + * Returns a `ReadableStream` that may be used to read the files data. + * + * An error will be thrown if this method is called more than once or is called + * after the `FileHandle` is closed or closing. + * + * ```js + * import { + * open, + * } from 'node:fs/promises'; + * + * const file = await open('./some/file/to/read'); + * + * for await (const chunk of file.readableWebStream()) + * console.log(chunk); + * + * await file.close(); + * ``` + * + * While the `ReadableStream` will read the file to completion, it will not + * close the `FileHandle` automatically. User code must still call the`fileHandle.close()` method. + * @since v17.0.0 + * @experimental + */ + readableWebStream(options?: ReadableWebStreamOptions): ReadableStream; + /** + * Asynchronously reads the entire contents of a file. + * + * If `options` is a string, then it specifies the `encoding`. + * + * The `FileHandle` has to support reading. + * + * If one or more `filehandle.read()` calls are made on a file handle and then a`filehandle.readFile()` call is made, the data will be read from the current + * position till the end of the file. It doesn't always read from the beginning + * of the file. + * @since v10.0.0 + * @return Fulfills upon a successful read with the contents of the file. If no encoding is specified (using `options.encoding`), the data is returned as a {Buffer} object. Otherwise, the + * data will be a string. + */ + readFile( + options?: { + encoding?: null | undefined; + flag?: OpenMode | undefined; + } | null, + ): Promise; + /** + * Asynchronously reads the entire contents of a file. The underlying file will _not_ be closed automatically. + * The `FileHandle` must have been opened for reading. + * @param options An object that may contain an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + readFile( + options: + | { + encoding: BufferEncoding; + flag?: OpenMode | undefined; + } + | BufferEncoding, + ): Promise; + /** + * Asynchronously reads the entire contents of a file. The underlying file will _not_ be closed automatically. + * The `FileHandle` must have been opened for reading. + * @param options An object that may contain an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + readFile( + options?: + | (ObjectEncodingOptions & { + flag?: OpenMode | undefined; + }) + | BufferEncoding + | null, + ): Promise; + /** + * Convenience method to create a `readline` interface and stream over the file. + * See `filehandle.createReadStream()` for the options. + * + * ```js + * import { open } from 'node:fs/promises'; + * + * const file = await open('./some/file/to/read'); + * + * for await (const line of file.readLines()) { + * console.log(line); + * } + * ``` + * @since v18.11.0 + */ + readLines(options?: CreateReadStreamOptions): ReadlineInterface; + /** + * @since v10.0.0 + * @return Fulfills with an {fs.Stats} for the file. + */ + stat( + opts?: StatOptions & { + bigint?: false | undefined; + }, + ): Promise; + stat( + opts: StatOptions & { + bigint: true; + }, + ): Promise; + stat(opts?: StatOptions): Promise; + /** + * Truncates the file. + * + * If the file was larger than `len` bytes, only the first `len` bytes will be + * retained in the file. + * + * The following example retains only the first four bytes of the file: + * + * ```js + * import { open } from 'node:fs/promises'; + * + * let filehandle = null; + * try { + * filehandle = await open('temp.txt', 'r+'); + * await filehandle.truncate(4); + * } finally { + * await filehandle?.close(); + * } + * ``` + * + * If the file previously was shorter than `len` bytes, it is extended, and the + * extended part is filled with null bytes (`'\0'`): + * + * If `len` is negative then `0` will be used. + * @since v10.0.0 + * @param [len=0] + * @return Fulfills with `undefined` upon success. + */ + truncate(len?: number): Promise; + /** + * Change the file system timestamps of the object referenced by the `FileHandle` then fulfills the promise with no arguments upon success. + * @since v10.0.0 + */ + utimes(atime: TimeLike, mtime: TimeLike): Promise; + /** + * Asynchronously writes data to a file, replacing the file if it already exists.`data` can be a string, a buffer, an + * [AsyncIterable](https://tc39.github.io/ecma262/#sec-asynciterable-interface), or an + * [Iterable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#The_iterable_protocol) object. + * The promise is fulfilled with no arguments upon success. + * + * If `options` is a string, then it specifies the `encoding`. + * + * The `FileHandle` has to support writing. + * + * It is unsafe to use `filehandle.writeFile()` multiple times on the same file + * without waiting for the promise to be fulfilled (or rejected). + * + * If one or more `filehandle.write()` calls are made on a file handle and then a`filehandle.writeFile()` call is made, the data will be written from the + * current position till the end of the file. It doesn't always write from the + * beginning of the file. + * @since v10.0.0 + */ + writeFile( + data: string | Uint8Array, + options?: + | (ObjectEncodingOptions & FlagAndOpenMode & Abortable & { flush?: boolean | undefined }) + | BufferEncoding + | null, + ): Promise; + /** + * Write `buffer` to the file. + * + * The promise is fulfilled with an object containing two properties: + * + * It is unsafe to use `filehandle.write()` multiple times on the same file + * without waiting for the promise to be fulfilled (or rejected). For this + * scenario, use `filehandle.createWriteStream()`. + * + * On Linux, positional writes do not work when the file is opened in append mode. + * The kernel ignores the position argument and always appends the data to + * the end of the file. + * @since v10.0.0 + * @param offset The start position from within `buffer` where the data to write begins. + * @param [length=buffer.byteLength - offset] The number of bytes from `buffer` to write. + * @param [position='null'] The offset from the beginning of the file where the data from `buffer` should be written. If `position` is not a `number`, the data will be written at the current + * position. See the POSIX pwrite(2) documentation for more detail. + */ + write( + buffer: TBuffer, + offset?: number | null, + length?: number | null, + position?: number | null, + ): Promise<{ + bytesWritten: number; + buffer: TBuffer; + }>; + write( + data: string, + position?: number | null, + encoding?: BufferEncoding | null, + ): Promise<{ + bytesWritten: number; + buffer: string; + }>; + /** + * Write an array of [ArrayBufferView](https://developer.mozilla.org/en-US/docs/Web/API/ArrayBufferView) s to the file. + * + * The promise is fulfilled with an object containing a two properties: + * + * It is unsafe to call `writev()` multiple times on the same file without waiting + * for the promise to be fulfilled (or rejected). + * + * On Linux, positional writes don't work when the file is opened in append mode. + * The kernel ignores the position argument and always appends the data to + * the end of the file. + * @since v12.9.0 + * @param [position='null'] The offset from the beginning of the file where the data from `buffers` should be written. If `position` is not a `number`, the data will be written at the current + * position. + */ + writev(buffers: readonly NodeJS.ArrayBufferView[], position?: number): Promise; + /** + * Read from a file and write to an array of [ArrayBufferView](https://developer.mozilla.org/en-US/docs/Web/API/ArrayBufferView) s + * @since v13.13.0, v12.17.0 + * @param [position='null'] The offset from the beginning of the file where the data should be read from. If `position` is not a `number`, the data will be read from the current position. + * @return Fulfills upon success an object containing two properties: + */ + readv(buffers: readonly NodeJS.ArrayBufferView[], position?: number): Promise; + /** + * Closes the file handle after waiting for any pending operation on the handle to + * complete. + * + * ```js + * import { open } from 'node:fs/promises'; + * + * let filehandle; + * try { + * filehandle = await open('thefile.txt', 'r'); + * } finally { + * await filehandle?.close(); + * } + * ``` + * @since v10.0.0 + * @return Fulfills with `undefined` upon success. + */ + close(): Promise; + /** + * An alias for {@link FileHandle.close()}. + * @since v20.4.0 + */ + [Symbol.asyncDispose](): Promise; + } + const constants: typeof fsConstants; + /** + * Tests a user's permissions for the file or directory specified by `path`. + * The `mode` argument is an optional integer that specifies the accessibility + * checks to be performed. `mode` should be either the value `fs.constants.F_OK`or a mask consisting of the bitwise OR of any of `fs.constants.R_OK`,`fs.constants.W_OK`, and `fs.constants.X_OK` + * (e.g.`fs.constants.W_OK | fs.constants.R_OK`). Check `File access constants` for + * possible values of `mode`. + * + * If the accessibility check is successful, the promise is fulfilled with no + * value. If any of the accessibility checks fail, the promise is rejected + * with an [Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error) object. The following example checks if the file`/etc/passwd` can be read and + * written by the current process. + * + * ```js + * import { access, constants } from 'node:fs/promises'; + * + * try { + * await access('/etc/passwd', constants.R_OK | constants.W_OK); + * console.log('can access'); + * } catch { + * console.error('cannot access'); + * } + * ``` + * + * Using `fsPromises.access()` to check for the accessibility of a file before + * calling `fsPromises.open()` is not recommended. Doing so introduces a race + * condition, since other processes may change the file's state between the two + * calls. Instead, user code should open/read/write the file directly and handle + * the error raised if the file is not accessible. + * @since v10.0.0 + * @param [mode=fs.constants.F_OK] + * @return Fulfills with `undefined` upon success. + */ + function access(path: PathLike, mode?: number): Promise; + /** + * Asynchronously copies `src` to `dest`. By default, `dest` is overwritten if it + * already exists. + * + * No guarantees are made about the atomicity of the copy operation. If an + * error occurs after the destination file has been opened for writing, an attempt + * will be made to remove the destination. + * + * ```js + * import { copyFile, constants } from 'node:fs/promises'; + * + * try { + * await copyFile('source.txt', 'destination.txt'); + * console.log('source.txt was copied to destination.txt'); + * } catch { + * console.error('The file could not be copied'); + * } + * + * // By using COPYFILE_EXCL, the operation will fail if destination.txt exists. + * try { + * await copyFile('source.txt', 'destination.txt', constants.COPYFILE_EXCL); + * console.log('source.txt was copied to destination.txt'); + * } catch { + * console.error('The file could not be copied'); + * } + * ``` + * @since v10.0.0 + * @param src source filename to copy + * @param dest destination filename of the copy operation + * @param [mode=0] Optional modifiers that specify the behavior of the copy operation. It is possible to create a mask consisting of the bitwise OR of two or more values (e.g. + * `fs.constants.COPYFILE_EXCL | fs.constants.COPYFILE_FICLONE`) + * @return Fulfills with `undefined` upon success. + */ + function copyFile(src: PathLike, dest: PathLike, mode?: number): Promise; + /** + * Opens a `FileHandle`. + * + * Refer to the POSIX [`open(2)`](http://man7.org/linux/man-pages/man2/open.2.html) documentation for more detail. + * + * Some characters (`< > : " / \ | ? *`) are reserved under Windows as documented + * by [Naming Files, Paths, and Namespaces](https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file). Under NTFS, if the filename contains + * a colon, Node.js will open a file system stream, as described by [this MSDN page](https://docs.microsoft.com/en-us/windows/desktop/FileIO/using-streams). + * @since v10.0.0 + * @param [flags='r'] See `support of file system `flags``. + * @param [mode=0o666] Sets the file mode (permission and sticky bits) if the file is created. + * @return Fulfills with a {FileHandle} object. + */ + function open(path: PathLike, flags?: string | number, mode?: Mode): Promise; + /** + * Renames `oldPath` to `newPath`. + * @since v10.0.0 + * @return Fulfills with `undefined` upon success. + */ + function rename(oldPath: PathLike, newPath: PathLike): Promise; + /** + * Truncates (shortens or extends the length) of the content at `path` to `len`bytes. + * @since v10.0.0 + * @param [len=0] + * @return Fulfills with `undefined` upon success. + */ + function truncate(path: PathLike, len?: number): Promise; + /** + * Removes the directory identified by `path`. + * + * Using `fsPromises.rmdir()` on a file (not a directory) results in the + * promise being rejected with an `ENOENT` error on Windows and an `ENOTDIR`error on POSIX. + * + * To get a behavior similar to the `rm -rf` Unix command, use `fsPromises.rm()` with options `{ recursive: true, force: true }`. + * @since v10.0.0 + * @return Fulfills with `undefined` upon success. + */ + function rmdir(path: PathLike, options?: RmDirOptions): Promise; + /** + * Removes files and directories (modeled on the standard POSIX `rm` utility). + * @since v14.14.0 + * @return Fulfills with `undefined` upon success. + */ + function rm(path: PathLike, options?: RmOptions): Promise; + /** + * Asynchronously creates a directory. + * + * The optional `options` argument can be an integer specifying `mode` (permission + * and sticky bits), or an object with a `mode` property and a `recursive`property indicating whether parent directories should be created. Calling`fsPromises.mkdir()` when `path` is a directory + * that exists results in a + * rejection only when `recursive` is false. + * + * ```js + * import { mkdir } from 'node:fs/promises'; + * + * try { + * const projectFolder = new URL('./test/project/', import.meta.url); + * const createDir = await mkdir(projectFolder, { recursive: true }); + * + * console.log(`created ${createDir}`); + * } catch (err) { + * console.error(err.message); + * } + * ``` + * @since v10.0.0 + * @return Upon success, fulfills with `undefined` if `recursive` is `false`, or the first directory path created if `recursive` is `true`. + */ + function mkdir( + path: PathLike, + options: MakeDirectoryOptions & { + recursive: true; + }, + ): Promise; + /** + * Asynchronous mkdir(2) - create a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options Either the file mode, or an object optionally specifying the file mode and whether parent folders + * should be created. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. + */ + function mkdir( + path: PathLike, + options?: + | Mode + | (MakeDirectoryOptions & { + recursive?: false | undefined; + }) + | null, + ): Promise; + /** + * Asynchronous mkdir(2) - create a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options Either the file mode, or an object optionally specifying the file mode and whether parent folders + * should be created. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. + */ + function mkdir(path: PathLike, options?: Mode | MakeDirectoryOptions | null): Promise; + /** + * Reads the contents of a directory. + * + * The optional `options` argument can be a string specifying an encoding, or an + * object with an `encoding` property specifying the character encoding to use for + * the filenames. If the `encoding` is set to `'buffer'`, the filenames returned + * will be passed as `Buffer` objects. + * + * If `options.withFileTypes` is set to `true`, the returned array will contain `fs.Dirent` objects. + * + * ```js + * import { readdir } from 'node:fs/promises'; + * + * try { + * const files = await readdir(path); + * for (const file of files) + * console.log(file); + * } catch (err) { + * console.error(err); + * } + * ``` + * @since v10.0.0 + * @return Fulfills with an array of the names of the files in the directory excluding `'.'` and `'..'`. + */ + function readdir( + path: PathLike, + options?: + | (ObjectEncodingOptions & { + withFileTypes?: false | undefined; + recursive?: boolean | undefined; + }) + | BufferEncoding + | null, + ): Promise; + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function readdir( + path: PathLike, + options: + | { + encoding: "buffer"; + withFileTypes?: false | undefined; + recursive?: boolean | undefined; + } + | "buffer", + ): Promise; + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function readdir( + path: PathLike, + options?: + | (ObjectEncodingOptions & { + withFileTypes?: false | undefined; + recursive?: boolean | undefined; + }) + | BufferEncoding + | null, + ): Promise; + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options If called with `withFileTypes: true` the result data will be an array of Dirent. + */ + function readdir( + path: PathLike, + options: ObjectEncodingOptions & { + withFileTypes: true; + recursive?: boolean | undefined; + }, + ): Promise; + /** + * Reads the contents of the symbolic link referred to by `path`. See the POSIX [`readlink(2)`](http://man7.org/linux/man-pages/man2/readlink.2.html) documentation for more detail. The promise is + * fulfilled with the`linkString` upon success. + * + * The optional `options` argument can be a string specifying an encoding, or an + * object with an `encoding` property specifying the character encoding to use for + * the link path returned. If the `encoding` is set to `'buffer'`, the link path + * returned will be passed as a `Buffer` object. + * @since v10.0.0 + * @return Fulfills with the `linkString` upon success. + */ + function readlink(path: PathLike, options?: ObjectEncodingOptions | BufferEncoding | null): Promise; + /** + * Asynchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function readlink(path: PathLike, options: BufferEncodingOption): Promise; + /** + * Asynchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function readlink(path: PathLike, options?: ObjectEncodingOptions | string | null): Promise; + /** + * Creates a symbolic link. + * + * The `type` argument is only used on Windows platforms and can be one of `'dir'`,`'file'`, or `'junction'`. If the `type` argument is not a string, Node.js will + * autodetect `target` type and use `'file'` or `'dir'`. If the `target` does not + * exist, `'file'` will be used. Windows junction points require the destination + * path to be absolute. When using `'junction'`, the `target` argument will + * automatically be normalized to absolute path. Junction points on NTFS volumes + * can only point to directories. + * @since v10.0.0 + * @param [type='null'] + * @return Fulfills with `undefined` upon success. + */ + function symlink(target: PathLike, path: PathLike, type?: string | null): Promise; + /** + * Equivalent to `fsPromises.stat()` unless `path` refers to a symbolic link, + * in which case the link itself is stat-ed, not the file that it refers to. + * Refer to the POSIX [`lstat(2)`](http://man7.org/linux/man-pages/man2/lstat.2.html) document for more detail. + * @since v10.0.0 + * @return Fulfills with the {fs.Stats} object for the given symbolic link `path`. + */ + function lstat( + path: PathLike, + opts?: StatOptions & { + bigint?: false | undefined; + }, + ): Promise; + function lstat( + path: PathLike, + opts: StatOptions & { + bigint: true; + }, + ): Promise; + function lstat(path: PathLike, opts?: StatOptions): Promise; + /** + * @since v10.0.0 + * @return Fulfills with the {fs.Stats} object for the given `path`. + */ + function stat( + path: PathLike, + opts?: StatOptions & { + bigint?: false | undefined; + }, + ): Promise; + function stat( + path: PathLike, + opts: StatOptions & { + bigint: true; + }, + ): Promise; + function stat(path: PathLike, opts?: StatOptions): Promise; + /** + * @since v19.6.0, v18.15.0 + * @return Fulfills with the {fs.StatFs} object for the given `path`. + */ + function statfs( + path: PathLike, + opts?: StatFsOptions & { + bigint?: false | undefined; + }, + ): Promise; + function statfs( + path: PathLike, + opts: StatFsOptions & { + bigint: true; + }, + ): Promise; + function statfs(path: PathLike, opts?: StatFsOptions): Promise; + /** + * Creates a new link from the `existingPath` to the `newPath`. See the POSIX [`link(2)`](http://man7.org/linux/man-pages/man2/link.2.html) documentation for more detail. + * @since v10.0.0 + * @return Fulfills with `undefined` upon success. + */ + function link(existingPath: PathLike, newPath: PathLike): Promise; + /** + * If `path` refers to a symbolic link, then the link is removed without affecting + * the file or directory to which that link refers. If the `path` refers to a file + * path that is not a symbolic link, the file is deleted. See the POSIX [`unlink(2)`](http://man7.org/linux/man-pages/man2/unlink.2.html) documentation for more detail. + * @since v10.0.0 + * @return Fulfills with `undefined` upon success. + */ + function unlink(path: PathLike): Promise; + /** + * Changes the permissions of a file. + * @since v10.0.0 + * @return Fulfills with `undefined` upon success. + */ + function chmod(path: PathLike, mode: Mode): Promise; + /** + * Changes the permissions on a symbolic link. + * + * This method is only implemented on macOS. + * @deprecated Since v10.0.0 + * @return Fulfills with `undefined` upon success. + */ + function lchmod(path: PathLike, mode: Mode): Promise; + /** + * Changes the ownership on a symbolic link. + * @since v10.0.0 + * @return Fulfills with `undefined` upon success. + */ + function lchown(path: PathLike, uid: number, gid: number): Promise; + /** + * Changes the access and modification times of a file in the same way as `fsPromises.utimes()`, with the difference that if the path refers to a + * symbolic link, then the link is not dereferenced: instead, the timestamps of + * the symbolic link itself are changed. + * @since v14.5.0, v12.19.0 + * @return Fulfills with `undefined` upon success. + */ + function lutimes(path: PathLike, atime: TimeLike, mtime: TimeLike): Promise; + /** + * Changes the ownership of a file. + * @since v10.0.0 + * @return Fulfills with `undefined` upon success. + */ + function chown(path: PathLike, uid: number, gid: number): Promise; + /** + * Change the file system timestamps of the object referenced by `path`. + * + * The `atime` and `mtime` arguments follow these rules: + * + * * Values can be either numbers representing Unix epoch time, `Date`s, or a + * numeric string like `'123456789.0'`. + * * If the value can not be converted to a number, or is `NaN`, `Infinity`, or`-Infinity`, an `Error` will be thrown. + * @since v10.0.0 + * @return Fulfills with `undefined` upon success. + */ + function utimes(path: PathLike, atime: TimeLike, mtime: TimeLike): Promise; + /** + * Determines the actual location of `path` using the same semantics as the`fs.realpath.native()` function. + * + * Only paths that can be converted to UTF8 strings are supported. + * + * The optional `options` argument can be a string specifying an encoding, or an + * object with an `encoding` property specifying the character encoding to use for + * the path. If the `encoding` is set to `'buffer'`, the path returned will be + * passed as a `Buffer` object. + * + * On Linux, when Node.js is linked against musl libc, the procfs file system must + * be mounted on `/proc` in order for this function to work. Glibc does not have + * this restriction. + * @since v10.0.0 + * @return Fulfills with the resolved path upon success. + */ + function realpath(path: PathLike, options?: ObjectEncodingOptions | BufferEncoding | null): Promise; + /** + * Asynchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function realpath(path: PathLike, options: BufferEncodingOption): Promise; + /** + * Asynchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function realpath( + path: PathLike, + options?: ObjectEncodingOptions | BufferEncoding | null, + ): Promise; + /** + * Creates a unique temporary directory. A unique directory name is generated by + * appending six random characters to the end of the provided `prefix`. Due to + * platform inconsistencies, avoid trailing `X` characters in `prefix`. Some + * platforms, notably the BSDs, can return more than six random characters, and + * replace trailing `X` characters in `prefix` with random characters. + * + * The optional `options` argument can be a string specifying an encoding, or an + * object with an `encoding` property specifying the character encoding to use. + * + * ```js + * import { mkdtemp } from 'node:fs/promises'; + * import { join } from 'node:path'; + * import { tmpdir } from 'node:os'; + * + * try { + * await mkdtemp(join(tmpdir(), 'foo-')); + * } catch (err) { + * console.error(err); + * } + * ``` + * + * The `fsPromises.mkdtemp()` method will append the six randomly selected + * characters directly to the `prefix` string. For instance, given a directory`/tmp`, if the intention is to create a temporary directory _within_`/tmp`, the`prefix` must end with a trailing + * platform-specific path separator + * (`require('node:path').sep`). + * @since v10.0.0 + * @return Fulfills with a string containing the file system path of the newly created temporary directory. + */ + function mkdtemp(prefix: string, options?: ObjectEncodingOptions | BufferEncoding | null): Promise; + /** + * Asynchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required `prefix` to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function mkdtemp(prefix: string, options: BufferEncodingOption): Promise; + /** + * Asynchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required `prefix` to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function mkdtemp(prefix: string, options?: ObjectEncodingOptions | BufferEncoding | null): Promise; + /** + * Asynchronously writes data to a file, replacing the file if it already exists.`data` can be a string, a buffer, an + * [AsyncIterable](https://tc39.github.io/ecma262/#sec-asynciterable-interface), or an + * [Iterable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#The_iterable_protocol) object. + * + * The `encoding` option is ignored if `data` is a buffer. + * + * If `options` is a string, then it specifies the encoding. + * + * The `mode` option only affects the newly created file. See `fs.open()` for more details. + * + * Any specified `FileHandle` has to support writing. + * + * It is unsafe to use `fsPromises.writeFile()` multiple times on the same file + * without waiting for the promise to be settled. + * + * Similarly to `fsPromises.readFile` \- `fsPromises.writeFile` is a convenience + * method that performs multiple `write` calls internally to write the buffer + * passed to it. For performance sensitive code consider using `fs.createWriteStream()` or `filehandle.createWriteStream()`. + * + * It is possible to use an `AbortSignal` to cancel an `fsPromises.writeFile()`. + * Cancelation is "best effort", and some amount of data is likely still + * to be written. + * + * ```js + * import { writeFile } from 'node:fs/promises'; + * import { Buffer } from 'node:buffer'; + * + * try { + * const controller = new AbortController(); + * const { signal } = controller; + * const data = new Uint8Array(Buffer.from('Hello Node.js')); + * const promise = writeFile('message.txt', data, { signal }); + * + * // Abort the request before the promise settles. + * controller.abort(); + * + * await promise; + * } catch (err) { + * // When a request is aborted - err is an AbortError + * console.error(err); + * } + * ``` + * + * Aborting an ongoing request does not abort individual operating + * system requests but rather the internal buffering `fs.writeFile` performs. + * @since v10.0.0 + * @param file filename or `FileHandle` + * @return Fulfills with `undefined` upon success. + */ + function writeFile( + file: PathLike | FileHandle, + data: + | string + | NodeJS.ArrayBufferView + | Iterable + | AsyncIterable + | Stream, + options?: + | (ObjectEncodingOptions & { + mode?: Mode | undefined; + flag?: OpenMode | undefined; + } & Abortable) + | BufferEncoding + | null, + ): Promise; + /** + * Asynchronously append data to a file, creating the file if it does not yet + * exist. `data` can be a string or a `Buffer`. + * + * If `options` is a string, then it specifies the `encoding`. + * + * The `mode` option only affects the newly created file. See `fs.open()` for more details. + * + * The `path` may be specified as a `FileHandle` that has been opened + * for appending (using `fsPromises.open()`). + * @since v10.0.0 + * @param path filename or {FileHandle} + * @return Fulfills with `undefined` upon success. + */ + function appendFile( + path: PathLike | FileHandle, + data: string | Uint8Array, + options?: (ObjectEncodingOptions & FlagAndOpenMode & { flush?: boolean | undefined }) | BufferEncoding | null, + ): Promise; + /** + * Asynchronously reads the entire contents of a file. + * + * If no encoding is specified (using `options.encoding`), the data is returned + * as a `Buffer` object. Otherwise, the data will be a string. + * + * If `options` is a string, then it specifies the encoding. + * + * When the `path` is a directory, the behavior of `fsPromises.readFile()` is + * platform-specific. On macOS, Linux, and Windows, the promise will be rejected + * with an error. On FreeBSD, a representation of the directory's contents will be + * returned. + * + * An example of reading a `package.json` file located in the same directory of the + * running code: + * + * ```js + * import { readFile } from 'node:fs/promises'; + * try { + * const filePath = new URL('./package.json', import.meta.url); + * const contents = await readFile(filePath, { encoding: 'utf8' }); + * console.log(contents); + * } catch (err) { + * console.error(err.message); + * } + * ``` + * + * It is possible to abort an ongoing `readFile` using an `AbortSignal`. If a + * request is aborted the promise returned is rejected with an `AbortError`: + * + * ```js + * import { readFile } from 'node:fs/promises'; + * + * try { + * const controller = new AbortController(); + * const { signal } = controller; + * const promise = readFile(fileName, { signal }); + * + * // Abort the request before the promise settles. + * controller.abort(); + * + * await promise; + * } catch (err) { + * // When a request is aborted - err is an AbortError + * console.error(err); + * } + * ``` + * + * Aborting an ongoing request does not abort individual operating + * system requests but rather the internal buffering `fs.readFile` performs. + * + * Any specified `FileHandle` has to support reading. + * @since v10.0.0 + * @param path filename or `FileHandle` + * @return Fulfills with the contents of the file. + */ + function readFile( + path: PathLike | FileHandle, + options?: + | ({ + encoding?: null | undefined; + flag?: OpenMode | undefined; + } & Abortable) + | null, + ): Promise; + /** + * Asynchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * If a `FileHandle` is provided, the underlying file will _not_ be closed automatically. + * @param options An object that may contain an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + function readFile( + path: PathLike | FileHandle, + options: + | ({ + encoding: BufferEncoding; + flag?: OpenMode | undefined; + } & Abortable) + | BufferEncoding, + ): Promise; + /** + * Asynchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * If a `FileHandle` is provided, the underlying file will _not_ be closed automatically. + * @param options An object that may contain an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + function readFile( + path: PathLike | FileHandle, + options?: + | ( + & ObjectEncodingOptions + & Abortable + & { + flag?: OpenMode | undefined; + } + ) + | BufferEncoding + | null, + ): Promise; + /** + * Asynchronously open a directory for iterative scanning. See the POSIX [`opendir(3)`](http://man7.org/linux/man-pages/man3/opendir.3.html) documentation for more detail. + * + * Creates an `fs.Dir`, which contains all further functions for reading from + * and cleaning up the directory. + * + * The `encoding` option sets the encoding for the `path` while opening the + * directory and subsequent read operations. + * + * Example using async iteration: + * + * ```js + * import { opendir } from 'node:fs/promises'; + * + * try { + * const dir = await opendir('./'); + * for await (const dirent of dir) + * console.log(dirent.name); + * } catch (err) { + * console.error(err); + * } + * ``` + * + * When using the async iterator, the `fs.Dir` object will be automatically + * closed after the iterator exits. + * @since v12.12.0 + * @return Fulfills with an {fs.Dir}. + */ + function opendir(path: PathLike, options?: OpenDirOptions): Promise; + /** + * Returns an async iterator that watches for changes on `filename`, where `filename`is either a file or a directory. + * + * ```js + * const { watch } = require('node:fs/promises'); + * + * const ac = new AbortController(); + * const { signal } = ac; + * setTimeout(() => ac.abort(), 10000); + * + * (async () => { + * try { + * const watcher = watch(__filename, { signal }); + * for await (const event of watcher) + * console.log(event); + * } catch (err) { + * if (err.name === 'AbortError') + * return; + * throw err; + * } + * })(); + * ``` + * + * On most platforms, `'rename'` is emitted whenever a filename appears or + * disappears in the directory. + * + * All the `caveats` for `fs.watch()` also apply to `fsPromises.watch()`. + * @since v15.9.0, v14.18.0 + * @return of objects with the properties: + */ + function watch( + filename: PathLike, + options: + | (WatchOptions & { + encoding: "buffer"; + }) + | "buffer", + ): AsyncIterable>; + /** + * Watch for changes on `filename`, where `filename` is either a file or a directory, returning an `FSWatcher`. + * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + * @param options Either the encoding for the filename provided to the listener, or an object optionally specifying encoding, persistent, and recursive options. + * If `encoding` is not supplied, the default of `'utf8'` is used. + * If `persistent` is not supplied, the default of `true` is used. + * If `recursive` is not supplied, the default of `false` is used. + */ + function watch(filename: PathLike, options?: WatchOptions | BufferEncoding): AsyncIterable>; + /** + * Watch for changes on `filename`, where `filename` is either a file or a directory, returning an `FSWatcher`. + * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + * @param options Either the encoding for the filename provided to the listener, or an object optionally specifying encoding, persistent, and recursive options. + * If `encoding` is not supplied, the default of `'utf8'` is used. + * If `persistent` is not supplied, the default of `true` is used. + * If `recursive` is not supplied, the default of `false` is used. + */ + function watch( + filename: PathLike, + options: WatchOptions | string, + ): AsyncIterable> | AsyncIterable>; + /** + * Asynchronously copies the entire directory structure from `src` to `dest`, + * including subdirectories and files. + * + * When copying a directory to another directory, globs are not supported and + * behavior is similar to `cp dir1/ dir2/`. + * @since v16.7.0 + * @experimental + * @param src source path to copy. + * @param dest destination path to copy to. + * @return Fulfills with `undefined` upon success. + */ + function cp(source: string | URL, destination: string | URL, opts?: CopyOptions): Promise; +} +declare module "node:fs/promises" { + export * from "fs/promises"; +} diff --git a/task/node_modules/@types/node/globals.d.ts b/task/node_modules/@types/node/globals.d.ts new file mode 100644 index 0000000..72d1860 --- /dev/null +++ b/task/node_modules/@types/node/globals.d.ts @@ -0,0 +1,385 @@ +export {}; // Make this a module + +// #region Fetch and friends +// Conditional type aliases, used at the end of this file. +// Will either be empty if lib-dom is included, or the undici version otherwise. +type _Request = typeof globalThis extends { onmessage: any } ? {} : import("undici-types").Request; +type _Response = typeof globalThis extends { onmessage: any } ? {} : import("undici-types").Response; +type _FormData = typeof globalThis extends { onmessage: any } ? {} : import("undici-types").FormData; +type _Headers = typeof globalThis extends { onmessage: any } ? {} : import("undici-types").Headers; +type _RequestInit = typeof globalThis extends { onmessage: any } ? {} + : import("undici-types").RequestInit; +type _ResponseInit = typeof globalThis extends { onmessage: any } ? {} + : import("undici-types").ResponseInit; +type _File = typeof globalThis extends { onmessage: any } ? {} : import("node:buffer").File; +// #endregion Fetch and friends + +declare global { + // Declare "static" methods in Error + interface ErrorConstructor { + /** Create .stack property on a target object */ + captureStackTrace(targetObject: object, constructorOpt?: Function): void; + + /** + * Optional override for formatting stack traces + * + * @see https://v8.dev/docs/stack-trace-api#customizing-stack-traces + */ + prepareStackTrace?: ((err: Error, stackTraces: NodeJS.CallSite[]) => any) | undefined; + + stackTraceLimit: number; + } + + /*-----------------------------------------------* + * * + * GLOBAL * + * * + ------------------------------------------------*/ + + // For backwards compability + interface NodeRequire extends NodeJS.Require {} + interface RequireResolve extends NodeJS.RequireResolve {} + interface NodeModule extends NodeJS.Module {} + + var process: NodeJS.Process; + var console: Console; + + var __filename: string; + var __dirname: string; + + var require: NodeRequire; + var module: NodeModule; + + // Same as module.exports + var exports: any; + + /** + * Only available if `--expose-gc` is passed to the process. + */ + var gc: undefined | (() => void); + + // #region borrowed + // from https://github.com/microsoft/TypeScript/blob/38da7c600c83e7b31193a62495239a0fe478cb67/lib/lib.webworker.d.ts#L633 until moved to separate lib + /** A controller object that allows you to abort one or more DOM requests as and when desired. */ + interface AbortController { + /** + * Returns the AbortSignal object associated with this object. + */ + + readonly signal: AbortSignal; + /** + * Invoking this method will set this object's AbortSignal's aborted flag and signal to any observers that the associated activity is to be aborted. + */ + abort(reason?: any): void; + } + + /** A signal object that allows you to communicate with a DOM request (such as a Fetch) and abort it if required via an AbortController object. */ + interface AbortSignal extends EventTarget { + /** + * Returns true if this AbortSignal's AbortController has signaled to abort, and false otherwise. + */ + readonly aborted: boolean; + readonly reason: any; + onabort: null | ((this: AbortSignal, event: Event) => any); + throwIfAborted(): void; + } + + var AbortController: typeof globalThis extends { onmessage: any; AbortController: infer T } ? T + : { + prototype: AbortController; + new(): AbortController; + }; + + var AbortSignal: typeof globalThis extends { onmessage: any; AbortSignal: infer T } ? T + : { + prototype: AbortSignal; + new(): AbortSignal; + abort(reason?: any): AbortSignal; + timeout(milliseconds: number): AbortSignal; + }; + // #endregion borrowed + + // #region Disposable + interface SymbolConstructor { + /** + * A method that is used to release resources held by an object. Called by the semantics of the `using` statement. + */ + readonly dispose: unique symbol; + + /** + * A method that is used to asynchronously release resources held by an object. Called by the semantics of the `await using` statement. + */ + readonly asyncDispose: unique symbol; + } + + interface Disposable { + [Symbol.dispose](): void; + } + + interface AsyncDisposable { + [Symbol.asyncDispose](): PromiseLike; + } + // #endregion Disposable + + // #region ArrayLike.at() + interface RelativeIndexable { + /** + * Takes an integer value and returns the item at that index, + * allowing for positive and negative integers. + * Negative integers count back from the last item in the array. + */ + at(index: number): T | undefined; + } + interface String extends RelativeIndexable {} + interface Array extends RelativeIndexable {} + interface ReadonlyArray extends RelativeIndexable {} + interface Int8Array extends RelativeIndexable {} + interface Uint8Array extends RelativeIndexable {} + interface Uint8ClampedArray extends RelativeIndexable {} + interface Int16Array extends RelativeIndexable {} + interface Uint16Array extends RelativeIndexable {} + interface Int32Array extends RelativeIndexable {} + interface Uint32Array extends RelativeIndexable {} + interface Float32Array extends RelativeIndexable {} + interface Float64Array extends RelativeIndexable {} + interface BigInt64Array extends RelativeIndexable {} + interface BigUint64Array extends RelativeIndexable {} + // #endregion ArrayLike.at() end + + /** + * @since v17.0.0 + * + * Creates a deep clone of an object. + */ + function structuredClone( + value: T, + transfer?: { transfer: ReadonlyArray }, + ): T; + + /*----------------------------------------------* + * * + * GLOBAL INTERFACES * + * * + *-----------------------------------------------*/ + namespace NodeJS { + interface CallSite { + /** + * Value of "this" + */ + getThis(): unknown; + + /** + * Type of "this" as a string. + * This is the name of the function stored in the constructor field of + * "this", if available. Otherwise the object's [[Class]] internal + * property. + */ + getTypeName(): string | null; + + /** + * Current function + */ + getFunction(): Function | undefined; + + /** + * Name of the current function, typically its name property. + * If a name property is not available an attempt will be made to try + * to infer a name from the function's context. + */ + getFunctionName(): string | null; + + /** + * Name of the property [of "this" or one of its prototypes] that holds + * the current function + */ + getMethodName(): string | null; + + /** + * Name of the script [if this function was defined in a script] + */ + getFileName(): string | undefined; + + /** + * Current line number [if this function was defined in a script] + */ + getLineNumber(): number | null; + + /** + * Current column number [if this function was defined in a script] + */ + getColumnNumber(): number | null; + + /** + * A call site object representing the location where eval was called + * [if this function was created using a call to eval] + */ + getEvalOrigin(): string | undefined; + + /** + * Is this a toplevel invocation, that is, is "this" the global object? + */ + isToplevel(): boolean; + + /** + * Does this call take place in code defined by a call to eval? + */ + isEval(): boolean; + + /** + * Is this call in native V8 code? + */ + isNative(): boolean; + + /** + * Is this a constructor call? + */ + isConstructor(): boolean; + } + + interface ErrnoException extends Error { + errno?: number | undefined; + code?: string | undefined; + path?: string | undefined; + syscall?: string | undefined; + } + + interface ReadableStream extends EventEmitter { + readable: boolean; + read(size?: number): string | Buffer; + setEncoding(encoding: BufferEncoding): this; + pause(): this; + resume(): this; + isPaused(): boolean; + pipe(destination: T, options?: { end?: boolean | undefined }): T; + unpipe(destination?: WritableStream): this; + unshift(chunk: string | Uint8Array, encoding?: BufferEncoding): void; + wrap(oldStream: ReadableStream): this; + [Symbol.asyncIterator](): AsyncIterableIterator; + } + + interface WritableStream extends EventEmitter { + writable: boolean; + write(buffer: Uint8Array | string, cb?: (err?: Error | null) => void): boolean; + write(str: string, encoding?: BufferEncoding, cb?: (err?: Error | null) => void): boolean; + end(cb?: () => void): this; + end(data: string | Uint8Array, cb?: () => void): this; + end(str: string, encoding?: BufferEncoding, cb?: () => void): this; + } + + interface ReadWriteStream extends ReadableStream, WritableStream {} + + interface RefCounted { + ref(): this; + unref(): this; + } + + type TypedArray = + | Uint8Array + | Uint8ClampedArray + | Uint16Array + | Uint32Array + | Int8Array + | Int16Array + | Int32Array + | BigUint64Array + | BigInt64Array + | Float32Array + | Float64Array; + type ArrayBufferView = TypedArray | DataView; + + interface Require { + (id: string): any; + resolve: RequireResolve; + cache: Dict; + /** + * @deprecated + */ + extensions: RequireExtensions; + main: Module | undefined; + } + + interface RequireResolve { + (id: string, options?: { paths?: string[] | undefined }): string; + paths(request: string): string[] | null; + } + + interface RequireExtensions extends Dict<(m: Module, filename: string) => any> { + ".js": (m: Module, filename: string) => any; + ".json": (m: Module, filename: string) => any; + ".node": (m: Module, filename: string) => any; + } + interface Module { + /** + * `true` if the module is running during the Node.js preload + */ + isPreloading: boolean; + exports: any; + require: Require; + id: string; + filename: string; + loaded: boolean; + /** @deprecated since v14.6.0 Please use `require.main` and `module.children` instead. */ + parent: Module | null | undefined; + children: Module[]; + /** + * @since v11.14.0 + * + * The directory name of the module. This is usually the same as the path.dirname() of the module.id. + */ + path: string; + paths: string[]; + } + + interface Dict { + [key: string]: T | undefined; + } + + interface ReadOnlyDict { + readonly [key: string]: T | undefined; + } + } + + interface RequestInit extends _RequestInit {} + + function fetch( + input: string | URL | globalThis.Request, + init?: RequestInit, + ): Promise; + + interface Request extends _Request {} + var Request: typeof globalThis extends { + onmessage: any; + Request: infer T; + } ? T + : typeof import("undici-types").Request; + + interface ResponseInit extends _ResponseInit {} + + interface Response extends _Response {} + var Response: typeof globalThis extends { + onmessage: any; + Response: infer T; + } ? T + : typeof import("undici-types").Response; + + interface FormData extends _FormData {} + var FormData: typeof globalThis extends { + onmessage: any; + FormData: infer T; + } ? T + : typeof import("undici-types").FormData; + + interface Headers extends _Headers {} + var Headers: typeof globalThis extends { + onmessage: any; + Headers: infer T; + } ? T + : typeof import("undici-types").Headers; + + interface File extends _File {} + var File: typeof globalThis extends { + onmessage: any; + File: infer T; + } ? T + : typeof import("node:buffer").File; +} diff --git a/task/node_modules/@types/node/globals.global.d.ts b/task/node_modules/@types/node/globals.global.d.ts new file mode 100644 index 0000000..ef1198c --- /dev/null +++ b/task/node_modules/@types/node/globals.global.d.ts @@ -0,0 +1 @@ +declare var global: typeof globalThis; diff --git a/task/node_modules/@types/node/http.d.ts b/task/node_modules/@types/node/http.d.ts new file mode 100644 index 0000000..9b2c3c2 --- /dev/null +++ b/task/node_modules/@types/node/http.d.ts @@ -0,0 +1,1888 @@ +/** + * To use the HTTP server and client one must `require('node:http')`. + * + * The HTTP interfaces in Node.js are designed to support many features + * of the protocol which have been traditionally difficult to use. + * In particular, large, possibly chunk-encoded, messages. The interface is + * careful to never buffer entire requests or responses, so the + * user is able to stream data. + * + * HTTP message headers are represented by an object like this: + * + * ```js + * { 'content-length': '123', + * 'content-type': 'text/plain', + * 'connection': 'keep-alive', + * 'host': 'example.com', + * 'accept': '*' } + * ``` + * + * Keys are lowercased. Values are not modified. + * + * In order to support the full spectrum of possible HTTP applications, the Node.js + * HTTP API is very low-level. It deals with stream handling and message + * parsing only. It parses a message into headers and body but it does not + * parse the actual headers or the body. + * + * See `message.headers` for details on how duplicate headers are handled. + * + * The raw headers as they were received are retained in the `rawHeaders`property, which is an array of `[key, value, key2, value2, ...]`. For + * example, the previous message header object might have a `rawHeaders`list like the following: + * + * ```js + * [ 'ConTent-Length', '123456', + * 'content-LENGTH', '123', + * 'content-type', 'text/plain', + * 'CONNECTION', 'keep-alive', + * 'Host', 'example.com', + * 'accepT', '*' ] + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/http.js) + */ +declare module "http" { + import * as stream from "node:stream"; + import { URL } from "node:url"; + import { LookupOptions } from "node:dns"; + import { EventEmitter } from "node:events"; + import { LookupFunction, Server as NetServer, Socket, TcpSocketConnectOpts } from "node:net"; + // incoming headers will never contain number + interface IncomingHttpHeaders extends NodeJS.Dict { + accept?: string | undefined; + "accept-language"?: string | undefined; + "accept-patch"?: string | undefined; + "accept-ranges"?: string | undefined; + "access-control-allow-credentials"?: string | undefined; + "access-control-allow-headers"?: string | undefined; + "access-control-allow-methods"?: string | undefined; + "access-control-allow-origin"?: string | undefined; + "access-control-expose-headers"?: string | undefined; + "access-control-max-age"?: string | undefined; + "access-control-request-headers"?: string | undefined; + "access-control-request-method"?: string | undefined; + age?: string | undefined; + allow?: string | undefined; + "alt-svc"?: string | undefined; + authorization?: string | undefined; + "cache-control"?: string | undefined; + connection?: string | undefined; + "content-disposition"?: string | undefined; + "content-encoding"?: string | undefined; + "content-language"?: string | undefined; + "content-length"?: string | undefined; + "content-location"?: string | undefined; + "content-range"?: string | undefined; + "content-type"?: string | undefined; + cookie?: string | undefined; + date?: string | undefined; + etag?: string | undefined; + expect?: string | undefined; + expires?: string | undefined; + forwarded?: string | undefined; + from?: string | undefined; + host?: string | undefined; + "if-match"?: string | undefined; + "if-modified-since"?: string | undefined; + "if-none-match"?: string | undefined; + "if-unmodified-since"?: string | undefined; + "last-modified"?: string | undefined; + location?: string | undefined; + origin?: string | undefined; + pragma?: string | undefined; + "proxy-authenticate"?: string | undefined; + "proxy-authorization"?: string | undefined; + "public-key-pins"?: string | undefined; + range?: string | undefined; + referer?: string | undefined; + "retry-after"?: string | undefined; + "sec-websocket-accept"?: string | undefined; + "sec-websocket-extensions"?: string | undefined; + "sec-websocket-key"?: string | undefined; + "sec-websocket-protocol"?: string | undefined; + "sec-websocket-version"?: string | undefined; + "set-cookie"?: string[] | undefined; + "strict-transport-security"?: string | undefined; + tk?: string | undefined; + trailer?: string | undefined; + "transfer-encoding"?: string | undefined; + upgrade?: string | undefined; + "user-agent"?: string | undefined; + vary?: string | undefined; + via?: string | undefined; + warning?: string | undefined; + "www-authenticate"?: string | undefined; + } + // outgoing headers allows numbers (as they are converted internally to strings) + type OutgoingHttpHeader = number | string | string[]; + interface OutgoingHttpHeaders extends NodeJS.Dict { + accept?: string | string[] | undefined; + "accept-charset"?: string | string[] | undefined; + "accept-encoding"?: string | string[] | undefined; + "accept-language"?: string | string[] | undefined; + "accept-ranges"?: string | undefined; + "access-control-allow-credentials"?: string | undefined; + "access-control-allow-headers"?: string | undefined; + "access-control-allow-methods"?: string | undefined; + "access-control-allow-origin"?: string | undefined; + "access-control-expose-headers"?: string | undefined; + "access-control-max-age"?: string | undefined; + "access-control-request-headers"?: string | undefined; + "access-control-request-method"?: string | undefined; + age?: string | undefined; + allow?: string | undefined; + authorization?: string | undefined; + "cache-control"?: string | undefined; + "cdn-cache-control"?: string | undefined; + connection?: string | string[] | undefined; + "content-disposition"?: string | undefined; + "content-encoding"?: string | undefined; + "content-language"?: string | undefined; + "content-length"?: string | number | undefined; + "content-location"?: string | undefined; + "content-range"?: string | undefined; + "content-security-policy"?: string | undefined; + "content-security-policy-report-only"?: string | undefined; + cookie?: string | string[] | undefined; + dav?: string | string[] | undefined; + dnt?: string | undefined; + date?: string | undefined; + etag?: string | undefined; + expect?: string | undefined; + expires?: string | undefined; + forwarded?: string | undefined; + from?: string | undefined; + host?: string | undefined; + "if-match"?: string | undefined; + "if-modified-since"?: string | undefined; + "if-none-match"?: string | undefined; + "if-range"?: string | undefined; + "if-unmodified-since"?: string | undefined; + "last-modified"?: string | undefined; + link?: string | string[] | undefined; + location?: string | undefined; + "max-forwards"?: string | undefined; + origin?: string | undefined; + prgama?: string | string[] | undefined; + "proxy-authenticate"?: string | string[] | undefined; + "proxy-authorization"?: string | undefined; + "public-key-pins"?: string | undefined; + "public-key-pins-report-only"?: string | undefined; + range?: string | undefined; + referer?: string | undefined; + "referrer-policy"?: string | undefined; + refresh?: string | undefined; + "retry-after"?: string | undefined; + "sec-websocket-accept"?: string | undefined; + "sec-websocket-extensions"?: string | string[] | undefined; + "sec-websocket-key"?: string | undefined; + "sec-websocket-protocol"?: string | string[] | undefined; + "sec-websocket-version"?: string | undefined; + server?: string | undefined; + "set-cookie"?: string | string[] | undefined; + "strict-transport-security"?: string | undefined; + te?: string | undefined; + trailer?: string | undefined; + "transfer-encoding"?: string | undefined; + "user-agent"?: string | undefined; + upgrade?: string | undefined; + "upgrade-insecure-requests"?: string | undefined; + vary?: string | undefined; + via?: string | string[] | undefined; + warning?: string | undefined; + "www-authenticate"?: string | string[] | undefined; + "x-content-type-options"?: string | undefined; + "x-dns-prefetch-control"?: string | undefined; + "x-frame-options"?: string | undefined; + "x-xss-protection"?: string | undefined; + } + interface ClientRequestArgs { + _defaultAgent?: Agent | undefined; + agent?: Agent | boolean | undefined; + auth?: string | null | undefined; + // https://github.com/nodejs/node/blob/master/lib/_http_client.js#L278 + createConnection?: + | ((options: ClientRequestArgs, oncreate: (err: Error, socket: Socket) => void) => Socket) + | undefined; + defaultPort?: number | string | undefined; + family?: number | undefined; + headers?: OutgoingHttpHeaders | undefined; + hints?: LookupOptions["hints"]; + host?: string | null | undefined; + hostname?: string | null | undefined; + insecureHTTPParser?: boolean | undefined; + localAddress?: string | undefined; + localPort?: number | undefined; + lookup?: LookupFunction | undefined; + /** + * @default 16384 + */ + maxHeaderSize?: number | undefined; + method?: string | undefined; + path?: string | null | undefined; + port?: number | string | null | undefined; + protocol?: string | null | undefined; + setHost?: boolean | undefined; + signal?: AbortSignal | undefined; + socketPath?: string | undefined; + timeout?: number | undefined; + uniqueHeaders?: Array | undefined; + joinDuplicateHeaders?: boolean; + } + interface ServerOptions< + Request extends typeof IncomingMessage = typeof IncomingMessage, + Response extends typeof ServerResponse = typeof ServerResponse, + > { + /** + * Specifies the `IncomingMessage` class to be used. Useful for extending the original `IncomingMessage`. + */ + IncomingMessage?: Request | undefined; + /** + * Specifies the `ServerResponse` class to be used. Useful for extending the original `ServerResponse`. + */ + ServerResponse?: Response | undefined; + /** + * Sets the timeout value in milliseconds for receiving the entire request from the client. + * @see Server.requestTimeout for more information. + * @default 300000 + * @since v18.0.0 + */ + requestTimeout?: number | undefined; + /** + * It joins the field line values of multiple headers in a request with `, ` instead of discarding the duplicates. + * @default false + * @since v18.14.0 + */ + joinDuplicateHeaders?: boolean; + /** + * The number of milliseconds of inactivity a server needs to wait for additional incoming data, + * after it has finished writing the last response, before a socket will be destroyed. + * @see Server.keepAliveTimeout for more information. + * @default 5000 + * @since v18.0.0 + */ + keepAliveTimeout?: number | undefined; + /** + * Sets the interval value in milliseconds to check for request and headers timeout in incomplete requests. + * @default 30000 + */ + connectionsCheckingInterval?: number | undefined; + /** + * Optionally overrides all `socket`s' `readableHighWaterMark` and `writableHighWaterMark`. + * This affects `highWaterMark` property of both `IncomingMessage` and `ServerResponse`. + * Default: @see stream.getDefaultHighWaterMark(). + * @since v20.1.0 + */ + highWaterMark?: number | undefined; + /** + * Use an insecure HTTP parser that accepts invalid HTTP headers when `true`. + * Using the insecure parser should be avoided. + * See --insecure-http-parser for more information. + * @default false + */ + insecureHTTPParser?: boolean | undefined; + /** + * Optionally overrides the value of + * `--max-http-header-size` for requests received by this server, i.e. + * the maximum length of request headers in bytes. + * @default 16384 + * @since v13.3.0 + */ + maxHeaderSize?: number | undefined; + /** + * If set to `true`, it disables the use of Nagle's algorithm immediately after a new incoming connection is received. + * @default true + * @since v16.5.0 + */ + noDelay?: boolean | undefined; + /** + * If set to `true`, it enables keep-alive functionality on the socket immediately after a new incoming connection is received, + * similarly on what is done in `socket.setKeepAlive([enable][, initialDelay])`. + * @default false + * @since v16.5.0 + */ + keepAlive?: boolean | undefined; + /** + * If set to a positive number, it sets the initial delay before the first keepalive probe is sent on an idle socket. + * @default 0 + * @since v16.5.0 + */ + keepAliveInitialDelay?: number | undefined; + /** + * A list of response headers that should be sent only once. + * If the header's value is an array, the items will be joined using `; `. + */ + uniqueHeaders?: Array | undefined; + } + type RequestListener< + Request extends typeof IncomingMessage = typeof IncomingMessage, + Response extends typeof ServerResponse = typeof ServerResponse, + > = (req: InstanceType, res: InstanceType & { req: InstanceType }) => void; + /** + * @since v0.1.17 + */ + class Server< + Request extends typeof IncomingMessage = typeof IncomingMessage, + Response extends typeof ServerResponse = typeof ServerResponse, + > extends NetServer { + constructor(requestListener?: RequestListener); + constructor(options: ServerOptions, requestListener?: RequestListener); + /** + * Sets the timeout value for sockets, and emits a `'timeout'` event on + * the Server object, passing the socket as an argument, if a timeout + * occurs. + * + * If there is a `'timeout'` event listener on the Server object, then it + * will be called with the timed-out socket as an argument. + * + * By default, the Server does not timeout sockets. However, if a callback + * is assigned to the Server's `'timeout'` event, timeouts must be handled + * explicitly. + * @since v0.9.12 + * @param [msecs=0 (no timeout)] + */ + setTimeout(msecs?: number, callback?: () => void): this; + setTimeout(callback: () => void): this; + /** + * Limits maximum incoming headers count. If set to 0, no limit will be applied. + * @since v0.7.0 + */ + maxHeadersCount: number | null; + /** + * The maximum number of requests socket can handle + * before closing keep alive connection. + * + * A value of `0` will disable the limit. + * + * When the limit is reached it will set the `Connection` header value to `close`, + * but will not actually close the connection, subsequent requests sent + * after the limit is reached will get `503 Service Unavailable` as a response. + * @since v16.10.0 + */ + maxRequestsPerSocket: number | null; + /** + * The number of milliseconds of inactivity before a socket is presumed + * to have timed out. + * + * A value of `0` will disable the timeout behavior on incoming connections. + * + * The socket timeout logic is set up on connection, so changing this + * value only affects new connections to the server, not any existing connections. + * @since v0.9.12 + */ + timeout: number; + /** + * Limit the amount of time the parser will wait to receive the complete HTTP + * headers. + * + * If the timeout expires, the server responds with status 408 without + * forwarding the request to the request listener and then closes the connection. + * + * It must be set to a non-zero value (e.g. 120 seconds) to protect against + * potential Denial-of-Service attacks in case the server is deployed without a + * reverse proxy in front. + * @since v11.3.0, v10.14.0 + */ + headersTimeout: number; + /** + * The number of milliseconds of inactivity a server needs to wait for additional + * incoming data, after it has finished writing the last response, before a socket + * will be destroyed. If the server receives new data before the keep-alive + * timeout has fired, it will reset the regular inactivity timeout, i.e.,`server.timeout`. + * + * A value of `0` will disable the keep-alive timeout behavior on incoming + * connections. + * A value of `0` makes the http server behave similarly to Node.js versions prior + * to 8.0.0, which did not have a keep-alive timeout. + * + * The socket timeout logic is set up on connection, so changing this value only + * affects new connections to the server, not any existing connections. + * @since v8.0.0 + */ + keepAliveTimeout: number; + /** + * Sets the timeout value in milliseconds for receiving the entire request from + * the client. + * + * If the timeout expires, the server responds with status 408 without + * forwarding the request to the request listener and then closes the connection. + * + * It must be set to a non-zero value (e.g. 120 seconds) to protect against + * potential Denial-of-Service attacks in case the server is deployed without a + * reverse proxy in front. + * @since v14.11.0 + */ + requestTimeout: number; + /** + * Closes all connections connected to this server. + * @since v18.2.0 + */ + closeAllConnections(): void; + /** + * Closes all connections connected to this server which are not sending a request + * or waiting for a response. + * @since v18.2.0 + */ + closeIdleConnections(): void; + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "connection", listener: (socket: Socket) => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "listening", listener: () => void): this; + addListener(event: "checkContinue", listener: RequestListener): this; + addListener(event: "checkExpectation", listener: RequestListener): this; + addListener(event: "clientError", listener: (err: Error, socket: stream.Duplex) => void): this; + addListener( + event: "connect", + listener: (req: InstanceType, socket: stream.Duplex, head: Buffer) => void, + ): this; + addListener(event: "dropRequest", listener: (req: InstanceType, socket: stream.Duplex) => void): this; + addListener(event: "request", listener: RequestListener): this; + addListener( + event: "upgrade", + listener: (req: InstanceType, socket: stream.Duplex, head: Buffer) => void, + ): this; + emit(event: string, ...args: any[]): boolean; + emit(event: "close"): boolean; + emit(event: "connection", socket: Socket): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "listening"): boolean; + emit( + event: "checkContinue", + req: InstanceType, + res: InstanceType & { req: InstanceType }, + ): boolean; + emit( + event: "checkExpectation", + req: InstanceType, + res: InstanceType & { req: InstanceType }, + ): boolean; + emit(event: "clientError", err: Error, socket: stream.Duplex): boolean; + emit(event: "connect", req: InstanceType, socket: stream.Duplex, head: Buffer): boolean; + emit(event: "dropRequest", req: InstanceType, socket: stream.Duplex): boolean; + emit( + event: "request", + req: InstanceType, + res: InstanceType & { req: InstanceType }, + ): boolean; + emit(event: "upgrade", req: InstanceType, socket: stream.Duplex, head: Buffer): boolean; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "close", listener: () => void): this; + on(event: "connection", listener: (socket: Socket) => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "listening", listener: () => void): this; + on(event: "checkContinue", listener: RequestListener): this; + on(event: "checkExpectation", listener: RequestListener): this; + on(event: "clientError", listener: (err: Error, socket: stream.Duplex) => void): this; + on(event: "connect", listener: (req: InstanceType, socket: stream.Duplex, head: Buffer) => void): this; + on(event: "dropRequest", listener: (req: InstanceType, socket: stream.Duplex) => void): this; + on(event: "request", listener: RequestListener): this; + on(event: "upgrade", listener: (req: InstanceType, socket: stream.Duplex, head: Buffer) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "connection", listener: (socket: Socket) => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "listening", listener: () => void): this; + once(event: "checkContinue", listener: RequestListener): this; + once(event: "checkExpectation", listener: RequestListener): this; + once(event: "clientError", listener: (err: Error, socket: stream.Duplex) => void): this; + once( + event: "connect", + listener: (req: InstanceType, socket: stream.Duplex, head: Buffer) => void, + ): this; + once(event: "dropRequest", listener: (req: InstanceType, socket: stream.Duplex) => void): this; + once(event: "request", listener: RequestListener): this; + once( + event: "upgrade", + listener: (req: InstanceType, socket: stream.Duplex, head: Buffer) => void, + ): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "connection", listener: (socket: Socket) => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "listening", listener: () => void): this; + prependListener(event: "checkContinue", listener: RequestListener): this; + prependListener(event: "checkExpectation", listener: RequestListener): this; + prependListener(event: "clientError", listener: (err: Error, socket: stream.Duplex) => void): this; + prependListener( + event: "connect", + listener: (req: InstanceType, socket: stream.Duplex, head: Buffer) => void, + ): this; + prependListener( + event: "dropRequest", + listener: (req: InstanceType, socket: stream.Duplex) => void, + ): this; + prependListener(event: "request", listener: RequestListener): this; + prependListener( + event: "upgrade", + listener: (req: InstanceType, socket: stream.Duplex, head: Buffer) => void, + ): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "connection", listener: (socket: Socket) => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "listening", listener: () => void): this; + prependOnceListener(event: "checkContinue", listener: RequestListener): this; + prependOnceListener(event: "checkExpectation", listener: RequestListener): this; + prependOnceListener(event: "clientError", listener: (err: Error, socket: stream.Duplex) => void): this; + prependOnceListener( + event: "connect", + listener: (req: InstanceType, socket: stream.Duplex, head: Buffer) => void, + ): this; + prependOnceListener( + event: "dropRequest", + listener: (req: InstanceType, socket: stream.Duplex) => void, + ): this; + prependOnceListener(event: "request", listener: RequestListener): this; + prependOnceListener( + event: "upgrade", + listener: (req: InstanceType, socket: stream.Duplex, head: Buffer) => void, + ): this; + } + /** + * This class serves as the parent class of {@link ClientRequest} and {@link ServerResponse}. It is an abstract outgoing message from + * the perspective of the participants of an HTTP transaction. + * @since v0.1.17 + */ + class OutgoingMessage extends stream.Writable { + readonly req: Request; + chunkedEncoding: boolean; + shouldKeepAlive: boolean; + useChunkedEncodingByDefault: boolean; + sendDate: boolean; + /** + * @deprecated Use `writableEnded` instead. + */ + finished: boolean; + /** + * Read-only. `true` if the headers were sent, otherwise `false`. + * @since v0.9.3 + */ + readonly headersSent: boolean; + /** + * Alias of `outgoingMessage.socket`. + * @since v0.3.0 + * @deprecated Since v15.12.0,v14.17.1 - Use `socket` instead. + */ + readonly connection: Socket | null; + /** + * Reference to the underlying socket. Usually, users will not want to access + * this property. + * + * After calling `outgoingMessage.end()`, this property will be nulled. + * @since v0.3.0 + */ + readonly socket: Socket | null; + constructor(); + /** + * Once a socket is associated with the message and is connected,`socket.setTimeout()` will be called with `msecs` as the first parameter. + * @since v0.9.12 + * @param callback Optional function to be called when a timeout occurs. Same as binding to the `timeout` event. + */ + setTimeout(msecs: number, callback?: () => void): this; + /** + * Sets a single header value. If the header already exists in the to-be-sent + * headers, its value will be replaced. Use an array of strings to send multiple + * headers with the same name. + * @since v0.4.0 + * @param name Header name + * @param value Header value + */ + setHeader(name: string, value: number | string | readonly string[]): this; + /** + * Append a single header value for the header object. + * + * If the value is an array, this is equivalent of calling this method multiple + * times. + * + * If there were no previous value for the header, this is equivalent of calling `outgoingMessage.setHeader(name, value)`. + * + * Depending of the value of `options.uniqueHeaders` when the client request or the + * server were created, this will end up in the header being sent multiple times or + * a single time with values joined using `; `. + * @since v18.3.0, v16.17.0 + * @param name Header name + * @param value Header value + */ + appendHeader(name: string, value: string | readonly string[]): this; + /** + * Gets the value of the HTTP header with the given name. If that header is not + * set, the returned value will be `undefined`. + * @since v0.4.0 + * @param name Name of header + */ + getHeader(name: string): number | string | string[] | undefined; + /** + * Returns a shallow copy of the current outgoing headers. Since a shallow + * copy is used, array values may be mutated without additional calls to + * various header-related HTTP module methods. The keys of the returned + * object are the header names and the values are the respective header + * values. All header names are lowercase. + * + * The object returned by the `outgoingMessage.getHeaders()` method does + * not prototypically inherit from the JavaScript `Object`. This means that + * typical `Object` methods such as `obj.toString()`, `obj.hasOwnProperty()`, + * and others are not defined and will not work. + * + * ```js + * outgoingMessage.setHeader('Foo', 'bar'); + * outgoingMessage.setHeader('Set-Cookie', ['foo=bar', 'bar=baz']); + * + * const headers = outgoingMessage.getHeaders(); + * // headers === { foo: 'bar', 'set-cookie': ['foo=bar', 'bar=baz'] } + * ``` + * @since v7.7.0 + */ + getHeaders(): OutgoingHttpHeaders; + /** + * Returns an array containing the unique names of the current outgoing headers. + * All names are lowercase. + * @since v7.7.0 + */ + getHeaderNames(): string[]; + /** + * Returns `true` if the header identified by `name` is currently set in the + * outgoing headers. The header name is case-insensitive. + * + * ```js + * const hasContentType = outgoingMessage.hasHeader('content-type'); + * ``` + * @since v7.7.0 + */ + hasHeader(name: string): boolean; + /** + * Removes a header that is queued for implicit sending. + * + * ```js + * outgoingMessage.removeHeader('Content-Encoding'); + * ``` + * @since v0.4.0 + * @param name Header name + */ + removeHeader(name: string): void; + /** + * Adds HTTP trailers (headers but at the end of the message) to the message. + * + * Trailers will **only** be emitted if the message is chunked encoded. If not, + * the trailers will be silently discarded. + * + * HTTP requires the `Trailer` header to be sent to emit trailers, + * with a list of header field names in its value, e.g. + * + * ```js + * message.writeHead(200, { 'Content-Type': 'text/plain', + * 'Trailer': 'Content-MD5' }); + * message.write(fileData); + * message.addTrailers({ 'Content-MD5': '7895bf4b8828b55ceaf47747b4bca667' }); + * message.end(); + * ``` + * + * Attempting to set a header field name or value that contains invalid characters + * will result in a `TypeError` being thrown. + * @since v0.3.0 + */ + addTrailers(headers: OutgoingHttpHeaders | ReadonlyArray<[string, string]>): void; + /** + * Flushes the message headers. + * + * For efficiency reason, Node.js normally buffers the message headers + * until `outgoingMessage.end()` is called or the first chunk of message data + * is written. It then tries to pack the headers and data into a single TCP + * packet. + * + * It is usually desired (it saves a TCP round-trip), but not when the first + * data is not sent until possibly much later. `outgoingMessage.flushHeaders()`bypasses the optimization and kickstarts the message. + * @since v1.6.0 + */ + flushHeaders(): void; + } + /** + * This object is created internally by an HTTP server, not by the user. It is + * passed as the second parameter to the `'request'` event. + * @since v0.1.17 + */ + class ServerResponse extends OutgoingMessage { + /** + * When using implicit headers (not calling `response.writeHead()` explicitly), + * this property controls the status code that will be sent to the client when + * the headers get flushed. + * + * ```js + * response.statusCode = 404; + * ``` + * + * After response header was sent to the client, this property indicates the + * status code which was sent out. + * @since v0.4.0 + */ + statusCode: number; + /** + * When using implicit headers (not calling `response.writeHead()` explicitly), + * this property controls the status message that will be sent to the client when + * the headers get flushed. If this is left as `undefined` then the standard + * message for the status code will be used. + * + * ```js + * response.statusMessage = 'Not found'; + * ``` + * + * After response header was sent to the client, this property indicates the + * status message which was sent out. + * @since v0.11.8 + */ + statusMessage: string; + /** + * If set to `true`, Node.js will check whether the `Content-Length`header value and the size of the body, in bytes, are equal. + * Mismatching the `Content-Length` header value will result + * in an `Error` being thrown, identified by `code:``'ERR_HTTP_CONTENT_LENGTH_MISMATCH'`. + * @since v18.10.0, v16.18.0 + */ + strictContentLength: boolean; + constructor(req: Request); + assignSocket(socket: Socket): void; + detachSocket(socket: Socket): void; + /** + * Sends an HTTP/1.1 100 Continue message to the client, indicating that + * the request body should be sent. See the `'checkContinue'` event on`Server`. + * @since v0.3.0 + */ + writeContinue(callback?: () => void): void; + /** + * Sends an HTTP/1.1 103 Early Hints message to the client with a Link header, + * indicating that the user agent can preload/preconnect the linked resources. + * The `hints` is an object containing the values of headers to be sent with + * early hints message. The optional `callback` argument will be called when + * the response message has been written. + * + * **Example** + * + * ```js + * const earlyHintsLink = '; rel=preload; as=style'; + * response.writeEarlyHints({ + * 'link': earlyHintsLink, + * }); + * + * const earlyHintsLinks = [ + * '; rel=preload; as=style', + * '; rel=preload; as=script', + * ]; + * response.writeEarlyHints({ + * 'link': earlyHintsLinks, + * 'x-trace-id': 'id for diagnostics', + * }); + * + * const earlyHintsCallback = () => console.log('early hints message sent'); + * response.writeEarlyHints({ + * 'link': earlyHintsLinks, + * }, earlyHintsCallback); + * ``` + * @since v18.11.0 + * @param hints An object containing the values of headers + * @param callback Will be called when the response message has been written + */ + writeEarlyHints(hints: Record, callback?: () => void): void; + /** + * Sends a response header to the request. The status code is a 3-digit HTTP + * status code, like `404`. The last argument, `headers`, are the response headers. + * Optionally one can give a human-readable `statusMessage` as the second + * argument. + * + * `headers` may be an `Array` where the keys and values are in the same list. + * It is _not_ a list of tuples. So, the even-numbered offsets are key values, + * and the odd-numbered offsets are the associated values. The array is in the same + * format as `request.rawHeaders`. + * + * Returns a reference to the `ServerResponse`, so that calls can be chained. + * + * ```js + * const body = 'hello world'; + * response + * .writeHead(200, { + * 'Content-Length': Buffer.byteLength(body), + * 'Content-Type': 'text/plain', + * }) + * .end(body); + * ``` + * + * This method must only be called once on a message and it must + * be called before `response.end()` is called. + * + * If `response.write()` or `response.end()` are called before calling + * this, the implicit/mutable headers will be calculated and call this function. + * + * When headers have been set with `response.setHeader()`, they will be merged + * with any headers passed to `response.writeHead()`, with the headers passed + * to `response.writeHead()` given precedence. + * + * If this method is called and `response.setHeader()` has not been called, + * it will directly write the supplied header values onto the network channel + * without caching internally, and the `response.getHeader()` on the header + * will not yield the expected result. If progressive population of headers is + * desired with potential future retrieval and modification, use `response.setHeader()` instead. + * + * ```js + * // Returns content-type = text/plain + * const server = http.createServer((req, res) => { + * res.setHeader('Content-Type', 'text/html'); + * res.setHeader('X-Foo', 'bar'); + * res.writeHead(200, { 'Content-Type': 'text/plain' }); + * res.end('ok'); + * }); + * ``` + * + * `Content-Length` is read in bytes, not characters. Use `Buffer.byteLength()` to determine the length of the body in bytes. Node.js + * will check whether `Content-Length` and the length of the body which has + * been transmitted are equal or not. + * + * Attempting to set a header field name or value that contains invalid characters + * will result in a \[`Error`\]\[\] being thrown. + * @since v0.1.30 + */ + writeHead( + statusCode: number, + statusMessage?: string, + headers?: OutgoingHttpHeaders | OutgoingHttpHeader[], + ): this; + writeHead(statusCode: number, headers?: OutgoingHttpHeaders | OutgoingHttpHeader[]): this; + /** + * Sends a HTTP/1.1 102 Processing message to the client, indicating that + * the request body should be sent. + * @since v10.0.0 + */ + writeProcessing(): void; + } + interface InformationEvent { + statusCode: number; + statusMessage: string; + httpVersion: string; + httpVersionMajor: number; + httpVersionMinor: number; + headers: IncomingHttpHeaders; + rawHeaders: string[]; + } + /** + * This object is created internally and returned from {@link request}. It + * represents an _in-progress_ request whose header has already been queued. The + * header is still mutable using the `setHeader(name, value)`,`getHeader(name)`, `removeHeader(name)` API. The actual header will + * be sent along with the first data chunk or when calling `request.end()`. + * + * To get the response, add a listener for `'response'` to the request object.`'response'` will be emitted from the request object when the response + * headers have been received. The `'response'` event is executed with one + * argument which is an instance of {@link IncomingMessage}. + * + * During the `'response'` event, one can add listeners to the + * response object; particularly to listen for the `'data'` event. + * + * If no `'response'` handler is added, then the response will be + * entirely discarded. However, if a `'response'` event handler is added, + * then the data from the response object **must** be consumed, either by + * calling `response.read()` whenever there is a `'readable'` event, or + * by adding a `'data'` handler, or by calling the `.resume()` method. + * Until the data is consumed, the `'end'` event will not fire. Also, until + * the data is read it will consume memory that can eventually lead to a + * 'process out of memory' error. + * + * For backward compatibility, `res` will only emit `'error'` if there is an`'error'` listener registered. + * + * Set `Content-Length` header to limit the response body size. + * If `response.strictContentLength` is set to `true`, mismatching the`Content-Length` header value will result in an `Error` being thrown, + * identified by `code:``'ERR_HTTP_CONTENT_LENGTH_MISMATCH'`. + * + * `Content-Length` value should be in bytes, not characters. Use `Buffer.byteLength()` to determine the length of the body in bytes. + * @since v0.1.17 + */ + class ClientRequest extends OutgoingMessage { + /** + * The `request.aborted` property will be `true` if the request has + * been aborted. + * @since v0.11.14 + * @deprecated Since v17.0.0,v16.12.0 - Check `destroyed` instead. + */ + aborted: boolean; + /** + * The request host. + * @since v14.5.0, v12.19.0 + */ + host: string; + /** + * The request protocol. + * @since v14.5.0, v12.19.0 + */ + protocol: string; + /** + * When sending request through a keep-alive enabled agent, the underlying socket + * might be reused. But if server closes connection at unfortunate time, client + * may run into a 'ECONNRESET' error. + * + * ```js + * import http from 'node:http'; + * + * // Server has a 5 seconds keep-alive timeout by default + * http + * .createServer((req, res) => { + * res.write('hello\n'); + * res.end(); + * }) + * .listen(3000); + * + * setInterval(() => { + * // Adapting a keep-alive agent + * http.get('http://localhost:3000', { agent }, (res) => { + * res.on('data', (data) => { + * // Do nothing + * }); + * }); + * }, 5000); // Sending request on 5s interval so it's easy to hit idle timeout + * ``` + * + * By marking a request whether it reused socket or not, we can do + * automatic error retry base on it. + * + * ```js + * import http from 'node:http'; + * const agent = new http.Agent({ keepAlive: true }); + * + * function retriableRequest() { + * const req = http + * .get('http://localhost:3000', { agent }, (res) => { + * // ... + * }) + * .on('error', (err) => { + * // Check if retry is needed + * if (req.reusedSocket && err.code === 'ECONNRESET') { + * retriableRequest(); + * } + * }); + * } + * + * retriableRequest(); + * ``` + * @since v13.0.0, v12.16.0 + */ + reusedSocket: boolean; + /** + * Limits maximum response headers count. If set to 0, no limit will be applied. + */ + maxHeadersCount: number; + constructor(url: string | URL | ClientRequestArgs, cb?: (res: IncomingMessage) => void); + /** + * The request method. + * @since v0.1.97 + */ + method: string; + /** + * The request path. + * @since v0.4.0 + */ + path: string; + /** + * Marks the request as aborting. Calling this will cause remaining data + * in the response to be dropped and the socket to be destroyed. + * @since v0.3.8 + * @deprecated Since v14.1.0,v13.14.0 - Use `destroy` instead. + */ + abort(): void; + onSocket(socket: Socket): void; + /** + * Once a socket is assigned to this request and is connected `socket.setTimeout()` will be called. + * @since v0.5.9 + * @param timeout Milliseconds before a request times out. + * @param callback Optional function to be called when a timeout occurs. Same as binding to the `'timeout'` event. + */ + setTimeout(timeout: number, callback?: () => void): this; + /** + * Once a socket is assigned to this request and is connected `socket.setNoDelay()` will be called. + * @since v0.5.9 + */ + setNoDelay(noDelay?: boolean): void; + /** + * Once a socket is assigned to this request and is connected `socket.setKeepAlive()` will be called. + * @since v0.5.9 + */ + setSocketKeepAlive(enable?: boolean, initialDelay?: number): void; + /** + * Returns an array containing the unique names of the current outgoing raw + * headers. Header names are returned with their exact casing being set. + * + * ```js + * request.setHeader('Foo', 'bar'); + * request.setHeader('Set-Cookie', ['foo=bar', 'bar=baz']); + * + * const headerNames = request.getRawHeaderNames(); + * // headerNames === ['Foo', 'Set-Cookie'] + * ``` + * @since v15.13.0, v14.17.0 + */ + getRawHeaderNames(): string[]; + /** + * @deprecated + */ + addListener(event: "abort", listener: () => void): this; + addListener( + event: "connect", + listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void, + ): this; + addListener(event: "continue", listener: () => void): this; + addListener(event: "information", listener: (info: InformationEvent) => void): this; + addListener(event: "response", listener: (response: IncomingMessage) => void): this; + addListener(event: "socket", listener: (socket: Socket) => void): this; + addListener(event: "timeout", listener: () => void): this; + addListener( + event: "upgrade", + listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void, + ): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "drain", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "finish", listener: () => void): this; + addListener(event: "pipe", listener: (src: stream.Readable) => void): this; + addListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + /** + * @deprecated + */ + on(event: "abort", listener: () => void): this; + on(event: "connect", listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this; + on(event: "continue", listener: () => void): this; + on(event: "information", listener: (info: InformationEvent) => void): this; + on(event: "response", listener: (response: IncomingMessage) => void): this; + on(event: "socket", listener: (socket: Socket) => void): this; + on(event: "timeout", listener: () => void): this; + on(event: "upgrade", listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this; + on(event: "close", listener: () => void): this; + on(event: "drain", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "finish", listener: () => void): this; + on(event: "pipe", listener: (src: stream.Readable) => void): this; + on(event: "unpipe", listener: (src: stream.Readable) => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + /** + * @deprecated + */ + once(event: "abort", listener: () => void): this; + once(event: "connect", listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this; + once(event: "continue", listener: () => void): this; + once(event: "information", listener: (info: InformationEvent) => void): this; + once(event: "response", listener: (response: IncomingMessage) => void): this; + once(event: "socket", listener: (socket: Socket) => void): this; + once(event: "timeout", listener: () => void): this; + once(event: "upgrade", listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this; + once(event: "close", listener: () => void): this; + once(event: "drain", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "finish", listener: () => void): this; + once(event: "pipe", listener: (src: stream.Readable) => void): this; + once(event: "unpipe", listener: (src: stream.Readable) => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + /** + * @deprecated + */ + prependListener(event: "abort", listener: () => void): this; + prependListener( + event: "connect", + listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void, + ): this; + prependListener(event: "continue", listener: () => void): this; + prependListener(event: "information", listener: (info: InformationEvent) => void): this; + prependListener(event: "response", listener: (response: IncomingMessage) => void): this; + prependListener(event: "socket", listener: (socket: Socket) => void): this; + prependListener(event: "timeout", listener: () => void): this; + prependListener( + event: "upgrade", + listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void, + ): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "drain", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "finish", listener: () => void): this; + prependListener(event: "pipe", listener: (src: stream.Readable) => void): this; + prependListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + /** + * @deprecated + */ + prependOnceListener(event: "abort", listener: () => void): this; + prependOnceListener( + event: "connect", + listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void, + ): this; + prependOnceListener(event: "continue", listener: () => void): this; + prependOnceListener(event: "information", listener: (info: InformationEvent) => void): this; + prependOnceListener(event: "response", listener: (response: IncomingMessage) => void): this; + prependOnceListener(event: "socket", listener: (socket: Socket) => void): this; + prependOnceListener(event: "timeout", listener: () => void): this; + prependOnceListener( + event: "upgrade", + listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void, + ): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "drain", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "finish", listener: () => void): this; + prependOnceListener(event: "pipe", listener: (src: stream.Readable) => void): this; + prependOnceListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + /** + * An `IncomingMessage` object is created by {@link Server} or {@link ClientRequest} and passed as the first argument to the `'request'` and `'response'` event respectively. It may be used to + * access response + * status, headers, and data. + * + * Different from its `socket` value which is a subclass of `stream.Duplex`, the`IncomingMessage` itself extends `stream.Readable` and is created separately to + * parse and emit the incoming HTTP headers and payload, as the underlying socket + * may be reused multiple times in case of keep-alive. + * @since v0.1.17 + */ + class IncomingMessage extends stream.Readable { + constructor(socket: Socket); + /** + * The `message.aborted` property will be `true` if the request has + * been aborted. + * @since v10.1.0 + * @deprecated Since v17.0.0,v16.12.0 - Check `message.destroyed` from stream.Readable. + */ + aborted: boolean; + /** + * In case of server request, the HTTP version sent by the client. In the case of + * client response, the HTTP version of the connected-to server. + * Probably either `'1.1'` or `'1.0'`. + * + * Also `message.httpVersionMajor` is the first integer and`message.httpVersionMinor` is the second. + * @since v0.1.1 + */ + httpVersion: string; + httpVersionMajor: number; + httpVersionMinor: number; + /** + * The `message.complete` property will be `true` if a complete HTTP message has + * been received and successfully parsed. + * + * This property is particularly useful as a means of determining if a client or + * server fully transmitted a message before a connection was terminated: + * + * ```js + * const req = http.request({ + * host: '127.0.0.1', + * port: 8080, + * method: 'POST', + * }, (res) => { + * res.resume(); + * res.on('end', () => { + * if (!res.complete) + * console.error( + * 'The connection was terminated while the message was still being sent'); + * }); + * }); + * ``` + * @since v0.3.0 + */ + complete: boolean; + /** + * Alias for `message.socket`. + * @since v0.1.90 + * @deprecated Since v16.0.0 - Use `socket`. + */ + connection: Socket; + /** + * The `net.Socket` object associated with the connection. + * + * With HTTPS support, use `request.socket.getPeerCertificate()` to obtain the + * client's authentication details. + * + * This property is guaranteed to be an instance of the `net.Socket` class, + * a subclass of `stream.Duplex`, unless the user specified a socket + * type other than `net.Socket` or internally nulled. + * @since v0.3.0 + */ + socket: Socket; + /** + * The request/response headers object. + * + * Key-value pairs of header names and values. Header names are lower-cased. + * + * ```js + * // Prints something like: + * // + * // { 'user-agent': 'curl/7.22.0', + * // host: '127.0.0.1:8000', + * // accept: '*' } + * console.log(request.headers); + * ``` + * + * Duplicates in raw headers are handled in the following ways, depending on the + * header name: + * + * * Duplicates of `age`, `authorization`, `content-length`, `content-type`,`etag`, `expires`, `from`, `host`, `if-modified-since`, `if-unmodified-since`,`last-modified`, `location`, + * `max-forwards`, `proxy-authorization`, `referer`,`retry-after`, `server`, or `user-agent` are discarded. + * To allow duplicate values of the headers listed above to be joined, + * use the option `joinDuplicateHeaders` in {@link request} and {@link createServer}. See RFC 9110 Section 5.3 for more + * information. + * * `set-cookie` is always an array. Duplicates are added to the array. + * * For duplicate `cookie` headers, the values are joined together with `; `. + * * For all other headers, the values are joined together with `, `. + * @since v0.1.5 + */ + headers: IncomingHttpHeaders; + /** + * Similar to `message.headers`, but there is no join logic and the values are + * always arrays of strings, even for headers received just once. + * + * ```js + * // Prints something like: + * // + * // { 'user-agent': ['curl/7.22.0'], + * // host: ['127.0.0.1:8000'], + * // accept: ['*'] } + * console.log(request.headersDistinct); + * ``` + * @since v18.3.0, v16.17.0 + */ + headersDistinct: NodeJS.Dict; + /** + * The raw request/response headers list exactly as they were received. + * + * The keys and values are in the same list. It is _not_ a + * list of tuples. So, the even-numbered offsets are key values, and the + * odd-numbered offsets are the associated values. + * + * Header names are not lowercased, and duplicates are not merged. + * + * ```js + * // Prints something like: + * // + * // [ 'user-agent', + * // 'this is invalid because there can be only one', + * // 'User-Agent', + * // 'curl/7.22.0', + * // 'Host', + * // '127.0.0.1:8000', + * // 'ACCEPT', + * // '*' ] + * console.log(request.rawHeaders); + * ``` + * @since v0.11.6 + */ + rawHeaders: string[]; + /** + * The request/response trailers object. Only populated at the `'end'` event. + * @since v0.3.0 + */ + trailers: NodeJS.Dict; + /** + * Similar to `message.trailers`, but there is no join logic and the values are + * always arrays of strings, even for headers received just once. + * Only populated at the `'end'` event. + * @since v18.3.0, v16.17.0 + */ + trailersDistinct: NodeJS.Dict; + /** + * The raw request/response trailer keys and values exactly as they were + * received. Only populated at the `'end'` event. + * @since v0.11.6 + */ + rawTrailers: string[]; + /** + * Calls `message.socket.setTimeout(msecs, callback)`. + * @since v0.5.9 + */ + setTimeout(msecs: number, callback?: () => void): this; + /** + * **Only valid for request obtained from {@link Server}.** + * + * The request method as a string. Read only. Examples: `'GET'`, `'DELETE'`. + * @since v0.1.1 + */ + method?: string | undefined; + /** + * **Only valid for request obtained from {@link Server}.** + * + * Request URL string. This contains only the URL that is present in the actual + * HTTP request. Take the following request: + * + * ```http + * GET /status?name=ryan HTTP/1.1 + * Accept: text/plain + * ``` + * + * To parse the URL into its parts: + * + * ```js + * new URL(request.url, `http://${request.headers.host}`); + * ``` + * + * When `request.url` is `'/status?name=ryan'` and `request.headers.host` is`'localhost:3000'`: + * + * ```console + * $ node + * > new URL(request.url, `http://${request.headers.host}`) + * URL { + * href: 'http://localhost:3000/status?name=ryan', + * origin: 'http://localhost:3000', + * protocol: 'http:', + * username: '', + * password: '', + * host: 'localhost:3000', + * hostname: 'localhost', + * port: '3000', + * pathname: '/status', + * search: '?name=ryan', + * searchParams: URLSearchParams { 'name' => 'ryan' }, + * hash: '' + * } + * ``` + * @since v0.1.90 + */ + url?: string | undefined; + /** + * **Only valid for response obtained from {@link ClientRequest}.** + * + * The 3-digit HTTP response status code. E.G. `404`. + * @since v0.1.1 + */ + statusCode?: number | undefined; + /** + * **Only valid for response obtained from {@link ClientRequest}.** + * + * The HTTP response status message (reason phrase). E.G. `OK` or `Internal Server Error`. + * @since v0.11.10 + */ + statusMessage?: string | undefined; + /** + * Calls `destroy()` on the socket that received the `IncomingMessage`. If `error`is provided, an `'error'` event is emitted on the socket and `error` is passed + * as an argument to any listeners on the event. + * @since v0.3.0 + */ + destroy(error?: Error): this; + } + interface AgentOptions extends Partial { + /** + * Keep sockets around in a pool to be used by other requests in the future. Default = false + */ + keepAlive?: boolean | undefined; + /** + * When using HTTP KeepAlive, how often to send TCP KeepAlive packets over sockets being kept alive. Default = 1000. + * Only relevant if keepAlive is set to true. + */ + keepAliveMsecs?: number | undefined; + /** + * Maximum number of sockets to allow per host. Default for Node 0.10 is 5, default for Node 0.12 is Infinity + */ + maxSockets?: number | undefined; + /** + * Maximum number of sockets allowed for all hosts in total. Each request will use a new socket until the maximum is reached. Default: Infinity. + */ + maxTotalSockets?: number | undefined; + /** + * Maximum number of sockets to leave open in a free state. Only relevant if keepAlive is set to true. Default = 256. + */ + maxFreeSockets?: number | undefined; + /** + * Socket timeout in milliseconds. This will set the timeout after the socket is connected. + */ + timeout?: number | undefined; + /** + * Scheduling strategy to apply when picking the next free socket to use. + * @default `lifo` + */ + scheduling?: "fifo" | "lifo" | undefined; + } + /** + * An `Agent` is responsible for managing connection persistence + * and reuse for HTTP clients. It maintains a queue of pending requests + * 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`. + * + * 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 + * pool and a new connection will be made when a new HTTP request is made for + * that host and port. Servers may also refuse to allow multiple requests + * over the same connection, in which case the connection will have to be + * remade for every request and cannot be pooled. The `Agent` will still make + * the requests to that server, but each one will occur over a new connection. + * + * When a connection is closed by the client or the server, it is removed + * from the pool. Any unused sockets in the pool will be unrefed so as not + * to keep the Node.js process running when there are no outstanding requests. + * (see `socket.unref()`). + * + * It is good practice, to `destroy()` an `Agent` instance when it is no + * longer in use, because unused sockets consume OS resources. + * + * Sockets are removed from an agent when the socket emits either + * a `'close'` event or an `'agentRemove'` event. When intending to keep one + * HTTP request open for a long time without keeping it in the agent, something + * like the following may be done: + * + * ```js + * http.get(options, (res) => { + * // Do stuff + * }).on('socket', (socket) => { + * socket.emit('agentRemove'); + * }); + * ``` + * + * An agent may also be used for an individual request. By providing`{agent: false}` as an option to the `http.get()` or `http.request()`functions, a one-time use `Agent` with default options + * will be used + * for the client connection. + * + * `agent:false`: + * + * ```js + * http.get({ + * hostname: 'localhost', + * port: 80, + * path: '/', + * agent: false, // Create a new agent just for this one request + * }, (res) => { + * // Do stuff with response + * }); + * ``` + * @since v0.3.4 + */ + class Agent extends EventEmitter { + /** + * By default set to 256. For agents with `keepAlive` enabled, this + * sets the maximum number of sockets that will be left open in the free + * state. + * @since v0.11.7 + */ + maxFreeSockets: number; + /** + * By default set to `Infinity`. Determines how many concurrent sockets the agent + * can have open per origin. Origin is the returned value of `agent.getName()`. + * @since v0.3.6 + */ + maxSockets: number; + /** + * By default set to `Infinity`. Determines how many concurrent sockets the agent + * can have open. Unlike `maxSockets`, this parameter applies across all origins. + * @since v14.5.0, v12.19.0 + */ + maxTotalSockets: number; + /** + * An object which contains arrays of sockets currently awaiting use by + * the agent when `keepAlive` is enabled. Do not modify. + * + * Sockets in the `freeSockets` list will be automatically destroyed and + * removed from the array on `'timeout'`. + * @since v0.11.4 + */ + readonly freeSockets: NodeJS.ReadOnlyDict; + /** + * An object which contains arrays of sockets currently in use by the + * agent. Do not modify. + * @since v0.3.6 + */ + readonly sockets: NodeJS.ReadOnlyDict; + /** + * An object which contains queues of requests that have not yet been assigned to + * sockets. Do not modify. + * @since v0.5.9 + */ + readonly requests: NodeJS.ReadOnlyDict; + constructor(opts?: AgentOptions); + /** + * Destroy any sockets that are currently in use by the agent. + * + * It is usually not necessary to do this. However, if using an + * agent with `keepAlive` enabled, then it is best to explicitly shut down + * the agent when it is no longer needed. Otherwise, + * sockets might stay open for quite a long time before the server + * terminates them. + * @since v0.11.4 + */ + destroy(): void; + } + const METHODS: string[]; + const STATUS_CODES: { + [errorCode: number]: string | undefined; + [errorCode: string]: string | undefined; + }; + /** + * Returns a new instance of {@link Server}. + * + * The `requestListener` is a function which is automatically + * added to the `'request'` event. + * + * ```js + * import http from 'node:http'; + * + * // Create a local server to receive data from + * const server = http.createServer((req, res) => { + * res.writeHead(200, { 'Content-Type': 'application/json' }); + * res.end(JSON.stringify({ + * data: 'Hello World!', + * })); + * }); + * + * server.listen(8000); + * ``` + * + * ```js + * import http from 'node:http'; + * + * // Create a local server to receive data from + * const server = http.createServer(); + * + * // Listen to the request event + * server.on('request', (request, res) => { + * res.writeHead(200, { 'Content-Type': 'application/json' }); + * res.end(JSON.stringify({ + * data: 'Hello World!', + * })); + * }); + * + * server.listen(8000); + * ``` + * @since v0.1.13 + */ + function createServer< + Request extends typeof IncomingMessage = typeof IncomingMessage, + Response extends typeof ServerResponse = typeof ServerResponse, + >(requestListener?: RequestListener): Server; + function createServer< + Request extends typeof IncomingMessage = typeof IncomingMessage, + Response extends typeof ServerResponse = typeof ServerResponse, + >( + options: ServerOptions, + requestListener?: RequestListener, + ): Server; + // although RequestOptions are passed as ClientRequestArgs to ClientRequest directly, + // create interface RequestOptions would make the naming more clear to developers + interface RequestOptions extends ClientRequestArgs {} + /** + * `options` in `socket.connect()` are also supported. + * + * Node.js maintains several connections per server to make HTTP requests. + * This function allows one to transparently issue requests. + * + * `url` can be a string or a `URL` object. If `url` is a + * string, it is automatically parsed with `new URL()`. If it is a `URL` object, it will be automatically converted to an ordinary `options` object. + * + * If both `url` and `options` are specified, the objects are merged, with the`options` properties taking precedence. + * + * The optional `callback` parameter will be added as a one-time listener for + * the `'response'` event. + * + * `http.request()` returns an instance of the {@link ClientRequest} class. The `ClientRequest` instance is a writable stream. If one needs to + * upload a file with a POST request, then write to the `ClientRequest` object. + * + * ```js + * import http from 'node:http'; + * import { Buffer } from 'node:buffer'; + * + * const postData = JSON.stringify({ + * 'msg': 'Hello World!', + * }); + * + * const options = { + * hostname: 'www.google.com', + * port: 80, + * path: '/upload', + * method: 'POST', + * headers: { + * 'Content-Type': 'application/json', + * 'Content-Length': Buffer.byteLength(postData), + * }, + * }; + * + * const req = http.request(options, (res) => { + * console.log(`STATUS: ${res.statusCode}`); + * console.log(`HEADERS: ${JSON.stringify(res.headers)}`); + * res.setEncoding('utf8'); + * res.on('data', (chunk) => { + * console.log(`BODY: ${chunk}`); + * }); + * res.on('end', () => { + * console.log('No more data in response.'); + * }); + * }); + * + * req.on('error', (e) => { + * console.error(`problem with request: ${e.message}`); + * }); + * + * // Write data to request body + * req.write(postData); + * req.end(); + * ``` + * + * In the example `req.end()` was called. With `http.request()` one + * must always call `req.end()` to signify the end of the request - + * even if there is no data being written to the request body. + * + * If any error is encountered during the request (be that with DNS resolution, + * TCP level errors, or actual HTTP parse errors) an `'error'` event is emitted + * on the returned request object. As with all `'error'` events, if no listeners + * are registered the error will be thrown. + * + * There are a few special headers that should be noted. + * + * * Sending a 'Connection: keep-alive' will notify Node.js that the connection to + * the server should be persisted until the next request. + * * Sending a 'Content-Length' header will disable the default chunked encoding. + * * Sending an 'Expect' header will immediately send the request headers. + * Usually, when sending 'Expect: 100-continue', both a timeout and a listener + * for the `'continue'` event should be set. See RFC 2616 Section 8.2.3 for more + * information. + * * Sending an Authorization header will override using the `auth` option + * to compute basic authentication. + * + * Example using a `URL` as `options`: + * + * ```js + * const options = new URL('http://abc:xyz@example.com'); + * + * const req = http.request(options, (res) => { + * // ... + * }); + * ``` + * + * In a successful request, the following events will be emitted in the following + * order: + * + * * `'socket'` + * * `'response'` + * * `'data'` any number of times, on the `res` object + * (`'data'` will not be emitted at all if the response body is empty, for + * instance, in most redirects) + * * `'end'` on the `res` object + * * `'close'` + * + * In the case of a connection error, the following events will be emitted: + * + * * `'socket'` + * * `'error'` + * * `'close'` + * + * In the case of a premature connection close before the response is received, + * the following events will be emitted in the following order: + * + * * `'socket'` + * * `'error'` with an error with message `'Error: socket hang up'` and code`'ECONNRESET'` + * * `'close'` + * + * In the case of a premature connection close after the response is received, + * the following events will be emitted in the following order: + * + * * `'socket'` + * * `'response'` + * * `'data'` any number of times, on the `res` object + * * (connection closed here) + * * `'aborted'` on the `res` object + * * `'error'` on the `res` object with an error with message`'Error: aborted'` and code `'ECONNRESET'` + * * `'close'` + * * `'close'` on the `res` object + * + * If `req.destroy()` is called before a socket is assigned, the following + * events will be emitted in the following order: + * + * * (`req.destroy()` called here) + * * `'error'` with an error with message `'Error: socket hang up'` and code`'ECONNRESET'`, or the error with which `req.destroy()` was called + * * `'close'` + * + * If `req.destroy()` is called before the connection succeeds, the following + * events will be emitted in the following order: + * + * * `'socket'` + * * (`req.destroy()` called here) + * * `'error'` with an error with message `'Error: socket hang up'` and code`'ECONNRESET'`, or the error with which `req.destroy()` was called + * * `'close'` + * + * If `req.destroy()` is called after the response is received, the following + * events will be emitted in the following order: + * + * * `'socket'` + * * `'response'` + * * `'data'` any number of times, on the `res` object + * * (`req.destroy()` called here) + * * `'aborted'` on the `res` object + * * `'error'` on the `res` object with an error with message `'Error: aborted'`and code `'ECONNRESET'`, or the error with which `req.destroy()` was called + * * `'close'` + * * `'close'` on the `res` object + * + * If `req.abort()` is called before a socket is assigned, the following + * events will be emitted in the following order: + * + * * (`req.abort()` called here) + * * `'abort'` + * * `'close'` + * + * If `req.abort()` is called before the connection succeeds, the following + * events will be emitted in the following order: + * + * * `'socket'` + * * (`req.abort()` called here) + * * `'abort'` + * * `'error'` with an error with message `'Error: socket hang up'` and code`'ECONNRESET'` + * * `'close'` + * + * If `req.abort()` is called after the response is received, the following + * events will be emitted in the following order: + * + * * `'socket'` + * * `'response'` + * * `'data'` any number of times, on the `res` object + * * (`req.abort()` called here) + * * `'abort'` + * * `'aborted'` on the `res` object + * * `'error'` on the `res` object with an error with message`'Error: aborted'` and code `'ECONNRESET'`. + * * `'close'` + * * `'close'` on the `res` object + * + * Setting the `timeout` option or using the `setTimeout()` function will + * not abort the request or do anything besides add a `'timeout'` event. + * + * Passing an `AbortSignal` and then calling `abort()` on the corresponding`AbortController` will behave the same way as calling `.destroy()` on the + * request. Specifically, the `'error'` event will be emitted with an error with + * the message `'AbortError: The operation was aborted'`, the code `'ABORT_ERR'`and the `cause`, if one was provided. + * @since v0.3.6 + */ + function request(options: RequestOptions | string | URL, callback?: (res: IncomingMessage) => void): ClientRequest; + function request( + url: string | URL, + options: RequestOptions, + callback?: (res: IncomingMessage) => void, + ): ClientRequest; + /** + * Since most requests are GET requests without bodies, Node.js provides this + * convenience method. The only difference between this method and {@link request} is that it sets the method to GET by default and calls `req.end()`automatically. The callback must take care to + * consume the response + * data for reasons stated in {@link ClientRequest} section. + * + * The `callback` is invoked with a single argument that is an instance of {@link IncomingMessage}. + * + * JSON fetching example: + * + * ```js + * http.get('http://localhost:8000/', (res) => { + * const { statusCode } = res; + * const contentType = res.headers['content-type']; + * + * let error; + * // Any 2xx status code signals a successful response but + * // here we're only checking for 200. + * if (statusCode !== 200) { + * error = new Error('Request Failed.\n' + + * `Status Code: ${statusCode}`); + * } else if (!/^application\/json/.test(contentType)) { + * error = new Error('Invalid content-type.\n' + + * `Expected application/json but received ${contentType}`); + * } + * if (error) { + * console.error(error.message); + * // Consume response data to free up memory + * res.resume(); + * return; + * } + * + * res.setEncoding('utf8'); + * let rawData = ''; + * res.on('data', (chunk) => { rawData += chunk; }); + * res.on('end', () => { + * try { + * const parsedData = JSON.parse(rawData); + * console.log(parsedData); + * } catch (e) { + * console.error(e.message); + * } + * }); + * }).on('error', (e) => { + * console.error(`Got error: ${e.message}`); + * }); + * + * // Create a local server to receive data from + * const server = http.createServer((req, res) => { + * res.writeHead(200, { 'Content-Type': 'application/json' }); + * res.end(JSON.stringify({ + * data: 'Hello World!', + * })); + * }); + * + * server.listen(8000); + * ``` + * @since v0.3.6 + * @param options Accepts the same `options` as {@link request}, with the method set to GET by default. + */ + function get(options: RequestOptions | string | URL, callback?: (res: IncomingMessage) => void): ClientRequest; + function get(url: string | URL, options: RequestOptions, callback?: (res: IncomingMessage) => void): ClientRequest; + /** + * Performs the low-level validations on the provided `name` that are done when`res.setHeader(name, value)` is called. + * + * Passing illegal value as `name` will result in a `TypeError` being thrown, + * identified by `code: 'ERR_INVALID_HTTP_TOKEN'`. + * + * It is not necessary to use this method before passing headers to an HTTP request + * or response. The HTTP module will automatically validate such headers. + * Examples: + * + * Example: + * + * ```js + * import { validateHeaderName } from 'node:http'; + * + * try { + * validateHeaderName(''); + * } catch (err) { + * console.error(err instanceof TypeError); // --> true + * console.error(err.code); // --> 'ERR_INVALID_HTTP_TOKEN' + * console.error(err.message); // --> 'Header name must be a valid HTTP token [""]' + * } + * ``` + * @since v14.3.0 + * @param [label='Header name'] Label for error message. + */ + function validateHeaderName(name: string): void; + /** + * Performs the low-level validations on the provided `value` that are done when`res.setHeader(name, value)` is called. + * + * Passing illegal value as `value` will result in a `TypeError` being thrown. + * + * * Undefined value error is identified by `code: 'ERR_HTTP_INVALID_HEADER_VALUE'`. + * * Invalid value character error is identified by `code: 'ERR_INVALID_CHAR'`. + * + * It is not necessary to use this method before passing headers to an HTTP request + * or response. The HTTP module will automatically validate such headers. + * + * Examples: + * + * ```js + * import { validateHeaderValue } from 'node:http'; + * + * try { + * validateHeaderValue('x-my-header', undefined); + * } catch (err) { + * console.error(err instanceof TypeError); // --> true + * console.error(err.code === 'ERR_HTTP_INVALID_HEADER_VALUE'); // --> true + * console.error(err.message); // --> 'Invalid value "undefined" for header "x-my-header"' + * } + * + * try { + * validateHeaderValue('x-my-header', 'oʊmɪɡə'); + * } catch (err) { + * console.error(err instanceof TypeError); // --> true + * console.error(err.code === 'ERR_INVALID_CHAR'); // --> true + * console.error(err.message); // --> 'Invalid character in header content ["x-my-header"]' + * } + * ``` + * @since v14.3.0 + * @param name Header name + * @param value Header value + */ + function validateHeaderValue(name: string, value: string): void; + /** + * Set the maximum number of idle HTTP parsers. + * @since v18.8.0, v16.18.0 + * @param [max=1000] + */ + function setMaxIdleHTTPParsers(max: number): void; + let globalAgent: Agent; + /** + * Read-only property specifying the maximum allowed size of HTTP headers in bytes. + * Defaults to 16KB. Configurable using the `--max-http-header-size` CLI option. + */ + const maxHeaderSize: number; +} +declare module "node:http" { + export * from "http"; +} diff --git a/task/node_modules/@types/node/http2.d.ts b/task/node_modules/@types/node/http2.d.ts new file mode 100644 index 0000000..c3b3e8e --- /dev/null +++ b/task/node_modules/@types/node/http2.d.ts @@ -0,0 +1,2382 @@ +/** + * The `node:http2` module provides an implementation of the [HTTP/2](https://tools.ietf.org/html/rfc7540) protocol. + * It can be accessed using: + * + * ```js + * const http2 = require('node:http2'); + * ``` + * @since v8.4.0 + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/http2.js) + */ +declare module "http2" { + import EventEmitter = require("node:events"); + import * as fs from "node:fs"; + import * as net from "node:net"; + import * as stream from "node:stream"; + import * as tls from "node:tls"; + import * as url from "node:url"; + import { + IncomingHttpHeaders as Http1IncomingHttpHeaders, + IncomingMessage, + OutgoingHttpHeaders, + ServerResponse, + } from "node:http"; + export { OutgoingHttpHeaders } from "node:http"; + export interface IncomingHttpStatusHeader { + ":status"?: number | undefined; + } + export interface IncomingHttpHeaders extends Http1IncomingHttpHeaders { + ":path"?: string | undefined; + ":method"?: string | undefined; + ":authority"?: string | undefined; + ":scheme"?: string | undefined; + } + // Http2Stream + export interface StreamPriorityOptions { + exclusive?: boolean | undefined; + parent?: number | undefined; + weight?: number | undefined; + silent?: boolean | undefined; + } + export interface StreamState { + localWindowSize?: number | undefined; + state?: number | undefined; + localClose?: number | undefined; + remoteClose?: number | undefined; + sumDependencyWeight?: number | undefined; + weight?: number | undefined; + } + export interface ServerStreamResponseOptions { + endStream?: boolean | undefined; + waitForTrailers?: boolean | undefined; + } + export interface StatOptions { + offset: number; + length: number; + } + export interface ServerStreamFileResponseOptions { + // eslint-disable-next-line @typescript-eslint/no-invalid-void-type + statCheck?(stats: fs.Stats, headers: OutgoingHttpHeaders, statOptions: StatOptions): void | boolean; + waitForTrailers?: boolean | undefined; + offset?: number | undefined; + length?: number | undefined; + } + export interface ServerStreamFileResponseOptionsWithError extends ServerStreamFileResponseOptions { + onError?(err: NodeJS.ErrnoException): void; + } + export interface Http2Stream extends stream.Duplex { + /** + * Set to `true` if the `Http2Stream` instance was aborted abnormally. When set, + * the `'aborted'` event will have been emitted. + * @since v8.4.0 + */ + readonly aborted: boolean; + /** + * This property shows the number of characters currently buffered to be written. + * See `net.Socket.bufferSize` for details. + * @since v11.2.0, v10.16.0 + */ + readonly bufferSize: number; + /** + * Set to `true` if the `Http2Stream` instance has been closed. + * @since v9.4.0 + */ + readonly closed: boolean; + /** + * Set to `true` if the `Http2Stream` instance has been destroyed and is no longer + * usable. + * @since v8.4.0 + */ + readonly destroyed: boolean; + /** + * Set to `true` if the `END_STREAM` flag was set in the request or response + * HEADERS frame received, indicating that no additional data should be received + * and the readable side of the `Http2Stream` will be closed. + * @since v10.11.0 + */ + readonly endAfterHeaders: boolean; + /** + * The numeric stream identifier of this `Http2Stream` instance. Set to `undefined`if the stream identifier has not yet been assigned. + * @since v8.4.0 + */ + readonly id?: number | undefined; + /** + * Set to `true` if the `Http2Stream` instance has not yet been assigned a + * numeric stream identifier. + * @since v9.4.0 + */ + readonly pending: boolean; + /** + * Set to the `RST_STREAM` `error code` reported when the `Http2Stream` is + * destroyed after either receiving an `RST_STREAM` frame from the connected peer, + * calling `http2stream.close()`, or `http2stream.destroy()`. Will be`undefined` if the `Http2Stream` has not been closed. + * @since v8.4.0 + */ + readonly rstCode: number; + /** + * An object containing the outbound headers sent for this `Http2Stream`. + * @since v9.5.0 + */ + readonly sentHeaders: OutgoingHttpHeaders; + /** + * An array of objects containing the outbound informational (additional) headers + * sent for this `Http2Stream`. + * @since v9.5.0 + */ + readonly sentInfoHeaders?: OutgoingHttpHeaders[] | undefined; + /** + * An object containing the outbound trailers sent for this `HttpStream`. + * @since v9.5.0 + */ + readonly sentTrailers?: OutgoingHttpHeaders | undefined; + /** + * A reference to the `Http2Session` instance that owns this `Http2Stream`. The + * value will be `undefined` after the `Http2Stream` instance is destroyed. + * @since v8.4.0 + */ + readonly session: Http2Session | undefined; + /** + * Provides miscellaneous information about the current state of the`Http2Stream`. + * + * A current state of this `Http2Stream`. + * @since v8.4.0 + */ + readonly state: StreamState; + /** + * Closes the `Http2Stream` instance by sending an `RST_STREAM` frame to the + * connected HTTP/2 peer. + * @since v8.4.0 + * @param [code=http2.constants.NGHTTP2_NO_ERROR] Unsigned 32-bit integer identifying the error code. + * @param callback An optional function registered to listen for the `'close'` event. + */ + close(code?: number, callback?: () => void): void; + /** + * Updates the priority for this `Http2Stream` instance. + * @since v8.4.0 + */ + priority(options: StreamPriorityOptions): void; + /** + * ```js + * const http2 = require('node:http2'); + * const client = http2.connect('http://example.org:8000'); + * const { NGHTTP2_CANCEL } = http2.constants; + * const req = client.request({ ':path': '/' }); + * + * // Cancel the stream if there's no activity after 5 seconds + * req.setTimeout(5000, () => req.close(NGHTTP2_CANCEL)); + * ``` + * @since v8.4.0 + */ + setTimeout(msecs: number, callback?: () => void): void; + /** + * Sends a trailing `HEADERS` frame to the connected HTTP/2 peer. This method + * will cause the `Http2Stream` to be immediately closed and must only be + * called after the `'wantTrailers'` event has been emitted. When sending a + * request or sending a response, the `options.waitForTrailers` option must be set + * in order to keep the `Http2Stream` open after the final `DATA` frame so that + * trailers can be sent. + * + * ```js + * const http2 = require('node:http2'); + * const server = http2.createServer(); + * server.on('stream', (stream) => { + * stream.respond(undefined, { waitForTrailers: true }); + * stream.on('wantTrailers', () => { + * stream.sendTrailers({ xyz: 'abc' }); + * }); + * stream.end('Hello World'); + * }); + * ``` + * + * The HTTP/1 specification forbids trailers from containing HTTP/2 pseudo-header + * fields (e.g. `':method'`, `':path'`, etc). + * @since v10.0.0 + */ + sendTrailers(headers: OutgoingHttpHeaders): void; + addListener(event: "aborted", listener: () => void): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "data", listener: (chunk: Buffer | string) => void): this; + addListener(event: "drain", listener: () => void): this; + addListener(event: "end", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "finish", listener: () => void): this; + addListener(event: "frameError", listener: (frameType: number, errorCode: number) => void): this; + addListener(event: "pipe", listener: (src: stream.Readable) => void): this; + addListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + addListener(event: "streamClosed", listener: (code: number) => void): this; + addListener(event: "timeout", listener: () => void): this; + addListener(event: "trailers", listener: (trailers: IncomingHttpHeaders, flags: number) => void): this; + addListener(event: "wantTrailers", listener: () => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + emit(event: "aborted"): boolean; + emit(event: "close"): boolean; + emit(event: "data", chunk: Buffer | string): boolean; + emit(event: "drain"): boolean; + emit(event: "end"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "finish"): boolean; + emit(event: "frameError", frameType: number, errorCode: number): boolean; + emit(event: "pipe", src: stream.Readable): boolean; + emit(event: "unpipe", src: stream.Readable): boolean; + emit(event: "streamClosed", code: number): boolean; + emit(event: "timeout"): boolean; + emit(event: "trailers", trailers: IncomingHttpHeaders, flags: number): boolean; + emit(event: "wantTrailers"): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on(event: "aborted", listener: () => void): this; + on(event: "close", listener: () => void): this; + on(event: "data", listener: (chunk: Buffer | string) => void): this; + on(event: "drain", listener: () => void): this; + on(event: "end", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "finish", listener: () => void): this; + on(event: "frameError", listener: (frameType: number, errorCode: number) => void): this; + on(event: "pipe", listener: (src: stream.Readable) => void): this; + on(event: "unpipe", listener: (src: stream.Readable) => void): this; + on(event: "streamClosed", listener: (code: number) => void): this; + on(event: "timeout", listener: () => void): this; + on(event: "trailers", listener: (trailers: IncomingHttpHeaders, flags: number) => void): this; + on(event: "wantTrailers", listener: () => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: "aborted", listener: () => void): this; + once(event: "close", listener: () => void): this; + once(event: "data", listener: (chunk: Buffer | string) => void): this; + once(event: "drain", listener: () => void): this; + once(event: "end", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "finish", listener: () => void): this; + once(event: "frameError", listener: (frameType: number, errorCode: number) => void): this; + once(event: "pipe", listener: (src: stream.Readable) => void): this; + once(event: "unpipe", listener: (src: stream.Readable) => void): this; + once(event: "streamClosed", listener: (code: number) => void): this; + once(event: "timeout", listener: () => void): this; + once(event: "trailers", listener: (trailers: IncomingHttpHeaders, flags: number) => void): this; + once(event: "wantTrailers", listener: () => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener(event: "aborted", listener: () => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "data", listener: (chunk: Buffer | string) => void): this; + prependListener(event: "drain", listener: () => void): this; + prependListener(event: "end", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "finish", listener: () => void): this; + prependListener(event: "frameError", listener: (frameType: number, errorCode: number) => void): this; + prependListener(event: "pipe", listener: (src: stream.Readable) => void): this; + prependListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + prependListener(event: "streamClosed", listener: (code: number) => void): this; + prependListener(event: "timeout", listener: () => void): this; + prependListener(event: "trailers", listener: (trailers: IncomingHttpHeaders, flags: number) => void): this; + prependListener(event: "wantTrailers", listener: () => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener(event: "aborted", listener: () => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "data", listener: (chunk: Buffer | string) => void): this; + prependOnceListener(event: "drain", listener: () => void): this; + prependOnceListener(event: "end", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "finish", listener: () => void): this; + prependOnceListener(event: "frameError", listener: (frameType: number, errorCode: number) => void): this; + prependOnceListener(event: "pipe", listener: (src: stream.Readable) => void): this; + prependOnceListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + prependOnceListener(event: "streamClosed", listener: (code: number) => void): this; + prependOnceListener(event: "timeout", listener: () => void): this; + prependOnceListener(event: "trailers", listener: (trailers: IncomingHttpHeaders, flags: number) => void): this; + prependOnceListener(event: "wantTrailers", listener: () => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + export interface ClientHttp2Stream extends Http2Stream { + addListener(event: "continue", listener: () => {}): this; + addListener( + event: "headers", + listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void, + ): this; + addListener(event: "push", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; + addListener( + event: "response", + listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void, + ): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + emit(event: "continue"): boolean; + emit(event: "headers", headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number): boolean; + emit(event: "push", headers: IncomingHttpHeaders, flags: number): boolean; + emit(event: "response", headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on(event: "continue", listener: () => {}): this; + on( + event: "headers", + listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void, + ): this; + on(event: "push", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; + on( + event: "response", + listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void, + ): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: "continue", listener: () => {}): this; + once( + event: "headers", + listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void, + ): this; + once(event: "push", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; + once( + event: "response", + listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void, + ): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener(event: "continue", listener: () => {}): this; + prependListener( + event: "headers", + listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void, + ): this; + prependListener(event: "push", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; + prependListener( + event: "response", + listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void, + ): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener(event: "continue", listener: () => {}): this; + prependOnceListener( + event: "headers", + listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void, + ): this; + prependOnceListener(event: "push", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; + prependOnceListener( + event: "response", + listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void, + ): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + export interface ServerHttp2Stream extends Http2Stream { + /** + * True if headers were sent, false otherwise (read-only). + * @since v8.4.0 + */ + readonly headersSent: boolean; + /** + * Read-only property mapped to the `SETTINGS_ENABLE_PUSH` flag of the remote + * client's most recent `SETTINGS` frame. Will be `true` if the remote peer + * accepts push streams, `false` otherwise. Settings are the same for every`Http2Stream` in the same `Http2Session`. + * @since v8.4.0 + */ + readonly pushAllowed: boolean; + /** + * Sends an additional informational `HEADERS` frame to the connected HTTP/2 peer. + * @since v8.4.0 + */ + additionalHeaders(headers: OutgoingHttpHeaders): void; + /** + * Initiates a push stream. The callback is invoked with the new `Http2Stream`instance created for the push stream passed as the second argument, or an`Error` passed as the first argument. + * + * ```js + * const http2 = require('node:http2'); + * const server = http2.createServer(); + * server.on('stream', (stream) => { + * stream.respond({ ':status': 200 }); + * stream.pushStream({ ':path': '/' }, (err, pushStream, headers) => { + * if (err) throw err; + * pushStream.respond({ ':status': 200 }); + * pushStream.end('some pushed data'); + * }); + * stream.end('some data'); + * }); + * ``` + * + * Setting the weight of a push stream is not allowed in the `HEADERS` frame. Pass + * a `weight` value to `http2stream.priority` with the `silent` option set to`true` to enable server-side bandwidth balancing between concurrent streams. + * + * Calling `http2stream.pushStream()` from within a pushed stream is not permitted + * and will throw an error. + * @since v8.4.0 + * @param callback Callback that is called once the push stream has been initiated. + */ + pushStream( + headers: OutgoingHttpHeaders, + callback?: (err: Error | null, pushStream: ServerHttp2Stream, headers: OutgoingHttpHeaders) => void, + ): void; + pushStream( + headers: OutgoingHttpHeaders, + options?: StreamPriorityOptions, + callback?: (err: Error | null, pushStream: ServerHttp2Stream, headers: OutgoingHttpHeaders) => void, + ): void; + /** + * ```js + * const http2 = require('node:http2'); + * const server = http2.createServer(); + * server.on('stream', (stream) => { + * stream.respond({ ':status': 200 }); + * stream.end('some data'); + * }); + * ``` + * + * Initiates a response. When the `options.waitForTrailers` option is set, the`'wantTrailers'` event will be emitted immediately after queuing the last chunk + * of payload data to be sent. The `http2stream.sendTrailers()` method can then be + * used to sent trailing header fields to the peer. + * + * When `options.waitForTrailers` is set, the `Http2Stream` will not automatically + * close when the final `DATA` frame is transmitted. User code must call either`http2stream.sendTrailers()` or `http2stream.close()` to close the`Http2Stream`. + * + * ```js + * const http2 = require('node:http2'); + * const server = http2.createServer(); + * server.on('stream', (stream) => { + * stream.respond({ ':status': 200 }, { waitForTrailers: true }); + * stream.on('wantTrailers', () => { + * stream.sendTrailers({ ABC: 'some value to send' }); + * }); + * stream.end('some data'); + * }); + * ``` + * @since v8.4.0 + */ + respond(headers?: OutgoingHttpHeaders, options?: ServerStreamResponseOptions): void; + /** + * Initiates a response whose data is read from the given file descriptor. No + * validation is performed on the given file descriptor. If an error occurs while + * attempting to read data using the file descriptor, the `Http2Stream` will be + * closed using an `RST_STREAM` frame using the standard `INTERNAL_ERROR` code. + * + * When used, the `Http2Stream` object's `Duplex` interface will be closed + * automatically. + * + * ```js + * const http2 = require('node:http2'); + * const fs = require('node:fs'); + * + * const server = http2.createServer(); + * server.on('stream', (stream) => { + * const fd = fs.openSync('/some/file', 'r'); + * + * const stat = fs.fstatSync(fd); + * const headers = { + * 'content-length': stat.size, + * 'last-modified': stat.mtime.toUTCString(), + * 'content-type': 'text/plain; charset=utf-8', + * }; + * stream.respondWithFD(fd, headers); + * stream.on('close', () => fs.closeSync(fd)); + * }); + * ``` + * + * The optional `options.statCheck` function may be specified to give user code + * an opportunity to set additional content headers based on the `fs.Stat` details + * of the given fd. If the `statCheck` function is provided, the`http2stream.respondWithFD()` method will perform an `fs.fstat()` call to + * collect details on the provided file descriptor. + * + * The `offset` and `length` options may be used to limit the response to a + * specific range subset. This can be used, for instance, to support HTTP Range + * requests. + * + * The file descriptor or `FileHandle` is not closed when the stream is closed, + * so it will need to be closed manually once it is no longer needed. + * Using the same file descriptor concurrently for multiple streams + * is not supported and may result in data loss. Re-using a file descriptor + * after a stream has finished is supported. + * + * When the `options.waitForTrailers` option is set, the `'wantTrailers'` event + * will be emitted immediately after queuing the last chunk of payload data to be + * sent. The `http2stream.sendTrailers()` method can then be used to sent trailing + * header fields to the peer. + * + * When `options.waitForTrailers` is set, the `Http2Stream` will not automatically + * close when the final `DATA` frame is transmitted. User code _must_ call either`http2stream.sendTrailers()` or `http2stream.close()` to close the`Http2Stream`. + * + * ```js + * const http2 = require('node:http2'); + * const fs = require('node:fs'); + * + * const server = http2.createServer(); + * server.on('stream', (stream) => { + * const fd = fs.openSync('/some/file', 'r'); + * + * const stat = fs.fstatSync(fd); + * const headers = { + * 'content-length': stat.size, + * 'last-modified': stat.mtime.toUTCString(), + * 'content-type': 'text/plain; charset=utf-8', + * }; + * stream.respondWithFD(fd, headers, { waitForTrailers: true }); + * stream.on('wantTrailers', () => { + * stream.sendTrailers({ ABC: 'some value to send' }); + * }); + * + * stream.on('close', () => fs.closeSync(fd)); + * }); + * ``` + * @since v8.4.0 + * @param fd A readable file descriptor. + */ + respondWithFD( + fd: number | fs.promises.FileHandle, + headers?: OutgoingHttpHeaders, + options?: ServerStreamFileResponseOptions, + ): void; + /** + * Sends a regular file as the response. The `path` must specify a regular file + * or an `'error'` event will be emitted on the `Http2Stream` object. + * + * When used, the `Http2Stream` object's `Duplex` interface will be closed + * automatically. + * + * The optional `options.statCheck` function may be specified to give user code + * an opportunity to set additional content headers based on the `fs.Stat` details + * of the given file: + * + * If an error occurs while attempting to read the file data, the `Http2Stream`will be closed using an `RST_STREAM` frame using the standard `INTERNAL_ERROR`code. If the `onError` callback is + * defined, then it will be called. Otherwise + * the stream will be destroyed. + * + * Example using a file path: + * + * ```js + * const http2 = require('node:http2'); + * const server = http2.createServer(); + * server.on('stream', (stream) => { + * function statCheck(stat, headers) { + * headers['last-modified'] = stat.mtime.toUTCString(); + * } + * + * function onError(err) { + * // stream.respond() can throw if the stream has been destroyed by + * // the other side. + * try { + * if (err.code === 'ENOENT') { + * stream.respond({ ':status': 404 }); + * } else { + * stream.respond({ ':status': 500 }); + * } + * } catch (err) { + * // Perform actual error handling. + * console.error(err); + * } + * stream.end(); + * } + * + * stream.respondWithFile('/some/file', + * { 'content-type': 'text/plain; charset=utf-8' }, + * { statCheck, onError }); + * }); + * ``` + * + * The `options.statCheck` function may also be used to cancel the send operation + * by returning `false`. For instance, a conditional request may check the stat + * results to determine if the file has been modified to return an appropriate`304` response: + * + * ```js + * const http2 = require('node:http2'); + * const server = http2.createServer(); + * server.on('stream', (stream) => { + * function statCheck(stat, headers) { + * // Check the stat here... + * stream.respond({ ':status': 304 }); + * return false; // Cancel the send operation + * } + * stream.respondWithFile('/some/file', + * { 'content-type': 'text/plain; charset=utf-8' }, + * { statCheck }); + * }); + * ``` + * + * The `content-length` header field will be automatically set. + * + * The `offset` and `length` options may be used to limit the response to a + * specific range subset. This can be used, for instance, to support HTTP Range + * requests. + * + * The `options.onError` function may also be used to handle all the errors + * that could happen before the delivery of the file is initiated. The + * default behavior is to destroy the stream. + * + * When the `options.waitForTrailers` option is set, the `'wantTrailers'` event + * will be emitted immediately after queuing the last chunk of payload data to be + * sent. The `http2stream.sendTrailers()` method can then be used to sent trailing + * header fields to the peer. + * + * When `options.waitForTrailers` is set, the `Http2Stream` will not automatically + * close when the final `DATA` frame is transmitted. User code must call either`http2stream.sendTrailers()` or `http2stream.close()` to close the`Http2Stream`. + * + * ```js + * const http2 = require('node:http2'); + * const server = http2.createServer(); + * server.on('stream', (stream) => { + * stream.respondWithFile('/some/file', + * { 'content-type': 'text/plain; charset=utf-8' }, + * { waitForTrailers: true }); + * stream.on('wantTrailers', () => { + * stream.sendTrailers({ ABC: 'some value to send' }); + * }); + * }); + * ``` + * @since v8.4.0 + */ + respondWithFile( + path: string, + headers?: OutgoingHttpHeaders, + options?: ServerStreamFileResponseOptionsWithError, + ): void; + } + // Http2Session + export interface Settings { + headerTableSize?: number | undefined; + enablePush?: boolean | undefined; + initialWindowSize?: number | undefined; + maxFrameSize?: number | undefined; + maxConcurrentStreams?: number | undefined; + maxHeaderListSize?: number | undefined; + enableConnectProtocol?: boolean | undefined; + } + export interface ClientSessionRequestOptions { + endStream?: boolean | undefined; + exclusive?: boolean | undefined; + parent?: number | undefined; + weight?: number | undefined; + waitForTrailers?: boolean | undefined; + signal?: AbortSignal | undefined; + } + export interface SessionState { + effectiveLocalWindowSize?: number | undefined; + effectiveRecvDataLength?: number | undefined; + nextStreamID?: number | undefined; + localWindowSize?: number | undefined; + lastProcStreamID?: number | undefined; + remoteWindowSize?: number | undefined; + outboundQueueSize?: number | undefined; + deflateDynamicTableSize?: number | undefined; + inflateDynamicTableSize?: number | undefined; + } + export interface Http2Session extends EventEmitter { + /** + * Value will be `undefined` if the `Http2Session` is not yet connected to a + * socket, `h2c` if the `Http2Session` is not connected to a `TLSSocket`, or + * will return the value of the connected `TLSSocket`'s own `alpnProtocol`property. + * @since v9.4.0 + */ + readonly alpnProtocol?: string | undefined; + /** + * Will be `true` if this `Http2Session` instance has been closed, otherwise`false`. + * @since v9.4.0 + */ + readonly closed: boolean; + /** + * Will be `true` if this `Http2Session` instance is still connecting, will be set + * to `false` before emitting `connect` event and/or calling the `http2.connect`callback. + * @since v10.0.0 + */ + readonly connecting: boolean; + /** + * Will be `true` if this `Http2Session` instance has been destroyed and must no + * longer be used, otherwise `false`. + * @since v8.4.0 + */ + readonly destroyed: boolean; + /** + * Value is `undefined` if the `Http2Session` session socket has not yet been + * connected, `true` if the `Http2Session` is connected with a `TLSSocket`, + * and `false` if the `Http2Session` is connected to any other kind of socket + * or stream. + * @since v9.4.0 + */ + readonly encrypted?: boolean | undefined; + /** + * A prototype-less object describing the current local settings of this`Http2Session`. The local settings are local to _this_`Http2Session` instance. + * @since v8.4.0 + */ + readonly localSettings: Settings; + /** + * If the `Http2Session` is connected to a `TLSSocket`, the `originSet` property + * will return an `Array` of origins for which the `Http2Session` may be + * considered authoritative. + * + * The `originSet` property is only available when using a secure TLS connection. + * @since v9.4.0 + */ + readonly originSet?: string[] | undefined; + /** + * Indicates whether the `Http2Session` is currently waiting for acknowledgment of + * a sent `SETTINGS` frame. Will be `true` after calling the`http2session.settings()` method. Will be `false` once all sent `SETTINGS`frames have been acknowledged. + * @since v8.4.0 + */ + readonly pendingSettingsAck: boolean; + /** + * A prototype-less object describing the current remote settings of this`Http2Session`. The remote settings are set by the _connected_ HTTP/2 peer. + * @since v8.4.0 + */ + readonly remoteSettings: Settings; + /** + * Returns a `Proxy` object that acts as a `net.Socket` (or `tls.TLSSocket`) but + * limits available methods to ones safe to use with HTTP/2. + * + * `destroy`, `emit`, `end`, `pause`, `read`, `resume`, and `write` will throw + * an error with code `ERR_HTTP2_NO_SOCKET_MANIPULATION`. See `Http2Session and Sockets` for more information. + * + * `setTimeout` method will be called on this `Http2Session`. + * + * All other interactions will be routed directly to the socket. + * @since v8.4.0 + */ + readonly socket: net.Socket | tls.TLSSocket; + /** + * Provides miscellaneous information about the current state of the`Http2Session`. + * + * An object describing the current status of this `Http2Session`. + * @since v8.4.0 + */ + readonly state: SessionState; + /** + * The `http2session.type` will be equal to`http2.constants.NGHTTP2_SESSION_SERVER` if this `Http2Session` instance is a + * server, and `http2.constants.NGHTTP2_SESSION_CLIENT` if the instance is a + * client. + * @since v8.4.0 + */ + readonly type: number; + /** + * Gracefully closes the `Http2Session`, allowing any existing streams to + * complete on their own and preventing new `Http2Stream` instances from being + * created. Once closed, `http2session.destroy()`_might_ be called if there + * are no open `Http2Stream` instances. + * + * If specified, the `callback` function is registered as a handler for the`'close'` event. + * @since v9.4.0 + */ + close(callback?: () => void): void; + /** + * Immediately terminates the `Http2Session` and the associated `net.Socket` or`tls.TLSSocket`. + * + * Once destroyed, the `Http2Session` will emit the `'close'` event. If `error`is not undefined, an `'error'` event will be emitted immediately before the`'close'` event. + * + * If there are any remaining open `Http2Streams` associated with the`Http2Session`, those will also be destroyed. + * @since v8.4.0 + * @param error An `Error` object if the `Http2Session` is being destroyed due to an error. + * @param code The HTTP/2 error code to send in the final `GOAWAY` frame. If unspecified, and `error` is not undefined, the default is `INTERNAL_ERROR`, otherwise defaults to `NO_ERROR`. + */ + destroy(error?: Error, code?: number): void; + /** + * Transmits a `GOAWAY` frame to the connected peer _without_ shutting down the`Http2Session`. + * @since v9.4.0 + * @param code An HTTP/2 error code + * @param lastStreamID The numeric ID of the last processed `Http2Stream` + * @param opaqueData A `TypedArray` or `DataView` instance containing additional data to be carried within the `GOAWAY` frame. + */ + goaway(code?: number, lastStreamID?: number, opaqueData?: NodeJS.ArrayBufferView): void; + /** + * Sends a `PING` frame to the connected HTTP/2 peer. A `callback` function must + * be provided. The method will return `true` if the `PING` was sent, `false`otherwise. + * + * The maximum number of outstanding (unacknowledged) pings is determined by the`maxOutstandingPings` configuration option. The default maximum is 10. + * + * If provided, the `payload` must be a `Buffer`, `TypedArray`, or `DataView`containing 8 bytes of data that will be transmitted with the `PING` and + * returned with the ping acknowledgment. + * + * The callback will be invoked with three arguments: an error argument that will + * be `null` if the `PING` was successfully acknowledged, a `duration` argument + * that reports the number of milliseconds elapsed since the ping was sent and the + * acknowledgment was received, and a `Buffer` containing the 8-byte `PING`payload. + * + * ```js + * session.ping(Buffer.from('abcdefgh'), (err, duration, payload) => { + * if (!err) { + * console.log(`Ping acknowledged in ${duration} milliseconds`); + * console.log(`With payload '${payload.toString()}'`); + * } + * }); + * ``` + * + * If the `payload` argument is not specified, the default payload will be the + * 64-bit timestamp (little endian) marking the start of the `PING` duration. + * @since v8.9.3 + * @param payload Optional ping payload. + */ + ping(callback: (err: Error | null, duration: number, payload: Buffer) => void): boolean; + ping( + payload: NodeJS.ArrayBufferView, + callback: (err: Error | null, duration: number, payload: Buffer) => void, + ): boolean; + /** + * Calls `ref()` on this `Http2Session`instance's underlying `net.Socket`. + * @since v9.4.0 + */ + ref(): void; + /** + * Sets the local endpoint's window size. + * The `windowSize` is the total window size to set, not + * the delta. + * + * ```js + * const http2 = require('node:http2'); + * + * const server = http2.createServer(); + * const expectedWindowSize = 2 ** 20; + * server.on('connect', (session) => { + * + * // Set local window size to be 2 ** 20 + * session.setLocalWindowSize(expectedWindowSize); + * }); + * ``` + * @since v15.3.0, v14.18.0 + */ + setLocalWindowSize(windowSize: number): void; + /** + * Used to set a callback function that is called when there is no activity on + * the `Http2Session` after `msecs` milliseconds. The given `callback` is + * registered as a listener on the `'timeout'` event. + * @since v8.4.0 + */ + setTimeout(msecs: number, callback?: () => void): void; + /** + * Updates the current local settings for this `Http2Session` and sends a new`SETTINGS` frame to the connected HTTP/2 peer. + * + * Once called, the `http2session.pendingSettingsAck` property will be `true`while the session is waiting for the remote peer to acknowledge the new + * settings. + * + * The new settings will not become effective until the `SETTINGS` acknowledgment + * is received and the `'localSettings'` event is emitted. It is possible to send + * multiple `SETTINGS` frames while acknowledgment is still pending. + * @since v8.4.0 + * @param callback Callback that is called once the session is connected or right away if the session is already connected. + */ + settings( + settings: Settings, + callback?: (err: Error | null, settings: Settings, duration: number) => void, + ): void; + /** + * Calls `unref()` on this `Http2Session`instance's underlying `net.Socket`. + * @since v9.4.0 + */ + unref(): void; + addListener(event: "close", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener( + event: "frameError", + listener: (frameType: number, errorCode: number, streamID: number) => void, + ): this; + addListener( + event: "goaway", + listener: (errorCode: number, lastStreamID: number, opaqueData?: Buffer) => void, + ): this; + addListener(event: "localSettings", listener: (settings: Settings) => void): this; + addListener(event: "ping", listener: () => void): this; + addListener(event: "remoteSettings", listener: (settings: Settings) => void): this; + addListener(event: "timeout", listener: () => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + emit(event: "close"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "frameError", frameType: number, errorCode: number, streamID: number): boolean; + emit(event: "goaway", errorCode: number, lastStreamID: number, opaqueData?: Buffer): boolean; + emit(event: "localSettings", settings: Settings): boolean; + emit(event: "ping"): boolean; + emit(event: "remoteSettings", settings: Settings): boolean; + emit(event: "timeout"): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on(event: "close", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "frameError", listener: (frameType: number, errorCode: number, streamID: number) => void): this; + on(event: "goaway", listener: (errorCode: number, lastStreamID: number, opaqueData?: Buffer) => void): this; + on(event: "localSettings", listener: (settings: Settings) => void): this; + on(event: "ping", listener: () => void): this; + on(event: "remoteSettings", listener: (settings: Settings) => void): this; + on(event: "timeout", listener: () => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "frameError", listener: (frameType: number, errorCode: number, streamID: number) => void): this; + once(event: "goaway", listener: (errorCode: number, lastStreamID: number, opaqueData?: Buffer) => void): this; + once(event: "localSettings", listener: (settings: Settings) => void): this; + once(event: "ping", listener: () => void): this; + once(event: "remoteSettings", listener: (settings: Settings) => void): this; + once(event: "timeout", listener: () => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener( + event: "frameError", + listener: (frameType: number, errorCode: number, streamID: number) => void, + ): this; + prependListener( + event: "goaway", + listener: (errorCode: number, lastStreamID: number, opaqueData?: Buffer) => void, + ): this; + prependListener(event: "localSettings", listener: (settings: Settings) => void): this; + prependListener(event: "ping", listener: () => void): this; + prependListener(event: "remoteSettings", listener: (settings: Settings) => void): this; + prependListener(event: "timeout", listener: () => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener( + event: "frameError", + listener: (frameType: number, errorCode: number, streamID: number) => void, + ): this; + prependOnceListener( + event: "goaway", + listener: (errorCode: number, lastStreamID: number, opaqueData?: Buffer) => void, + ): this; + prependOnceListener(event: "localSettings", listener: (settings: Settings) => void): this; + prependOnceListener(event: "ping", listener: () => void): this; + prependOnceListener(event: "remoteSettings", listener: (settings: Settings) => void): this; + prependOnceListener(event: "timeout", listener: () => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + export interface ClientHttp2Session extends Http2Session { + /** + * For HTTP/2 Client `Http2Session` instances only, the `http2session.request()`creates and returns an `Http2Stream` instance that can be used to send an + * HTTP/2 request to the connected server. + * + * When a `ClientHttp2Session` is first created, the socket may not yet be + * connected. if `clienthttp2session.request()` is called during this time, the + * actual request will be deferred until the socket is ready to go. + * If the `session` is closed before the actual request be executed, an`ERR_HTTP2_GOAWAY_SESSION` is thrown. + * + * This method is only available if `http2session.type` is equal to`http2.constants.NGHTTP2_SESSION_CLIENT`. + * + * ```js + * const http2 = require('node:http2'); + * const clientSession = http2.connect('https://localhost:1234'); + * const { + * HTTP2_HEADER_PATH, + * HTTP2_HEADER_STATUS, + * } = http2.constants; + * + * const req = clientSession.request({ [HTTP2_HEADER_PATH]: '/' }); + * req.on('response', (headers) => { + * console.log(headers[HTTP2_HEADER_STATUS]); + * req.on('data', (chunk) => { // .. }); + * req.on('end', () => { // .. }); + * }); + * ``` + * + * When the `options.waitForTrailers` option is set, the `'wantTrailers'` event + * is emitted immediately after queuing the last chunk of payload data to be sent. + * The `http2stream.sendTrailers()` method can then be called to send trailing + * headers to the peer. + * + * When `options.waitForTrailers` is set, the `Http2Stream` will not automatically + * close when the final `DATA` frame is transmitted. User code must call either`http2stream.sendTrailers()` or `http2stream.close()` to close the`Http2Stream`. + * + * When `options.signal` is set with an `AbortSignal` and then `abort` on the + * corresponding `AbortController` is called, the request will emit an `'error'`event with an `AbortError` error. + * + * The `:method` and `:path` pseudo-headers are not specified within `headers`, + * they respectively default to: + * + * * `:method` \= `'GET'` + * * `:path` \= `/` + * @since v8.4.0 + */ + request(headers?: OutgoingHttpHeaders, options?: ClientSessionRequestOptions): ClientHttp2Stream; + addListener(event: "altsvc", listener: (alt: string, origin: string, stream: number) => void): this; + addListener(event: "origin", listener: (origins: string[]) => void): this; + addListener( + event: "connect", + listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void, + ): this; + addListener( + event: "stream", + listener: ( + stream: ClientHttp2Stream, + headers: IncomingHttpHeaders & IncomingHttpStatusHeader, + flags: number, + ) => void, + ): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + emit(event: "altsvc", alt: string, origin: string, stream: number): boolean; + emit(event: "origin", origins: readonly string[]): boolean; + emit(event: "connect", session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket): boolean; + emit( + event: "stream", + stream: ClientHttp2Stream, + headers: IncomingHttpHeaders & IncomingHttpStatusHeader, + flags: number, + ): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on(event: "altsvc", listener: (alt: string, origin: string, stream: number) => void): this; + on(event: "origin", listener: (origins: string[]) => void): this; + on(event: "connect", listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; + on( + event: "stream", + listener: ( + stream: ClientHttp2Stream, + headers: IncomingHttpHeaders & IncomingHttpStatusHeader, + flags: number, + ) => void, + ): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: "altsvc", listener: (alt: string, origin: string, stream: number) => void): this; + once(event: "origin", listener: (origins: string[]) => void): this; + once( + event: "connect", + listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void, + ): this; + once( + event: "stream", + listener: ( + stream: ClientHttp2Stream, + headers: IncomingHttpHeaders & IncomingHttpStatusHeader, + flags: number, + ) => void, + ): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener(event: "altsvc", listener: (alt: string, origin: string, stream: number) => void): this; + prependListener(event: "origin", listener: (origins: string[]) => void): this; + prependListener( + event: "connect", + listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void, + ): this; + prependListener( + event: "stream", + listener: ( + stream: ClientHttp2Stream, + headers: IncomingHttpHeaders & IncomingHttpStatusHeader, + flags: number, + ) => void, + ): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener(event: "altsvc", listener: (alt: string, origin: string, stream: number) => void): this; + prependOnceListener(event: "origin", listener: (origins: string[]) => void): this; + prependOnceListener( + event: "connect", + listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void, + ): this; + prependOnceListener( + event: "stream", + listener: ( + stream: ClientHttp2Stream, + headers: IncomingHttpHeaders & IncomingHttpStatusHeader, + flags: number, + ) => void, + ): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + export interface AlternativeServiceOptions { + origin: number | string | url.URL; + } + export interface ServerHttp2Session extends Http2Session { + readonly server: Http2Server | Http2SecureServer; + /** + * Submits an `ALTSVC` frame (as defined by [RFC 7838](https://tools.ietf.org/html/rfc7838)) to the connected client. + * + * ```js + * const http2 = require('node:http2'); + * + * const server = http2.createServer(); + * server.on('session', (session) => { + * // Set altsvc for origin https://example.org:80 + * session.altsvc('h2=":8000"', 'https://example.org:80'); + * }); + * + * server.on('stream', (stream) => { + * // Set altsvc for a specific stream + * stream.session.altsvc('h2=":8000"', stream.id); + * }); + * ``` + * + * Sending an `ALTSVC` frame with a specific stream ID indicates that the alternate + * service is associated with the origin of the given `Http2Stream`. + * + * The `alt` and origin string _must_ contain only ASCII bytes and are + * strictly interpreted as a sequence of ASCII bytes. The special value `'clear'`may be passed to clear any previously set alternative service for a given + * domain. + * + * When a string is passed for the `originOrStream` argument, it will be parsed as + * a URL and the origin will be derived. For instance, the origin for the + * HTTP URL `'https://example.org/foo/bar'` is the ASCII string`'https://example.org'`. An error will be thrown if either the given string + * cannot be parsed as a URL or if a valid origin cannot be derived. + * + * A `URL` object, or any object with an `origin` property, may be passed as`originOrStream`, in which case the value of the `origin` property will be + * used. The value of the `origin` property _must_ be a properly serialized + * ASCII origin. + * @since v9.4.0 + * @param alt A description of the alternative service configuration as defined by `RFC 7838`. + * @param originOrStream Either a URL string specifying the origin (or an `Object` with an `origin` property) or the numeric identifier of an active `Http2Stream` as given by the + * `http2stream.id` property. + */ + altsvc(alt: string, originOrStream: number | string | url.URL | AlternativeServiceOptions): void; + /** + * Submits an `ORIGIN` frame (as defined by [RFC 8336](https://tools.ietf.org/html/rfc8336)) to the connected client + * to advertise the set of origins for which the server is capable of providing + * authoritative responses. + * + * ```js + * const http2 = require('node:http2'); + * const options = getSecureOptionsSomehow(); + * const server = http2.createSecureServer(options); + * server.on('stream', (stream) => { + * stream.respond(); + * stream.end('ok'); + * }); + * server.on('session', (session) => { + * session.origin('https://example.com', 'https://example.org'); + * }); + * ``` + * + * When a string is passed as an `origin`, it will be parsed as a URL and the + * origin will be derived. For instance, the origin for the HTTP URL`'https://example.org/foo/bar'` is the ASCII string`'https://example.org'`. An error will be thrown if either the given + * string + * cannot be parsed as a URL or if a valid origin cannot be derived. + * + * A `URL` object, or any object with an `origin` property, may be passed as + * an `origin`, in which case the value of the `origin` property will be + * used. The value of the `origin` property _must_ be a properly serialized + * ASCII origin. + * + * Alternatively, the `origins` option may be used when creating a new HTTP/2 + * server using the `http2.createSecureServer()` method: + * + * ```js + * const http2 = require('node:http2'); + * const options = getSecureOptionsSomehow(); + * options.origins = ['https://example.com', 'https://example.org']; + * const server = http2.createSecureServer(options); + * server.on('stream', (stream) => { + * stream.respond(); + * stream.end('ok'); + * }); + * ``` + * @since v10.12.0 + * @param origins One or more URL Strings passed as separate arguments. + */ + origin( + ...origins: Array< + | string + | url.URL + | { + origin: string; + } + > + ): void; + addListener( + event: "connect", + listener: (session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket) => void, + ): this; + addListener( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + emit(event: "connect", session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket): boolean; + emit(event: "stream", stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on(event: "connect", listener: (session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; + on( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once( + event: "connect", + listener: (session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket) => void, + ): this; + once( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener( + event: "connect", + listener: (session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket) => void, + ): this; + prependListener( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener( + event: "connect", + listener: (session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket) => void, + ): this; + prependOnceListener( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + // Http2Server + export interface SessionOptions { + maxDeflateDynamicTableSize?: number | undefined; + maxSessionMemory?: number | undefined; + maxHeaderListPairs?: number | undefined; + maxOutstandingPings?: number | undefined; + maxSendHeaderBlockLength?: number | undefined; + paddingStrategy?: number | undefined; + peerMaxConcurrentStreams?: number | undefined; + settings?: Settings | undefined; + /** + * Specifies a timeout in milliseconds that + * a server should wait when an [`'unknownProtocol'`][] is emitted. If the + * socket has not been destroyed by that time the server will destroy it. + * @default 100000 + */ + unknownProtocolTimeout?: number | undefined; + selectPadding?(frameLen: number, maxFrameLen: number): number; + } + export interface ClientSessionOptions extends SessionOptions { + maxReservedRemoteStreams?: number | undefined; + createConnection?: ((authority: url.URL, option: SessionOptions) => stream.Duplex) | undefined; + protocol?: "http:" | "https:" | undefined; + } + export interface ServerSessionOptions extends SessionOptions { + Http1IncomingMessage?: typeof IncomingMessage | undefined; + Http1ServerResponse?: typeof ServerResponse | undefined; + Http2ServerRequest?: typeof Http2ServerRequest | undefined; + Http2ServerResponse?: typeof Http2ServerResponse | undefined; + } + export interface SecureClientSessionOptions extends ClientSessionOptions, tls.ConnectionOptions {} + export interface SecureServerSessionOptions extends ServerSessionOptions, tls.TlsOptions {} + export interface ServerOptions extends ServerSessionOptions {} + export interface SecureServerOptions extends SecureServerSessionOptions { + allowHTTP1?: boolean | undefined; + origins?: string[] | undefined; + } + interface HTTP2ServerCommon { + setTimeout(msec?: number, callback?: () => void): this; + /** + * Throws ERR_HTTP2_INVALID_SETTING_VALUE for invalid settings values. + * Throws ERR_INVALID_ARG_TYPE for invalid settings argument. + */ + updateSettings(settings: Settings): void; + } + export interface Http2Server extends net.Server, HTTP2ServerCommon { + addListener( + event: "checkContinue", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + addListener( + event: "request", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + addListener(event: "session", listener: (session: ServerHttp2Session) => void): this; + addListener(event: "sessionError", listener: (err: Error) => void): this; + addListener( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + addListener(event: "timeout", listener: () => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + emit(event: "checkContinue", request: Http2ServerRequest, response: Http2ServerResponse): boolean; + emit(event: "request", request: Http2ServerRequest, response: Http2ServerResponse): boolean; + emit(event: "session", session: ServerHttp2Session): boolean; + emit(event: "sessionError", err: Error): boolean; + emit(event: "stream", stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number): boolean; + emit(event: "timeout"): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on( + event: "checkContinue", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + on(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; + on(event: "session", listener: (session: ServerHttp2Session) => void): this; + on(event: "sessionError", listener: (err: Error) => void): this; + on( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + on(event: "timeout", listener: () => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once( + event: "checkContinue", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + once(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; + once(event: "session", listener: (session: ServerHttp2Session) => void): this; + once(event: "sessionError", listener: (err: Error) => void): this; + once( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + once(event: "timeout", listener: () => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener( + event: "checkContinue", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + prependListener( + event: "request", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + prependListener(event: "session", listener: (session: ServerHttp2Session) => void): this; + prependListener(event: "sessionError", listener: (err: Error) => void): this; + prependListener( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + prependListener(event: "timeout", listener: () => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener( + event: "checkContinue", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + prependOnceListener( + event: "request", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + prependOnceListener(event: "session", listener: (session: ServerHttp2Session) => void): this; + prependOnceListener(event: "sessionError", listener: (err: Error) => void): this; + prependOnceListener( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + prependOnceListener(event: "timeout", listener: () => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + export interface Http2SecureServer extends tls.Server, HTTP2ServerCommon { + addListener( + event: "checkContinue", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + addListener( + event: "request", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + addListener(event: "session", listener: (session: ServerHttp2Session) => void): this; + addListener(event: "sessionError", listener: (err: Error) => void): this; + addListener( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + addListener(event: "timeout", listener: () => void): this; + addListener(event: "unknownProtocol", listener: (socket: tls.TLSSocket) => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + emit(event: "checkContinue", request: Http2ServerRequest, response: Http2ServerResponse): boolean; + emit(event: "request", request: Http2ServerRequest, response: Http2ServerResponse): boolean; + emit(event: "session", session: ServerHttp2Session): boolean; + emit(event: "sessionError", err: Error): boolean; + emit(event: "stream", stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number): boolean; + emit(event: "timeout"): boolean; + emit(event: "unknownProtocol", socket: tls.TLSSocket): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on( + event: "checkContinue", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + on(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; + on(event: "session", listener: (session: ServerHttp2Session) => void): this; + on(event: "sessionError", listener: (err: Error) => void): this; + on( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + on(event: "timeout", listener: () => void): this; + on(event: "unknownProtocol", listener: (socket: tls.TLSSocket) => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once( + event: "checkContinue", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + once(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; + once(event: "session", listener: (session: ServerHttp2Session) => void): this; + once(event: "sessionError", listener: (err: Error) => void): this; + once( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + once(event: "timeout", listener: () => void): this; + once(event: "unknownProtocol", listener: (socket: tls.TLSSocket) => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener( + event: "checkContinue", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + prependListener( + event: "request", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + prependListener(event: "session", listener: (session: ServerHttp2Session) => void): this; + prependListener(event: "sessionError", listener: (err: Error) => void): this; + prependListener( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + prependListener(event: "timeout", listener: () => void): this; + prependListener(event: "unknownProtocol", listener: (socket: tls.TLSSocket) => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener( + event: "checkContinue", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + prependOnceListener( + event: "request", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + prependOnceListener(event: "session", listener: (session: ServerHttp2Session) => void): this; + prependOnceListener(event: "sessionError", listener: (err: Error) => void): this; + prependOnceListener( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + prependOnceListener(event: "timeout", listener: () => void): this; + prependOnceListener(event: "unknownProtocol", listener: (socket: tls.TLSSocket) => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + /** + * A `Http2ServerRequest` object is created by {@link Server} or {@link SecureServer} and passed as the first argument to the `'request'` event. It may be used to access a request status, + * headers, and + * data. + * @since v8.4.0 + */ + export class Http2ServerRequest extends stream.Readable { + constructor( + stream: ServerHttp2Stream, + headers: IncomingHttpHeaders, + options: stream.ReadableOptions, + rawHeaders: readonly string[], + ); + /** + * The `request.aborted` property will be `true` if the request has + * been aborted. + * @since v10.1.0 + */ + readonly aborted: boolean; + /** + * The request authority pseudo header field. Because HTTP/2 allows requests + * to set either `:authority` or `host`, this value is derived from`req.headers[':authority']` if present. Otherwise, it is derived from`req.headers['host']`. + * @since v8.4.0 + */ + readonly authority: string; + /** + * See `request.socket`. + * @since v8.4.0 + * @deprecated Since v13.0.0 - Use `socket`. + */ + readonly connection: net.Socket | tls.TLSSocket; + /** + * The `request.complete` property will be `true` if the request has + * been completed, aborted, or destroyed. + * @since v12.10.0 + */ + readonly complete: boolean; + /** + * The request/response headers object. + * + * Key-value pairs of header names and values. Header names are lower-cased. + * + * ```js + * // Prints something like: + * // + * // { 'user-agent': 'curl/7.22.0', + * // host: '127.0.0.1:8000', + * // accept: '*' } + * console.log(request.headers); + * ``` + * + * See `HTTP/2 Headers Object`. + * + * In HTTP/2, the request path, host name, protocol, and method are represented as + * special headers prefixed with the `:` character (e.g. `':path'`). These special + * headers will be included in the `request.headers` object. Care must be taken not + * to inadvertently modify these special headers or errors may occur. For instance, + * removing all headers from the request will cause errors to occur: + * + * ```js + * removeAllHeaders(request.headers); + * assert(request.url); // Fails because the :path header has been removed + * ``` + * @since v8.4.0 + */ + readonly headers: IncomingHttpHeaders; + /** + * In case of server request, the HTTP version sent by the client. In the case of + * client response, the HTTP version of the connected-to server. Returns`'2.0'`. + * + * Also `message.httpVersionMajor` is the first integer and`message.httpVersionMinor` is the second. + * @since v8.4.0 + */ + readonly httpVersion: string; + readonly httpVersionMinor: number; + readonly httpVersionMajor: number; + /** + * The request method as a string. Read-only. Examples: `'GET'`, `'DELETE'`. + * @since v8.4.0 + */ + readonly method: string; + /** + * The raw request/response headers list exactly as they were received. + * + * The keys and values are in the same list. It is _not_ a + * list of tuples. So, the even-numbered offsets are key values, and the + * odd-numbered offsets are the associated values. + * + * Header names are not lowercased, and duplicates are not merged. + * + * ```js + * // Prints something like: + * // + * // [ 'user-agent', + * // 'this is invalid because there can be only one', + * // 'User-Agent', + * // 'curl/7.22.0', + * // 'Host', + * // '127.0.0.1:8000', + * // 'ACCEPT', + * // '*' ] + * console.log(request.rawHeaders); + * ``` + * @since v8.4.0 + */ + readonly rawHeaders: string[]; + /** + * The raw request/response trailer keys and values exactly as they were + * received. Only populated at the `'end'` event. + * @since v8.4.0 + */ + readonly rawTrailers: string[]; + /** + * The request scheme pseudo header field indicating the scheme + * portion of the target URL. + * @since v8.4.0 + */ + readonly scheme: string; + /** + * Returns a `Proxy` object that acts as a `net.Socket` (or `tls.TLSSocket`) but + * applies getters, setters, and methods based on HTTP/2 logic. + * + * `destroyed`, `readable`, and `writable` properties will be retrieved from and + * set on `request.stream`. + * + * `destroy`, `emit`, `end`, `on` and `once` methods will be called on`request.stream`. + * + * `setTimeout` method will be called on `request.stream.session`. + * + * `pause`, `read`, `resume`, and `write` will throw an error with code`ERR_HTTP2_NO_SOCKET_MANIPULATION`. See `Http2Session and Sockets` for + * more information. + * + * All other interactions will be routed directly to the socket. With TLS support, + * use `request.socket.getPeerCertificate()` to obtain the client's + * authentication details. + * @since v8.4.0 + */ + readonly socket: net.Socket | tls.TLSSocket; + /** + * The `Http2Stream` object backing the request. + * @since v8.4.0 + */ + readonly stream: ServerHttp2Stream; + /** + * The request/response trailers object. Only populated at the `'end'` event. + * @since v8.4.0 + */ + readonly trailers: IncomingHttpHeaders; + /** + * Request URL string. This contains only the URL that is present in the actual + * HTTP request. If the request is: + * + * ```http + * GET /status?name=ryan HTTP/1.1 + * Accept: text/plain + * ``` + * + * Then `request.url` will be: + * + * ```js + * '/status?name=ryan' + * ``` + * + * To parse the url into its parts, `new URL()` can be used: + * + * ```console + * $ node + * > new URL('/status?name=ryan', 'http://example.com') + * URL { + * href: 'http://example.com/status?name=ryan', + * origin: 'http://example.com', + * protocol: 'http:', + * username: '', + * password: '', + * host: 'example.com', + * hostname: 'example.com', + * port: '', + * pathname: '/status', + * search: '?name=ryan', + * searchParams: URLSearchParams { 'name' => 'ryan' }, + * hash: '' + * } + * ``` + * @since v8.4.0 + */ + url: string; + /** + * Sets the `Http2Stream`'s timeout value to `msecs`. If a callback is + * provided, then it is added as a listener on the `'timeout'` event on + * the response object. + * + * If no `'timeout'` listener is added to the request, the response, or + * the server, then `Http2Stream` s are destroyed when they time out. If a + * handler is assigned to the request, the response, or the server's `'timeout'`events, timed out sockets must be handled explicitly. + * @since v8.4.0 + */ + setTimeout(msecs: number, callback?: () => void): void; + read(size?: number): Buffer | string | null; + addListener(event: "aborted", listener: (hadError: boolean, code: number) => void): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "data", listener: (chunk: Buffer | string) => void): this; + addListener(event: "end", listener: () => void): this; + addListener(event: "readable", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + emit(event: "aborted", hadError: boolean, code: number): boolean; + emit(event: "close"): boolean; + emit(event: "data", chunk: Buffer | string): boolean; + emit(event: "end"): boolean; + emit(event: "readable"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on(event: "aborted", listener: (hadError: boolean, code: number) => void): this; + on(event: "close", listener: () => void): this; + on(event: "data", listener: (chunk: Buffer | string) => void): this; + on(event: "end", listener: () => void): this; + on(event: "readable", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: "aborted", listener: (hadError: boolean, code: number) => void): this; + once(event: "close", listener: () => void): this; + once(event: "data", listener: (chunk: Buffer | string) => void): this; + once(event: "end", listener: () => void): this; + once(event: "readable", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener(event: "aborted", listener: (hadError: boolean, code: number) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "data", listener: (chunk: Buffer | string) => void): this; + prependListener(event: "end", listener: () => void): this; + prependListener(event: "readable", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener(event: "aborted", listener: (hadError: boolean, code: number) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "data", listener: (chunk: Buffer | string) => void): this; + prependOnceListener(event: "end", listener: () => void): this; + prependOnceListener(event: "readable", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + /** + * This object is created internally by an HTTP server, not by the user. It is + * passed as the second parameter to the `'request'` event. + * @since v8.4.0 + */ + export class Http2ServerResponse extends stream.Writable { + constructor(stream: ServerHttp2Stream); + /** + * See `response.socket`. + * @since v8.4.0 + * @deprecated Since v13.0.0 - Use `socket`. + */ + readonly connection: net.Socket | tls.TLSSocket; + /** + * Boolean value that indicates whether the response has completed. Starts + * as `false`. After `response.end()` executes, the value will be `true`. + * @since v8.4.0 + * @deprecated Since v13.4.0,v12.16.0 - Use `writableEnded`. + */ + readonly finished: boolean; + /** + * True if headers were sent, false otherwise (read-only). + * @since v8.4.0 + */ + readonly headersSent: boolean; + /** + * A reference to the original HTTP2 `request` object. + * @since v15.7.0 + */ + readonly req: Http2ServerRequest; + /** + * Returns a `Proxy` object that acts as a `net.Socket` (or `tls.TLSSocket`) but + * applies getters, setters, and methods based on HTTP/2 logic. + * + * `destroyed`, `readable`, and `writable` properties will be retrieved from and + * set on `response.stream`. + * + * `destroy`, `emit`, `end`, `on` and `once` methods will be called on`response.stream`. + * + * `setTimeout` method will be called on `response.stream.session`. + * + * `pause`, `read`, `resume`, and `write` will throw an error with code`ERR_HTTP2_NO_SOCKET_MANIPULATION`. See `Http2Session and Sockets` for + * more information. + * + * All other interactions will be routed directly to the socket. + * + * ```js + * const http2 = require('node:http2'); + * const server = http2.createServer((req, res) => { + * const ip = req.socket.remoteAddress; + * const port = req.socket.remotePort; + * res.end(`Your IP address is ${ip} and your source port is ${port}.`); + * }).listen(3000); + * ``` + * @since v8.4.0 + */ + readonly socket: net.Socket | tls.TLSSocket; + /** + * The `Http2Stream` object backing the response. + * @since v8.4.0 + */ + readonly stream: ServerHttp2Stream; + /** + * When true, the Date header will be automatically generated and sent in + * the response if it is not already present in the headers. Defaults to true. + * + * This should only be disabled for testing; HTTP requires the Date header + * in responses. + * @since v8.4.0 + */ + sendDate: boolean; + /** + * When using implicit headers (not calling `response.writeHead()` explicitly), + * this property controls the status code that will be sent to the client when + * the headers get flushed. + * + * ```js + * response.statusCode = 404; + * ``` + * + * After response header was sent to the client, this property indicates the + * status code which was sent out. + * @since v8.4.0 + */ + statusCode: number; + /** + * Status message is not supported by HTTP/2 (RFC 7540 8.1.2.4). It returns + * an empty string. + * @since v8.4.0 + */ + statusMessage: ""; + /** + * This method adds HTTP trailing headers (a header but at the end of the + * message) to the response. + * + * Attempting to set a header field name or value that contains invalid characters + * will result in a `TypeError` being thrown. + * @since v8.4.0 + */ + addTrailers(trailers: OutgoingHttpHeaders): void; + /** + * This method signals to the server that all of the response headers and body + * have been sent; that server should consider this message complete. + * The method, `response.end()`, MUST be called on each response. + * + * If `data` is specified, it is equivalent to calling `response.write(data, encoding)` followed by `response.end(callback)`. + * + * If `callback` is specified, it will be called when the response stream + * is finished. + * @since v8.4.0 + */ + end(callback?: () => void): this; + end(data: string | Uint8Array, callback?: () => void): this; + end(data: string | Uint8Array, encoding: BufferEncoding, callback?: () => void): this; + /** + * Reads out a header that has already been queued but not sent to the client. + * The name is case-insensitive. + * + * ```js + * const contentType = response.getHeader('content-type'); + * ``` + * @since v8.4.0 + */ + getHeader(name: string): string; + /** + * Returns an array containing the unique names of the current outgoing headers. + * All header names are lowercase. + * + * ```js + * response.setHeader('Foo', 'bar'); + * response.setHeader('Set-Cookie', ['foo=bar', 'bar=baz']); + * + * const headerNames = response.getHeaderNames(); + * // headerNames === ['foo', 'set-cookie'] + * ``` + * @since v8.4.0 + */ + getHeaderNames(): string[]; + /** + * Returns a shallow copy of the current outgoing headers. Since a shallow copy + * is used, array values may be mutated without additional calls to various + * header-related http module methods. The keys of the returned object are the + * header names and the values are the respective header values. All header names + * are lowercase. + * + * The object returned by the `response.getHeaders()` method _does not_prototypically inherit from the JavaScript `Object`. This means that typical`Object` methods such as `obj.toString()`, + * `obj.hasOwnProperty()`, and others + * are not defined and _will not work_. + * + * ```js + * response.setHeader('Foo', 'bar'); + * response.setHeader('Set-Cookie', ['foo=bar', 'bar=baz']); + * + * const headers = response.getHeaders(); + * // headers === { foo: 'bar', 'set-cookie': ['foo=bar', 'bar=baz'] } + * ``` + * @since v8.4.0 + */ + getHeaders(): OutgoingHttpHeaders; + /** + * Returns `true` if the header identified by `name` is currently set in the + * outgoing headers. The header name matching is case-insensitive. + * + * ```js + * const hasContentType = response.hasHeader('content-type'); + * ``` + * @since v8.4.0 + */ + hasHeader(name: string): boolean; + /** + * Removes a header that has been queued for implicit sending. + * + * ```js + * response.removeHeader('Content-Encoding'); + * ``` + * @since v8.4.0 + */ + removeHeader(name: string): void; + /** + * Sets a single header value for implicit headers. If this header already exists + * in the to-be-sent headers, its value will be replaced. Use an array of strings + * here to send multiple headers with the same name. + * + * ```js + * response.setHeader('Content-Type', 'text/html; charset=utf-8'); + * ``` + * + * or + * + * ```js + * response.setHeader('Set-Cookie', ['type=ninja', 'language=javascript']); + * ``` + * + * Attempting to set a header field name or value that contains invalid characters + * will result in a `TypeError` being thrown. + * + * When headers have been set with `response.setHeader()`, they will be merged + * with any headers passed to `response.writeHead()`, with the headers passed + * to `response.writeHead()` given precedence. + * + * ```js + * // Returns content-type = text/plain + * const server = http2.createServer((req, res) => { + * res.setHeader('Content-Type', 'text/html; charset=utf-8'); + * res.setHeader('X-Foo', 'bar'); + * res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }); + * res.end('ok'); + * }); + * ``` + * @since v8.4.0 + */ + setHeader(name: string, value: number | string | readonly string[]): void; + /** + * Sets the `Http2Stream`'s timeout value to `msecs`. If a callback is + * provided, then it is added as a listener on the `'timeout'` event on + * the response object. + * + * If no `'timeout'` listener is added to the request, the response, or + * the server, then `Http2Stream` s are destroyed when they time out. If a + * handler is assigned to the request, the response, or the server's `'timeout'`events, timed out sockets must be handled explicitly. + * @since v8.4.0 + */ + setTimeout(msecs: number, callback?: () => void): void; + /** + * If this method is called and `response.writeHead()` has not been called, + * it will switch to implicit header mode and flush the implicit headers. + * + * This sends a chunk of the response body. This method may + * be called multiple times to provide successive parts of the body. + * + * In the `node:http` module, the response body is omitted when the + * request is a HEAD request. Similarly, the `204` and `304` responses _must not_ include a message body. + * + * `chunk` can be a string or a buffer. If `chunk` is a string, + * the second parameter specifies how to encode it into a byte stream. + * By default the `encoding` is `'utf8'`. `callback` will be called when this chunk + * of data is flushed. + * + * This is the raw HTTP body and has nothing to do with higher-level multi-part + * body encodings that may be used. + * + * The first time `response.write()` is called, it will send the buffered + * header information and the first chunk of the body to the client. The second + * time `response.write()` is called, Node.js assumes data will be streamed, + * and sends the new data separately. That is, the response is buffered up to the + * first chunk of the body. + * + * Returns `true` if the entire data was flushed successfully to the kernel + * buffer. Returns `false` if all or part of the data was queued in user memory.`'drain'` will be emitted when the buffer is free again. + * @since v8.4.0 + */ + write(chunk: string | Uint8Array, callback?: (err: Error) => void): boolean; + write(chunk: string | Uint8Array, encoding: BufferEncoding, callback?: (err: Error) => void): boolean; + /** + * Sends a status `100 Continue` to the client, indicating that the request body + * should be sent. See the `'checkContinue'` event on `Http2Server` and`Http2SecureServer`. + * @since v8.4.0 + */ + writeContinue(): void; + /** + * Sends a status `103 Early Hints` to the client with a Link header, + * indicating that the user agent can preload/preconnect the linked resources. + * The `hints` is an object containing the values of headers to be sent with + * early hints message. + * + * **Example** + * + * ```js + * const earlyHintsLink = '; rel=preload; as=style'; + * response.writeEarlyHints({ + * 'link': earlyHintsLink, + * }); + * + * const earlyHintsLinks = [ + * '; rel=preload; as=style', + * '; rel=preload; as=script', + * ]; + * response.writeEarlyHints({ + * 'link': earlyHintsLinks, + * }); + * ``` + * @since v18.11.0 + */ + writeEarlyHints(hints: Record): void; + /** + * Sends a response header to the request. The status code is a 3-digit HTTP + * status code, like `404`. The last argument, `headers`, are the response headers. + * + * Returns a reference to the `Http2ServerResponse`, so that calls can be chained. + * + * For compatibility with `HTTP/1`, a human-readable `statusMessage` may be + * passed as the second argument. However, because the `statusMessage` has no + * meaning within HTTP/2, the argument will have no effect and a process warning + * will be emitted. + * + * ```js + * const body = 'hello world'; + * response.writeHead(200, { + * 'Content-Length': Buffer.byteLength(body), + * 'Content-Type': 'text/plain; charset=utf-8', + * }); + * ``` + * + * `Content-Length` is given in bytes not characters. The`Buffer.byteLength()` API may be used to determine the number of bytes in a + * given encoding. On outbound messages, Node.js does not check if Content-Length + * and the length of the body being transmitted are equal or not. However, when + * receiving messages, Node.js will automatically reject messages when the`Content-Length` does not match the actual payload size. + * + * This method may be called at most one time on a message before `response.end()` is called. + * + * If `response.write()` or `response.end()` are called before calling + * this, the implicit/mutable headers will be calculated and call this function. + * + * When headers have been set with `response.setHeader()`, they will be merged + * with any headers passed to `response.writeHead()`, with the headers passed + * to `response.writeHead()` given precedence. + * + * ```js + * // Returns content-type = text/plain + * const server = http2.createServer((req, res) => { + * res.setHeader('Content-Type', 'text/html; charset=utf-8'); + * res.setHeader('X-Foo', 'bar'); + * res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }); + * res.end('ok'); + * }); + * ``` + * + * Attempting to set a header field name or value that contains invalid characters + * will result in a `TypeError` being thrown. + * @since v8.4.0 + */ + writeHead(statusCode: number, headers?: OutgoingHttpHeaders): this; + writeHead(statusCode: number, statusMessage: string, headers?: OutgoingHttpHeaders): this; + /** + * Call `http2stream.pushStream()` with the given headers, and wrap the + * given `Http2Stream` on a newly created `Http2ServerResponse` as the callback + * parameter if successful. When `Http2ServerRequest` is closed, the callback is + * called with an error `ERR_HTTP2_INVALID_STREAM`. + * @since v8.4.0 + * @param headers An object describing the headers + * @param callback Called once `http2stream.pushStream()` is finished, or either when the attempt to create the pushed `Http2Stream` has failed or has been rejected, or the state of + * `Http2ServerRequest` is closed prior to calling the `http2stream.pushStream()` method + */ + createPushResponse( + headers: OutgoingHttpHeaders, + callback: (err: Error | null, res: Http2ServerResponse) => void, + ): void; + addListener(event: "close", listener: () => void): this; + addListener(event: "drain", listener: () => void): this; + addListener(event: "error", listener: (error: Error) => void): this; + addListener(event: "finish", listener: () => void): this; + addListener(event: "pipe", listener: (src: stream.Readable) => void): this; + addListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + emit(event: "close"): boolean; + emit(event: "drain"): boolean; + emit(event: "error", error: Error): boolean; + emit(event: "finish"): boolean; + emit(event: "pipe", src: stream.Readable): boolean; + emit(event: "unpipe", src: stream.Readable): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on(event: "close", listener: () => void): this; + on(event: "drain", listener: () => void): this; + on(event: "error", listener: (error: Error) => void): this; + on(event: "finish", listener: () => void): this; + on(event: "pipe", listener: (src: stream.Readable) => void): this; + on(event: "unpipe", listener: (src: stream.Readable) => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "drain", listener: () => void): this; + once(event: "error", listener: (error: Error) => void): this; + once(event: "finish", listener: () => void): this; + once(event: "pipe", listener: (src: stream.Readable) => void): this; + once(event: "unpipe", listener: (src: stream.Readable) => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "drain", listener: () => void): this; + prependListener(event: "error", listener: (error: Error) => void): this; + prependListener(event: "finish", listener: () => void): this; + prependListener(event: "pipe", listener: (src: stream.Readable) => void): this; + prependListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "drain", listener: () => void): this; + prependOnceListener(event: "error", listener: (error: Error) => void): this; + prependOnceListener(event: "finish", listener: () => void): this; + prependOnceListener(event: "pipe", listener: (src: stream.Readable) => void): this; + prependOnceListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + export namespace constants { + const NGHTTP2_SESSION_SERVER: number; + const NGHTTP2_SESSION_CLIENT: number; + const NGHTTP2_STREAM_STATE_IDLE: number; + const NGHTTP2_STREAM_STATE_OPEN: number; + const NGHTTP2_STREAM_STATE_RESERVED_LOCAL: number; + const NGHTTP2_STREAM_STATE_RESERVED_REMOTE: number; + const NGHTTP2_STREAM_STATE_HALF_CLOSED_LOCAL: number; + const NGHTTP2_STREAM_STATE_HALF_CLOSED_REMOTE: number; + const NGHTTP2_STREAM_STATE_CLOSED: number; + const NGHTTP2_NO_ERROR: number; + const NGHTTP2_PROTOCOL_ERROR: number; + const NGHTTP2_INTERNAL_ERROR: number; + const NGHTTP2_FLOW_CONTROL_ERROR: number; + const NGHTTP2_SETTINGS_TIMEOUT: number; + const NGHTTP2_STREAM_CLOSED: number; + const NGHTTP2_FRAME_SIZE_ERROR: number; + const NGHTTP2_REFUSED_STREAM: number; + const NGHTTP2_CANCEL: number; + const NGHTTP2_COMPRESSION_ERROR: number; + const NGHTTP2_CONNECT_ERROR: number; + const NGHTTP2_ENHANCE_YOUR_CALM: number; + const NGHTTP2_INADEQUATE_SECURITY: number; + const NGHTTP2_HTTP_1_1_REQUIRED: number; + const NGHTTP2_ERR_FRAME_SIZE_ERROR: number; + const NGHTTP2_FLAG_NONE: number; + const NGHTTP2_FLAG_END_STREAM: number; + const NGHTTP2_FLAG_END_HEADERS: number; + const NGHTTP2_FLAG_ACK: number; + const NGHTTP2_FLAG_PADDED: number; + const NGHTTP2_FLAG_PRIORITY: number; + const DEFAULT_SETTINGS_HEADER_TABLE_SIZE: number; + const DEFAULT_SETTINGS_ENABLE_PUSH: number; + const DEFAULT_SETTINGS_INITIAL_WINDOW_SIZE: number; + const DEFAULT_SETTINGS_MAX_FRAME_SIZE: number; + const MAX_MAX_FRAME_SIZE: number; + const MIN_MAX_FRAME_SIZE: number; + const MAX_INITIAL_WINDOW_SIZE: number; + const NGHTTP2_DEFAULT_WEIGHT: number; + const NGHTTP2_SETTINGS_HEADER_TABLE_SIZE: number; + const NGHTTP2_SETTINGS_ENABLE_PUSH: number; + const NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS: number; + const NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE: number; + const NGHTTP2_SETTINGS_MAX_FRAME_SIZE: number; + const NGHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE: number; + const PADDING_STRATEGY_NONE: number; + const PADDING_STRATEGY_MAX: number; + const PADDING_STRATEGY_CALLBACK: number; + const HTTP2_HEADER_STATUS: string; + const HTTP2_HEADER_METHOD: string; + const HTTP2_HEADER_AUTHORITY: string; + const HTTP2_HEADER_SCHEME: string; + const HTTP2_HEADER_PATH: string; + const HTTP2_HEADER_ACCEPT_CHARSET: string; + const HTTP2_HEADER_ACCEPT_ENCODING: string; + const HTTP2_HEADER_ACCEPT_LANGUAGE: string; + const HTTP2_HEADER_ACCEPT_RANGES: string; + const HTTP2_HEADER_ACCEPT: string; + const HTTP2_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN: string; + const HTTP2_HEADER_AGE: string; + const HTTP2_HEADER_ALLOW: string; + const HTTP2_HEADER_AUTHORIZATION: string; + const HTTP2_HEADER_CACHE_CONTROL: string; + const HTTP2_HEADER_CONNECTION: string; + const HTTP2_HEADER_CONTENT_DISPOSITION: string; + const HTTP2_HEADER_CONTENT_ENCODING: string; + const HTTP2_HEADER_CONTENT_LANGUAGE: string; + const HTTP2_HEADER_CONTENT_LENGTH: string; + const HTTP2_HEADER_CONTENT_LOCATION: string; + const HTTP2_HEADER_CONTENT_MD5: string; + const HTTP2_HEADER_CONTENT_RANGE: string; + const HTTP2_HEADER_CONTENT_TYPE: string; + const HTTP2_HEADER_COOKIE: string; + const HTTP2_HEADER_DATE: string; + const HTTP2_HEADER_ETAG: string; + const HTTP2_HEADER_EXPECT: string; + const HTTP2_HEADER_EXPIRES: string; + const HTTP2_HEADER_FROM: string; + const HTTP2_HEADER_HOST: string; + const HTTP2_HEADER_IF_MATCH: string; + const HTTP2_HEADER_IF_MODIFIED_SINCE: string; + const HTTP2_HEADER_IF_NONE_MATCH: string; + const HTTP2_HEADER_IF_RANGE: string; + const HTTP2_HEADER_IF_UNMODIFIED_SINCE: string; + const HTTP2_HEADER_LAST_MODIFIED: string; + const HTTP2_HEADER_LINK: string; + const HTTP2_HEADER_LOCATION: string; + const HTTP2_HEADER_MAX_FORWARDS: string; + const HTTP2_HEADER_PREFER: string; + const HTTP2_HEADER_PROXY_AUTHENTICATE: string; + const HTTP2_HEADER_PROXY_AUTHORIZATION: string; + const HTTP2_HEADER_RANGE: string; + const HTTP2_HEADER_REFERER: string; + const HTTP2_HEADER_REFRESH: string; + const HTTP2_HEADER_RETRY_AFTER: string; + const HTTP2_HEADER_SERVER: string; + const HTTP2_HEADER_SET_COOKIE: string; + const HTTP2_HEADER_STRICT_TRANSPORT_SECURITY: string; + const HTTP2_HEADER_TRANSFER_ENCODING: string; + const HTTP2_HEADER_TE: string; + const HTTP2_HEADER_UPGRADE: string; + const HTTP2_HEADER_USER_AGENT: string; + const HTTP2_HEADER_VARY: string; + const HTTP2_HEADER_VIA: string; + const HTTP2_HEADER_WWW_AUTHENTICATE: string; + const HTTP2_HEADER_HTTP2_SETTINGS: string; + const HTTP2_HEADER_KEEP_ALIVE: string; + const HTTP2_HEADER_PROXY_CONNECTION: string; + const HTTP2_METHOD_ACL: string; + const HTTP2_METHOD_BASELINE_CONTROL: string; + const HTTP2_METHOD_BIND: string; + const HTTP2_METHOD_CHECKIN: string; + const HTTP2_METHOD_CHECKOUT: string; + const HTTP2_METHOD_CONNECT: string; + const HTTP2_METHOD_COPY: string; + const HTTP2_METHOD_DELETE: string; + const HTTP2_METHOD_GET: string; + const HTTP2_METHOD_HEAD: string; + const HTTP2_METHOD_LABEL: string; + const HTTP2_METHOD_LINK: string; + const HTTP2_METHOD_LOCK: string; + const HTTP2_METHOD_MERGE: string; + const HTTP2_METHOD_MKACTIVITY: string; + const HTTP2_METHOD_MKCALENDAR: string; + const HTTP2_METHOD_MKCOL: string; + const HTTP2_METHOD_MKREDIRECTREF: string; + const HTTP2_METHOD_MKWORKSPACE: string; + const HTTP2_METHOD_MOVE: string; + const HTTP2_METHOD_OPTIONS: string; + const HTTP2_METHOD_ORDERPATCH: string; + const HTTP2_METHOD_PATCH: string; + const HTTP2_METHOD_POST: string; + const HTTP2_METHOD_PRI: string; + const HTTP2_METHOD_PROPFIND: string; + const HTTP2_METHOD_PROPPATCH: string; + const HTTP2_METHOD_PUT: string; + const HTTP2_METHOD_REBIND: string; + const HTTP2_METHOD_REPORT: string; + const HTTP2_METHOD_SEARCH: string; + const HTTP2_METHOD_TRACE: string; + const HTTP2_METHOD_UNBIND: string; + const HTTP2_METHOD_UNCHECKOUT: string; + const HTTP2_METHOD_UNLINK: string; + const HTTP2_METHOD_UNLOCK: string; + const HTTP2_METHOD_UPDATE: string; + const HTTP2_METHOD_UPDATEREDIRECTREF: string; + const HTTP2_METHOD_VERSION_CONTROL: string; + const HTTP_STATUS_CONTINUE: number; + const HTTP_STATUS_SWITCHING_PROTOCOLS: number; + const HTTP_STATUS_PROCESSING: number; + const HTTP_STATUS_OK: number; + const HTTP_STATUS_CREATED: number; + const HTTP_STATUS_ACCEPTED: number; + const HTTP_STATUS_NON_AUTHORITATIVE_INFORMATION: number; + const HTTP_STATUS_NO_CONTENT: number; + const HTTP_STATUS_RESET_CONTENT: number; + const HTTP_STATUS_PARTIAL_CONTENT: number; + const HTTP_STATUS_MULTI_STATUS: number; + const HTTP_STATUS_ALREADY_REPORTED: number; + const HTTP_STATUS_IM_USED: number; + const HTTP_STATUS_MULTIPLE_CHOICES: number; + const HTTP_STATUS_MOVED_PERMANENTLY: number; + const HTTP_STATUS_FOUND: number; + const HTTP_STATUS_SEE_OTHER: number; + const HTTP_STATUS_NOT_MODIFIED: number; + const HTTP_STATUS_USE_PROXY: number; + const HTTP_STATUS_TEMPORARY_REDIRECT: number; + const HTTP_STATUS_PERMANENT_REDIRECT: number; + const HTTP_STATUS_BAD_REQUEST: number; + const HTTP_STATUS_UNAUTHORIZED: number; + const HTTP_STATUS_PAYMENT_REQUIRED: number; + const HTTP_STATUS_FORBIDDEN: number; + const HTTP_STATUS_NOT_FOUND: number; + const HTTP_STATUS_METHOD_NOT_ALLOWED: number; + const HTTP_STATUS_NOT_ACCEPTABLE: number; + const HTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED: number; + const HTTP_STATUS_REQUEST_TIMEOUT: number; + const HTTP_STATUS_CONFLICT: number; + const HTTP_STATUS_GONE: number; + const HTTP_STATUS_LENGTH_REQUIRED: number; + const HTTP_STATUS_PRECONDITION_FAILED: number; + const HTTP_STATUS_PAYLOAD_TOO_LARGE: number; + const HTTP_STATUS_URI_TOO_LONG: number; + const HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE: number; + const HTTP_STATUS_RANGE_NOT_SATISFIABLE: number; + const HTTP_STATUS_EXPECTATION_FAILED: number; + const HTTP_STATUS_TEAPOT: number; + const HTTP_STATUS_MISDIRECTED_REQUEST: number; + const HTTP_STATUS_UNPROCESSABLE_ENTITY: number; + const HTTP_STATUS_LOCKED: number; + const HTTP_STATUS_FAILED_DEPENDENCY: number; + const HTTP_STATUS_UNORDERED_COLLECTION: number; + const HTTP_STATUS_UPGRADE_REQUIRED: number; + const HTTP_STATUS_PRECONDITION_REQUIRED: number; + const HTTP_STATUS_TOO_MANY_REQUESTS: number; + const HTTP_STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE: number; + const HTTP_STATUS_UNAVAILABLE_FOR_LEGAL_REASONS: number; + const HTTP_STATUS_INTERNAL_SERVER_ERROR: number; + const HTTP_STATUS_NOT_IMPLEMENTED: number; + const HTTP_STATUS_BAD_GATEWAY: number; + const HTTP_STATUS_SERVICE_UNAVAILABLE: number; + const HTTP_STATUS_GATEWAY_TIMEOUT: number; + const HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED: number; + const HTTP_STATUS_VARIANT_ALSO_NEGOTIATES: number; + const HTTP_STATUS_INSUFFICIENT_STORAGE: number; + const HTTP_STATUS_LOOP_DETECTED: number; + const HTTP_STATUS_BANDWIDTH_LIMIT_EXCEEDED: number; + const HTTP_STATUS_NOT_EXTENDED: number; + const HTTP_STATUS_NETWORK_AUTHENTICATION_REQUIRED: number; + } + /** + * This symbol can be set as a property on the HTTP/2 headers object with + * an array value in order to provide a list of headers considered sensitive. + */ + export const sensitiveHeaders: symbol; + /** + * Returns an object containing the default settings for an `Http2Session`instance. This method returns a new object instance every time it is called + * so instances returned may be safely modified for use. + * @since v8.4.0 + */ + export function getDefaultSettings(): Settings; + /** + * Returns a `Buffer` instance containing serialized representation of the given + * HTTP/2 settings as specified in the [HTTP/2](https://tools.ietf.org/html/rfc7540) specification. This is intended + * for use with the `HTTP2-Settings` header field. + * + * ```js + * const http2 = require('node:http2'); + * + * const packed = http2.getPackedSettings({ enablePush: false }); + * + * console.log(packed.toString('base64')); + * // Prints: AAIAAAAA + * ``` + * @since v8.4.0 + */ + export function getPackedSettings(settings: Settings): Buffer; + /** + * Returns a `HTTP/2 Settings Object` containing the deserialized settings from + * the given `Buffer` as generated by `http2.getPackedSettings()`. + * @since v8.4.0 + * @param buf The packed settings. + */ + export function getUnpackedSettings(buf: Uint8Array): Settings; + /** + * Returns a `net.Server` instance that creates and manages `Http2Session`instances. + * + * Since there are no browsers known that support [unencrypted HTTP/2](https://http2.github.io/faq/#does-http2-require-encryption), the use of {@link createSecureServer} is necessary when + * communicating + * with browser clients. + * + * ```js + * const http2 = require('node:http2'); + * + * // Create an unencrypted HTTP/2 server. + * // Since there are no browsers known that support + * // unencrypted HTTP/2, the use of `http2.createSecureServer()` + * // is necessary when communicating with browser clients. + * const server = http2.createServer(); + * + * server.on('stream', (stream, headers) => { + * stream.respond({ + * 'content-type': 'text/html; charset=utf-8', + * ':status': 200, + * }); + * stream.end('

Hello World

'); + * }); + * + * server.listen(8000); + * ``` + * @since v8.4.0 + * @param onRequestHandler See `Compatibility API` + */ + export function createServer( + onRequestHandler?: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): Http2Server; + export function createServer( + options: ServerOptions, + onRequestHandler?: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): Http2Server; + /** + * Returns a `tls.Server` instance that creates and manages `Http2Session`instances. + * + * ```js + * const http2 = require('node:http2'); + * const fs = require('node:fs'); + * + * const options = { + * key: fs.readFileSync('server-key.pem'), + * cert: fs.readFileSync('server-cert.pem'), + * }; + * + * // Create a secure HTTP/2 server + * const server = http2.createSecureServer(options); + * + * server.on('stream', (stream, headers) => { + * stream.respond({ + * 'content-type': 'text/html; charset=utf-8', + * ':status': 200, + * }); + * stream.end('

Hello World

'); + * }); + * + * server.listen(8443); + * ``` + * @since v8.4.0 + * @param onRequestHandler See `Compatibility API` + */ + export function createSecureServer( + onRequestHandler?: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): Http2SecureServer; + export function createSecureServer( + options: SecureServerOptions, + onRequestHandler?: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): Http2SecureServer; + /** + * Returns a `ClientHttp2Session` instance. + * + * ```js + * const http2 = require('node:http2'); + * const client = http2.connect('https://localhost:1234'); + * + * // Use the client + * + * client.close(); + * ``` + * @since v8.4.0 + * @param authority The remote HTTP/2 server to connect to. This must be in the form of a minimal, valid URL with the `http://` or `https://` prefix, host name, and IP port (if a non-default port + * is used). Userinfo (user ID and password), path, querystring, and fragment details in the URL will be ignored. + * @param listener Will be registered as a one-time listener of the {@link 'connect'} event. + */ + export function connect( + authority: string | url.URL, + listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void, + ): ClientHttp2Session; + export function connect( + authority: string | url.URL, + options?: ClientSessionOptions | SecureClientSessionOptions, + listener?: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void, + ): ClientHttp2Session; +} +declare module "node:http2" { + export * from "http2"; +} diff --git a/task/node_modules/@types/node/https.d.ts b/task/node_modules/@types/node/https.d.ts new file mode 100644 index 0000000..36ae5b2 --- /dev/null +++ b/task/node_modules/@types/node/https.d.ts @@ -0,0 +1,550 @@ +/** + * HTTPS is the HTTP protocol over TLS/SSL. In Node.js this is implemented as a + * separate module. + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/https.js) + */ +declare module "https" { + import { Duplex } from "node:stream"; + import * as tls from "node:tls"; + import * as http from "node:http"; + import { URL } from "node:url"; + type ServerOptions< + Request extends typeof http.IncomingMessage = typeof http.IncomingMessage, + Response extends typeof http.ServerResponse = typeof http.ServerResponse, + > = tls.SecureContextOptions & tls.TlsOptions & http.ServerOptions; + type RequestOptions = + & http.RequestOptions + & tls.SecureContextOptions + & { + checkServerIdentity?: typeof tls.checkServerIdentity | undefined; + rejectUnauthorized?: boolean | undefined; // Defaults to true + servername?: string | undefined; // SNI TLS Extension + }; + interface AgentOptions extends http.AgentOptions, tls.ConnectionOptions { + rejectUnauthorized?: boolean | undefined; + maxCachedSessions?: number | undefined; + } + /** + * An `Agent` object for HTTPS similar to `http.Agent`. See {@link request} for more information. + * @since v0.4.5 + */ + class Agent extends http.Agent { + constructor(options?: AgentOptions); + options: AgentOptions; + } + interface Server< + Request extends typeof http.IncomingMessage = typeof http.IncomingMessage, + Response extends typeof http.ServerResponse = typeof http.ServerResponse, + > extends http.Server {} + /** + * See `http.Server` for more information. + * @since v0.3.4 + */ + class Server< + Request extends typeof http.IncomingMessage = typeof http.IncomingMessage, + Response extends typeof http.ServerResponse = typeof http.ServerResponse, + > extends tls.Server { + constructor(requestListener?: http.RequestListener); + constructor( + options: ServerOptions, + requestListener?: http.RequestListener, + ); + /** + * Closes all connections connected to this server. + * @since v18.2.0 + */ + closeAllConnections(): void; + /** + * Closes all connections connected to this server which are not sending a request or waiting for a response. + * @since v18.2.0 + */ + closeIdleConnections(): void; + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "keylog", listener: (line: Buffer, tlsSocket: tls.TLSSocket) => void): this; + addListener( + event: "newSession", + listener: (sessionId: Buffer, sessionData: Buffer, callback: (err: Error, resp: Buffer) => void) => void, + ): this; + addListener( + event: "OCSPRequest", + listener: ( + certificate: Buffer, + issuer: Buffer, + callback: (err: Error | null, resp: Buffer) => void, + ) => void, + ): this; + addListener( + event: "resumeSession", + listener: (sessionId: Buffer, callback: (err: Error, sessionData: Buffer) => void) => void, + ): this; + addListener(event: "secureConnection", listener: (tlsSocket: tls.TLSSocket) => void): this; + addListener(event: "tlsClientError", listener: (err: Error, tlsSocket: tls.TLSSocket) => void): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "connection", listener: (socket: Duplex) => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "listening", listener: () => void): this; + addListener(event: "checkContinue", listener: http.RequestListener): this; + addListener(event: "checkExpectation", listener: http.RequestListener): this; + addListener(event: "clientError", listener: (err: Error, socket: Duplex) => void): this; + addListener( + event: "connect", + listener: (req: InstanceType, socket: Duplex, head: Buffer) => void, + ): this; + addListener(event: "request", listener: http.RequestListener): this; + addListener( + event: "upgrade", + listener: (req: InstanceType, socket: Duplex, head: Buffer) => void, + ): this; + emit(event: string, ...args: any[]): boolean; + emit(event: "keylog", line: Buffer, tlsSocket: tls.TLSSocket): boolean; + emit( + event: "newSession", + sessionId: Buffer, + sessionData: Buffer, + callback: (err: Error, resp: Buffer) => void, + ): boolean; + emit( + event: "OCSPRequest", + certificate: Buffer, + issuer: Buffer, + callback: (err: Error | null, resp: Buffer) => void, + ): boolean; + emit(event: "resumeSession", sessionId: Buffer, callback: (err: Error, sessionData: Buffer) => void): boolean; + emit(event: "secureConnection", tlsSocket: tls.TLSSocket): boolean; + emit(event: "tlsClientError", err: Error, tlsSocket: tls.TLSSocket): boolean; + emit(event: "close"): boolean; + emit(event: "connection", socket: Duplex): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "listening"): boolean; + emit( + event: "checkContinue", + req: InstanceType, + res: InstanceType & { + req: InstanceType; + }, + ): boolean; + emit( + event: "checkExpectation", + req: InstanceType, + res: InstanceType & { + req: InstanceType; + }, + ): boolean; + emit(event: "clientError", err: Error, socket: Duplex): boolean; + emit(event: "connect", req: InstanceType, socket: Duplex, head: Buffer): boolean; + emit( + event: "request", + req: InstanceType, + res: InstanceType & { + req: InstanceType; + }, + ): boolean; + emit(event: "upgrade", req: InstanceType, socket: Duplex, head: Buffer): boolean; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "keylog", listener: (line: Buffer, tlsSocket: tls.TLSSocket) => void): this; + on( + event: "newSession", + listener: (sessionId: Buffer, sessionData: Buffer, callback: (err: Error, resp: Buffer) => void) => void, + ): this; + on( + event: "OCSPRequest", + listener: ( + certificate: Buffer, + issuer: Buffer, + callback: (err: Error | null, resp: Buffer) => void, + ) => void, + ): this; + on( + event: "resumeSession", + listener: (sessionId: Buffer, callback: (err: Error, sessionData: Buffer) => void) => void, + ): this; + on(event: "secureConnection", listener: (tlsSocket: tls.TLSSocket) => void): this; + on(event: "tlsClientError", listener: (err: Error, tlsSocket: tls.TLSSocket) => void): this; + on(event: "close", listener: () => void): this; + on(event: "connection", listener: (socket: Duplex) => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "listening", listener: () => void): this; + on(event: "checkContinue", listener: http.RequestListener): this; + on(event: "checkExpectation", listener: http.RequestListener): this; + on(event: "clientError", listener: (err: Error, socket: Duplex) => void): this; + on(event: "connect", listener: (req: InstanceType, socket: Duplex, head: Buffer) => void): this; + on(event: "request", listener: http.RequestListener): this; + on(event: "upgrade", listener: (req: InstanceType, socket: Duplex, head: Buffer) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "keylog", listener: (line: Buffer, tlsSocket: tls.TLSSocket) => void): this; + once( + event: "newSession", + listener: (sessionId: Buffer, sessionData: Buffer, callback: (err: Error, resp: Buffer) => void) => void, + ): this; + once( + event: "OCSPRequest", + listener: ( + certificate: Buffer, + issuer: Buffer, + callback: (err: Error | null, resp: Buffer) => void, + ) => void, + ): this; + once( + event: "resumeSession", + listener: (sessionId: Buffer, callback: (err: Error, sessionData: Buffer) => void) => void, + ): this; + once(event: "secureConnection", listener: (tlsSocket: tls.TLSSocket) => void): this; + once(event: "tlsClientError", listener: (err: Error, tlsSocket: tls.TLSSocket) => void): this; + once(event: "close", listener: () => void): this; + once(event: "connection", listener: (socket: Duplex) => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "listening", listener: () => void): this; + once(event: "checkContinue", listener: http.RequestListener): this; + once(event: "checkExpectation", listener: http.RequestListener): this; + once(event: "clientError", listener: (err: Error, socket: Duplex) => void): this; + once(event: "connect", listener: (req: InstanceType, socket: Duplex, head: Buffer) => void): this; + once(event: "request", listener: http.RequestListener): this; + once(event: "upgrade", listener: (req: InstanceType, socket: Duplex, head: Buffer) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "keylog", listener: (line: Buffer, tlsSocket: tls.TLSSocket) => void): this; + prependListener( + event: "newSession", + listener: (sessionId: Buffer, sessionData: Buffer, callback: (err: Error, resp: Buffer) => void) => void, + ): this; + prependListener( + event: "OCSPRequest", + listener: ( + certificate: Buffer, + issuer: Buffer, + callback: (err: Error | null, resp: Buffer) => void, + ) => void, + ): this; + prependListener( + event: "resumeSession", + listener: (sessionId: Buffer, callback: (err: Error, sessionData: Buffer) => void) => void, + ): this; + prependListener(event: "secureConnection", listener: (tlsSocket: tls.TLSSocket) => void): this; + prependListener(event: "tlsClientError", listener: (err: Error, tlsSocket: tls.TLSSocket) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "connection", listener: (socket: Duplex) => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "listening", listener: () => void): this; + prependListener(event: "checkContinue", listener: http.RequestListener): this; + prependListener(event: "checkExpectation", listener: http.RequestListener): this; + prependListener(event: "clientError", listener: (err: Error, socket: Duplex) => void): this; + prependListener( + event: "connect", + listener: (req: InstanceType, socket: Duplex, head: Buffer) => void, + ): this; + prependListener(event: "request", listener: http.RequestListener): this; + prependListener( + event: "upgrade", + listener: (req: InstanceType, socket: Duplex, head: Buffer) => void, + ): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "keylog", listener: (line: Buffer, tlsSocket: tls.TLSSocket) => void): this; + prependOnceListener( + event: "newSession", + listener: (sessionId: Buffer, sessionData: Buffer, callback: (err: Error, resp: Buffer) => void) => void, + ): this; + prependOnceListener( + event: "OCSPRequest", + listener: ( + certificate: Buffer, + issuer: Buffer, + callback: (err: Error | null, resp: Buffer) => void, + ) => void, + ): this; + prependOnceListener( + event: "resumeSession", + listener: (sessionId: Buffer, callback: (err: Error, sessionData: Buffer) => void) => void, + ): this; + prependOnceListener(event: "secureConnection", listener: (tlsSocket: tls.TLSSocket) => void): this; + prependOnceListener(event: "tlsClientError", listener: (err: Error, tlsSocket: tls.TLSSocket) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "connection", listener: (socket: Duplex) => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "listening", listener: () => void): this; + prependOnceListener(event: "checkContinue", listener: http.RequestListener): this; + prependOnceListener(event: "checkExpectation", listener: http.RequestListener): this; + prependOnceListener(event: "clientError", listener: (err: Error, socket: Duplex) => void): this; + prependOnceListener( + event: "connect", + listener: (req: InstanceType, socket: Duplex, head: Buffer) => void, + ): this; + prependOnceListener(event: "request", listener: http.RequestListener): this; + prependOnceListener( + event: "upgrade", + listener: (req: InstanceType, socket: Duplex, head: Buffer) => void, + ): this; + } + /** + * ```js + * // curl -k https://localhost:8000/ + * const https = require('node:https'); + * const fs = require('node:fs'); + * + * const options = { + * key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'), + * cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem'), + * }; + * + * https.createServer(options, (req, res) => { + * res.writeHead(200); + * res.end('hello world\n'); + * }).listen(8000); + * ``` + * + * Or + * + * ```js + * const https = require('node:https'); + * const fs = require('node:fs'); + * + * const options = { + * pfx: fs.readFileSync('test/fixtures/test_cert.pfx'), + * passphrase: 'sample', + * }; + * + * https.createServer(options, (req, res) => { + * res.writeHead(200); + * res.end('hello world\n'); + * }).listen(8000); + * ``` + * @since v0.3.4 + * @param options Accepts `options` from `createServer`, `createSecureContext` and `createServer`. + * @param requestListener A listener to be added to the `'request'` event. + */ + function createServer< + Request extends typeof http.IncomingMessage = typeof http.IncomingMessage, + Response extends typeof http.ServerResponse = typeof http.ServerResponse, + >(requestListener?: http.RequestListener): Server; + function createServer< + Request extends typeof http.IncomingMessage = typeof http.IncomingMessage, + Response extends typeof http.ServerResponse = typeof http.ServerResponse, + >( + options: ServerOptions, + requestListener?: http.RequestListener, + ): Server; + /** + * Makes a request to a secure web server. + * + * The following additional `options` from `tls.connect()` are also accepted:`ca`, `cert`, `ciphers`, `clientCertEngine`, `crl`, `dhparam`, `ecdhCurve`,`honorCipherOrder`, `key`, `passphrase`, + * `pfx`, `rejectUnauthorized`,`secureOptions`, `secureProtocol`, `servername`, `sessionIdContext`,`highWaterMark`. + * + * `options` can be an object, a string, or a `URL` object. If `options` is a + * string, it is automatically parsed with `new URL()`. If it is a `URL` object, it will be automatically converted to an ordinary `options` object. + * + * `https.request()` returns an instance of the `http.ClientRequest` class. The `ClientRequest` instance is a writable stream. If one needs to + * upload a file with a POST request, then write to the `ClientRequest` object. + * + * ```js + * const https = require('node:https'); + * + * const options = { + * hostname: 'encrypted.google.com', + * port: 443, + * path: '/', + * method: 'GET', + * }; + * + * const req = https.request(options, (res) => { + * console.log('statusCode:', res.statusCode); + * console.log('headers:', res.headers); + * + * res.on('data', (d) => { + * process.stdout.write(d); + * }); + * }); + * + * req.on('error', (e) => { + * console.error(e); + * }); + * req.end(); + * ``` + * + * Example using options from `tls.connect()`: + * + * ```js + * const options = { + * hostname: 'encrypted.google.com', + * port: 443, + * path: '/', + * method: 'GET', + * key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'), + * cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem'), + * }; + * options.agent = new https.Agent(options); + * + * const req = https.request(options, (res) => { + * // ... + * }); + * ``` + * + * Alternatively, opt out of connection pooling by not using an `Agent`. + * + * ```js + * const options = { + * hostname: 'encrypted.google.com', + * port: 443, + * path: '/', + * method: 'GET', + * key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'), + * cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem'), + * agent: false, + * }; + * + * const req = https.request(options, (res) => { + * // ... + * }); + * ``` + * + * Example using a `URL` as `options`: + * + * ```js + * const options = new URL('https://abc:xyz@example.com'); + * + * const req = https.request(options, (res) => { + * // ... + * }); + * ``` + * + * Example pinning on certificate fingerprint, or the public key (similar to`pin-sha256`): + * + * ```js + * const tls = require('node:tls'); + * const https = require('node:https'); + * const crypto = require('node:crypto'); + * + * function sha256(s) { + * return crypto.createHash('sha256').update(s).digest('base64'); + * } + * const options = { + * hostname: 'github.com', + * port: 443, + * path: '/', + * method: 'GET', + * checkServerIdentity: function(host, cert) { + * // Make sure the certificate is issued to the host we are connected to + * const err = tls.checkServerIdentity(host, cert); + * if (err) { + * return err; + * } + * + * // Pin the public key, similar to HPKP pin-sha256 pinning + * const pubkey256 = 'pL1+qb9HTMRZJmuC/bB/ZI9d302BYrrqiVuRyW+DGrU='; + * if (sha256(cert.pubkey) !== pubkey256) { + * const msg = 'Certificate verification error: ' + + * `The public key of '${cert.subject.CN}' ` + + * 'does not match our pinned fingerprint'; + * return new Error(msg); + * } + * + * // Pin the exact certificate, rather than the pub key + * const cert256 = '25:FE:39:32:D9:63:8C:8A:FC:A1:9A:29:87:' + + * 'D8:3E:4C:1D:98:DB:71:E4:1A:48:03:98:EA:22:6A:BD:8B:93:16'; + * if (cert.fingerprint256 !== cert256) { + * const msg = 'Certificate verification error: ' + + * `The certificate of '${cert.subject.CN}' ` + + * 'does not match our pinned fingerprint'; + * return new Error(msg); + * } + * + * // This loop is informational only. + * // Print the certificate and public key fingerprints of all certs in the + * // chain. Its common to pin the public key of the issuer on the public + * // internet, while pinning the public key of the service in sensitive + * // environments. + * do { + * console.log('Subject Common Name:', cert.subject.CN); + * console.log(' Certificate SHA256 fingerprint:', cert.fingerprint256); + * + * hash = crypto.createHash('sha256'); + * console.log(' Public key ping-sha256:', sha256(cert.pubkey)); + * + * lastprint256 = cert.fingerprint256; + * cert = cert.issuerCertificate; + * } while (cert.fingerprint256 !== lastprint256); + * + * }, + * }; + * + * options.agent = new https.Agent(options); + * const req = https.request(options, (res) => { + * console.log('All OK. Server matched our pinned cert or public key'); + * console.log('statusCode:', res.statusCode); + * // Print the HPKP values + * console.log('headers:', res.headers['public-key-pins']); + * + * res.on('data', (d) => {}); + * }); + * + * req.on('error', (e) => { + * console.error(e.message); + * }); + * req.end(); + * ``` + * + * Outputs for example: + * + * ```text + * Subject Common Name: github.com + * Certificate SHA256 fingerprint: 25:FE:39:32:D9:63:8C:8A:FC:A1:9A:29:87:D8:3E:4C:1D:98:DB:71:E4:1A:48:03:98:EA:22:6A:BD:8B:93:16 + * Public key ping-sha256: pL1+qb9HTMRZJmuC/bB/ZI9d302BYrrqiVuRyW+DGrU= + * Subject Common Name: DigiCert SHA2 Extended Validation Server CA + * Certificate SHA256 fingerprint: 40:3E:06:2A:26:53:05:91:13:28:5B:AF:80:A0:D4:AE:42:2C:84:8C:9F:78:FA:D0:1F:C9:4B:C5:B8:7F:EF:1A + * Public key ping-sha256: RRM1dGqnDFsCJXBTHky16vi1obOlCgFFn/yOhI/y+ho= + * Subject Common Name: DigiCert High Assurance EV Root CA + * Certificate SHA256 fingerprint: 74:31:E5:F4:C3:C1:CE:46:90:77:4F:0B:61:E0:54:40:88:3B:A9:A0:1E:D0:0B:A6:AB:D7:80:6E:D3:B1:18:CF + * Public key ping-sha256: WoiWRyIOVNa9ihaBciRSC7XHjliYS9VwUGOIud4PB18= + * All OK. Server matched our pinned cert or public key + * 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 + * ``` + * @since v0.3.6 + * @param options Accepts all `options` from `request`, with some differences in default values: + */ + function request( + options: RequestOptions | string | URL, + callback?: (res: http.IncomingMessage) => void, + ): http.ClientRequest; + function request( + url: string | URL, + options: RequestOptions, + callback?: (res: http.IncomingMessage) => void, + ): http.ClientRequest; + /** + * Like `http.get()` but for HTTPS. + * + * `options` can be an object, a string, or a `URL` object. If `options` is a + * string, it is automatically parsed with `new URL()`. If it is a `URL` object, it will be automatically converted to an ordinary `options` object. + * + * ```js + * const https = require('node:https'); + * + * https.get('https://encrypted.google.com/', (res) => { + * console.log('statusCode:', res.statusCode); + * console.log('headers:', res.headers); + * + * res.on('data', (d) => { + * process.stdout.write(d); + * }); + * + * }).on('error', (e) => { + * console.error(e); + * }); + * ``` + * @since v0.3.6 + * @param options Accepts the same `options` as {@link request}, with the `method` always set to `GET`. + */ + function get( + options: RequestOptions | string | URL, + callback?: (res: http.IncomingMessage) => void, + ): http.ClientRequest; + function get( + url: string | URL, + options: RequestOptions, + callback?: (res: http.IncomingMessage) => void, + ): http.ClientRequest; + let globalAgent: Agent; +} +declare module "node:https" { + export * from "https"; +} diff --git a/task/node_modules/@types/node/index.d.ts b/task/node_modules/@types/node/index.d.ts new file mode 100644 index 0000000..a596cad --- /dev/null +++ b/task/node_modules/@types/node/index.d.ts @@ -0,0 +1,88 @@ +/** + * License for programmatically and manually incorporated + * documentation aka. `JSDoc` from https://github.com/nodejs/node/tree/master/doc + * + * Copyright Node.js contributors. All rights reserved. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +// NOTE: These definitions support NodeJS and TypeScript 4.9+. + +// Reference required types from the default lib: +/// +/// +/// +/// + +// Base definitions for all NodeJS modules that are not specific to any version of TypeScript: +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// + +/// diff --git a/task/node_modules/@types/node/inspector.d.ts b/task/node_modules/@types/node/inspector.d.ts new file mode 100644 index 0000000..3927b81 --- /dev/null +++ b/task/node_modules/@types/node/inspector.d.ts @@ -0,0 +1,2747 @@ +// Type definitions for inspector + +// These definitions are auto-generated. +// Please see https://github.com/DefinitelyTyped/DefinitelyTyped/pull/19330 +// for more information. + + +/** + * The `node:inspector` module provides an API for interacting with the V8 + * inspector. + * + * It can be accessed using: + * + * ```js + * import * as inspector from 'node:inspector/promises'; + * ``` + * + * or + * + * ```js + * import * as inspector from 'node:inspector'; + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/inspector.js) + */ +declare module 'inspector' { + import EventEmitter = require('node:events'); + interface InspectorNotification { + method: string; + params: T; + } + namespace Schema { + /** + * Description of the protocol domain. + */ + interface Domain { + /** + * Domain name. + */ + name: string; + /** + * Domain version. + */ + version: string; + } + interface GetDomainsReturnType { + /** + * List of supported domains. + */ + domains: Domain[]; + } + } + namespace Runtime { + /** + * Unique script identifier. + */ + type ScriptId = string; + /** + * Unique object identifier. + */ + type RemoteObjectId = string; + /** + * Primitive value which cannot be JSON-stringified. + */ + type UnserializableValue = string; + /** + * Mirror object referencing original JavaScript object. + */ + interface RemoteObject { + /** + * Object type. + */ + type: string; + /** + * Object subtype hint. Specified for object type values only. + */ + subtype?: string | undefined; + /** + * Object class (constructor) name. Specified for object type values only. + */ + className?: string | undefined; + /** + * Remote object value in case of primitive values or JSON values (if it was requested). + */ + value?: any; + /** + * Primitive value which can not be JSON-stringified does not have value, but gets this property. + */ + unserializableValue?: UnserializableValue | undefined; + /** + * String representation of the object. + */ + description?: string | undefined; + /** + * Unique object identifier (for non-primitive values). + */ + objectId?: RemoteObjectId | undefined; + /** + * Preview containing abbreviated property values. Specified for object type values only. + * @experimental + */ + preview?: ObjectPreview | undefined; + /** + * @experimental + */ + customPreview?: CustomPreview | undefined; + } + /** + * @experimental + */ + interface CustomPreview { + header: string; + hasBody: boolean; + formatterObjectId: RemoteObjectId; + bindRemoteObjectFunctionId: RemoteObjectId; + configObjectId?: RemoteObjectId | undefined; + } + /** + * Object containing abbreviated remote object value. + * @experimental + */ + interface ObjectPreview { + /** + * Object type. + */ + type: string; + /** + * Object subtype hint. Specified for object type values only. + */ + subtype?: string | undefined; + /** + * String representation of the object. + */ + description?: string | undefined; + /** + * True iff some of the properties or entries of the original object did not fit. + */ + overflow: boolean; + /** + * List of the properties. + */ + properties: PropertyPreview[]; + /** + * List of the entries. Specified for map and set subtype values only. + */ + entries?: EntryPreview[] | undefined; + } + /** + * @experimental + */ + interface PropertyPreview { + /** + * Property name. + */ + name: string; + /** + * Object type. Accessor means that the property itself is an accessor property. + */ + type: string; + /** + * User-friendly property value string. + */ + value?: string | undefined; + /** + * Nested value preview. + */ + valuePreview?: ObjectPreview | undefined; + /** + * Object subtype hint. Specified for object type values only. + */ + subtype?: string | undefined; + } + /** + * @experimental + */ + interface EntryPreview { + /** + * Preview of the key. Specified for map-like collection entries. + */ + key?: ObjectPreview | undefined; + /** + * Preview of the value. + */ + value: ObjectPreview; + } + /** + * Object property descriptor. + */ + interface PropertyDescriptor { + /** + * Property name or symbol description. + */ + name: string; + /** + * The value associated with the property. + */ + value?: RemoteObject | undefined; + /** + * True if the value associated with the property may be changed (data descriptors only). + */ + writable?: boolean | undefined; + /** + * A function which serves as a getter for the property, or undefined if there is no getter (accessor descriptors only). + */ + get?: RemoteObject | undefined; + /** + * A function which serves as a setter for the property, or undefined if there is no setter (accessor descriptors only). + */ + set?: RemoteObject | undefined; + /** + * True if the type of this property descriptor may be changed and if the property may be deleted from the corresponding object. + */ + configurable: boolean; + /** + * True if this property shows up during enumeration of the properties on the corresponding object. + */ + enumerable: boolean; + /** + * True if the result was thrown during the evaluation. + */ + wasThrown?: boolean | undefined; + /** + * True if the property is owned for the object. + */ + isOwn?: boolean | undefined; + /** + * Property symbol object, if the property is of the symbol type. + */ + symbol?: RemoteObject | undefined; + } + /** + * Object internal property descriptor. This property isn't normally visible in JavaScript code. + */ + interface InternalPropertyDescriptor { + /** + * Conventional property name. + */ + name: string; + /** + * The value associated with the property. + */ + value?: RemoteObject | undefined; + } + /** + * Represents function call argument. Either remote object id objectId, primitive value, unserializable primitive value or neither of (for undefined) them should be specified. + */ + interface CallArgument { + /** + * Primitive value or serializable javascript object. + */ + value?: any; + /** + * Primitive value which can not be JSON-stringified. + */ + unserializableValue?: UnserializableValue | undefined; + /** + * Remote object handle. + */ + objectId?: RemoteObjectId | undefined; + } + /** + * Id of an execution context. + */ + type ExecutionContextId = number; + /** + * Description of an isolated world. + */ + interface ExecutionContextDescription { + /** + * Unique id of the execution context. It can be used to specify in which execution context script evaluation should be performed. + */ + id: ExecutionContextId; + /** + * Execution context origin. + */ + origin: string; + /** + * Human readable name describing given context. + */ + name: string; + /** + * Embedder-specific auxiliary data. + */ + auxData?: {} | undefined; + } + /** + * Detailed information about exception (or error) that was thrown during script compilation or execution. + */ + interface ExceptionDetails { + /** + * Exception id. + */ + exceptionId: number; + /** + * Exception text, which should be used together with exception object when available. + */ + text: string; + /** + * Line number of the exception location (0-based). + */ + lineNumber: number; + /** + * Column number of the exception location (0-based). + */ + columnNumber: number; + /** + * Script ID of the exception location. + */ + scriptId?: ScriptId | undefined; + /** + * URL of the exception location, to be used when the script was not reported. + */ + url?: string | undefined; + /** + * JavaScript stack trace if available. + */ + stackTrace?: StackTrace | undefined; + /** + * Exception object if available. + */ + exception?: RemoteObject | undefined; + /** + * Identifier of the context where exception happened. + */ + executionContextId?: ExecutionContextId | undefined; + } + /** + * Number of milliseconds since epoch. + */ + type Timestamp = number; + /** + * Stack entry for runtime errors and assertions. + */ + interface CallFrame { + /** + * JavaScript function name. + */ + functionName: string; + /** + * JavaScript script id. + */ + scriptId: ScriptId; + /** + * JavaScript script name or url. + */ + url: string; + /** + * JavaScript script line number (0-based). + */ + lineNumber: number; + /** + * JavaScript script column number (0-based). + */ + columnNumber: number; + } + /** + * Call frames for assertions or error messages. + */ + interface StackTrace { + /** + * String label of this stack trace. For async traces this may be a name of the function that initiated the async call. + */ + description?: string | undefined; + /** + * JavaScript function name. + */ + callFrames: CallFrame[]; + /** + * Asynchronous JavaScript stack trace that preceded this stack, if available. + */ + parent?: StackTrace | undefined; + /** + * Asynchronous JavaScript stack trace that preceded this stack, if available. + * @experimental + */ + parentId?: StackTraceId | undefined; + } + /** + * Unique identifier of current debugger. + * @experimental + */ + type UniqueDebuggerId = string; + /** + * If debuggerId is set stack trace comes from another debugger and can be resolved there. This allows to track cross-debugger calls. See Runtime.StackTrace and Debugger.paused for usages. + * @experimental + */ + interface StackTraceId { + id: string; + debuggerId?: UniqueDebuggerId | undefined; + } + interface EvaluateParameterType { + /** + * Expression to evaluate. + */ + expression: string; + /** + * Symbolic group name that can be used to release multiple objects. + */ + objectGroup?: string | undefined; + /** + * Determines whether Command Line API should be available during the evaluation. + */ + includeCommandLineAPI?: boolean | undefined; + /** + * In silent mode exceptions thrown during evaluation are not reported and do not pause execution. Overrides setPauseOnException state. + */ + silent?: boolean | undefined; + /** + * Specifies in which execution context to perform evaluation. If the parameter is omitted the evaluation will be performed in the context of the inspected page. + */ + contextId?: ExecutionContextId | undefined; + /** + * Whether the result is expected to be a JSON object that should be sent by value. + */ + returnByValue?: boolean | undefined; + /** + * Whether preview should be generated for the result. + * @experimental + */ + generatePreview?: boolean | undefined; + /** + * Whether execution should be treated as initiated by user in the UI. + */ + userGesture?: boolean | undefined; + /** + * Whether execution should await for resulting value and return once awaited promise is resolved. + */ + awaitPromise?: boolean | undefined; + } + interface AwaitPromiseParameterType { + /** + * Identifier of the promise. + */ + promiseObjectId: RemoteObjectId; + /** + * Whether the result is expected to be a JSON object that should be sent by value. + */ + returnByValue?: boolean | undefined; + /** + * Whether preview should be generated for the result. + */ + generatePreview?: boolean | undefined; + } + interface CallFunctionOnParameterType { + /** + * Declaration of the function to call. + */ + functionDeclaration: string; + /** + * Identifier of the object to call function on. Either objectId or executionContextId should be specified. + */ + objectId?: RemoteObjectId | undefined; + /** + * Call arguments. All call arguments must belong to the same JavaScript world as the target object. + */ + arguments?: CallArgument[] | undefined; + /** + * In silent mode exceptions thrown during evaluation are not reported and do not pause execution. Overrides setPauseOnException state. + */ + silent?: boolean | undefined; + /** + * Whether the result is expected to be a JSON object which should be sent by value. + */ + returnByValue?: boolean | undefined; + /** + * Whether preview should be generated for the result. + * @experimental + */ + generatePreview?: boolean | undefined; + /** + * Whether execution should be treated as initiated by user in the UI. + */ + userGesture?: boolean | undefined; + /** + * Whether execution should await for resulting value and return once awaited promise is resolved. + */ + awaitPromise?: boolean | undefined; + /** + * Specifies execution context which global object will be used to call function on. Either executionContextId or objectId should be specified. + */ + executionContextId?: ExecutionContextId | undefined; + /** + * Symbolic group name that can be used to release multiple objects. If objectGroup is not specified and objectId is, objectGroup will be inherited from object. + */ + objectGroup?: string | undefined; + } + interface GetPropertiesParameterType { + /** + * Identifier of the object to return properties for. + */ + objectId: RemoteObjectId; + /** + * If true, returns properties belonging only to the element itself, not to its prototype chain. + */ + ownProperties?: boolean | undefined; + /** + * If true, returns accessor properties (with getter/setter) only; internal properties are not returned either. + * @experimental + */ + accessorPropertiesOnly?: boolean | undefined; + /** + * Whether preview should be generated for the results. + * @experimental + */ + generatePreview?: boolean | undefined; + } + interface ReleaseObjectParameterType { + /** + * Identifier of the object to release. + */ + objectId: RemoteObjectId; + } + interface ReleaseObjectGroupParameterType { + /** + * Symbolic object group name. + */ + objectGroup: string; + } + interface SetCustomObjectFormatterEnabledParameterType { + enabled: boolean; + } + interface CompileScriptParameterType { + /** + * Expression to compile. + */ + expression: string; + /** + * Source url to be set for the script. + */ + sourceURL: string; + /** + * Specifies whether the compiled script should be persisted. + */ + persistScript: boolean; + /** + * Specifies in which execution context to perform script run. If the parameter is omitted the evaluation will be performed in the context of the inspected page. + */ + executionContextId?: ExecutionContextId | undefined; + } + interface RunScriptParameterType { + /** + * Id of the script to run. + */ + scriptId: ScriptId; + /** + * Specifies in which execution context to perform script run. If the parameter is omitted the evaluation will be performed in the context of the inspected page. + */ + executionContextId?: ExecutionContextId | undefined; + /** + * Symbolic group name that can be used to release multiple objects. + */ + objectGroup?: string | undefined; + /** + * In silent mode exceptions thrown during evaluation are not reported and do not pause execution. Overrides setPauseOnException state. + */ + silent?: boolean | undefined; + /** + * Determines whether Command Line API should be available during the evaluation. + */ + includeCommandLineAPI?: boolean | undefined; + /** + * Whether the result is expected to be a JSON object which should be sent by value. + */ + returnByValue?: boolean | undefined; + /** + * Whether preview should be generated for the result. + */ + generatePreview?: boolean | undefined; + /** + * Whether execution should await for resulting value and return once awaited promise is resolved. + */ + awaitPromise?: boolean | undefined; + } + interface QueryObjectsParameterType { + /** + * Identifier of the prototype to return objects for. + */ + prototypeObjectId: RemoteObjectId; + } + interface GlobalLexicalScopeNamesParameterType { + /** + * Specifies in which execution context to lookup global scope variables. + */ + executionContextId?: ExecutionContextId | undefined; + } + interface EvaluateReturnType { + /** + * Evaluation result. + */ + result: RemoteObject; + /** + * Exception details. + */ + exceptionDetails?: ExceptionDetails | undefined; + } + interface AwaitPromiseReturnType { + /** + * Promise result. Will contain rejected value if promise was rejected. + */ + result: RemoteObject; + /** + * Exception details if stack strace is available. + */ + exceptionDetails?: ExceptionDetails | undefined; + } + interface CallFunctionOnReturnType { + /** + * Call result. + */ + result: RemoteObject; + /** + * Exception details. + */ + exceptionDetails?: ExceptionDetails | undefined; + } + interface GetPropertiesReturnType { + /** + * Object properties. + */ + result: PropertyDescriptor[]; + /** + * Internal object properties (only of the element itself). + */ + internalProperties?: InternalPropertyDescriptor[] | undefined; + /** + * Exception details. + */ + exceptionDetails?: ExceptionDetails | undefined; + } + interface CompileScriptReturnType { + /** + * Id of the script. + */ + scriptId?: ScriptId | undefined; + /** + * Exception details. + */ + exceptionDetails?: ExceptionDetails | undefined; + } + interface RunScriptReturnType { + /** + * Run result. + */ + result: RemoteObject; + /** + * Exception details. + */ + exceptionDetails?: ExceptionDetails | undefined; + } + interface QueryObjectsReturnType { + /** + * Array with objects. + */ + objects: RemoteObject; + } + interface GlobalLexicalScopeNamesReturnType { + names: string[]; + } + interface ExecutionContextCreatedEventDataType { + /** + * A newly created execution context. + */ + context: ExecutionContextDescription; + } + interface ExecutionContextDestroyedEventDataType { + /** + * Id of the destroyed context + */ + executionContextId: ExecutionContextId; + } + interface ExceptionThrownEventDataType { + /** + * Timestamp of the exception. + */ + timestamp: Timestamp; + exceptionDetails: ExceptionDetails; + } + interface ExceptionRevokedEventDataType { + /** + * Reason describing why exception was revoked. + */ + reason: string; + /** + * The id of revoked exception, as reported in exceptionThrown. + */ + exceptionId: number; + } + interface ConsoleAPICalledEventDataType { + /** + * Type of the call. + */ + type: string; + /** + * Call arguments. + */ + args: RemoteObject[]; + /** + * Identifier of the context where the call was made. + */ + executionContextId: ExecutionContextId; + /** + * Call timestamp. + */ + timestamp: Timestamp; + /** + * Stack trace captured when the call was made. + */ + stackTrace?: StackTrace | undefined; + /** + * Console context descriptor for calls on non-default console context (not console.*): 'anonymous#unique-logger-id' for call on unnamed context, 'name#unique-logger-id' for call on named context. + * @experimental + */ + context?: string | undefined; + } + interface InspectRequestedEventDataType { + object: RemoteObject; + hints: {}; + } + } + namespace Debugger { + /** + * Breakpoint identifier. + */ + type BreakpointId = string; + /** + * Call frame identifier. + */ + type CallFrameId = string; + /** + * Location in the source code. + */ + interface Location { + /** + * Script identifier as reported in the Debugger.scriptParsed. + */ + scriptId: Runtime.ScriptId; + /** + * Line number in the script (0-based). + */ + lineNumber: number; + /** + * Column number in the script (0-based). + */ + columnNumber?: number | undefined; + } + /** + * Location in the source code. + * @experimental + */ + interface ScriptPosition { + lineNumber: number; + columnNumber: number; + } + /** + * JavaScript call frame. Array of call frames form the call stack. + */ + interface CallFrame { + /** + * Call frame identifier. This identifier is only valid while the virtual machine is paused. + */ + callFrameId: CallFrameId; + /** + * Name of the JavaScript function called on this call frame. + */ + functionName: string; + /** + * Location in the source code. + */ + functionLocation?: Location | undefined; + /** + * Location in the source code. + */ + location: Location; + /** + * JavaScript script name or url. + */ + url: string; + /** + * Scope chain for this call frame. + */ + scopeChain: Scope[]; + /** + * this object for this call frame. + */ + this: Runtime.RemoteObject; + /** + * The value being returned, if the function is at return point. + */ + returnValue?: Runtime.RemoteObject | undefined; + } + /** + * Scope description. + */ + interface Scope { + /** + * Scope type. + */ + type: string; + /** + * Object representing the scope. For global and with scopes it represents the actual object; for the rest of the scopes, it is artificial transient object enumerating scope variables as its properties. + */ + object: Runtime.RemoteObject; + name?: string | undefined; + /** + * Location in the source code where scope starts + */ + startLocation?: Location | undefined; + /** + * Location in the source code where scope ends + */ + endLocation?: Location | undefined; + } + /** + * Search match for resource. + */ + interface SearchMatch { + /** + * Line number in resource content. + */ + lineNumber: number; + /** + * Line with match content. + */ + lineContent: string; + } + interface BreakLocation { + /** + * Script identifier as reported in the Debugger.scriptParsed. + */ + scriptId: Runtime.ScriptId; + /** + * Line number in the script (0-based). + */ + lineNumber: number; + /** + * Column number in the script (0-based). + */ + columnNumber?: number | undefined; + type?: string | undefined; + } + interface SetBreakpointsActiveParameterType { + /** + * New value for breakpoints active state. + */ + active: boolean; + } + interface SetSkipAllPausesParameterType { + /** + * New value for skip pauses state. + */ + skip: boolean; + } + interface SetBreakpointByUrlParameterType { + /** + * Line number to set breakpoint at. + */ + lineNumber: number; + /** + * URL of the resources to set breakpoint on. + */ + url?: string | undefined; + /** + * Regex pattern for the URLs of the resources to set breakpoints on. Either url or urlRegex must be specified. + */ + urlRegex?: string | undefined; + /** + * Script hash of the resources to set breakpoint on. + */ + scriptHash?: string | undefined; + /** + * Offset in the line to set breakpoint at. + */ + columnNumber?: number | undefined; + /** + * Expression to use as a breakpoint condition. When specified, debugger will only stop on the breakpoint if this expression evaluates to true. + */ + condition?: string | undefined; + } + interface SetBreakpointParameterType { + /** + * Location to set breakpoint in. + */ + location: Location; + /** + * Expression to use as a breakpoint condition. When specified, debugger will only stop on the breakpoint if this expression evaluates to true. + */ + condition?: string | undefined; + } + interface RemoveBreakpointParameterType { + breakpointId: BreakpointId; + } + interface GetPossibleBreakpointsParameterType { + /** + * Start of range to search possible breakpoint locations in. + */ + start: Location; + /** + * End of range to search possible breakpoint locations in (excluding). When not specified, end of scripts is used as end of range. + */ + end?: Location | undefined; + /** + * Only consider locations which are in the same (non-nested) function as start. + */ + restrictToFunction?: boolean | undefined; + } + interface ContinueToLocationParameterType { + /** + * Location to continue to. + */ + location: Location; + targetCallFrames?: string | undefined; + } + interface PauseOnAsyncCallParameterType { + /** + * Debugger will pause when async call with given stack trace is started. + */ + parentStackTraceId: Runtime.StackTraceId; + } + interface StepIntoParameterType { + /** + * Debugger will issue additional Debugger.paused notification if any async task is scheduled before next pause. + * @experimental + */ + breakOnAsyncCall?: boolean | undefined; + } + interface GetStackTraceParameterType { + stackTraceId: Runtime.StackTraceId; + } + interface SearchInContentParameterType { + /** + * Id of the script to search in. + */ + scriptId: Runtime.ScriptId; + /** + * String to search for. + */ + query: string; + /** + * If true, search is case sensitive. + */ + caseSensitive?: boolean | undefined; + /** + * If true, treats string parameter as regex. + */ + isRegex?: boolean | undefined; + } + interface SetScriptSourceParameterType { + /** + * Id of the script to edit. + */ + scriptId: Runtime.ScriptId; + /** + * New content of the script. + */ + scriptSource: string; + /** + * If true the change will not actually be applied. Dry run may be used to get result description without actually modifying the code. + */ + dryRun?: boolean | undefined; + } + interface RestartFrameParameterType { + /** + * Call frame identifier to evaluate on. + */ + callFrameId: CallFrameId; + } + interface GetScriptSourceParameterType { + /** + * Id of the script to get source for. + */ + scriptId: Runtime.ScriptId; + } + interface SetPauseOnExceptionsParameterType { + /** + * Pause on exceptions mode. + */ + state: string; + } + interface EvaluateOnCallFrameParameterType { + /** + * Call frame identifier to evaluate on. + */ + callFrameId: CallFrameId; + /** + * Expression to evaluate. + */ + expression: string; + /** + * String object group name to put result into (allows rapid releasing resulting object handles using releaseObjectGroup). + */ + objectGroup?: string | undefined; + /** + * Specifies whether command line API should be available to the evaluated expression, defaults to false. + */ + includeCommandLineAPI?: boolean | undefined; + /** + * In silent mode exceptions thrown during evaluation are not reported and do not pause execution. Overrides setPauseOnException state. + */ + silent?: boolean | undefined; + /** + * Whether the result is expected to be a JSON object that should be sent by value. + */ + returnByValue?: boolean | undefined; + /** + * Whether preview should be generated for the result. + * @experimental + */ + generatePreview?: boolean | undefined; + /** + * Whether to throw an exception if side effect cannot be ruled out during evaluation. + */ + throwOnSideEffect?: boolean | undefined; + } + interface SetVariableValueParameterType { + /** + * 0-based number of scope as was listed in scope chain. Only 'local', 'closure' and 'catch' scope types are allowed. Other scopes could be manipulated manually. + */ + scopeNumber: number; + /** + * Variable name. + */ + variableName: string; + /** + * New variable value. + */ + newValue: Runtime.CallArgument; + /** + * Id of callframe that holds variable. + */ + callFrameId: CallFrameId; + } + interface SetReturnValueParameterType { + /** + * New return value. + */ + newValue: Runtime.CallArgument; + } + interface SetAsyncCallStackDepthParameterType { + /** + * Maximum depth of async call stacks. Setting to 0 will effectively disable collecting async call stacks (default). + */ + maxDepth: number; + } + interface SetBlackboxPatternsParameterType { + /** + * Array of regexps that will be used to check script url for blackbox state. + */ + patterns: string[]; + } + interface SetBlackboxedRangesParameterType { + /** + * Id of the script. + */ + scriptId: Runtime.ScriptId; + positions: ScriptPosition[]; + } + interface EnableReturnType { + /** + * Unique identifier of the debugger. + * @experimental + */ + debuggerId: Runtime.UniqueDebuggerId; + } + interface SetBreakpointByUrlReturnType { + /** + * Id of the created breakpoint for further reference. + */ + breakpointId: BreakpointId; + /** + * List of the locations this breakpoint resolved into upon addition. + */ + locations: Location[]; + } + interface SetBreakpointReturnType { + /** + * Id of the created breakpoint for further reference. + */ + breakpointId: BreakpointId; + /** + * Location this breakpoint resolved into. + */ + actualLocation: Location; + } + interface GetPossibleBreakpointsReturnType { + /** + * List of the possible breakpoint locations. + */ + locations: BreakLocation[]; + } + interface GetStackTraceReturnType { + stackTrace: Runtime.StackTrace; + } + interface SearchInContentReturnType { + /** + * List of search matches. + */ + result: SearchMatch[]; + } + interface SetScriptSourceReturnType { + /** + * New stack trace in case editing has happened while VM was stopped. + */ + callFrames?: CallFrame[] | undefined; + /** + * Whether current call stack was modified after applying the changes. + */ + stackChanged?: boolean | undefined; + /** + * Async stack trace, if any. + */ + asyncStackTrace?: Runtime.StackTrace | undefined; + /** + * Async stack trace, if any. + * @experimental + */ + asyncStackTraceId?: Runtime.StackTraceId | undefined; + /** + * Exception details if any. + */ + exceptionDetails?: Runtime.ExceptionDetails | undefined; + } + interface RestartFrameReturnType { + /** + * New stack trace. + */ + callFrames: CallFrame[]; + /** + * Async stack trace, if any. + */ + asyncStackTrace?: Runtime.StackTrace | undefined; + /** + * Async stack trace, if any. + * @experimental + */ + asyncStackTraceId?: Runtime.StackTraceId | undefined; + } + interface GetScriptSourceReturnType { + /** + * Script source. + */ + scriptSource: string; + } + interface EvaluateOnCallFrameReturnType { + /** + * Object wrapper for the evaluation result. + */ + result: Runtime.RemoteObject; + /** + * Exception details. + */ + exceptionDetails?: Runtime.ExceptionDetails | undefined; + } + interface ScriptParsedEventDataType { + /** + * Identifier of the script parsed. + */ + scriptId: Runtime.ScriptId; + /** + * URL or name of the script parsed (if any). + */ + url: string; + /** + * Line offset of the script within the resource with given URL (for script tags). + */ + startLine: number; + /** + * Column offset of the script within the resource with given URL. + */ + startColumn: number; + /** + * Last line of the script. + */ + endLine: number; + /** + * Length of the last line of the script. + */ + endColumn: number; + /** + * Specifies script creation context. + */ + executionContextId: Runtime.ExecutionContextId; + /** + * Content hash of the script. + */ + hash: string; + /** + * Embedder-specific auxiliary data. + */ + executionContextAuxData?: {} | undefined; + /** + * True, if this script is generated as a result of the live edit operation. + * @experimental + */ + isLiveEdit?: boolean | undefined; + /** + * URL of source map associated with script (if any). + */ + sourceMapURL?: string | undefined; + /** + * True, if this script has sourceURL. + */ + hasSourceURL?: boolean | undefined; + /** + * True, if this script is ES6 module. + */ + isModule?: boolean | undefined; + /** + * This script length. + */ + length?: number | undefined; + /** + * JavaScript top stack frame of where the script parsed event was triggered if available. + * @experimental + */ + stackTrace?: Runtime.StackTrace | undefined; + } + interface ScriptFailedToParseEventDataType { + /** + * Identifier of the script parsed. + */ + scriptId: Runtime.ScriptId; + /** + * URL or name of the script parsed (if any). + */ + url: string; + /** + * Line offset of the script within the resource with given URL (for script tags). + */ + startLine: number; + /** + * Column offset of the script within the resource with given URL. + */ + startColumn: number; + /** + * Last line of the script. + */ + endLine: number; + /** + * Length of the last line of the script. + */ + endColumn: number; + /** + * Specifies script creation context. + */ + executionContextId: Runtime.ExecutionContextId; + /** + * Content hash of the script. + */ + hash: string; + /** + * Embedder-specific auxiliary data. + */ + executionContextAuxData?: {} | undefined; + /** + * URL of source map associated with script (if any). + */ + sourceMapURL?: string | undefined; + /** + * True, if this script has sourceURL. + */ + hasSourceURL?: boolean | undefined; + /** + * True, if this script is ES6 module. + */ + isModule?: boolean | undefined; + /** + * This script length. + */ + length?: number | undefined; + /** + * JavaScript top stack frame of where the script parsed event was triggered if available. + * @experimental + */ + stackTrace?: Runtime.StackTrace | undefined; + } + interface BreakpointResolvedEventDataType { + /** + * Breakpoint unique identifier. + */ + breakpointId: BreakpointId; + /** + * Actual breakpoint location. + */ + location: Location; + } + interface PausedEventDataType { + /** + * Call stack the virtual machine stopped on. + */ + callFrames: CallFrame[]; + /** + * Pause reason. + */ + reason: string; + /** + * Object containing break-specific auxiliary properties. + */ + data?: {} | undefined; + /** + * Hit breakpoints IDs + */ + hitBreakpoints?: string[] | undefined; + /** + * Async stack trace, if any. + */ + asyncStackTrace?: Runtime.StackTrace | undefined; + /** + * Async stack trace, if any. + * @experimental + */ + asyncStackTraceId?: Runtime.StackTraceId | undefined; + /** + * Just scheduled async call will have this stack trace as parent stack during async execution. This field is available only after Debugger.stepInto call with breakOnAsynCall flag. + * @experimental + */ + asyncCallStackTraceId?: Runtime.StackTraceId | undefined; + } + } + namespace Console { + /** + * Console message. + */ + interface ConsoleMessage { + /** + * Message source. + */ + source: string; + /** + * Message severity. + */ + level: string; + /** + * Message text. + */ + text: string; + /** + * URL of the message origin. + */ + url?: string | undefined; + /** + * Line number in the resource that generated this message (1-based). + */ + line?: number | undefined; + /** + * Column number in the resource that generated this message (1-based). + */ + column?: number | undefined; + } + interface MessageAddedEventDataType { + /** + * Console message that has been added. + */ + message: ConsoleMessage; + } + } + namespace Profiler { + /** + * Profile node. Holds callsite information, execution statistics and child nodes. + */ + interface ProfileNode { + /** + * Unique id of the node. + */ + id: number; + /** + * Function location. + */ + callFrame: Runtime.CallFrame; + /** + * Number of samples where this node was on top of the call stack. + */ + hitCount?: number | undefined; + /** + * Child node ids. + */ + children?: number[] | undefined; + /** + * The reason of being not optimized. The function may be deoptimized or marked as don't optimize. + */ + deoptReason?: string | undefined; + /** + * An array of source position ticks. + */ + positionTicks?: PositionTickInfo[] | undefined; + } + /** + * Profile. + */ + interface Profile { + /** + * The list of profile nodes. First item is the root node. + */ + nodes: ProfileNode[]; + /** + * Profiling start timestamp in microseconds. + */ + startTime: number; + /** + * Profiling end timestamp in microseconds. + */ + endTime: number; + /** + * Ids of samples top nodes. + */ + samples?: number[] | undefined; + /** + * Time intervals between adjacent samples in microseconds. The first delta is relative to the profile startTime. + */ + timeDeltas?: number[] | undefined; + } + /** + * Specifies a number of samples attributed to a certain source position. + */ + interface PositionTickInfo { + /** + * Source line number (1-based). + */ + line: number; + /** + * Number of samples attributed to the source line. + */ + ticks: number; + } + /** + * Coverage data for a source range. + */ + interface CoverageRange { + /** + * JavaScript script source offset for the range start. + */ + startOffset: number; + /** + * JavaScript script source offset for the range end. + */ + endOffset: number; + /** + * Collected execution count of the source range. + */ + count: number; + } + /** + * Coverage data for a JavaScript function. + */ + interface FunctionCoverage { + /** + * JavaScript function name. + */ + functionName: string; + /** + * Source ranges inside the function with coverage data. + */ + ranges: CoverageRange[]; + /** + * Whether coverage data for this function has block granularity. + */ + isBlockCoverage: boolean; + } + /** + * Coverage data for a JavaScript script. + */ + interface ScriptCoverage { + /** + * JavaScript script id. + */ + scriptId: Runtime.ScriptId; + /** + * JavaScript script name or url. + */ + url: string; + /** + * Functions contained in the script that has coverage data. + */ + functions: FunctionCoverage[]; + } + /** + * Describes a type collected during runtime. + * @experimental + */ + interface TypeObject { + /** + * Name of a type collected with type profiling. + */ + name: string; + } + /** + * Source offset and types for a parameter or return value. + * @experimental + */ + interface TypeProfileEntry { + /** + * Source offset of the parameter or end of function for return values. + */ + offset: number; + /** + * The types for this parameter or return value. + */ + types: TypeObject[]; + } + /** + * Type profile data collected during runtime for a JavaScript script. + * @experimental + */ + interface ScriptTypeProfile { + /** + * JavaScript script id. + */ + scriptId: Runtime.ScriptId; + /** + * JavaScript script name or url. + */ + url: string; + /** + * Type profile entries for parameters and return values of the functions in the script. + */ + entries: TypeProfileEntry[]; + } + interface SetSamplingIntervalParameterType { + /** + * New sampling interval in microseconds. + */ + interval: number; + } + interface StartPreciseCoverageParameterType { + /** + * Collect accurate call counts beyond simple 'covered' or 'not covered'. + */ + callCount?: boolean | undefined; + /** + * Collect block-based coverage. + */ + detailed?: boolean | undefined; + } + interface StopReturnType { + /** + * Recorded profile. + */ + profile: Profile; + } + interface TakePreciseCoverageReturnType { + /** + * Coverage data for the current isolate. + */ + result: ScriptCoverage[]; + } + interface GetBestEffortCoverageReturnType { + /** + * Coverage data for the current isolate. + */ + result: ScriptCoverage[]; + } + interface TakeTypeProfileReturnType { + /** + * Type profile for all scripts since startTypeProfile() was turned on. + */ + result: ScriptTypeProfile[]; + } + interface ConsoleProfileStartedEventDataType { + id: string; + /** + * Location of console.profile(). + */ + location: Debugger.Location; + /** + * Profile title passed as an argument to console.profile(). + */ + title?: string | undefined; + } + interface ConsoleProfileFinishedEventDataType { + id: string; + /** + * Location of console.profileEnd(). + */ + location: Debugger.Location; + profile: Profile; + /** + * Profile title passed as an argument to console.profile(). + */ + title?: string | undefined; + } + } + namespace HeapProfiler { + /** + * Heap snapshot object id. + */ + type HeapSnapshotObjectId = string; + /** + * Sampling Heap Profile node. Holds callsite information, allocation statistics and child nodes. + */ + interface SamplingHeapProfileNode { + /** + * Function location. + */ + callFrame: Runtime.CallFrame; + /** + * Allocations size in bytes for the node excluding children. + */ + selfSize: number; + /** + * Child nodes. + */ + children: SamplingHeapProfileNode[]; + } + /** + * Profile. + */ + interface SamplingHeapProfile { + head: SamplingHeapProfileNode; + } + interface StartTrackingHeapObjectsParameterType { + trackAllocations?: boolean | undefined; + } + interface StopTrackingHeapObjectsParameterType { + /** + * If true 'reportHeapSnapshotProgress' events will be generated while snapshot is being taken when the tracking is stopped. + */ + reportProgress?: boolean | undefined; + } + interface TakeHeapSnapshotParameterType { + /** + * If true 'reportHeapSnapshotProgress' events will be generated while snapshot is being taken. + */ + reportProgress?: boolean | undefined; + } + interface GetObjectByHeapObjectIdParameterType { + objectId: HeapSnapshotObjectId; + /** + * Symbolic group name that can be used to release multiple objects. + */ + objectGroup?: string | undefined; + } + interface AddInspectedHeapObjectParameterType { + /** + * Heap snapshot object id to be accessible by means of $x command line API. + */ + heapObjectId: HeapSnapshotObjectId; + } + interface GetHeapObjectIdParameterType { + /** + * Identifier of the object to get heap object id for. + */ + objectId: Runtime.RemoteObjectId; + } + interface StartSamplingParameterType { + /** + * Average sample interval in bytes. Poisson distribution is used for the intervals. The default value is 32768 bytes. + */ + samplingInterval?: number | undefined; + } + interface GetObjectByHeapObjectIdReturnType { + /** + * Evaluation result. + */ + result: Runtime.RemoteObject; + } + interface GetHeapObjectIdReturnType { + /** + * Id of the heap snapshot object corresponding to the passed remote object id. + */ + heapSnapshotObjectId: HeapSnapshotObjectId; + } + interface StopSamplingReturnType { + /** + * Recorded sampling heap profile. + */ + profile: SamplingHeapProfile; + } + interface GetSamplingProfileReturnType { + /** + * Return the sampling profile being collected. + */ + profile: SamplingHeapProfile; + } + interface AddHeapSnapshotChunkEventDataType { + chunk: string; + } + interface ReportHeapSnapshotProgressEventDataType { + done: number; + total: number; + finished?: boolean | undefined; + } + interface LastSeenObjectIdEventDataType { + lastSeenObjectId: number; + timestamp: number; + } + interface HeapStatsUpdateEventDataType { + /** + * An array of triplets. Each triplet describes a fragment. The first integer is the fragment index, the second integer is a total count of objects for the fragment, the third integer is a total size of the objects for the fragment. + */ + statsUpdate: number[]; + } + } + namespace NodeTracing { + interface TraceConfig { + /** + * Controls how the trace buffer stores data. + */ + recordMode?: string | undefined; + /** + * Included category filters. + */ + includedCategories: string[]; + } + interface StartParameterType { + traceConfig: TraceConfig; + } + interface GetCategoriesReturnType { + /** + * A list of supported tracing categories. + */ + categories: string[]; + } + interface DataCollectedEventDataType { + value: Array<{}>; + } + } + namespace NodeWorker { + type WorkerID = string; + /** + * Unique identifier of attached debugging session. + */ + type SessionID = string; + interface WorkerInfo { + workerId: WorkerID; + type: string; + title: string; + url: string; + } + interface SendMessageToWorkerParameterType { + message: string; + /** + * Identifier of the session. + */ + sessionId: SessionID; + } + interface EnableParameterType { + /** + * Whether to new workers should be paused until the frontend sends `Runtime.runIfWaitingForDebugger` + * message to run them. + */ + waitForDebuggerOnStart: boolean; + } + interface DetachParameterType { + sessionId: SessionID; + } + interface AttachedToWorkerEventDataType { + /** + * Identifier assigned to the session used to send/receive messages. + */ + sessionId: SessionID; + workerInfo: WorkerInfo; + waitingForDebugger: boolean; + } + interface DetachedFromWorkerEventDataType { + /** + * Detached session identifier. + */ + sessionId: SessionID; + } + interface ReceivedMessageFromWorkerEventDataType { + /** + * Identifier of a session which sends a message. + */ + sessionId: SessionID; + message: string; + } + } + namespace NodeRuntime { + interface NotifyWhenWaitingForDisconnectParameterType { + enabled: boolean; + } + } + /** + * The `inspector.Session` is used for dispatching messages to the V8 inspector + * back-end and receiving message responses and notifications. + */ + class Session extends EventEmitter { + /** + * Create a new instance of the inspector.Session class. + * The inspector session needs to be connected through session.connect() before the messages can be dispatched to the inspector backend. + */ + constructor(); + /** + * Connects a session to the inspector back-end. + * @since v8.0.0 + */ + connect(): void; + /** + * Immediately close the session. All pending message callbacks will be called + * with an error. `session.connect()` will need to be called to be able to send + * messages again. Reconnected session will lose all inspector state, such as + * enabled agents or configured breakpoints. + * @since v8.0.0 + */ + disconnect(): void; + /** + * Posts a message to the inspector back-end. `callback` will be notified when + * a response is received. `callback` is a function that accepts two optional + * arguments: error and message-specific result. + * + * ```js + * session.post('Runtime.evaluate', { expression: '2 + 2' }, + * (error, { result }) => console.log(result)); + * // Output: { type: 'number', value: 4, description: '4' } + * ``` + * + * The latest version of the V8 inspector protocol is published on the [Chrome DevTools Protocol Viewer](https://chromedevtools.github.io/devtools-protocol/v8/). + * + * Node.js inspector supports all the Chrome DevTools Protocol domains declared + * by V8\. Chrome DevTools Protocol domain provides an interface for interacting + * with one of the runtime agents used to inspect the application state and listen + * to the run-time events. + * + * ## Example usage + * + * Apart from the debugger, various V8 Profilers are available through the DevTools + * protocol. + * @since v8.0.0 + */ + post(method: string, params?: {}, callback?: (err: Error | null, params?: {}) => void): void; + post(method: string, callback?: (err: Error | null, params?: {}) => void): void; + /** + * Returns supported domains. + */ + post(method: 'Schema.getDomains', callback?: (err: Error | null, params: Schema.GetDomainsReturnType) => void): void; + /** + * Evaluates expression on global object. + */ + post(method: 'Runtime.evaluate', params?: Runtime.EvaluateParameterType, callback?: (err: Error | null, params: Runtime.EvaluateReturnType) => void): void; + post(method: 'Runtime.evaluate', callback?: (err: Error | null, params: Runtime.EvaluateReturnType) => void): void; + /** + * Add handler to promise with given promise object id. + */ + post(method: 'Runtime.awaitPromise', params?: Runtime.AwaitPromiseParameterType, callback?: (err: Error | null, params: Runtime.AwaitPromiseReturnType) => void): void; + post(method: 'Runtime.awaitPromise', callback?: (err: Error | null, params: Runtime.AwaitPromiseReturnType) => void): void; + /** + * Calls function with given declaration on the given object. Object group of the result is inherited from the target object. + */ + post(method: 'Runtime.callFunctionOn', params?: Runtime.CallFunctionOnParameterType, callback?: (err: Error | null, params: Runtime.CallFunctionOnReturnType) => void): void; + post(method: 'Runtime.callFunctionOn', callback?: (err: Error | null, params: Runtime.CallFunctionOnReturnType) => void): void; + /** + * Returns properties of a given object. Object group of the result is inherited from the target object. + */ + post(method: 'Runtime.getProperties', params?: Runtime.GetPropertiesParameterType, callback?: (err: Error | null, params: Runtime.GetPropertiesReturnType) => void): void; + post(method: 'Runtime.getProperties', callback?: (err: Error | null, params: Runtime.GetPropertiesReturnType) => void): void; + /** + * Releases remote object with given id. + */ + post(method: 'Runtime.releaseObject', params?: Runtime.ReleaseObjectParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Runtime.releaseObject', callback?: (err: Error | null) => void): void; + /** + * Releases all remote objects that belong to a given group. + */ + post(method: 'Runtime.releaseObjectGroup', params?: Runtime.ReleaseObjectGroupParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Runtime.releaseObjectGroup', callback?: (err: Error | null) => void): void; + /** + * Tells inspected instance to run if it was waiting for debugger to attach. + */ + post(method: 'Runtime.runIfWaitingForDebugger', callback?: (err: Error | null) => void): void; + /** + * Enables reporting of execution contexts creation by means of executionContextCreated event. When the reporting gets enabled the event will be sent immediately for each existing execution context. + */ + post(method: 'Runtime.enable', callback?: (err: Error | null) => void): void; + /** + * Disables reporting of execution contexts creation. + */ + post(method: 'Runtime.disable', callback?: (err: Error | null) => void): void; + /** + * Discards collected exceptions and console API calls. + */ + post(method: 'Runtime.discardConsoleEntries', callback?: (err: Error | null) => void): void; + /** + * @experimental + */ + post(method: 'Runtime.setCustomObjectFormatterEnabled', params?: Runtime.SetCustomObjectFormatterEnabledParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Runtime.setCustomObjectFormatterEnabled', callback?: (err: Error | null) => void): void; + /** + * Compiles expression. + */ + post(method: 'Runtime.compileScript', params?: Runtime.CompileScriptParameterType, callback?: (err: Error | null, params: Runtime.CompileScriptReturnType) => void): void; + post(method: 'Runtime.compileScript', callback?: (err: Error | null, params: Runtime.CompileScriptReturnType) => void): void; + /** + * Runs script with given id in a given context. + */ + post(method: 'Runtime.runScript', params?: Runtime.RunScriptParameterType, callback?: (err: Error | null, params: Runtime.RunScriptReturnType) => void): void; + post(method: 'Runtime.runScript', callback?: (err: Error | null, params: Runtime.RunScriptReturnType) => void): void; + post(method: 'Runtime.queryObjects', params?: Runtime.QueryObjectsParameterType, callback?: (err: Error | null, params: Runtime.QueryObjectsReturnType) => void): void; + post(method: 'Runtime.queryObjects', callback?: (err: Error | null, params: Runtime.QueryObjectsReturnType) => void): void; + /** + * Returns all let, const and class variables from global scope. + */ + post( + method: 'Runtime.globalLexicalScopeNames', + params?: Runtime.GlobalLexicalScopeNamesParameterType, + callback?: (err: Error | null, params: Runtime.GlobalLexicalScopeNamesReturnType) => void + ): void; + post(method: 'Runtime.globalLexicalScopeNames', callback?: (err: Error | null, params: Runtime.GlobalLexicalScopeNamesReturnType) => void): void; + /** + * Enables debugger for the given page. Clients should not assume that the debugging has been enabled until the result for this command is received. + */ + post(method: 'Debugger.enable', callback?: (err: Error | null, params: Debugger.EnableReturnType) => void): void; + /** + * Disables debugger for given page. + */ + post(method: 'Debugger.disable', callback?: (err: Error | null) => void): void; + /** + * Activates / deactivates all breakpoints on the page. + */ + post(method: 'Debugger.setBreakpointsActive', params?: Debugger.SetBreakpointsActiveParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Debugger.setBreakpointsActive', callback?: (err: Error | null) => void): void; + /** + * Makes page not interrupt on any pauses (breakpoint, exception, dom exception etc). + */ + post(method: 'Debugger.setSkipAllPauses', params?: Debugger.SetSkipAllPausesParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Debugger.setSkipAllPauses', callback?: (err: Error | null) => void): void; + /** + * Sets JavaScript breakpoint at given location specified either by URL or URL regex. Once this command is issued, all existing parsed scripts will have breakpoints resolved and returned in locations property. Further matching script parsing will result in subsequent breakpointResolved events issued. This logical breakpoint will survive page reloads. + */ + post(method: 'Debugger.setBreakpointByUrl', params?: Debugger.SetBreakpointByUrlParameterType, callback?: (err: Error | null, params: Debugger.SetBreakpointByUrlReturnType) => void): void; + post(method: 'Debugger.setBreakpointByUrl', callback?: (err: Error | null, params: Debugger.SetBreakpointByUrlReturnType) => void): void; + /** + * Sets JavaScript breakpoint at a given location. + */ + post(method: 'Debugger.setBreakpoint', params?: Debugger.SetBreakpointParameterType, callback?: (err: Error | null, params: Debugger.SetBreakpointReturnType) => void): void; + post(method: 'Debugger.setBreakpoint', callback?: (err: Error | null, params: Debugger.SetBreakpointReturnType) => void): void; + /** + * Removes JavaScript breakpoint. + */ + post(method: 'Debugger.removeBreakpoint', params?: Debugger.RemoveBreakpointParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Debugger.removeBreakpoint', callback?: (err: Error | null) => void): void; + /** + * Returns possible locations for breakpoint. scriptId in start and end range locations should be the same. + */ + post( + method: 'Debugger.getPossibleBreakpoints', + params?: Debugger.GetPossibleBreakpointsParameterType, + callback?: (err: Error | null, params: Debugger.GetPossibleBreakpointsReturnType) => void + ): void; + post(method: 'Debugger.getPossibleBreakpoints', callback?: (err: Error | null, params: Debugger.GetPossibleBreakpointsReturnType) => void): void; + /** + * Continues execution until specific location is reached. + */ + post(method: 'Debugger.continueToLocation', params?: Debugger.ContinueToLocationParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Debugger.continueToLocation', callback?: (err: Error | null) => void): void; + /** + * @experimental + */ + post(method: 'Debugger.pauseOnAsyncCall', params?: Debugger.PauseOnAsyncCallParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Debugger.pauseOnAsyncCall', callback?: (err: Error | null) => void): void; + /** + * Steps over the statement. + */ + post(method: 'Debugger.stepOver', callback?: (err: Error | null) => void): void; + /** + * Steps into the function call. + */ + post(method: 'Debugger.stepInto', params?: Debugger.StepIntoParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Debugger.stepInto', callback?: (err: Error | null) => void): void; + /** + * Steps out of the function call. + */ + post(method: 'Debugger.stepOut', callback?: (err: Error | null) => void): void; + /** + * Stops on the next JavaScript statement. + */ + post(method: 'Debugger.pause', callback?: (err: Error | null) => void): void; + /** + * This method is deprecated - use Debugger.stepInto with breakOnAsyncCall and Debugger.pauseOnAsyncTask instead. Steps into next scheduled async task if any is scheduled before next pause. Returns success when async task is actually scheduled, returns error if no task were scheduled or another scheduleStepIntoAsync was called. + * @experimental + */ + post(method: 'Debugger.scheduleStepIntoAsync', callback?: (err: Error | null) => void): void; + /** + * Resumes JavaScript execution. + */ + post(method: 'Debugger.resume', callback?: (err: Error | null) => void): void; + /** + * Returns stack trace with given stackTraceId. + * @experimental + */ + post(method: 'Debugger.getStackTrace', params?: Debugger.GetStackTraceParameterType, callback?: (err: Error | null, params: Debugger.GetStackTraceReturnType) => void): void; + post(method: 'Debugger.getStackTrace', callback?: (err: Error | null, params: Debugger.GetStackTraceReturnType) => void): void; + /** + * Searches for given string in script content. + */ + post(method: 'Debugger.searchInContent', params?: Debugger.SearchInContentParameterType, callback?: (err: Error | null, params: Debugger.SearchInContentReturnType) => void): void; + post(method: 'Debugger.searchInContent', callback?: (err: Error | null, params: Debugger.SearchInContentReturnType) => void): void; + /** + * Edits JavaScript source live. + */ + post(method: 'Debugger.setScriptSource', params?: Debugger.SetScriptSourceParameterType, callback?: (err: Error | null, params: Debugger.SetScriptSourceReturnType) => void): void; + post(method: 'Debugger.setScriptSource', callback?: (err: Error | null, params: Debugger.SetScriptSourceReturnType) => void): void; + /** + * Restarts particular call frame from the beginning. + */ + post(method: 'Debugger.restartFrame', params?: Debugger.RestartFrameParameterType, callback?: (err: Error | null, params: Debugger.RestartFrameReturnType) => void): void; + post(method: 'Debugger.restartFrame', callback?: (err: Error | null, params: Debugger.RestartFrameReturnType) => void): void; + /** + * Returns source for the script with given id. + */ + post(method: 'Debugger.getScriptSource', params?: Debugger.GetScriptSourceParameterType, callback?: (err: Error | null, params: Debugger.GetScriptSourceReturnType) => void): void; + post(method: 'Debugger.getScriptSource', callback?: (err: Error | null, params: Debugger.GetScriptSourceReturnType) => void): void; + /** + * Defines pause on exceptions state. Can be set to stop on all exceptions, uncaught exceptions or no exceptions. Initial pause on exceptions state is none. + */ + post(method: 'Debugger.setPauseOnExceptions', params?: Debugger.SetPauseOnExceptionsParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Debugger.setPauseOnExceptions', callback?: (err: Error | null) => void): void; + /** + * Evaluates expression on a given call frame. + */ + post(method: 'Debugger.evaluateOnCallFrame', params?: Debugger.EvaluateOnCallFrameParameterType, callback?: (err: Error | null, params: Debugger.EvaluateOnCallFrameReturnType) => void): void; + post(method: 'Debugger.evaluateOnCallFrame', callback?: (err: Error | null, params: Debugger.EvaluateOnCallFrameReturnType) => void): void; + /** + * Changes value of variable in a callframe. Object-based scopes are not supported and must be mutated manually. + */ + post(method: 'Debugger.setVariableValue', params?: Debugger.SetVariableValueParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Debugger.setVariableValue', callback?: (err: Error | null) => void): void; + /** + * Changes return value in top frame. Available only at return break position. + * @experimental + */ + post(method: 'Debugger.setReturnValue', params?: Debugger.SetReturnValueParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Debugger.setReturnValue', callback?: (err: Error | null) => void): void; + /** + * Enables or disables async call stacks tracking. + */ + post(method: 'Debugger.setAsyncCallStackDepth', params?: Debugger.SetAsyncCallStackDepthParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Debugger.setAsyncCallStackDepth', callback?: (err: Error | null) => void): void; + /** + * Replace previous blackbox patterns with passed ones. Forces backend to skip stepping/pausing in scripts with url matching one of the patterns. VM will try to leave blackboxed script by performing 'step in' several times, finally resorting to 'step out' if unsuccessful. + * @experimental + */ + post(method: 'Debugger.setBlackboxPatterns', params?: Debugger.SetBlackboxPatternsParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Debugger.setBlackboxPatterns', callback?: (err: Error | null) => void): void; + /** + * Makes backend skip steps in the script in blackboxed ranges. VM will try leave blacklisted scripts by performing 'step in' several times, finally resorting to 'step out' if unsuccessful. Positions array contains positions where blackbox state is changed. First interval isn't blackboxed. Array should be sorted. + * @experimental + */ + post(method: 'Debugger.setBlackboxedRanges', params?: Debugger.SetBlackboxedRangesParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Debugger.setBlackboxedRanges', callback?: (err: Error | null) => void): void; + /** + * Enables console domain, sends the messages collected so far to the client by means of the messageAdded notification. + */ + post(method: 'Console.enable', callback?: (err: Error | null) => void): void; + /** + * Disables console domain, prevents further console messages from being reported to the client. + */ + post(method: 'Console.disable', callback?: (err: Error | null) => void): void; + /** + * Does nothing. + */ + post(method: 'Console.clearMessages', callback?: (err: Error | null) => void): void; + post(method: 'Profiler.enable', callback?: (err: Error | null) => void): void; + post(method: 'Profiler.disable', callback?: (err: Error | null) => void): void; + /** + * Changes CPU profiler sampling interval. Must be called before CPU profiles recording started. + */ + post(method: 'Profiler.setSamplingInterval', params?: Profiler.SetSamplingIntervalParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Profiler.setSamplingInterval', callback?: (err: Error | null) => void): void; + post(method: 'Profiler.start', callback?: (err: Error | null) => void): void; + post(method: 'Profiler.stop', callback?: (err: Error | null, params: Profiler.StopReturnType) => void): void; + /** + * Enable precise code coverage. Coverage data for JavaScript executed before enabling precise code coverage may be incomplete. Enabling prevents running optimized code and resets execution counters. + */ + post(method: 'Profiler.startPreciseCoverage', params?: Profiler.StartPreciseCoverageParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Profiler.startPreciseCoverage', callback?: (err: Error | null) => void): void; + /** + * Disable precise code coverage. Disabling releases unnecessary execution count records and allows executing optimized code. + */ + post(method: 'Profiler.stopPreciseCoverage', callback?: (err: Error | null) => void): void; + /** + * Collect coverage data for the current isolate, and resets execution counters. Precise code coverage needs to have started. + */ + post(method: 'Profiler.takePreciseCoverage', callback?: (err: Error | null, params: Profiler.TakePreciseCoverageReturnType) => void): void; + /** + * Collect coverage data for the current isolate. The coverage data may be incomplete due to garbage collection. + */ + post(method: 'Profiler.getBestEffortCoverage', callback?: (err: Error | null, params: Profiler.GetBestEffortCoverageReturnType) => void): void; + /** + * Enable type profile. + * @experimental + */ + post(method: 'Profiler.startTypeProfile', callback?: (err: Error | null) => void): void; + /** + * Disable type profile. Disabling releases type profile data collected so far. + * @experimental + */ + post(method: 'Profiler.stopTypeProfile', callback?: (err: Error | null) => void): void; + /** + * Collect type profile. + * @experimental + */ + post(method: 'Profiler.takeTypeProfile', callback?: (err: Error | null, params: Profiler.TakeTypeProfileReturnType) => void): void; + post(method: 'HeapProfiler.enable', callback?: (err: Error | null) => void): void; + post(method: 'HeapProfiler.disable', callback?: (err: Error | null) => void): void; + post(method: 'HeapProfiler.startTrackingHeapObjects', params?: HeapProfiler.StartTrackingHeapObjectsParameterType, callback?: (err: Error | null) => void): void; + post(method: 'HeapProfiler.startTrackingHeapObjects', callback?: (err: Error | null) => void): void; + post(method: 'HeapProfiler.stopTrackingHeapObjects', params?: HeapProfiler.StopTrackingHeapObjectsParameterType, callback?: (err: Error | null) => void): void; + post(method: 'HeapProfiler.stopTrackingHeapObjects', callback?: (err: Error | null) => void): void; + post(method: 'HeapProfiler.takeHeapSnapshot', params?: HeapProfiler.TakeHeapSnapshotParameterType, callback?: (err: Error | null) => void): void; + post(method: 'HeapProfiler.takeHeapSnapshot', callback?: (err: Error | null) => void): void; + post(method: 'HeapProfiler.collectGarbage', callback?: (err: Error | null) => void): void; + post( + method: 'HeapProfiler.getObjectByHeapObjectId', + params?: HeapProfiler.GetObjectByHeapObjectIdParameterType, + callback?: (err: Error | null, params: HeapProfiler.GetObjectByHeapObjectIdReturnType) => void + ): void; + post(method: 'HeapProfiler.getObjectByHeapObjectId', callback?: (err: Error | null, params: HeapProfiler.GetObjectByHeapObjectIdReturnType) => void): void; + /** + * Enables console to refer to the node with given id via $x (see Command Line API for more details $x functions). + */ + post(method: 'HeapProfiler.addInspectedHeapObject', params?: HeapProfiler.AddInspectedHeapObjectParameterType, callback?: (err: Error | null) => void): void; + post(method: 'HeapProfiler.addInspectedHeapObject', callback?: (err: Error | null) => void): void; + post(method: 'HeapProfiler.getHeapObjectId', params?: HeapProfiler.GetHeapObjectIdParameterType, callback?: (err: Error | null, params: HeapProfiler.GetHeapObjectIdReturnType) => void): void; + post(method: 'HeapProfiler.getHeapObjectId', callback?: (err: Error | null, params: HeapProfiler.GetHeapObjectIdReturnType) => void): void; + post(method: 'HeapProfiler.startSampling', params?: HeapProfiler.StartSamplingParameterType, callback?: (err: Error | null) => void): void; + post(method: 'HeapProfiler.startSampling', callback?: (err: Error | null) => void): void; + post(method: 'HeapProfiler.stopSampling', callback?: (err: Error | null, params: HeapProfiler.StopSamplingReturnType) => void): void; + post(method: 'HeapProfiler.getSamplingProfile', callback?: (err: Error | null, params: HeapProfiler.GetSamplingProfileReturnType) => void): void; + /** + * Gets supported tracing categories. + */ + post(method: 'NodeTracing.getCategories', callback?: (err: Error | null, params: NodeTracing.GetCategoriesReturnType) => void): void; + /** + * Start trace events collection. + */ + post(method: 'NodeTracing.start', params?: NodeTracing.StartParameterType, callback?: (err: Error | null) => void): void; + post(method: 'NodeTracing.start', callback?: (err: Error | null) => void): void; + /** + * Stop trace events collection. Remaining collected events will be sent as a sequence of + * dataCollected events followed by tracingComplete event. + */ + post(method: 'NodeTracing.stop', callback?: (err: Error | null) => void): void; + /** + * Sends protocol message over session with given id. + */ + post(method: 'NodeWorker.sendMessageToWorker', params?: NodeWorker.SendMessageToWorkerParameterType, callback?: (err: Error | null) => void): void; + post(method: 'NodeWorker.sendMessageToWorker', callback?: (err: Error | null) => void): void; + /** + * Instructs the inspector to attach to running workers. Will also attach to new workers + * as they start + */ + post(method: 'NodeWorker.enable', params?: NodeWorker.EnableParameterType, callback?: (err: Error | null) => void): void; + post(method: 'NodeWorker.enable', callback?: (err: Error | null) => void): void; + /** + * Detaches from all running workers and disables attaching to new workers as they are started. + */ + post(method: 'NodeWorker.disable', callback?: (err: Error | null) => void): void; + /** + * Detached from the worker with given sessionId. + */ + post(method: 'NodeWorker.detach', params?: NodeWorker.DetachParameterType, callback?: (err: Error | null) => void): void; + post(method: 'NodeWorker.detach', callback?: (err: Error | null) => void): void; + /** + * Enable the `NodeRuntime.waitingForDisconnect`. + */ + post(method: 'NodeRuntime.notifyWhenWaitingForDisconnect', params?: NodeRuntime.NotifyWhenWaitingForDisconnectParameterType, callback?: (err: Error | null) => void): void; + post(method: 'NodeRuntime.notifyWhenWaitingForDisconnect', callback?: (err: Error | null) => void): void; + // Events + addListener(event: string, listener: (...args: any[]) => void): this; + /** + * Emitted when any notification from the V8 Inspector is received. + */ + addListener(event: 'inspectorNotification', listener: (message: InspectorNotification<{}>) => void): this; + /** + * Issued when new execution context is created. + */ + addListener(event: 'Runtime.executionContextCreated', listener: (message: InspectorNotification) => void): this; + /** + * Issued when execution context is destroyed. + */ + addListener(event: 'Runtime.executionContextDestroyed', listener: (message: InspectorNotification) => void): this; + /** + * Issued when all executionContexts were cleared in browser + */ + addListener(event: 'Runtime.executionContextsCleared', listener: () => void): this; + /** + * Issued when exception was thrown and unhandled. + */ + addListener(event: 'Runtime.exceptionThrown', listener: (message: InspectorNotification) => void): this; + /** + * Issued when unhandled exception was revoked. + */ + addListener(event: 'Runtime.exceptionRevoked', listener: (message: InspectorNotification) => void): this; + /** + * Issued when console API was called. + */ + addListener(event: 'Runtime.consoleAPICalled', listener: (message: InspectorNotification) => void): this; + /** + * Issued when object should be inspected (for example, as a result of inspect() command line API call). + */ + addListener(event: 'Runtime.inspectRequested', listener: (message: InspectorNotification) => void): this; + /** + * Fired when virtual machine parses script. This event is also fired for all known and uncollected scripts upon enabling debugger. + */ + addListener(event: 'Debugger.scriptParsed', listener: (message: InspectorNotification) => void): this; + /** + * Fired when virtual machine fails to parse the script. + */ + addListener(event: 'Debugger.scriptFailedToParse', listener: (message: InspectorNotification) => void): this; + /** + * Fired when breakpoint is resolved to an actual script and location. + */ + addListener(event: 'Debugger.breakpointResolved', listener: (message: InspectorNotification) => void): this; + /** + * Fired when the virtual machine stopped on breakpoint or exception or any other stop criteria. + */ + addListener(event: 'Debugger.paused', listener: (message: InspectorNotification) => void): this; + /** + * Fired when the virtual machine resumed execution. + */ + addListener(event: 'Debugger.resumed', listener: () => void): this; + /** + * Issued when new console message is added. + */ + addListener(event: 'Console.messageAdded', listener: (message: InspectorNotification) => void): this; + /** + * Sent when new profile recording is started using console.profile() call. + */ + addListener(event: 'Profiler.consoleProfileStarted', listener: (message: InspectorNotification) => void): this; + addListener(event: 'Profiler.consoleProfileFinished', listener: (message: InspectorNotification) => void): this; + addListener(event: 'HeapProfiler.addHeapSnapshotChunk', listener: (message: InspectorNotification) => void): this; + addListener(event: 'HeapProfiler.resetProfiles', listener: () => void): this; + addListener(event: 'HeapProfiler.reportHeapSnapshotProgress', listener: (message: InspectorNotification) => void): this; + /** + * If heap objects tracking has been started then backend regularly sends a current value for last seen object id and corresponding timestamp. If the were changes in the heap since last event then one or more heapStatsUpdate events will be sent before a new lastSeenObjectId event. + */ + addListener(event: 'HeapProfiler.lastSeenObjectId', listener: (message: InspectorNotification) => void): this; + /** + * If heap objects tracking has been started then backend may send update for one or more fragments + */ + addListener(event: 'HeapProfiler.heapStatsUpdate', listener: (message: InspectorNotification) => void): this; + /** + * Contains an bucket of collected trace events. + */ + addListener(event: 'NodeTracing.dataCollected', listener: (message: InspectorNotification) => void): this; + /** + * Signals that tracing is stopped and there is no trace buffers pending flush, all data were + * delivered via dataCollected events. + */ + addListener(event: 'NodeTracing.tracingComplete', listener: () => void): this; + /** + * Issued when attached to a worker. + */ + addListener(event: 'NodeWorker.attachedToWorker', listener: (message: InspectorNotification) => void): this; + /** + * Issued when detached from the worker. + */ + addListener(event: 'NodeWorker.detachedFromWorker', listener: (message: InspectorNotification) => void): this; + /** + * Notifies about a new protocol message received from the session + * (session ID is provided in attachedToWorker notification). + */ + addListener(event: 'NodeWorker.receivedMessageFromWorker', listener: (message: InspectorNotification) => void): this; + /** + * This event is fired instead of `Runtime.executionContextDestroyed` when + * enabled. + * It is fired when the Node process finished all code execution and is + * waiting for all frontends to disconnect. + */ + addListener(event: 'NodeRuntime.waitingForDisconnect', listener: () => void): this; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: 'inspectorNotification', message: InspectorNotification<{}>): boolean; + emit(event: 'Runtime.executionContextCreated', message: InspectorNotification): boolean; + emit(event: 'Runtime.executionContextDestroyed', message: InspectorNotification): boolean; + emit(event: 'Runtime.executionContextsCleared'): boolean; + emit(event: 'Runtime.exceptionThrown', message: InspectorNotification): boolean; + emit(event: 'Runtime.exceptionRevoked', message: InspectorNotification): boolean; + emit(event: 'Runtime.consoleAPICalled', message: InspectorNotification): boolean; + emit(event: 'Runtime.inspectRequested', message: InspectorNotification): boolean; + emit(event: 'Debugger.scriptParsed', message: InspectorNotification): boolean; + emit(event: 'Debugger.scriptFailedToParse', message: InspectorNotification): boolean; + emit(event: 'Debugger.breakpointResolved', message: InspectorNotification): boolean; + emit(event: 'Debugger.paused', message: InspectorNotification): boolean; + emit(event: 'Debugger.resumed'): boolean; + emit(event: 'Console.messageAdded', message: InspectorNotification): boolean; + emit(event: 'Profiler.consoleProfileStarted', message: InspectorNotification): boolean; + emit(event: 'Profiler.consoleProfileFinished', message: InspectorNotification): boolean; + emit(event: 'HeapProfiler.addHeapSnapshotChunk', message: InspectorNotification): boolean; + emit(event: 'HeapProfiler.resetProfiles'): boolean; + emit(event: 'HeapProfiler.reportHeapSnapshotProgress', message: InspectorNotification): boolean; + emit(event: 'HeapProfiler.lastSeenObjectId', message: InspectorNotification): boolean; + emit(event: 'HeapProfiler.heapStatsUpdate', message: InspectorNotification): boolean; + emit(event: 'NodeTracing.dataCollected', message: InspectorNotification): boolean; + emit(event: 'NodeTracing.tracingComplete'): boolean; + emit(event: 'NodeWorker.attachedToWorker', message: InspectorNotification): boolean; + emit(event: 'NodeWorker.detachedFromWorker', message: InspectorNotification): boolean; + emit(event: 'NodeWorker.receivedMessageFromWorker', message: InspectorNotification): boolean; + emit(event: 'NodeRuntime.waitingForDisconnect'): boolean; + on(event: string, listener: (...args: any[]) => void): this; + /** + * Emitted when any notification from the V8 Inspector is received. + */ + on(event: 'inspectorNotification', listener: (message: InspectorNotification<{}>) => void): this; + /** + * Issued when new execution context is created. + */ + on(event: 'Runtime.executionContextCreated', listener: (message: InspectorNotification) => void): this; + /** + * Issued when execution context is destroyed. + */ + on(event: 'Runtime.executionContextDestroyed', listener: (message: InspectorNotification) => void): this; + /** + * Issued when all executionContexts were cleared in browser + */ + on(event: 'Runtime.executionContextsCleared', listener: () => void): this; + /** + * Issued when exception was thrown and unhandled. + */ + on(event: 'Runtime.exceptionThrown', listener: (message: InspectorNotification) => void): this; + /** + * Issued when unhandled exception was revoked. + */ + on(event: 'Runtime.exceptionRevoked', listener: (message: InspectorNotification) => void): this; + /** + * Issued when console API was called. + */ + on(event: 'Runtime.consoleAPICalled', listener: (message: InspectorNotification) => void): this; + /** + * Issued when object should be inspected (for example, as a result of inspect() command line API call). + */ + on(event: 'Runtime.inspectRequested', listener: (message: InspectorNotification) => void): this; + /** + * Fired when virtual machine parses script. This event is also fired for all known and uncollected scripts upon enabling debugger. + */ + on(event: 'Debugger.scriptParsed', listener: (message: InspectorNotification) => void): this; + /** + * Fired when virtual machine fails to parse the script. + */ + on(event: 'Debugger.scriptFailedToParse', listener: (message: InspectorNotification) => void): this; + /** + * Fired when breakpoint is resolved to an actual script and location. + */ + on(event: 'Debugger.breakpointResolved', listener: (message: InspectorNotification) => void): this; + /** + * Fired when the virtual machine stopped on breakpoint or exception or any other stop criteria. + */ + on(event: 'Debugger.paused', listener: (message: InspectorNotification) => void): this; + /** + * Fired when the virtual machine resumed execution. + */ + on(event: 'Debugger.resumed', listener: () => void): this; + /** + * Issued when new console message is added. + */ + on(event: 'Console.messageAdded', listener: (message: InspectorNotification) => void): this; + /** + * Sent when new profile recording is started using console.profile() call. + */ + on(event: 'Profiler.consoleProfileStarted', listener: (message: InspectorNotification) => void): this; + on(event: 'Profiler.consoleProfileFinished', listener: (message: InspectorNotification) => void): this; + on(event: 'HeapProfiler.addHeapSnapshotChunk', listener: (message: InspectorNotification) => void): this; + on(event: 'HeapProfiler.resetProfiles', listener: () => void): this; + on(event: 'HeapProfiler.reportHeapSnapshotProgress', listener: (message: InspectorNotification) => void): this; + /** + * If heap objects tracking has been started then backend regularly sends a current value for last seen object id and corresponding timestamp. If the were changes in the heap since last event then one or more heapStatsUpdate events will be sent before a new lastSeenObjectId event. + */ + on(event: 'HeapProfiler.lastSeenObjectId', listener: (message: InspectorNotification) => void): this; + /** + * If heap objects tracking has been started then backend may send update for one or more fragments + */ + on(event: 'HeapProfiler.heapStatsUpdate', listener: (message: InspectorNotification) => void): this; + /** + * Contains an bucket of collected trace events. + */ + on(event: 'NodeTracing.dataCollected', listener: (message: InspectorNotification) => void): this; + /** + * Signals that tracing is stopped and there is no trace buffers pending flush, all data were + * delivered via dataCollected events. + */ + on(event: 'NodeTracing.tracingComplete', listener: () => void): this; + /** + * Issued when attached to a worker. + */ + on(event: 'NodeWorker.attachedToWorker', listener: (message: InspectorNotification) => void): this; + /** + * Issued when detached from the worker. + */ + on(event: 'NodeWorker.detachedFromWorker', listener: (message: InspectorNotification) => void): this; + /** + * Notifies about a new protocol message received from the session + * (session ID is provided in attachedToWorker notification). + */ + on(event: 'NodeWorker.receivedMessageFromWorker', listener: (message: InspectorNotification) => void): this; + /** + * This event is fired instead of `Runtime.executionContextDestroyed` when + * enabled. + * It is fired when the Node process finished all code execution and is + * waiting for all frontends to disconnect. + */ + on(event: 'NodeRuntime.waitingForDisconnect', listener: () => void): this; + once(event: string, listener: (...args: any[]) => void): this; + /** + * Emitted when any notification from the V8 Inspector is received. + */ + once(event: 'inspectorNotification', listener: (message: InspectorNotification<{}>) => void): this; + /** + * Issued when new execution context is created. + */ + once(event: 'Runtime.executionContextCreated', listener: (message: InspectorNotification) => void): this; + /** + * Issued when execution context is destroyed. + */ + once(event: 'Runtime.executionContextDestroyed', listener: (message: InspectorNotification) => void): this; + /** + * Issued when all executionContexts were cleared in browser + */ + once(event: 'Runtime.executionContextsCleared', listener: () => void): this; + /** + * Issued when exception was thrown and unhandled. + */ + once(event: 'Runtime.exceptionThrown', listener: (message: InspectorNotification) => void): this; + /** + * Issued when unhandled exception was revoked. + */ + once(event: 'Runtime.exceptionRevoked', listener: (message: InspectorNotification) => void): this; + /** + * Issued when console API was called. + */ + once(event: 'Runtime.consoleAPICalled', listener: (message: InspectorNotification) => void): this; + /** + * Issued when object should be inspected (for example, as a result of inspect() command line API call). + */ + once(event: 'Runtime.inspectRequested', listener: (message: InspectorNotification) => void): this; + /** + * Fired when virtual machine parses script. This event is also fired for all known and uncollected scripts upon enabling debugger. + */ + once(event: 'Debugger.scriptParsed', listener: (message: InspectorNotification) => void): this; + /** + * Fired when virtual machine fails to parse the script. + */ + once(event: 'Debugger.scriptFailedToParse', listener: (message: InspectorNotification) => void): this; + /** + * Fired when breakpoint is resolved to an actual script and location. + */ + once(event: 'Debugger.breakpointResolved', listener: (message: InspectorNotification) => void): this; + /** + * Fired when the virtual machine stopped on breakpoint or exception or any other stop criteria. + */ + once(event: 'Debugger.paused', listener: (message: InspectorNotification) => void): this; + /** + * Fired when the virtual machine resumed execution. + */ + once(event: 'Debugger.resumed', listener: () => void): this; + /** + * Issued when new console message is added. + */ + once(event: 'Console.messageAdded', listener: (message: InspectorNotification) => void): this; + /** + * Sent when new profile recording is started using console.profile() call. + */ + once(event: 'Profiler.consoleProfileStarted', listener: (message: InspectorNotification) => void): this; + once(event: 'Profiler.consoleProfileFinished', listener: (message: InspectorNotification) => void): this; + once(event: 'HeapProfiler.addHeapSnapshotChunk', listener: (message: InspectorNotification) => void): this; + once(event: 'HeapProfiler.resetProfiles', listener: () => void): this; + once(event: 'HeapProfiler.reportHeapSnapshotProgress', listener: (message: InspectorNotification) => void): this; + /** + * If heap objects tracking has been started then backend regularly sends a current value for last seen object id and corresponding timestamp. If the were changes in the heap since last event then one or more heapStatsUpdate events will be sent before a new lastSeenObjectId event. + */ + once(event: 'HeapProfiler.lastSeenObjectId', listener: (message: InspectorNotification) => void): this; + /** + * If heap objects tracking has been started then backend may send update for one or more fragments + */ + once(event: 'HeapProfiler.heapStatsUpdate', listener: (message: InspectorNotification) => void): this; + /** + * Contains an bucket of collected trace events. + */ + once(event: 'NodeTracing.dataCollected', listener: (message: InspectorNotification) => void): this; + /** + * Signals that tracing is stopped and there is no trace buffers pending flush, all data were + * delivered via dataCollected events. + */ + once(event: 'NodeTracing.tracingComplete', listener: () => void): this; + /** + * Issued when attached to a worker. + */ + once(event: 'NodeWorker.attachedToWorker', listener: (message: InspectorNotification) => void): this; + /** + * Issued when detached from the worker. + */ + once(event: 'NodeWorker.detachedFromWorker', listener: (message: InspectorNotification) => void): this; + /** + * Notifies about a new protocol message received from the session + * (session ID is provided in attachedToWorker notification). + */ + once(event: 'NodeWorker.receivedMessageFromWorker', listener: (message: InspectorNotification) => void): this; + /** + * This event is fired instead of `Runtime.executionContextDestroyed` when + * enabled. + * It is fired when the Node process finished all code execution and is + * waiting for all frontends to disconnect. + */ + once(event: 'NodeRuntime.waitingForDisconnect', listener: () => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + /** + * Emitted when any notification from the V8 Inspector is received. + */ + prependListener(event: 'inspectorNotification', listener: (message: InspectorNotification<{}>) => void): this; + /** + * Issued when new execution context is created. + */ + prependListener(event: 'Runtime.executionContextCreated', listener: (message: InspectorNotification) => void): this; + /** + * Issued when execution context is destroyed. + */ + prependListener(event: 'Runtime.executionContextDestroyed', listener: (message: InspectorNotification) => void): this; + /** + * Issued when all executionContexts were cleared in browser + */ + prependListener(event: 'Runtime.executionContextsCleared', listener: () => void): this; + /** + * Issued when exception was thrown and unhandled. + */ + prependListener(event: 'Runtime.exceptionThrown', listener: (message: InspectorNotification) => void): this; + /** + * Issued when unhandled exception was revoked. + */ + prependListener(event: 'Runtime.exceptionRevoked', listener: (message: InspectorNotification) => void): this; + /** + * Issued when console API was called. + */ + prependListener(event: 'Runtime.consoleAPICalled', listener: (message: InspectorNotification) => void): this; + /** + * Issued when object should be inspected (for example, as a result of inspect() command line API call). + */ + prependListener(event: 'Runtime.inspectRequested', listener: (message: InspectorNotification) => void): this; + /** + * Fired when virtual machine parses script. This event is also fired for all known and uncollected scripts upon enabling debugger. + */ + prependListener(event: 'Debugger.scriptParsed', listener: (message: InspectorNotification) => void): this; + /** + * Fired when virtual machine fails to parse the script. + */ + prependListener(event: 'Debugger.scriptFailedToParse', listener: (message: InspectorNotification) => void): this; + /** + * Fired when breakpoint is resolved to an actual script and location. + */ + prependListener(event: 'Debugger.breakpointResolved', listener: (message: InspectorNotification) => void): this; + /** + * Fired when the virtual machine stopped on breakpoint or exception or any other stop criteria. + */ + prependListener(event: 'Debugger.paused', listener: (message: InspectorNotification) => void): this; + /** + * Fired when the virtual machine resumed execution. + */ + prependListener(event: 'Debugger.resumed', listener: () => void): this; + /** + * Issued when new console message is added. + */ + prependListener(event: 'Console.messageAdded', listener: (message: InspectorNotification) => void): this; + /** + * Sent when new profile recording is started using console.profile() call. + */ + prependListener(event: 'Profiler.consoleProfileStarted', listener: (message: InspectorNotification) => void): this; + prependListener(event: 'Profiler.consoleProfileFinished', listener: (message: InspectorNotification) => void): this; + prependListener(event: 'HeapProfiler.addHeapSnapshotChunk', listener: (message: InspectorNotification) => void): this; + prependListener(event: 'HeapProfiler.resetProfiles', listener: () => void): this; + prependListener(event: 'HeapProfiler.reportHeapSnapshotProgress', listener: (message: InspectorNotification) => void): this; + /** + * If heap objects tracking has been started then backend regularly sends a current value for last seen object id and corresponding timestamp. If the were changes in the heap since last event then one or more heapStatsUpdate events will be sent before a new lastSeenObjectId event. + */ + prependListener(event: 'HeapProfiler.lastSeenObjectId', listener: (message: InspectorNotification) => void): this; + /** + * If heap objects tracking has been started then backend may send update for one or more fragments + */ + prependListener(event: 'HeapProfiler.heapStatsUpdate', listener: (message: InspectorNotification) => void): this; + /** + * Contains an bucket of collected trace events. + */ + prependListener(event: 'NodeTracing.dataCollected', listener: (message: InspectorNotification) => void): this; + /** + * Signals that tracing is stopped and there is no trace buffers pending flush, all data were + * delivered via dataCollected events. + */ + prependListener(event: 'NodeTracing.tracingComplete', listener: () => void): this; + /** + * Issued when attached to a worker. + */ + prependListener(event: 'NodeWorker.attachedToWorker', listener: (message: InspectorNotification) => void): this; + /** + * Issued when detached from the worker. + */ + prependListener(event: 'NodeWorker.detachedFromWorker', listener: (message: InspectorNotification) => void): this; + /** + * Notifies about a new protocol message received from the session + * (session ID is provided in attachedToWorker notification). + */ + prependListener(event: 'NodeWorker.receivedMessageFromWorker', listener: (message: InspectorNotification) => void): this; + /** + * This event is fired instead of `Runtime.executionContextDestroyed` when + * enabled. + * It is fired when the Node process finished all code execution and is + * waiting for all frontends to disconnect. + */ + prependListener(event: 'NodeRuntime.waitingForDisconnect', listener: () => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + /** + * Emitted when any notification from the V8 Inspector is received. + */ + prependOnceListener(event: 'inspectorNotification', listener: (message: InspectorNotification<{}>) => void): this; + /** + * Issued when new execution context is created. + */ + prependOnceListener(event: 'Runtime.executionContextCreated', listener: (message: InspectorNotification) => void): this; + /** + * Issued when execution context is destroyed. + */ + prependOnceListener(event: 'Runtime.executionContextDestroyed', listener: (message: InspectorNotification) => void): this; + /** + * Issued when all executionContexts were cleared in browser + */ + prependOnceListener(event: 'Runtime.executionContextsCleared', listener: () => void): this; + /** + * Issued when exception was thrown and unhandled. + */ + prependOnceListener(event: 'Runtime.exceptionThrown', listener: (message: InspectorNotification) => void): this; + /** + * Issued when unhandled exception was revoked. + */ + prependOnceListener(event: 'Runtime.exceptionRevoked', listener: (message: InspectorNotification) => void): this; + /** + * Issued when console API was called. + */ + prependOnceListener(event: 'Runtime.consoleAPICalled', listener: (message: InspectorNotification) => void): this; + /** + * Issued when object should be inspected (for example, as a result of inspect() command line API call). + */ + prependOnceListener(event: 'Runtime.inspectRequested', listener: (message: InspectorNotification) => void): this; + /** + * Fired when virtual machine parses script. This event is also fired for all known and uncollected scripts upon enabling debugger. + */ + prependOnceListener(event: 'Debugger.scriptParsed', listener: (message: InspectorNotification) => void): this; + /** + * Fired when virtual machine fails to parse the script. + */ + prependOnceListener(event: 'Debugger.scriptFailedToParse', listener: (message: InspectorNotification) => void): this; + /** + * Fired when breakpoint is resolved to an actual script and location. + */ + prependOnceListener(event: 'Debugger.breakpointResolved', listener: (message: InspectorNotification) => void): this; + /** + * Fired when the virtual machine stopped on breakpoint or exception or any other stop criteria. + */ + prependOnceListener(event: 'Debugger.paused', listener: (message: InspectorNotification) => void): this; + /** + * Fired when the virtual machine resumed execution. + */ + prependOnceListener(event: 'Debugger.resumed', listener: () => void): this; + /** + * Issued when new console message is added. + */ + prependOnceListener(event: 'Console.messageAdded', listener: (message: InspectorNotification) => void): this; + /** + * Sent when new profile recording is started using console.profile() call. + */ + prependOnceListener(event: 'Profiler.consoleProfileStarted', listener: (message: InspectorNotification) => void): this; + prependOnceListener(event: 'Profiler.consoleProfileFinished', listener: (message: InspectorNotification) => void): this; + prependOnceListener(event: 'HeapProfiler.addHeapSnapshotChunk', listener: (message: InspectorNotification) => void): this; + prependOnceListener(event: 'HeapProfiler.resetProfiles', listener: () => void): this; + prependOnceListener(event: 'HeapProfiler.reportHeapSnapshotProgress', listener: (message: InspectorNotification) => void): this; + /** + * If heap objects tracking has been started then backend regularly sends a current value for last seen object id and corresponding timestamp. If the were changes in the heap since last event then one or more heapStatsUpdate events will be sent before a new lastSeenObjectId event. + */ + prependOnceListener(event: 'HeapProfiler.lastSeenObjectId', listener: (message: InspectorNotification) => void): this; + /** + * If heap objects tracking has been started then backend may send update for one or more fragments + */ + prependOnceListener(event: 'HeapProfiler.heapStatsUpdate', listener: (message: InspectorNotification) => void): this; + /** + * Contains an bucket of collected trace events. + */ + prependOnceListener(event: 'NodeTracing.dataCollected', listener: (message: InspectorNotification) => void): this; + /** + * Signals that tracing is stopped and there is no trace buffers pending flush, all data were + * delivered via dataCollected events. + */ + prependOnceListener(event: 'NodeTracing.tracingComplete', listener: () => void): this; + /** + * Issued when attached to a worker. + */ + prependOnceListener(event: 'NodeWorker.attachedToWorker', listener: (message: InspectorNotification) => void): this; + /** + * Issued when detached from the worker. + */ + prependOnceListener(event: 'NodeWorker.detachedFromWorker', listener: (message: InspectorNotification) => void): this; + /** + * Notifies about a new protocol message received from the session + * (session ID is provided in attachedToWorker notification). + */ + prependOnceListener(event: 'NodeWorker.receivedMessageFromWorker', listener: (message: InspectorNotification) => void): this; + /** + * This event is fired instead of `Runtime.executionContextDestroyed` when + * enabled. + * It is fired when the Node process finished all code execution and is + * waiting for all frontends to disconnect. + */ + prependOnceListener(event: 'NodeRuntime.waitingForDisconnect', listener: () => void): this; + } + /** + * Activate inspector on host and port. Equivalent to`node --inspect=[[host:]port]`, but can be done programmatically after node has + * 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` regarding the `host`parameter usage. + * @param [port='what was specified on the CLI'] Port to listen on for inspector connections. Optional. + * @param [host='what was specified on the CLI'] Host to listen on for inspector connections. Optional. + * @param [wait=false] Block until a client has connected. Optional. + * @returns Disposable that calls `inspector.close()`. + */ + function open(port?: number, host?: string, wait?: boolean): Disposable; + /** + * Deactivate the inspector. Blocks until there are no active connections. + */ + function close(): void; + /** + * Return the URL of the active inspector, or `undefined` if there is none. + * + * ```console + * $ node --inspect -p 'inspector.url()' + * Debugger listening on ws://127.0.0.1:9229/166e272e-7a30-4d09-97ce-f1c012b43c34 + * For help, see: https://nodejs.org/en/docs/inspector + * ws://127.0.0.1:9229/166e272e-7a30-4d09-97ce-f1c012b43c34 + * + * $ node --inspect=localhost:3000 -p 'inspector.url()' + * Debugger listening on ws://localhost:3000/51cf8d0e-3c36-4c59-8efd-54519839e56a + * For help, see: https://nodejs.org/en/docs/inspector + * ws://localhost:3000/51cf8d0e-3c36-4c59-8efd-54519839e56a + * + * $ node -p 'inspector.url()' + * undefined + * ``` + */ + function url(): string | undefined; + /** + * Blocks until a client (existing or connected later) has sent`Runtime.runIfWaitingForDebugger` command. + * + * An exception will be thrown if there is no active inspector. + * @since v12.7.0 + */ + function waitForDebugger(): void; +} +/** + * The inspector module provides an API for interacting with the V8 inspector. + */ +declare module 'node:inspector' { + import inspector = require('inspector'); + export = inspector; +} diff --git a/task/node_modules/@types/node/module.d.ts b/task/node_modules/@types/node/module.d.ts new file mode 100644 index 0000000..68d59c7 --- /dev/null +++ b/task/node_modules/@types/node/module.d.ts @@ -0,0 +1,301 @@ +/** + * @since v0.3.7 + * @experimental + */ +declare module "module" { + import { URL } from "node:url"; + import { MessagePort } from "node:worker_threads"; + namespace Module { + /** + * The `module.syncBuiltinESMExports()` method updates all the live bindings for + * builtin `ES Modules` to match the properties of the `CommonJS` exports. It + * does not add or remove exported names from the `ES Modules`. + * + * ```js + * const fs = require('node:fs'); + * const assert = require('node:assert'); + * const { syncBuiltinESMExports } = require('node:module'); + * + * fs.readFile = newAPI; + * + * delete fs.readFileSync; + * + * function newAPI() { + * // ... + * } + * + * fs.newAPI = newAPI; + * + * syncBuiltinESMExports(); + * + * import('node:fs').then((esmFS) => { + * // It syncs the existing readFile property with the new value + * assert.strictEqual(esmFS.readFile, newAPI); + * // readFileSync has been deleted from the required fs + * assert.strictEqual('readFileSync' in fs, false); + * // syncBuiltinESMExports() does not remove readFileSync from esmFS + * assert.strictEqual('readFileSync' in esmFS, true); + * // syncBuiltinESMExports() does not add names + * assert.strictEqual(esmFS.newAPI, undefined); + * }); + * ``` + * @since v12.12.0 + */ + function syncBuiltinESMExports(): void; + /** + * `path` is the resolved path for the file for which a corresponding source map + * should be fetched. + * @since v13.7.0, v12.17.0 + * @return Returns `module.SourceMap` if a source map is found, `undefined` otherwise. + */ + function findSourceMap(path: string, error?: Error): SourceMap; + interface SourceMapPayload { + file: string; + version: number; + sources: string[]; + sourcesContent: string[]; + names: string[]; + mappings: string; + sourceRoot: string; + } + interface SourceMapping { + generatedLine: number; + generatedColumn: number; + originalSource: string; + originalLine: number; + originalColumn: number; + } + interface SourceOrigin { + /** + * The name of the range in the source map, if one was provided + */ + name?: string; + /** + * The file name of the original source, as reported in the SourceMap + */ + fileName: string; + /** + * The 1-indexed lineNumber of the corresponding call site in the original source + */ + lineNumber: number; + /** + * The 1-indexed columnNumber of the corresponding call site in the original source + */ + columnNumber: number; + } + /** + * @since v13.7.0, v12.17.0 + */ + class SourceMap { + /** + * Getter for the payload used to construct the `SourceMap` instance. + */ + readonly payload: SourceMapPayload; + constructor(payload: SourceMapPayload); + /** + * Given a line offset and column offset in the generated source + * file, returns an object representing the SourceMap range in the + * original file if found, or an empty object if not. + * + * The object returned contains the following keys: + * + * The returned value represents the raw range as it appears in the + * SourceMap, based on zero-indexed offsets, _not_ 1-indexed line and + * column numbers as they appear in Error messages and CallSite + * objects. + * + * To get the corresponding 1-indexed line and column numbers from a + * lineNumber and columnNumber as they are reported by Error stacks + * and CallSite objects, use `sourceMap.findOrigin(lineNumber, columnNumber)` + * @param lineOffset The zero-indexed line number offset in the generated source + * @param columnOffset The zero-indexed column number offset in the generated source + */ + findEntry(lineOffset: number, columnOffset: number): SourceMapping; + /** + * Given a 1-indexed `lineNumber` and `columnNumber` from a call site in the generated source, + * find the corresponding call site location in the original source. + * + * If the `lineNumber` and `columnNumber` provided are not found in any source map, + * then an empty object is returned. + * @param lineNumber The 1-indexed line number of the call site in the generated source + * @param columnNumber The 1-indexed column number of the call site in the generated source + */ + findOrigin(lineNumber: number, columnNumber: number): SourceOrigin | {}; + } + /** @deprecated Use `ImportAttributes` instead */ + interface ImportAssertions extends ImportAttributes {} + interface ImportAttributes extends NodeJS.Dict { + type?: string | undefined; + } + type ModuleFormat = "builtin" | "commonjs" | "json" | "module" | "wasm"; + type ModuleSource = string | ArrayBuffer | NodeJS.TypedArray; + interface GlobalPreloadContext { + port: MessagePort; + } + /** + * @deprecated This hook will be removed in a future version. + * Use `initialize` instead. When a loader has an `initialize` export, `globalPreload` will be ignored. + * + * 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. + * + * @param context Information to assist the preload code + * @return Code to run before application startup + */ + type GlobalPreloadHook = (context: GlobalPreloadContext) => string; + /** + * The `initialize` hook provides a way to define a custom function that runs in the hooks thread + * when the hooks module is initialized. Initialization happens when the hooks module is registered via `register`. + * + * This hook can receive data from a `register` invocation, including ports and other transferrable objects. + * The return value of `initialize` can be a `Promise`, in which case it will be awaited before the main application thread execution resumes. + */ + type InitializeHook = (data: Data) => void | Promise; + interface ResolveHookContext { + /** + * Export conditions of the relevant `package.json` + */ + conditions: string[]; + /** + * @deprecated Use `importAttributes` instead + */ + importAssertions: ImportAttributes; + /** + * An object whose key-value pairs represent the assertions for the module to import + */ + importAttributes: ImportAttributes; + /** + * The module importing this one, or undefined if this is the Node.js entry point + */ + parentURL: string | undefined; + } + interface ResolveFnOutput { + /** + * A hint to the load hook (it might be ignored) + */ + format?: ModuleFormat | null | undefined; + /** + * @deprecated Use `importAttributes` instead + */ + importAssertions?: ImportAttributes | undefined; + /** + * The import attributes to use when caching the module (optional; if excluded the input will be used) + */ + importAttributes?: ImportAttributes | undefined; + /** + * A signal that this hook intends to terminate the chain of `resolve` hooks. + * @default false + */ + shortCircuit?: boolean | undefined; + /** + * The absolute URL to which this input resolves + */ + url: string; + } + /** + * The `resolve` hook chain is responsible for resolving file URL for a given module specifier 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. + * + * @param specifier The specified URL path of the module to be resolved + * @param context + * @param nextResolve The subsequent `resolve` hook in the chain, or the Node.js default `resolve` hook after the last user-supplied resolve hook + */ + type ResolveHook = ( + specifier: string, + context: ResolveHookContext, + nextResolve: ( + specifier: string, + context?: ResolveHookContext, + ) => ResolveFnOutput | Promise, + ) => ResolveFnOutput | Promise; + interface LoadHookContext { + /** + * Export conditions of the relevant `package.json` + */ + conditions: string[]; + /** + * The format optionally supplied by the `resolve` hook chain + */ + format: ModuleFormat; + /** + * @deprecated Use `importAttributes` instead + */ + importAssertions: ImportAttributes; + /** + * An object whose key-value pairs represent the assertions for the module to import + */ + importAttributes: ImportAttributes; + } + interface LoadFnOutput { + format: ModuleFormat; + /** + * A signal that this hook intends to terminate the chain of `resolve` hooks. + * @default false + */ + shortCircuit?: boolean | undefined; + /** + * The source for Node.js to evaluate + */ + source?: ModuleSource; + } + /** + * The `load` hook provides a way to define a custom method of determining how a URL should be interpreted, retrieved, and parsed. + * It is also in charge of validating the import assertion. + * + * @param url The URL/path of the module to be loaded + * @param context Metadata about the module + * @param nextLoad The subsequent `load` hook in the chain, or the Node.js default `load` hook after the last user-supplied `load` hook + */ + type LoadHook = ( + url: string, + context: LoadHookContext, + nextLoad: (url: string, context?: LoadHookContext) => LoadFnOutput | Promise, + ) => LoadFnOutput | Promise; + } + interface RegisterOptions { + parentURL: string | URL; + data?: Data | undefined; + transferList?: any[] | undefined; + } + interface Module extends NodeModule {} + class Module { + static runMain(): void; + static wrap(code: string): string; + static createRequire(path: string | URL): NodeRequire; + static builtinModules: string[]; + static isBuiltin(moduleName: string): boolean; + static Module: typeof Module; + static register( + specifier: string | URL, + parentURL?: string | URL, + options?: RegisterOptions, + ): void; + static register(specifier: string | URL, options?: RegisterOptions): void; + constructor(id: string, parent?: Module); + } + global { + interface ImportMeta { + url: string; + /** + * Provides a module-relative resolution function scoped to each module, returning + * the URL string. + * + * Second `parent` parameter is only used when the `--experimental-import-meta-resolve` + * command flag enabled. + * + * @since v20.6.0 + * + * @param specifier The module specifier to resolve relative to `parent`. + * @param parent The absolute parent module URL to resolve from. + * @returns The absolute (`file:`) URL string for the resolved module. + */ + resolve(specifier: string, parent?: string | URL | undefined): string; + } + } + export = Module; +} +declare module "node:module" { + import module = require("module"); + export = module; +} diff --git a/task/node_modules/@types/node/net.d.ts b/task/node_modules/@types/node/net.d.ts new file mode 100644 index 0000000..70789e1 --- /dev/null +++ b/task/node_modules/@types/node/net.d.ts @@ -0,0 +1,949 @@ +/** + * > Stability: 2 - Stable + * + * The `node:net` module provides an asynchronous network API for creating stream-based + * TCP or `IPC` servers ({@link createServer}) and clients + * ({@link createConnection}). + * + * It can be accessed using: + * + * ```js + * const net = require('node:net'); + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/net.js) + */ +declare module "net" { + import * as stream from "node:stream"; + import { Abortable, EventEmitter } from "node:events"; + import * as dns from "node:dns"; + type LookupFunction = ( + hostname: string, + options: dns.LookupAllOptions, + callback: (err: NodeJS.ErrnoException | null, addresses: dns.LookupAddress[]) => void, + ) => void; + interface AddressInfo { + address: string; + family: string; + port: number; + } + interface SocketConstructorOpts { + fd?: number | undefined; + allowHalfOpen?: boolean | undefined; + readable?: boolean | undefined; + writable?: boolean | undefined; + signal?: AbortSignal; + } + interface OnReadOpts { + buffer: Uint8Array | (() => Uint8Array); + /** + * This function is called for every chunk of incoming data. + * Two arguments are passed to it: the number of bytes written to buffer and a reference to buffer. + * Return false from this function to implicitly pause() the socket. + */ + callback(bytesWritten: number, buf: Uint8Array): boolean; + } + interface ConnectOpts { + /** + * If specified, incoming data is stored in a single buffer and passed to the supplied callback when data arrives on the socket. + * Note: this will cause the streaming functionality to not provide any data, however events like 'error', 'end', and 'close' will + * still be emitted as normal and methods like pause() and resume() will also behave as expected. + */ + onread?: OnReadOpts | undefined; + } + interface TcpSocketConnectOpts extends ConnectOpts { + port: number; + host?: string | undefined; + localAddress?: string | undefined; + localPort?: number | undefined; + hints?: number | undefined; + family?: number | undefined; + lookup?: LookupFunction | undefined; + noDelay?: boolean | undefined; + keepAlive?: boolean | undefined; + keepAliveInitialDelay?: number | undefined; + /** + * @since v18.13.0 + */ + autoSelectFamily?: boolean | undefined; + /** + * @since v18.13.0 + */ + autoSelectFamilyAttemptTimeout?: number | undefined; + } + interface IpcSocketConnectOpts extends ConnectOpts { + path: string; + } + type SocketConnectOpts = TcpSocketConnectOpts | IpcSocketConnectOpts; + type SocketReadyState = "opening" | "open" | "readOnly" | "writeOnly" | "closed"; + /** + * This class is an abstraction of a TCP socket or a streaming `IPC` endpoint + * (uses named pipes on Windows, and Unix domain sockets otherwise). It is also + * an `EventEmitter`. + * + * A `net.Socket` can be created by the user and used directly to interact with + * a server. For example, it is returned by {@link createConnection}, + * so the user can use it to talk to the server. + * + * It can also be created by Node.js and passed to the user when a connection + * is received. For example, it is passed to the listeners of a `'connection'` event emitted on a {@link Server}, so the user can use + * it to interact with the client. + * @since v0.3.4 + */ + class Socket extends stream.Duplex { + constructor(options?: SocketConstructorOpts); + /** + * Destroys the socket after all data is written. If the `finish` event was already emitted the socket is destroyed immediately. + * If the socket is still writable it implicitly calls `socket.end()`. + * @since v0.3.4 + */ + destroySoon(): void; + /** + * Sends data on the socket. The second parameter specifies the encoding in the + * case of a string. It defaults to UTF8 encoding. + * + * Returns `true` if the entire data was flushed successfully to the kernel + * buffer. Returns `false` if all or part of the data was queued in user memory.`'drain'` will be emitted when the buffer is again free. + * + * The optional `callback` parameter will be executed when the data is finally + * written out, which may not be immediately. + * + * See `Writable` stream `write()` method for more + * information. + * @since v0.1.90 + * @param [encoding='utf8'] Only used when data is `string`. + */ + write(buffer: Uint8Array | string, cb?: (err?: Error) => void): boolean; + write(str: Uint8Array | string, encoding?: BufferEncoding, cb?: (err?: Error) => void): boolean; + /** + * Initiate a connection on a given socket. + * + * Possible signatures: + * + * * `socket.connect(options[, connectListener])` + * * `socket.connect(path[, connectListener])` for `IPC` connections. + * * `socket.connect(port[, host][, connectListener])` for TCP connections. + * * Returns: `net.Socket` The socket itself. + * + * This function is asynchronous. When the connection is established, the `'connect'` event will be emitted. If there is a problem connecting, + * instead of a `'connect'` event, an `'error'` event will be emitted with + * the error passed to the `'error'` listener. + * The last parameter `connectListener`, if supplied, will be added as a listener + * for the `'connect'` event **once**. + * + * This function should only be used for reconnecting a socket after`'close'` has been emitted or otherwise it may lead to undefined + * behavior. + */ + connect(options: SocketConnectOpts, connectionListener?: () => void): this; + connect(port: number, host: string, connectionListener?: () => void): this; + connect(port: number, connectionListener?: () => void): this; + connect(path: string, connectionListener?: () => void): this; + /** + * Set the encoding for the socket as a `Readable Stream`. See `readable.setEncoding()` for more information. + * @since v0.1.90 + * @return The socket itself. + */ + setEncoding(encoding?: BufferEncoding): this; + /** + * Pauses the reading of data. That is, `'data'` events will not be emitted. + * Useful to throttle back an upload. + * @return The socket itself. + */ + pause(): this; + /** + * Close the TCP connection by sending an RST packet and destroy the stream. + * If this TCP socket is in connecting status, it will send an RST packet and destroy this TCP socket once it is connected. + * Otherwise, it will call `socket.destroy` with an `ERR_SOCKET_CLOSED` Error. + * If this is not a TCP socket (for example, a pipe), calling this method will immediately throw an `ERR_INVALID_HANDLE_TYPE` Error. + * @since v18.3.0, v16.17.0 + */ + resetAndDestroy(): this; + /** + * Resumes reading after a call to `socket.pause()`. + * @return The socket itself. + */ + resume(): this; + /** + * Sets the socket to timeout after `timeout` milliseconds of inactivity on + * the socket. By default `net.Socket` do not have a timeout. + * + * When an idle timeout is triggered the socket will receive a `'timeout'` event but the connection will not be severed. The user must manually call `socket.end()` or `socket.destroy()` to + * end the connection. + * + * ```js + * socket.setTimeout(3000); + * socket.on('timeout', () => { + * console.log('socket timeout'); + * socket.end(); + * }); + * ``` + * + * If `timeout` is 0, then the existing idle timeout is disabled. + * + * The optional `callback` parameter will be added as a one-time listener for the `'timeout'` event. + * @since v0.1.90 + * @return The socket itself. + */ + setTimeout(timeout: number, callback?: () => void): this; + /** + * Enable/disable the use of Nagle's algorithm. + * + * When a TCP connection is created, it will have Nagle's algorithm enabled. + * + * Nagle's algorithm delays data before it is sent via the network. It attempts + * to optimize throughput at the expense of latency. + * + * Passing `true` for `noDelay` or not passing an argument will disable Nagle's + * algorithm for the socket. Passing `false` for `noDelay` will enable Nagle's + * algorithm. + * @since v0.1.90 + * @param [noDelay=true] + * @return The socket itself. + */ + setNoDelay(noDelay?: boolean): this; + /** + * Enable/disable keep-alive functionality, and optionally set the initial + * delay before the first keepalive probe is sent on an idle socket. + * + * Set `initialDelay` (in milliseconds) to set the delay between the last + * data packet received and the first keepalive probe. Setting `0` for`initialDelay` will leave the value unchanged from the default + * (or previous) setting. + * + * Enabling the keep-alive functionality will set the following socket options: + * + * * `SO_KEEPALIVE=1` + * * `TCP_KEEPIDLE=initialDelay` + * * `TCP_KEEPCNT=10` + * * `TCP_KEEPINTVL=1` + * @since v0.1.92 + * @param [enable=false] + * @param [initialDelay=0] + * @return The socket itself. + */ + setKeepAlive(enable?: boolean, initialDelay?: number): this; + /** + * Returns the bound `address`, the address `family` name and `port` of the + * socket as reported by the operating system:`{ port: 12346, family: 'IPv4', address: '127.0.0.1' }` + * @since v0.1.90 + */ + address(): AddressInfo | {}; + /** + * Calling `unref()` on a socket will allow the program to exit if this is the only + * active socket in the event system. If the socket is already `unref`ed calling`unref()` again will have no effect. + * @since v0.9.1 + * @return The socket itself. + */ + unref(): this; + /** + * Opposite of `unref()`, calling `ref()` on a previously `unref`ed socket will _not_ let the program exit if it's the only socket left (the default behavior). + * If the socket is `ref`ed calling `ref` again will have no effect. + * @since v0.9.1 + * @return The socket itself. + */ + ref(): this; + /** + * This property is only present if the family autoselection algorithm is enabled in `socket.connect(options)` + * and it is an array of the addresses that have been attempted. + * + * Each address is a string in the form of `$IP:$PORT`. + * If the connection was successful, then the last address is the one that the socket is currently connected to. + * @since v19.4.0 + */ + readonly autoSelectFamilyAttemptedAddresses: string[]; + /** + * This property shows the number of characters buffered for writing. The buffer + * may contain strings whose length after encoding is not yet known. So this number + * is only an approximation of the number of bytes in the buffer. + * + * `net.Socket` has the property that `socket.write()` always works. This is to + * help users get up and running quickly. The computer cannot always keep up + * with the amount of data that is written to a socket. The network connection + * simply might be too slow. Node.js will internally queue up the data written to a + * socket and send it out over the wire when it is possible. + * + * The consequence of this internal buffering is that memory may grow. + * Users who experience large or growing `bufferSize` should attempt to + * "throttle" the data flows in their program with `socket.pause()` and `socket.resume()`. + * @since v0.3.8 + * @deprecated Since v14.6.0 - Use `writableLength` instead. + */ + readonly bufferSize: number; + /** + * The amount of received bytes. + * @since v0.5.3 + */ + readonly bytesRead: number; + /** + * The amount of bytes sent. + * @since v0.5.3 + */ + readonly bytesWritten: number; + /** + * If `true`,`socket.connect(options[, connectListener])` was + * called and has not yet finished. It will stay `true` until the socket becomes + * connected, then it is set to `false` and the `'connect'` event is emitted. Note + * that the `socket.connect(options[, connectListener])` callback is a listener for the `'connect'` event. + * @since v6.1.0 + */ + readonly connecting: boolean; + /** + * This is `true` if the socket is not connected yet, either because `.connect()`has not yet been called or because it is still in the process of connecting + * (see `socket.connecting`). + * @since v11.2.0, v10.16.0 + */ + readonly pending: boolean; + /** + * See `writable.destroyed` for further details. + */ + readonly destroyed: boolean; + /** + * The string representation of the local IP address the remote client is + * connecting on. For example, in a server listening on `'0.0.0.0'`, if a client + * connects on `'192.168.1.1'`, the value of `socket.localAddress` would be`'192.168.1.1'`. + * @since v0.9.6 + */ + readonly localAddress?: string; + /** + * The numeric representation of the local port. For example, `80` or `21`. + * @since v0.9.6 + */ + readonly localPort?: number; + /** + * The string representation of the local IP family. `'IPv4'` or `'IPv6'`. + * @since v18.8.0, v16.18.0 + */ + readonly localFamily?: string; + /** + * This property represents the state of the connection as a string. + * + * * If the stream is connecting `socket.readyState` is `opening`. + * * If the stream is readable and writable, it is `open`. + * * If the stream is readable and not writable, it is `readOnly`. + * * If the stream is not readable and writable, it is `writeOnly`. + * @since v0.5.0 + */ + readonly readyState: SocketReadyState; + /** + * The string representation of the remote IP address. For example,`'74.125.127.100'` or `'2001:4860:a005::68'`. Value may be `undefined` if + * the socket is destroyed (for example, if the client disconnected). + * @since v0.5.10 + */ + readonly remoteAddress?: string | undefined; + /** + * The string representation of the remote IP family. `'IPv4'` or `'IPv6'`. Value may be `undefined` if + * the socket is destroyed (for example, if the client disconnected). + * @since v0.11.14 + */ + readonly remoteFamily?: string | undefined; + /** + * The numeric representation of the remote port. For example, `80` or `21`. Value may be `undefined` if + * the socket is destroyed (for example, if the client disconnected). + * @since v0.5.10 + */ + readonly remotePort?: number | undefined; + /** + * The socket timeout in milliseconds as set by `socket.setTimeout()`. + * It is `undefined` if a timeout has not been set. + * @since v10.7.0 + */ + readonly timeout?: number | undefined; + /** + * Half-closes the socket. i.e., it sends a FIN packet. It is possible the + * server will still send some data. + * + * See `writable.end()` for further details. + * @since v0.1.90 + * @param [encoding='utf8'] Only used when data is `string`. + * @param callback Optional callback for when the socket is finished. + * @return The socket itself. + */ + end(callback?: () => void): this; + end(buffer: Uint8Array | string, callback?: () => void): this; + end(str: Uint8Array | string, encoding?: BufferEncoding, callback?: () => void): this; + /** + * events.EventEmitter + * 1. close + * 2. connect + * 3. data + * 4. drain + * 5. end + * 6. error + * 7. lookup + * 8. ready + * 9. timeout + */ + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "close", listener: (hadError: boolean) => void): this; + addListener(event: "connect", listener: () => void): this; + addListener(event: "data", listener: (data: Buffer) => void): this; + addListener(event: "drain", listener: () => void): this; + addListener(event: "end", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener( + event: "lookup", + listener: (err: Error, address: string, family: string | number, host: string) => void, + ): this; + addListener(event: "ready", listener: () => void): this; + addListener(event: "timeout", listener: () => void): this; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close", hadError: boolean): boolean; + emit(event: "connect"): boolean; + emit(event: "data", data: Buffer): boolean; + emit(event: "drain"): boolean; + emit(event: "end"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "lookup", err: Error, address: string, family: string | number, host: string): boolean; + emit(event: "ready"): boolean; + emit(event: "timeout"): boolean; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "close", listener: (hadError: boolean) => void): this; + on(event: "connect", listener: () => void): this; + on(event: "data", listener: (data: Buffer) => void): this; + on(event: "drain", listener: () => void): this; + on(event: "end", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on( + event: "lookup", + listener: (err: Error, address: string, family: string | number, host: string) => void, + ): this; + on(event: "ready", listener: () => void): this; + on(event: "timeout", listener: () => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "close", listener: (hadError: boolean) => void): this; + once(event: "connect", listener: () => void): this; + once(event: "data", listener: (data: Buffer) => void): this; + once(event: "drain", listener: () => void): this; + once(event: "end", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once( + event: "lookup", + listener: (err: Error, address: string, family: string | number, host: string) => void, + ): this; + once(event: "ready", listener: () => void): this; + once(event: "timeout", listener: () => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: (hadError: boolean) => void): this; + prependListener(event: "connect", listener: () => void): this; + prependListener(event: "data", listener: (data: Buffer) => void): this; + prependListener(event: "drain", listener: () => void): this; + prependListener(event: "end", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener( + event: "lookup", + listener: (err: Error, address: string, family: string | number, host: string) => void, + ): this; + prependListener(event: "ready", listener: () => void): this; + prependListener(event: "timeout", listener: () => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: (hadError: boolean) => void): this; + prependOnceListener(event: "connect", listener: () => void): this; + prependOnceListener(event: "data", listener: (data: Buffer) => void): this; + prependOnceListener(event: "drain", listener: () => void): this; + prependOnceListener(event: "end", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener( + event: "lookup", + listener: (err: Error, address: string, family: string | number, host: string) => void, + ): this; + prependOnceListener(event: "ready", listener: () => void): this; + prependOnceListener(event: "timeout", listener: () => void): this; + } + interface ListenOptions extends Abortable { + port?: number | undefined; + host?: string | undefined; + backlog?: number | undefined; + path?: string | undefined; + exclusive?: boolean | undefined; + readableAll?: boolean | undefined; + writableAll?: boolean | undefined; + /** + * @default false + */ + ipv6Only?: boolean | undefined; + } + interface ServerOpts { + /** + * Indicates whether half-opened TCP connections are allowed. + * @default false + */ + allowHalfOpen?: boolean | undefined; + /** + * Indicates whether the socket should be paused on incoming connections. + * @default false + */ + pauseOnConnect?: boolean | undefined; + /** + * If set to `true`, it disables the use of Nagle's algorithm immediately after a new incoming connection is received. + * @default false + * @since v16.5.0 + */ + noDelay?: boolean | undefined; + /** + * If set to `true`, it enables keep-alive functionality on the socket immediately after a new incoming connection is received, + * similarly on what is done in `socket.setKeepAlive([enable][, initialDelay])`. + * @default false + * @since v16.5.0 + */ + keepAlive?: boolean | undefined; + /** + * If set to a positive number, it sets the initial delay before the first keepalive probe is sent on an idle socket. + * @default 0 + * @since v16.5.0 + */ + keepAliveInitialDelay?: number | undefined; + } + interface DropArgument { + localAddress?: string; + localPort?: number; + localFamily?: string; + remoteAddress?: string; + remotePort?: number; + remoteFamily?: string; + } + /** + * This class is used to create a TCP or `IPC` server. + * @since v0.1.90 + */ + class Server extends EventEmitter { + constructor(connectionListener?: (socket: Socket) => void); + constructor(options?: ServerOpts, connectionListener?: (socket: Socket) => void); + /** + * Start a server listening for connections. A `net.Server` can be a TCP or + * an `IPC` server depending on what it listens to. + * + * Possible signatures: + * + * * `server.listen(handle[, backlog][, callback])` + * * `server.listen(options[, callback])` + * * `server.listen(path[, backlog][, callback])` for `IPC` servers + * * `server.listen([port[, host[, backlog]]][, callback])` for TCP servers + * + * This function is asynchronous. When the server starts listening, the `'listening'` event will be emitted. The last parameter `callback`will be added as a listener for the `'listening'` + * event. + * + * All `listen()` methods can take a `backlog` parameter to specify the maximum + * length of the queue of pending connections. The actual length will be determined + * by the OS through sysctl settings such as `tcp_max_syn_backlog` and `somaxconn`on Linux. The default value of this parameter is 511 (not 512). + * + * All {@link Socket} are set to `SO_REUSEADDR` (see [`socket(7)`](https://man7.org/linux/man-pages/man7/socket.7.html) for + * details). + * + * The `server.listen()` method can be called again if and only if there was an + * error during the first `server.listen()` call or `server.close()` has been + * called. Otherwise, an `ERR_SERVER_ALREADY_LISTEN` error will be thrown. + * + * One of the most common errors raised when listening is `EADDRINUSE`. + * This happens when another server is already listening on the requested`port`/`path`/`handle`. One way to handle this would be to retry + * after a certain amount of time: + * + * ```js + * server.on('error', (e) => { + * if (e.code === 'EADDRINUSE') { + * console.error('Address in use, retrying...'); + * setTimeout(() => { + * server.close(); + * server.listen(PORT, HOST); + * }, 1000); + * } + * }); + * ``` + */ + listen(port?: number, hostname?: string, backlog?: number, listeningListener?: () => void): this; + listen(port?: number, hostname?: string, listeningListener?: () => void): this; + listen(port?: number, backlog?: number, listeningListener?: () => void): this; + listen(port?: number, listeningListener?: () => void): this; + listen(path: string, backlog?: number, listeningListener?: () => void): this; + listen(path: string, listeningListener?: () => void): this; + listen(options: ListenOptions, listeningListener?: () => void): this; + listen(handle: any, backlog?: number, listeningListener?: () => void): this; + listen(handle: any, listeningListener?: () => void): this; + /** + * Stops the server from accepting new connections and keeps existing + * connections. This function is asynchronous, the server is finally closed + * when all connections are ended and the server emits a `'close'` event. + * The optional `callback` will be called once the `'close'` event occurs. Unlike + * that event, it will be called with an `Error` as its only argument if the server + * was not open when it was closed. + * @since v0.1.90 + * @param callback Called when the server is closed. + */ + close(callback?: (err?: Error) => void): this; + /** + * Returns the bound `address`, the address `family` name, and `port` of the server + * as reported by the operating system if listening on an IP socket + * (useful to find which port was assigned when getting an OS-assigned address):`{ port: 12346, family: 'IPv4', address: '127.0.0.1' }`. + * + * For a server listening on a pipe or Unix domain socket, the name is returned + * as a string. + * + * ```js + * const server = net.createServer((socket) => { + * socket.end('goodbye\n'); + * }).on('error', (err) => { + * // Handle errors here. + * throw err; + * }); + * + * // Grab an arbitrary unused port. + * server.listen(() => { + * console.log('opened server on', server.address()); + * }); + * ``` + * + * `server.address()` returns `null` before the `'listening'` event has been + * emitted or after calling `server.close()`. + * @since v0.1.90 + */ + address(): AddressInfo | string | null; + /** + * Asynchronously get the number of concurrent connections on the server. Works + * when sockets were sent to forks. + * + * Callback should take two arguments `err` and `count`. + * @since v0.9.7 + */ + getConnections(cb: (error: Error | null, count: number) => void): void; + /** + * Opposite of `unref()`, calling `ref()` on a previously `unref`ed server will _not_ let the program exit if it's the only server left (the default behavior). + * If the server is `ref`ed calling `ref()` again will have no effect. + * @since v0.9.1 + */ + ref(): this; + /** + * Calling `unref()` on a server will allow the program to exit if this is the only + * active server in the event system. If the server is already `unref`ed calling`unref()` again will have no effect. + * @since v0.9.1 + */ + unref(): this; + /** + * Set this property to reject connections when the server's connection count gets + * high. + * + * It is not recommended to use this option once a socket has been sent to a child + * with `child_process.fork()`. + * @since v0.2.0 + */ + maxConnections: number; + connections: number; + /** + * Indicates whether or not the server is listening for connections. + * @since v5.7.0 + */ + listening: boolean; + /** + * events.EventEmitter + * 1. close + * 2. connection + * 3. error + * 4. listening + * 5. drop + */ + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "connection", listener: (socket: Socket) => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "listening", listener: () => void): this; + addListener(event: "drop", listener: (data?: DropArgument) => void): this; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close"): boolean; + emit(event: "connection", socket: Socket): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "listening"): boolean; + emit(event: "drop", data?: DropArgument): boolean; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "close", listener: () => void): this; + on(event: "connection", listener: (socket: Socket) => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "listening", listener: () => void): this; + on(event: "drop", listener: (data?: DropArgument) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "connection", listener: (socket: Socket) => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "listening", listener: () => void): this; + once(event: "drop", listener: (data?: DropArgument) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "connection", listener: (socket: Socket) => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "listening", listener: () => void): this; + prependListener(event: "drop", listener: (data?: DropArgument) => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "connection", listener: (socket: Socket) => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "listening", listener: () => void): this; + prependOnceListener(event: "drop", listener: (data?: DropArgument) => void): this; + /** + * Calls {@link Server.close()} and returns a promise that fulfills when the server has closed. + * @since v20.5.0 + */ + [Symbol.asyncDispose](): Promise; + } + type IPVersion = "ipv4" | "ipv6"; + /** + * The `BlockList` object can be used with some network APIs to specify rules for + * disabling inbound or outbound access to specific IP addresses, IP ranges, or + * IP subnets. + * @since v15.0.0, v14.18.0 + */ + class BlockList { + /** + * Adds a rule to block the given IP address. + * @since v15.0.0, v14.18.0 + * @param address An IPv4 or IPv6 address. + * @param [type='ipv4'] Either `'ipv4'` or `'ipv6'`. + */ + addAddress(address: string, type?: IPVersion): void; + addAddress(address: SocketAddress): void; + /** + * Adds a rule to block a range of IP addresses from `start` (inclusive) to`end` (inclusive). + * @since v15.0.0, v14.18.0 + * @param start The starting IPv4 or IPv6 address in the range. + * @param end The ending IPv4 or IPv6 address in the range. + * @param [type='ipv4'] Either `'ipv4'` or `'ipv6'`. + */ + addRange(start: string, end: string, type?: IPVersion): void; + addRange(start: SocketAddress, end: SocketAddress): void; + /** + * Adds a rule to block a range of IP addresses specified as a subnet mask. + * @since v15.0.0, v14.18.0 + * @param net The network IPv4 or IPv6 address. + * @param prefix The number of CIDR prefix bits. For IPv4, this must be a value between `0` and `32`. For IPv6, this must be between `0` and `128`. + * @param [type='ipv4'] Either `'ipv4'` or `'ipv6'`. + */ + addSubnet(net: SocketAddress, prefix: number): void; + addSubnet(net: string, prefix: number, type?: IPVersion): void; + /** + * Returns `true` if the given IP address matches any of the rules added to the`BlockList`. + * + * ```js + * const blockList = new net.BlockList(); + * blockList.addAddress('123.123.123.123'); + * blockList.addRange('10.0.0.1', '10.0.0.10'); + * blockList.addSubnet('8592:757c:efae:4e45::', 64, 'ipv6'); + * + * console.log(blockList.check('123.123.123.123')); // Prints: true + * console.log(blockList.check('10.0.0.3')); // Prints: true + * console.log(blockList.check('222.111.111.222')); // Prints: false + * + * // IPv6 notation for IPv4 addresses works: + * console.log(blockList.check('::ffff:7b7b:7b7b', 'ipv6')); // Prints: true + * console.log(blockList.check('::ffff:123.123.123.123', 'ipv6')); // Prints: true + * ``` + * @since v15.0.0, v14.18.0 + * @param address The IP address to check + * @param [type='ipv4'] Either `'ipv4'` or `'ipv6'`. + */ + check(address: SocketAddress): boolean; + check(address: string, type?: IPVersion): boolean; + } + interface TcpNetConnectOpts extends TcpSocketConnectOpts, SocketConstructorOpts { + timeout?: number | undefined; + } + interface IpcNetConnectOpts extends IpcSocketConnectOpts, SocketConstructorOpts { + timeout?: number | undefined; + } + type NetConnectOpts = TcpNetConnectOpts | IpcNetConnectOpts; + /** + * Creates a new TCP or `IPC` server. + * + * If `allowHalfOpen` is set to `true`, when the other end of the socket + * signals the end of transmission, the server will only send back the end of + * transmission when `socket.end()` is explicitly called. For example, in the + * context of TCP, when a FIN packed is received, a FIN packed is sent + * back only when `socket.end()` is explicitly called. Until then the + * connection is half-closed (non-readable but still writable). See `'end'` event and [RFC 1122](https://tools.ietf.org/html/rfc1122) (section 4.2.2.13) for more information. + * + * If `pauseOnConnect` is set to `true`, then the socket associated with each + * incoming connection will be paused, and no data will be read from its handle. + * This allows connections to be passed between processes without any data being + * read by the original process. To begin reading data from a paused socket, call `socket.resume()`. + * + * The server can be a TCP server or an `IPC` server, depending on what it `listen()` to. + * + * Here is an example of a TCP echo server which listens for connections + * on port 8124: + * + * ```js + * const net = require('node:net'); + * const server = net.createServer((c) => { + * // 'connection' listener. + * console.log('client connected'); + * c.on('end', () => { + * console.log('client disconnected'); + * }); + * c.write('hello\r\n'); + * c.pipe(c); + * }); + * server.on('error', (err) => { + * throw err; + * }); + * server.listen(8124, () => { + * console.log('server bound'); + * }); + * ``` + * + * Test this by using `telnet`: + * + * ```bash + * telnet localhost 8124 + * ``` + * + * To listen on the socket `/tmp/echo.sock`: + * + * ```js + * server.listen('/tmp/echo.sock', () => { + * console.log('server bound'); + * }); + * ``` + * + * Use `nc` to connect to a Unix domain socket server: + * + * ```bash + * nc -U /tmp/echo.sock + * ``` + * @since v0.5.0 + * @param connectionListener Automatically set as a listener for the {@link 'connection'} event. + */ + function createServer(connectionListener?: (socket: Socket) => void): Server; + function createServer(options?: ServerOpts, connectionListener?: (socket: Socket) => void): Server; + /** + * Aliases to {@link createConnection}. + * + * Possible signatures: + * + * * {@link connect} + * * {@link connect} for `IPC` connections. + * * {@link connect} for TCP connections. + */ + function connect(options: NetConnectOpts, connectionListener?: () => void): Socket; + function connect(port: number, host?: string, connectionListener?: () => void): Socket; + function connect(path: string, connectionListener?: () => void): Socket; + /** + * A factory function, which creates a new {@link Socket}, + * immediately initiates connection with `socket.connect()`, + * then returns the `net.Socket` that starts the connection. + * + * When the connection is established, a `'connect'` event will be emitted + * on the returned socket. The last parameter `connectListener`, if supplied, + * will be added as a listener for the `'connect'` event **once**. + * + * Possible signatures: + * + * * {@link createConnection} + * * {@link createConnection} for `IPC` connections. + * * {@link createConnection} for TCP connections. + * + * The {@link connect} function is an alias to this function. + */ + function createConnection(options: NetConnectOpts, connectionListener?: () => void): Socket; + function createConnection(port: number, host?: string, connectionListener?: () => void): Socket; + function createConnection(path: string, connectionListener?: () => void): Socket; + /** + * Gets the current default value of the `autoSelectFamily` option of `socket.connect(options)`. + * The initial default value is `true`, unless the command line option`--no-network-family-autoselection` is provided. + * @since v19.4.0 + */ + function getDefaultAutoSelectFamily(): boolean; + /** + * Sets the default value of the `autoSelectFamily` option of `socket.connect(options)`. + * @since v19.4.0 + */ + function setDefaultAutoSelectFamily(value: boolean): void; + /** + * Gets the current default value of the `autoSelectFamilyAttemptTimeout` option of `socket.connect(options)`. + * The initial default value is `250`. + * @since v19.8.0 + */ + function getDefaultAutoSelectFamilyAttemptTimeout(): number; + /** + * Sets the default value of the `autoSelectFamilyAttemptTimeout` option of `socket.connect(options)`. + * @since v19.8.0 + */ + function setDefaultAutoSelectFamilyAttemptTimeout(value: number): void; + /** + * Returns `6` if `input` is an IPv6 address. Returns `4` if `input` is an IPv4 + * address in [dot-decimal notation](https://en.wikipedia.org/wiki/Dot-decimal_notation) with no leading zeroes. Otherwise, returns`0`. + * + * ```js + * net.isIP('::1'); // returns 6 + * net.isIP('127.0.0.1'); // returns 4 + * net.isIP('127.000.000.001'); // returns 0 + * net.isIP('127.0.0.1/24'); // returns 0 + * net.isIP('fhqwhgads'); // returns 0 + * ``` + * @since v0.3.0 + */ + function isIP(input: string): number; + /** + * Returns `true` if `input` is an IPv4 address in [dot-decimal notation](https://en.wikipedia.org/wiki/Dot-decimal_notation) with no + * leading zeroes. Otherwise, returns `false`. + * + * ```js + * net.isIPv4('127.0.0.1'); // returns true + * net.isIPv4('127.000.000.001'); // returns false + * net.isIPv4('127.0.0.1/24'); // returns false + * net.isIPv4('fhqwhgads'); // returns false + * ``` + * @since v0.3.0 + */ + function isIPv4(input: string): boolean; + /** + * Returns `true` if `input` is an IPv6 address. Otherwise, returns `false`. + * + * ```js + * net.isIPv6('::1'); // returns true + * net.isIPv6('fhqwhgads'); // returns false + * ``` + * @since v0.3.0 + */ + function isIPv6(input: string): boolean; + interface SocketAddressInitOptions { + /** + * The network address as either an IPv4 or IPv6 string. + * @default 127.0.0.1 + */ + address?: string | undefined; + /** + * @default `'ipv4'` + */ + family?: IPVersion | undefined; + /** + * An IPv6 flow-label used only if `family` is `'ipv6'`. + * @default 0 + */ + flowlabel?: number | undefined; + /** + * An IP port. + * @default 0 + */ + port?: number | undefined; + } + /** + * @since v15.14.0, v14.18.0 + */ + class SocketAddress { + constructor(options: SocketAddressInitOptions); + /** + * Either \`'ipv4'\` or \`'ipv6'\`. + * @since v15.14.0, v14.18.0 + */ + readonly address: string; + /** + * Either \`'ipv4'\` or \`'ipv6'\`. + * @since v15.14.0, v14.18.0 + */ + readonly family: IPVersion; + /** + * @since v15.14.0, v14.18.0 + */ + readonly port: number; + /** + * @since v15.14.0, v14.18.0 + */ + readonly flowlabel: number; + } +} +declare module "node:net" { + export * from "net"; +} diff --git a/task/node_modules/@types/node/os.d.ts b/task/node_modules/@types/node/os.d.ts new file mode 100644 index 0000000..39a33f7 --- /dev/null +++ b/task/node_modules/@types/node/os.d.ts @@ -0,0 +1,478 @@ +/** + * The `node:os` module provides operating system-related utility methods and + * properties. It can be accessed using: + * + * ```js + * const os = require('node:os'); + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/os.js) + */ +declare module "os" { + interface CpuInfo { + model: string; + speed: number; + times: { + user: number; + nice: number; + sys: number; + idle: number; + irq: number; + }; + } + interface NetworkInterfaceBase { + address: string; + netmask: string; + mac: string; + internal: boolean; + cidr: string | null; + } + interface NetworkInterfaceInfoIPv4 extends NetworkInterfaceBase { + family: "IPv4"; + scopeid?: undefined; + } + interface NetworkInterfaceInfoIPv6 extends NetworkInterfaceBase { + family: "IPv6"; + scopeid: number; + } + interface UserInfo { + username: T; + uid: number; + gid: number; + shell: T | null; + homedir: T; + } + type NetworkInterfaceInfo = NetworkInterfaceInfoIPv4 | NetworkInterfaceInfoIPv6; + /** + * Returns the host name of the operating system as a string. + * @since v0.3.3 + */ + function hostname(): string; + /** + * Returns an array containing the 1, 5, and 15 minute load averages. + * + * The load average is a measure of system activity calculated by the operating + * system and expressed as a fractional number. + * + * The load average is a Unix-specific concept. On Windows, the return value is + * always `[0, 0, 0]`. + * @since v0.3.3 + */ + function loadavg(): number[]; + /** + * Returns the system uptime in number of seconds. + * @since v0.3.3 + */ + function uptime(): number; + /** + * Returns the amount of free system memory in bytes as an integer. + * @since v0.3.3 + */ + function freemem(): number; + /** + * Returns the total amount of system memory in bytes as an integer. + * @since v0.3.3 + */ + function totalmem(): number; + /** + * Returns an array of objects containing information about each logical CPU core. + * The array will be empty if no CPU information is available, such as if the`/proc` file system is unavailable. + * + * The properties included on each object include: + * + * ```js + * [ + * { + * model: 'Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz', + * speed: 2926, + * times: { + * user: 252020, + * nice: 0, + * sys: 30340, + * idle: 1070356870, + * irq: 0, + * }, + * }, + * { + * model: 'Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz', + * speed: 2926, + * times: { + * user: 306960, + * nice: 0, + * sys: 26980, + * idle: 1071569080, + * irq: 0, + * }, + * }, + * { + * model: 'Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz', + * speed: 2926, + * times: { + * user: 248450, + * nice: 0, + * sys: 21750, + * idle: 1070919370, + * irq: 0, + * }, + * }, + * { + * model: 'Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz', + * speed: 2926, + * times: { + * user: 256880, + * nice: 0, + * sys: 19430, + * idle: 1070905480, + * irq: 20, + * }, + * }, + * ] + * ``` + * + * `nice` values are POSIX-only. On Windows, the `nice` values of all processors + * are always 0. + * + * `os.cpus().length` should not be used to calculate the amount of parallelism + * available to an application. Use {@link availableParallelism} for this purpose. + * @since v0.3.3 + */ + function cpus(): CpuInfo[]; + /** + * Returns an estimate of the default amount of parallelism a program should use. + * Always returns a value greater than zero. + * + * This function is a small wrapper about libuv's [`uv_available_parallelism()`](https://docs.libuv.org/en/v1.x/misc.html#c.uv_available_parallelism). + * @since v19.4.0, v18.14.0 + */ + function availableParallelism(): number; + /** + * Returns the operating system name as returned by [`uname(3)`](https://linux.die.net/man/3/uname). For example, it + * returns `'Linux'` on Linux, `'Darwin'` on macOS, and `'Windows_NT'` on Windows. + * + * See [https://en.wikipedia.org/wiki/Uname#Examples](https://en.wikipedia.org/wiki/Uname#Examples) for additional information + * about the output of running [`uname(3)`](https://linux.die.net/man/3/uname) on various operating systems. + * @since v0.3.3 + */ + function type(): string; + /** + * Returns the operating system as a string. + * + * On POSIX systems, the operating system release is determined by calling [`uname(3)`](https://linux.die.net/man/3/uname). On Windows, `GetVersionExW()` is used. See + * [https://en.wikipedia.org/wiki/Uname#Examples](https://en.wikipedia.org/wiki/Uname#Examples) for more information. + * @since v0.3.3 + */ + function release(): string; + /** + * Returns an object containing network interfaces that have been assigned a + * network address. + * + * Each key on the returned object identifies a network interface. The associated + * value is an array of objects that each describe an assigned network address. + * + * The properties available on the assigned network address object include: + * + * ```js + * { + * lo: [ + * { + * address: '127.0.0.1', + * netmask: '255.0.0.0', + * family: 'IPv4', + * mac: '00:00:00:00:00:00', + * internal: true, + * cidr: '127.0.0.1/8' + * }, + * { + * address: '::1', + * netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', + * family: 'IPv6', + * mac: '00:00:00:00:00:00', + * scopeid: 0, + * internal: true, + * cidr: '::1/128' + * } + * ], + * eth0: [ + * { + * address: '192.168.1.108', + * netmask: '255.255.255.0', + * family: 'IPv4', + * mac: '01:02:03:0a:0b:0c', + * internal: false, + * cidr: '192.168.1.108/24' + * }, + * { + * address: 'fe80::a00:27ff:fe4e:66a1', + * netmask: 'ffff:ffff:ffff:ffff::', + * family: 'IPv6', + * mac: '01:02:03:0a:0b:0c', + * scopeid: 1, + * internal: false, + * cidr: 'fe80::a00:27ff:fe4e:66a1/64' + * } + * ] + * } + * ``` + * @since v0.6.0 + */ + function networkInterfaces(): NodeJS.Dict; + /** + * Returns the string path of the current user's home directory. + * + * On POSIX, it uses the `$HOME` environment variable if defined. Otherwise it + * uses the [effective UID](https://en.wikipedia.org/wiki/User_identifier#Effective_user_ID) to look up the user's home directory. + * + * On Windows, it uses the `USERPROFILE` environment variable if defined. + * Otherwise it uses the path to the profile directory of the current user. + * @since v2.3.0 + */ + function homedir(): string; + /** + * Returns information about the currently effective user. On POSIX platforms, + * this is typically a subset of the password file. The returned object includes + * the `username`, `uid`, `gid`, `shell`, and `homedir`. On Windows, the `uid` and`gid` fields are `-1`, and `shell` is `null`. + * + * The value of `homedir` returned by `os.userInfo()` is provided by the operating + * system. This differs from the result of `os.homedir()`, which queries + * environment variables for the home directory before falling back to the + * operating system response. + * + * Throws a `SystemError` if a user has no `username` or `homedir`. + * @since v6.0.0 + */ + function userInfo(options: { encoding: "buffer" }): UserInfo; + function userInfo(options?: { encoding: BufferEncoding }): UserInfo; + type SignalConstants = { + [key in NodeJS.Signals]: number; + }; + namespace constants { + const UV_UDP_REUSEADDR: number; + namespace signals {} + const signals: SignalConstants; + namespace errno { + const E2BIG: number; + const EACCES: number; + const EADDRINUSE: number; + const EADDRNOTAVAIL: number; + const EAFNOSUPPORT: number; + const EAGAIN: number; + const EALREADY: number; + const EBADF: number; + const EBADMSG: number; + const EBUSY: number; + const ECANCELED: number; + const ECHILD: number; + const ECONNABORTED: number; + const ECONNREFUSED: number; + const ECONNRESET: number; + const EDEADLK: number; + const EDESTADDRREQ: number; + const EDOM: number; + const EDQUOT: number; + const EEXIST: number; + const EFAULT: number; + const EFBIG: number; + const EHOSTUNREACH: number; + const EIDRM: number; + const EILSEQ: number; + const EINPROGRESS: number; + const EINTR: number; + const EINVAL: number; + const EIO: number; + const EISCONN: number; + const EISDIR: number; + const ELOOP: number; + const EMFILE: number; + const EMLINK: number; + const EMSGSIZE: number; + const EMULTIHOP: number; + const ENAMETOOLONG: number; + const ENETDOWN: number; + const ENETRESET: number; + const ENETUNREACH: number; + const ENFILE: number; + const ENOBUFS: number; + const ENODATA: number; + const ENODEV: number; + const ENOENT: number; + const ENOEXEC: number; + const ENOLCK: number; + const ENOLINK: number; + const ENOMEM: number; + const ENOMSG: number; + const ENOPROTOOPT: number; + const ENOSPC: number; + const ENOSR: number; + const ENOSTR: number; + const ENOSYS: number; + const ENOTCONN: number; + const ENOTDIR: number; + const ENOTEMPTY: number; + const ENOTSOCK: number; + const ENOTSUP: number; + const ENOTTY: number; + const ENXIO: number; + const EOPNOTSUPP: number; + const EOVERFLOW: number; + const EPERM: number; + const EPIPE: number; + const EPROTO: number; + const EPROTONOSUPPORT: number; + const EPROTOTYPE: number; + const ERANGE: number; + const EROFS: number; + const ESPIPE: number; + const ESRCH: number; + const ESTALE: number; + const ETIME: number; + const ETIMEDOUT: number; + const ETXTBSY: number; + const EWOULDBLOCK: number; + const EXDEV: number; + const WSAEINTR: number; + const WSAEBADF: number; + const WSAEACCES: number; + const WSAEFAULT: number; + const WSAEINVAL: number; + const WSAEMFILE: number; + const WSAEWOULDBLOCK: number; + const WSAEINPROGRESS: number; + const WSAEALREADY: number; + const WSAENOTSOCK: number; + const WSAEDESTADDRREQ: number; + const WSAEMSGSIZE: number; + const WSAEPROTOTYPE: number; + const WSAENOPROTOOPT: number; + const WSAEPROTONOSUPPORT: number; + const WSAESOCKTNOSUPPORT: number; + const WSAEOPNOTSUPP: number; + const WSAEPFNOSUPPORT: number; + const WSAEAFNOSUPPORT: number; + const WSAEADDRINUSE: number; + const WSAEADDRNOTAVAIL: number; + const WSAENETDOWN: number; + const WSAENETUNREACH: number; + const WSAENETRESET: number; + const WSAECONNABORTED: number; + const WSAECONNRESET: number; + const WSAENOBUFS: number; + const WSAEISCONN: number; + const WSAENOTCONN: number; + const WSAESHUTDOWN: number; + const WSAETOOMANYREFS: number; + const WSAETIMEDOUT: number; + const WSAECONNREFUSED: number; + const WSAELOOP: number; + const WSAENAMETOOLONG: number; + const WSAEHOSTDOWN: number; + const WSAEHOSTUNREACH: number; + const WSAENOTEMPTY: number; + const WSAEPROCLIM: number; + const WSAEUSERS: number; + const WSAEDQUOT: number; + const WSAESTALE: number; + const WSAEREMOTE: number; + const WSASYSNOTREADY: number; + const WSAVERNOTSUPPORTED: number; + const WSANOTINITIALISED: number; + const WSAEDISCON: number; + const WSAENOMORE: number; + const WSAECANCELLED: number; + const WSAEINVALIDPROCTABLE: number; + const WSAEINVALIDPROVIDER: number; + const WSAEPROVIDERFAILEDINIT: number; + const WSASYSCALLFAILURE: number; + const WSASERVICE_NOT_FOUND: number; + const WSATYPE_NOT_FOUND: number; + const WSA_E_NO_MORE: number; + const WSA_E_CANCELLED: number; + const WSAEREFUSED: number; + } + namespace priority { + const PRIORITY_LOW: number; + const PRIORITY_BELOW_NORMAL: number; + const PRIORITY_NORMAL: number; + const PRIORITY_ABOVE_NORMAL: number; + const PRIORITY_HIGH: number; + const PRIORITY_HIGHEST: number; + } + } + const devNull: string; + const EOL: string; + /** + * Returns the operating system CPU architecture for which the Node.js binary was + * compiled. Possible values are `'arm'`, `'arm64'`, `'ia32'`, `'loong64'`,`'mips'`, `'mipsel'`, `'ppc'`, `'ppc64'`, `'riscv64'`, `'s390'`, `'s390x'`, + * and `'x64'`. + * + * The return value is equivalent to `process.arch`. + * @since v0.5.0 + */ + function arch(): string; + /** + * Returns a string identifying the kernel version. + * + * On POSIX systems, the operating system release is determined by calling [`uname(3)`](https://linux.die.net/man/3/uname). On Windows, `RtlGetVersion()` is used, and if it is not + * available, `GetVersionExW()` will be used. See [https://en.wikipedia.org/wiki/Uname#Examples](https://en.wikipedia.org/wiki/Uname#Examples) for more information. + * @since v13.11.0, v12.17.0 + */ + function version(): string; + /** + * Returns a string identifying the operating system platform for which + * the Node.js binary was compiled. The value is set at compile time. + * Possible values are `'aix'`, `'darwin'`, `'freebsd'`,`'linux'`,`'openbsd'`, `'sunos'`, and `'win32'`. + * + * The return value is equivalent to `process.platform`. + * + * The value `'android'` may also be returned if Node.js is built on the Android + * operating system. [Android support is experimental](https://github.com/nodejs/node/blob/HEAD/BUILDING.md#androidandroid-based-devices-eg-firefox-os). + * @since v0.5.0 + */ + function platform(): NodeJS.Platform; + /** + * Returns the machine type as a string, such as `arm`, `arm64`, `aarch64`,`mips`, `mips64`, `ppc64`, `ppc64le`, `s390`, `s390x`, `i386`, `i686`, `x86_64`. + * + * On POSIX systems, the machine type is determined by calling [`uname(3)`](https://linux.die.net/man/3/uname). On Windows, `RtlGetVersion()` is used, and if it is not + * available, `GetVersionExW()` will be used. See [https://en.wikipedia.org/wiki/Uname#Examples](https://en.wikipedia.org/wiki/Uname#Examples) for more information. + * @since v18.9.0, v16.18.0 + */ + function machine(): string; + /** + * Returns the operating system's default directory for temporary files as a + * string. + * @since v0.9.9 + */ + function tmpdir(): string; + /** + * Returns a string identifying the endianness of the CPU for which the Node.js + * binary was compiled. + * + * Possible values are `'BE'` for big endian and `'LE'` for little endian. + * @since v0.9.4 + */ + function endianness(): "BE" | "LE"; + /** + * Returns the scheduling priority for the process specified by `pid`. If `pid` is + * not provided or is `0`, the priority of the current process is returned. + * @since v10.10.0 + * @param [pid=0] The process ID to retrieve scheduling priority for. + */ + function getPriority(pid?: number): number; + /** + * Attempts to set the scheduling priority for the process specified by `pid`. If`pid` is not provided or is `0`, the process ID of the current process is used. + * + * The `priority` input must be an integer between `-20` (high priority) and `19`(low priority). Due to differences between Unix priority levels and Windows + * priority classes, `priority` is mapped to one of six priority constants in`os.constants.priority`. When retrieving a process priority level, this range + * mapping may cause the return value to be slightly different on Windows. To avoid + * confusion, set `priority` to one of the priority constants. + * + * On Windows, setting priority to `PRIORITY_HIGHEST` requires elevated user + * privileges. Otherwise the set priority will be silently reduced to`PRIORITY_HIGH`. + * @since v10.10.0 + * @param [pid=0] The process ID to set scheduling priority for. + * @param priority The scheduling priority to assign to the process. + */ + function setPriority(priority: number): void; + function setPriority(pid: number, priority: number): void; +} +declare module "node:os" { + export * from "os"; +} diff --git a/task/node_modules/@types/node/package.json b/task/node_modules/@types/node/package.json new file mode 100644 index 0000000..8e61e9f --- /dev/null +++ b/task/node_modules/@types/node/package.json @@ -0,0 +1,230 @@ +{ + "name": "@types/node", + "version": "20.10.3", + "description": "TypeScript definitions for node", + "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node", + "license": "MIT", + "contributors": [ + { + "name": "Microsoft TypeScript", + "githubUsername": "Microsoft", + "url": "https://github.com/Microsoft" + }, + { + "name": "Alberto Schiabel", + "githubUsername": "jkomyno", + "url": "https://github.com/jkomyno" + }, + { + "name": "Alvis HT Tang", + "githubUsername": "alvis", + "url": "https://github.com/alvis" + }, + { + "name": "Andrew Makarov", + "githubUsername": "r3nya", + "url": "https://github.com/r3nya" + }, + { + "name": "Benjamin Toueg", + "githubUsername": "btoueg", + "url": "https://github.com/btoueg" + }, + { + "name": "Chigozirim C.", + "githubUsername": "smac89", + "url": "https://github.com/smac89" + }, + { + "name": "David Junger", + "githubUsername": "touffy", + "url": "https://github.com/touffy" + }, + { + "name": "Deividas Bakanas", + "githubUsername": "DeividasBakanas", + "url": "https://github.com/DeividasBakanas" + }, + { + "name": "Eugene Y. Q. Shen", + "githubUsername": "eyqs", + "url": "https://github.com/eyqs" + }, + { + "name": "Hannes Magnusson", + "githubUsername": "Hannes-Magnusson-CK", + "url": "https://github.com/Hannes-Magnusson-CK" + }, + { + "name": "Huw", + "githubUsername": "hoo29", + "url": "https://github.com/hoo29" + }, + { + "name": "Kelvin Jin", + "githubUsername": "kjin", + "url": "https://github.com/kjin" + }, + { + "name": "Klaus Meinhardt", + "githubUsername": "ajafff", + "url": "https://github.com/ajafff" + }, + { + "name": "Lishude", + "githubUsername": "islishude", + "url": "https://github.com/islishude" + }, + { + "name": "Mariusz Wiktorczyk", + "githubUsername": "mwiktorczyk", + "url": "https://github.com/mwiktorczyk" + }, + { + "name": "Mohsen Azimi", + "githubUsername": "mohsen1", + "url": "https://github.com/mohsen1" + }, + { + "name": "Nicolas Even", + "githubUsername": "n-e", + "url": "https://github.com/n-e" + }, + { + "name": "Nikita Galkin", + "githubUsername": "galkin", + "url": "https://github.com/galkin" + }, + { + "name": "Parambir Singh", + "githubUsername": "parambirs", + "url": "https://github.com/parambirs" + }, + { + "name": "Sebastian Silbermann", + "githubUsername": "eps1lon", + "url": "https://github.com/eps1lon" + }, + { + "name": "Thomas den Hollander", + "githubUsername": "ThomasdenH", + "url": "https://github.com/ThomasdenH" + }, + { + "name": "Wilco Bakker", + "githubUsername": "WilcoBakker", + "url": "https://github.com/WilcoBakker" + }, + { + "name": "wwwy3y3", + "githubUsername": "wwwy3y3", + "url": "https://github.com/wwwy3y3" + }, + { + "name": "Samuel Ainsworth", + "githubUsername": "samuela", + "url": "https://github.com/samuela" + }, + { + "name": "Kyle Uehlein", + "githubUsername": "kuehlein", + "url": "https://github.com/kuehlein" + }, + { + "name": "Thanik Bhongbhibhat", + "githubUsername": "bhongy", + "url": "https://github.com/bhongy" + }, + { + "name": "Marcin Kopacz", + "githubUsername": "chyzwar", + "url": "https://github.com/chyzwar" + }, + { + "name": "Trivikram Kamat", + "githubUsername": "trivikr", + "url": "https://github.com/trivikr" + }, + { + "name": "Junxiao Shi", + "githubUsername": "yoursunny", + "url": "https://github.com/yoursunny" + }, + { + "name": "Ilia Baryshnikov", + "githubUsername": "qwelias", + "url": "https://github.com/qwelias" + }, + { + "name": "ExE Boss", + "githubUsername": "ExE-Boss", + "url": "https://github.com/ExE-Boss" + }, + { + "name": "Piotr Błażejewicz", + "githubUsername": "peterblazejewicz", + "url": "https://github.com/peterblazejewicz" + }, + { + "name": "Anna Henningsen", + "githubUsername": "addaleax", + "url": "https://github.com/addaleax" + }, + { + "name": "Victor Perin", + "githubUsername": "victorperin", + "url": "https://github.com/victorperin" + }, + { + "name": "Yongsheng Zhang", + "githubUsername": "ZYSzys", + "url": "https://github.com/ZYSzys" + }, + { + "name": "NodeJS Contributors", + "githubUsername": "NodeJS", + "url": "https://github.com/NodeJS" + }, + { + "name": "Linus Unnebäck", + "githubUsername": "LinusU", + "url": "https://github.com/LinusU" + }, + { + "name": "wafuwafu13", + "githubUsername": "wafuwafu13", + "url": "https://github.com/wafuwafu13" + }, + { + "name": "Matteo Collina", + "githubUsername": "mcollina", + "url": "https://github.com/mcollina" + }, + { + "name": "Dmitry Semigradsky", + "githubUsername": "Semigradsky", + "url": "https://github.com/Semigradsky" + } + ], + "main": "", + "types": "index.d.ts", + "typesVersions": { + "<=4.8": { + "*": [ + "ts4.8/*" + ] + } + }, + "repository": { + "type": "git", + "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git", + "directory": "types/node" + }, + "scripts": {}, + "dependencies": { + "undici-types": "~5.26.4" + }, + "typesPublisherContentHash": "23bf5e20c3e989ac01a5ead7a9bd16b7752ee61c6293df790619aa6185433385", + "typeScriptVersion": "4.6", + "nonNpm": true +} \ No newline at end of file diff --git a/task/node_modules/@types/node/path.d.ts b/task/node_modules/@types/node/path.d.ts new file mode 100644 index 0000000..6f07681 --- /dev/null +++ b/task/node_modules/@types/node/path.d.ts @@ -0,0 +1,191 @@ +declare module "path/posix" { + import path = require("path"); + export = path; +} +declare module "path/win32" { + import path = require("path"); + export = path; +} +/** + * The `node:path` module provides utilities for working with file and directory + * paths. It can be accessed using: + * + * ```js + * const path = require('node:path'); + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/path.js) + */ +declare module "path" { + namespace path { + /** + * A parsed path object generated by path.parse() or consumed by path.format(). + */ + interface ParsedPath { + /** + * The root of the path such as '/' or 'c:\' + */ + root: string; + /** + * The full directory path such as '/home/user/dir' or 'c:\path\dir' + */ + dir: string; + /** + * The file name including extension (if any) such as 'index.html' + */ + base: string; + /** + * The file extension (if any) such as '.html' + */ + ext: string; + /** + * The file name without extension (if any) such as 'index' + */ + name: string; + } + interface FormatInputPathObject { + /** + * The root of the path such as '/' or 'c:\' + */ + root?: string | undefined; + /** + * The full directory path such as '/home/user/dir' or 'c:\path\dir' + */ + dir?: string | undefined; + /** + * The file name including extension (if any) such as 'index.html' + */ + base?: string | undefined; + /** + * The file extension (if any) such as '.html' + */ + ext?: string | undefined; + /** + * The file name without extension (if any) such as 'index' + */ + name?: string | undefined; + } + interface PlatformPath { + /** + * Normalize a string path, reducing '..' and '.' parts. + * When multiple slashes are found, they're replaced by a single one; when the path contains a trailing slash, it is preserved. On Windows backslashes are used. + * + * @param path string path to normalize. + * @throws {TypeError} if `path` is not a string. + */ + normalize(path: string): string; + /** + * Join all arguments together and normalize the resulting path. + * + * @param paths paths to join. + * @throws {TypeError} if any of the path segments is not a string. + */ + join(...paths: string[]): string; + /** + * The right-most parameter is considered {to}. Other parameters are considered an array of {from}. + * + * Starting from leftmost {from} parameter, resolves {to} to an absolute path. + * + * If {to} isn't already absolute, {from} arguments are prepended in right to left order, + * until an absolute path is found. If after using all {from} paths still no absolute path is found, + * the current working directory is used as well. The resulting path is normalized, + * and trailing slashes are removed unless the path gets resolved to the root directory. + * + * @param paths A sequence of paths or path segments. + * @throws {TypeError} if any of the arguments is not a string. + */ + resolve(...paths: string[]): string; + /** + * Determines whether {path} is an absolute path. An absolute path will always resolve to the same location, regardless of the working directory. + * + * If the given {path} is a zero-length string, `false` will be returned. + * + * @param path path to test. + * @throws {TypeError} if `path` is not a string. + */ + isAbsolute(path: string): boolean; + /** + * Solve the relative path from {from} to {to} based on the current working directory. + * At times we have two absolute paths, and we need to derive the relative path from one to the other. This is actually the reverse transform of path.resolve. + * + * @throws {TypeError} if either `from` or `to` is not a string. + */ + relative(from: string, to: string): string; + /** + * Return the directory name of a path. Similar to the Unix dirname command. + * + * @param path the path to evaluate. + * @throws {TypeError} if `path` is not a string. + */ + dirname(path: string): string; + /** + * Return the last portion of a path. Similar to the Unix basename command. + * Often used to extract the file name from a fully qualified path. + * + * @param path the path to evaluate. + * @param suffix optionally, an extension to remove from the result. + * @throws {TypeError} if `path` is not a string or if `ext` is given and is not a string. + */ + basename(path: string, suffix?: string): string; + /** + * Return the extension of the path, from the last '.' to end of string in the last portion of the path. + * If there is no '.' in the last portion of the path or the first character of it is '.', then it returns an empty string. + * + * @param path the path to evaluate. + * @throws {TypeError} if `path` is not a string. + */ + extname(path: string): string; + /** + * The platform-specific file separator. '\\' or '/'. + */ + readonly sep: "\\" | "/"; + /** + * The platform-specific file delimiter. ';' or ':'. + */ + readonly delimiter: ";" | ":"; + /** + * Returns an object from a path string - the opposite of format(). + * + * @param path path to evaluate. + * @throws {TypeError} if `path` is not a string. + */ + parse(path: string): ParsedPath; + /** + * Returns a path string from an object - the opposite of parse(). + * + * @param pathObject path to evaluate. + */ + format(pathObject: FormatInputPathObject): string; + /** + * On Windows systems only, returns an equivalent namespace-prefixed path for the given path. + * If path is not a string, path will be returned without modifications. + * This method is meaningful only on Windows system. + * On POSIX systems, the method is non-operational and always returns path without modifications. + */ + toNamespacedPath(path: string): string; + /** + * Posix specific pathing. + * Same as parent object on posix. + */ + readonly posix: PlatformPath; + /** + * Windows specific pathing. + * Same as parent object on windows + */ + readonly win32: PlatformPath; + } + } + const path: path.PlatformPath; + export = path; +} +declare module "node:path" { + import path = require("path"); + export = path; +} +declare module "node:path/posix" { + import path = require("path/posix"); + export = path; +} +declare module "node:path/win32" { + import path = require("path/win32"); + export = path; +} diff --git a/task/node_modules/@types/node/perf_hooks.d.ts b/task/node_modules/@types/node/perf_hooks.d.ts new file mode 100644 index 0000000..b369bb6 --- /dev/null +++ b/task/node_modules/@types/node/perf_hooks.d.ts @@ -0,0 +1,639 @@ +/** + * This module provides an implementation of a subset of the W3C [Web Performance APIs](https://w3c.github.io/perf-timing-primer/) as well as additional APIs for + * Node.js-specific performance measurements. + * + * Node.js supports the following [Web Performance APIs](https://w3c.github.io/perf-timing-primer/): + * + * * [High Resolution Time](https://www.w3.org/TR/hr-time-2) + * * [Performance Timeline](https://w3c.github.io/performance-timeline/) + * * [User Timing](https://www.w3.org/TR/user-timing/) + * * [Resource Timing](https://www.w3.org/TR/resource-timing-2/) + * + * ```js + * const { PerformanceObserver, performance } = require('node:perf_hooks'); + * + * const obs = new PerformanceObserver((items) => { + * console.log(items.getEntries()[0].duration); + * performance.clearMarks(); + * }); + * obs.observe({ type: 'measure' }); + * performance.measure('Start to Now'); + * + * performance.mark('A'); + * doSomeLongRunningProcess(() => { + * performance.measure('A to Now', 'A'); + * + * performance.mark('B'); + * performance.measure('A to B', 'A', 'B'); + * }); + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/perf_hooks.js) + */ +declare module "perf_hooks" { + import { AsyncResource } from "node:async_hooks"; + type EntryType = "node" | "mark" | "measure" | "gc" | "function" | "http2" | "http" | "dns" | "net"; + interface NodeGCPerformanceDetail { + /** + * When `performanceEntry.entryType` is equal to 'gc', `the performance.kind` property identifies + * the type of garbage collection operation that occurred. + * See perf_hooks.constants for valid values. + */ + readonly kind?: number | undefined; + /** + * When `performanceEntry.entryType` is equal to 'gc', the `performance.flags` + * property contains additional information about garbage collection operation. + * See perf_hooks.constants for valid values. + */ + readonly flags?: number | undefined; + } + /** + * The constructor of this class is not exposed to users directly. + * @since v8.5.0 + */ + class PerformanceEntry { + protected constructor(); + /** + * The total number of milliseconds elapsed for this entry. This value will not + * be meaningful for all Performance Entry types. + * @since v8.5.0 + */ + readonly duration: number; + /** + * The name of the performance entry. + * @since v8.5.0 + */ + readonly name: string; + /** + * The high resolution millisecond timestamp marking the starting time of the + * Performance Entry. + * @since v8.5.0 + */ + readonly startTime: number; + /** + * The type of the performance entry. It may be one of: + * + * * `'node'` (Node.js only) + * * `'mark'` (available on the Web) + * * `'measure'` (available on the Web) + * * `'gc'` (Node.js only) + * * `'function'` (Node.js only) + * * `'http2'` (Node.js only) + * * `'http'` (Node.js only) + * @since v8.5.0 + */ + readonly entryType: EntryType; + /** + * Additional detail specific to the `entryType`. + * @since v16.0.0 + */ + readonly detail?: NodeGCPerformanceDetail | unknown | undefined; // TODO: Narrow this based on entry type. + toJSON(): any; + } + /** + * Exposes marks created via the `Performance.mark()` method. + * @since v18.2.0, v16.17.0 + */ + class PerformanceMark extends PerformanceEntry { + readonly duration: 0; + readonly entryType: "mark"; + } + /** + * Exposes measures created via the `Performance.measure()` method. + * + * The constructor of this class is not exposed to users directly. + * @since v18.2.0, v16.17.0 + */ + class PerformanceMeasure extends PerformanceEntry { + readonly entryType: "measure"; + } + /** + * _This property is an extension by Node.js. It is not available in Web browsers._ + * + * Provides timing details for Node.js itself. The constructor of this class + * is not exposed to users. + * @since v8.5.0 + */ + class PerformanceNodeTiming extends PerformanceEntry { + /** + * The high resolution millisecond timestamp at which the Node.js process + * completed bootstrapping. If bootstrapping has not yet finished, the property + * has the value of -1. + * @since v8.5.0 + */ + readonly bootstrapComplete: number; + /** + * The high resolution millisecond timestamp at which the Node.js environment was + * initialized. + * @since v8.5.0 + */ + readonly environment: number; + /** + * The high resolution millisecond timestamp of the amount of time the event loop + * has been idle within the event loop's event provider (e.g. `epoll_wait`). This + * does not take CPU usage into consideration. If the event loop has not yet + * started (e.g., in the first tick of the main script), the property has the + * value of 0. + * @since v14.10.0, v12.19.0 + */ + readonly idleTime: number; + /** + * The high resolution millisecond timestamp at which the Node.js event loop + * exited. If the event loop has not yet exited, the property has the value of -1\. + * It can only have a value of not -1 in a handler of the `'exit'` event. + * @since v8.5.0 + */ + readonly loopExit: number; + /** + * The high resolution millisecond timestamp at which the Node.js event loop + * started. If the event loop has not yet started (e.g., in the first tick of the + * main script), the property has the value of -1. + * @since v8.5.0 + */ + readonly loopStart: number; + /** + * The high resolution millisecond timestamp at which the V8 platform was + * initialized. + * @since v8.5.0 + */ + readonly v8Start: number; + } + interface EventLoopUtilization { + idle: number; + active: number; + utilization: number; + } + /** + * @param util1 The result of a previous call to eventLoopUtilization() + * @param util2 The result of a previous call to eventLoopUtilization() prior to util1 + */ + type EventLoopUtilityFunction = ( + util1?: EventLoopUtilization, + util2?: EventLoopUtilization, + ) => EventLoopUtilization; + interface MarkOptions { + /** + * Additional optional detail to include with the mark. + */ + detail?: unknown | undefined; + /** + * An optional timestamp to be used as the mark time. + * @default `performance.now()`. + */ + startTime?: number | undefined; + } + interface MeasureOptions { + /** + * Additional optional detail to include with the mark. + */ + detail?: unknown | undefined; + /** + * Duration between start and end times. + */ + duration?: number | undefined; + /** + * Timestamp to be used as the end time, or a string identifying a previously recorded mark. + */ + end?: number | string | undefined; + /** + * Timestamp to be used as the start time, or a string identifying a previously recorded mark. + */ + start?: number | string | undefined; + } + interface TimerifyOptions { + /** + * A histogram object created using + * `perf_hooks.createHistogram()` that will record runtime durations in + * nanoseconds. + */ + histogram?: RecordableHistogram | undefined; + } + interface Performance { + /** + * If name is not provided, removes all PerformanceMark objects from the Performance Timeline. + * If name is provided, removes only the named mark. + * @param name + */ + clearMarks(name?: string): void; + /** + * If name is not provided, removes all PerformanceMeasure objects from the Performance Timeline. + * If name is provided, removes only the named measure. + * @param name + * @since v16.7.0 + */ + clearMeasures(name?: string): void; + /** + * Returns a list of `PerformanceEntry` objects in chronological order with respect to `performanceEntry.startTime`. + * If you are only interested in performance entries of certain types or that have certain names, see + * `performance.getEntriesByType()` and `performance.getEntriesByName()`. + * @since v16.7.0 + */ + getEntries(): PerformanceEntry[]; + /** + * Returns a list of `PerformanceEntry` objects in chronological order with respect to `performanceEntry.startTime` + * whose `performanceEntry.name` is equal to `name`, and optionally, whose `performanceEntry.entryType` is equal to `type`. + * @param name + * @param type + * @since v16.7.0 + */ + getEntriesByName(name: string, type?: EntryType): PerformanceEntry[]; + /** + * Returns a list of `PerformanceEntry` objects in chronological order with respect to `performanceEntry.startTime` + * whose `performanceEntry.entryType` is equal to `type`. + * @param type + * @since v16.7.0 + */ + getEntriesByType(type: EntryType): PerformanceEntry[]; + /** + * Creates a new PerformanceMark entry in the Performance Timeline. + * A PerformanceMark is a subclass of PerformanceEntry whose performanceEntry.entryType is always 'mark', + * and whose performanceEntry.duration is always 0. + * Performance marks are used to mark specific significant moments in the Performance Timeline. + * @param name + * @return The PerformanceMark entry that was created + */ + mark(name?: string, options?: MarkOptions): PerformanceMark; + /** + * Creates a new PerformanceMeasure entry in the Performance Timeline. + * A PerformanceMeasure is a subclass of PerformanceEntry whose performanceEntry.entryType is always 'measure', + * and whose performanceEntry.duration measures the number of milliseconds elapsed since startMark and endMark. + * + * The startMark argument may identify any existing PerformanceMark in the the Performance Timeline, or may identify + * any of the timestamp properties provided by the PerformanceNodeTiming class. If the named startMark does not exist, + * then startMark is set to timeOrigin by default. + * + * The endMark argument must identify any existing PerformanceMark in the the Performance Timeline or any of the timestamp + * properties provided by the PerformanceNodeTiming class. If the named endMark does not exist, an error will be thrown. + * @param name + * @param startMark + * @param endMark + * @return The PerformanceMeasure entry that was created + */ + measure(name: string, startMark?: string, endMark?: string): PerformanceMeasure; + measure(name: string, options: MeasureOptions): PerformanceMeasure; + /** + * An instance of the PerformanceNodeTiming class that provides performance metrics for specific Node.js operational milestones. + */ + readonly nodeTiming: PerformanceNodeTiming; + /** + * @return the current high resolution millisecond timestamp + */ + now(): number; + /** + * The timeOrigin specifies the high resolution millisecond timestamp from which all performance metric durations are measured. + */ + readonly timeOrigin: number; + /** + * Wraps a function within a new function that measures the running time of the wrapped function. + * A PerformanceObserver must be subscribed to the 'function' event type in order for the timing details to be accessed. + * @param fn + */ + timerify any>(fn: T, options?: TimerifyOptions): T; + /** + * eventLoopUtilization is similar to CPU utilization except that it is calculated using high precision wall-clock time. + * It represents the percentage of time the event loop has spent outside the event loop's event provider (e.g. epoll_wait). + * No other CPU idle time is taken into consideration. + */ + eventLoopUtilization: EventLoopUtilityFunction; + } + interface PerformanceObserverEntryList { + /** + * Returns a list of `PerformanceEntry` objects in chronological order + * with respect to `performanceEntry.startTime`. + * + * ```js + * const { + * performance, + * PerformanceObserver, + * } = require('node:perf_hooks'); + * + * const obs = new PerformanceObserver((perfObserverList, observer) => { + * console.log(perfObserverList.getEntries()); + * + * * [ + * * PerformanceEntry { + * * name: 'test', + * * entryType: 'mark', + * * startTime: 81.465639, + * * duration: 0 + * * }, + * * PerformanceEntry { + * * name: 'meow', + * * entryType: 'mark', + * * startTime: 81.860064, + * * duration: 0 + * * } + * * ] + * + * performance.clearMarks(); + * performance.clearMeasures(); + * observer.disconnect(); + * }); + * obs.observe({ type: 'mark' }); + * + * performance.mark('test'); + * performance.mark('meow'); + * ``` + * @since v8.5.0 + */ + getEntries(): PerformanceEntry[]; + /** + * Returns a list of `PerformanceEntry` objects in chronological order + * with respect to `performanceEntry.startTime` whose `performanceEntry.name` is + * equal to `name`, and optionally, whose `performanceEntry.entryType` is equal to`type`. + * + * ```js + * const { + * performance, + * PerformanceObserver, + * } = require('node:perf_hooks'); + * + * const obs = new PerformanceObserver((perfObserverList, observer) => { + * console.log(perfObserverList.getEntriesByName('meow')); + * + * * [ + * * PerformanceEntry { + * * name: 'meow', + * * entryType: 'mark', + * * startTime: 98.545991, + * * duration: 0 + * * } + * * ] + * + * console.log(perfObserverList.getEntriesByName('nope')); // [] + * + * console.log(perfObserverList.getEntriesByName('test', 'mark')); + * + * * [ + * * PerformanceEntry { + * * name: 'test', + * * entryType: 'mark', + * * startTime: 63.518931, + * * duration: 0 + * * } + * * ] + * + * console.log(perfObserverList.getEntriesByName('test', 'measure')); // [] + * + * performance.clearMarks(); + * performance.clearMeasures(); + * observer.disconnect(); + * }); + * obs.observe({ entryTypes: ['mark', 'measure'] }); + * + * performance.mark('test'); + * performance.mark('meow'); + * ``` + * @since v8.5.0 + */ + getEntriesByName(name: string, type?: EntryType): PerformanceEntry[]; + /** + * Returns a list of `PerformanceEntry` objects in chronological order + * with respect to `performanceEntry.startTime` whose `performanceEntry.entryType`is equal to `type`. + * + * ```js + * const { + * performance, + * PerformanceObserver, + * } = require('node:perf_hooks'); + * + * const obs = new PerformanceObserver((perfObserverList, observer) => { + * console.log(perfObserverList.getEntriesByType('mark')); + * + * * [ + * * PerformanceEntry { + * * name: 'test', + * * entryType: 'mark', + * * startTime: 55.897834, + * * duration: 0 + * * }, + * * PerformanceEntry { + * * name: 'meow', + * * entryType: 'mark', + * * startTime: 56.350146, + * * duration: 0 + * * } + * * ] + * + * performance.clearMarks(); + * performance.clearMeasures(); + * observer.disconnect(); + * }); + * obs.observe({ type: 'mark' }); + * + * performance.mark('test'); + * performance.mark('meow'); + * ``` + * @since v8.5.0 + */ + getEntriesByType(type: EntryType): PerformanceEntry[]; + } + type PerformanceObserverCallback = (list: PerformanceObserverEntryList, observer: PerformanceObserver) => void; + /** + * @since v8.5.0 + */ + class PerformanceObserver extends AsyncResource { + constructor(callback: PerformanceObserverCallback); + /** + * Disconnects the `PerformanceObserver` instance from all notifications. + * @since v8.5.0 + */ + disconnect(): void; + /** + * Subscribes the `PerformanceObserver` instance to notifications of new `PerformanceEntry` instances identified either by `options.entryTypes`or `options.type`: + * + * ```js + * const { + * performance, + * PerformanceObserver, + * } = require('node:perf_hooks'); + * + * const obs = new PerformanceObserver((list, observer) => { + * // Called once asynchronously. `list` contains three items. + * }); + * obs.observe({ type: 'mark' }); + * + * for (let n = 0; n < 3; n++) + * performance.mark(`test${n}`); + * ``` + * @since v8.5.0 + */ + observe( + options: + | { + entryTypes: readonly EntryType[]; + buffered?: boolean | undefined; + } + | { + type: EntryType; + buffered?: boolean | undefined; + }, + ): void; + } + namespace constants { + const NODE_PERFORMANCE_GC_MAJOR: number; + const NODE_PERFORMANCE_GC_MINOR: number; + const NODE_PERFORMANCE_GC_INCREMENTAL: number; + const NODE_PERFORMANCE_GC_WEAKCB: number; + const NODE_PERFORMANCE_GC_FLAGS_NO: number; + const NODE_PERFORMANCE_GC_FLAGS_CONSTRUCT_RETAINED: number; + const NODE_PERFORMANCE_GC_FLAGS_FORCED: number; + const NODE_PERFORMANCE_GC_FLAGS_SYNCHRONOUS_PHANTOM_PROCESSING: number; + const NODE_PERFORMANCE_GC_FLAGS_ALL_AVAILABLE_GARBAGE: number; + const NODE_PERFORMANCE_GC_FLAGS_ALL_EXTERNAL_MEMORY: number; + const NODE_PERFORMANCE_GC_FLAGS_SCHEDULE_IDLE: number; + } + const performance: Performance; + interface EventLoopMonitorOptions { + /** + * The sampling rate in milliseconds. + * Must be greater than zero. + * @default 10 + */ + resolution?: number | undefined; + } + interface Histogram { + /** + * Returns a `Map` object detailing the accumulated percentile distribution. + * @since v11.10.0 + */ + readonly percentiles: Map; + /** + * The number of times the event loop delay exceeded the maximum 1 hour event + * loop delay threshold. + * @since v11.10.0 + */ + readonly exceeds: number; + /** + * The minimum recorded event loop delay. + * @since v11.10.0 + */ + readonly min: number; + /** + * The maximum recorded event loop delay. + * @since v11.10.0 + */ + readonly max: number; + /** + * The mean of the recorded event loop delays. + * @since v11.10.0 + */ + readonly mean: number; + /** + * The standard deviation of the recorded event loop delays. + * @since v11.10.0 + */ + readonly stddev: number; + /** + * Resets the collected histogram data. + * @since v11.10.0 + */ + reset(): void; + /** + * Returns the value at the given percentile. + * @since v11.10.0 + * @param percentile A percentile value in the range (0, 100]. + */ + percentile(percentile: number): number; + } + interface IntervalHistogram extends Histogram { + /** + * Enables the update interval timer. Returns `true` if the timer was + * started, `false` if it was already started. + * @since v11.10.0 + */ + enable(): boolean; + /** + * Disables the update interval timer. Returns `true` if the timer was + * stopped, `false` if it was already stopped. + * @since v11.10.0 + */ + disable(): boolean; + } + interface RecordableHistogram extends Histogram { + /** + * @since v15.9.0, v14.18.0 + * @param val The amount to record in the histogram. + */ + record(val: number | bigint): void; + /** + * Calculates the amount of time (in nanoseconds) that has passed since the + * previous call to `recordDelta()` and records that amount in the histogram. + * + * ## Examples + * @since v15.9.0, v14.18.0 + */ + recordDelta(): void; + /** + * Adds the values from `other` to this histogram. + * @since v17.4.0, v16.14.0 + */ + add(other: RecordableHistogram): void; + } + /** + * _This property is an extension by Node.js. It is not available in Web browsers._ + * + * Creates an `IntervalHistogram` object that samples and reports the event loop + * delay over time. The delays will be reported in nanoseconds. + * + * Using a timer to detect approximate event loop delay works because the + * execution of timers is tied specifically to the lifecycle of the libuv + * event loop. That is, a delay in the loop will cause a delay in the execution + * of the timer, and those delays are specifically what this API is intended to + * detect. + * + * ```js + * const { monitorEventLoopDelay } = require('node:perf_hooks'); + * const h = monitorEventLoopDelay({ resolution: 20 }); + * h.enable(); + * // Do something. + * h.disable(); + * console.log(h.min); + * console.log(h.max); + * console.log(h.mean); + * console.log(h.stddev); + * console.log(h.percentiles); + * console.log(h.percentile(50)); + * console.log(h.percentile(99)); + * ``` + * @since v11.10.0 + */ + function monitorEventLoopDelay(options?: EventLoopMonitorOptions): IntervalHistogram; + interface CreateHistogramOptions { + /** + * The minimum recordable value. Must be an integer value greater than 0. + * @default 1 + */ + min?: number | bigint | undefined; + /** + * The maximum recordable value. Must be an integer value greater than min. + * @default Number.MAX_SAFE_INTEGER + */ + max?: number | bigint | undefined; + /** + * The number of accuracy digits. Must be a number between 1 and 5. + * @default 3 + */ + figures?: number | undefined; + } + /** + * Returns a `RecordableHistogram`. + * @since v15.9.0, v14.18.0 + */ + function createHistogram(options?: CreateHistogramOptions): RecordableHistogram; + import { performance as _performance } from "perf_hooks"; + global { + /** + * `performance` is a global reference for `require('perf_hooks').performance` + * https://nodejs.org/api/globals.html#performance + * @since v16.0.0 + */ + var performance: typeof globalThis extends { + onmessage: any; + performance: infer T; + } ? T + : typeof _performance; + } +} +declare module "node:perf_hooks" { + export * from "perf_hooks"; +} diff --git a/task/node_modules/@types/node/process.d.ts b/task/node_modules/@types/node/process.d.ts new file mode 100644 index 0000000..0e27473 --- /dev/null +++ b/task/node_modules/@types/node/process.d.ts @@ -0,0 +1,1539 @@ +declare module "process" { + import * as tty from "node:tty"; + import { Worker } from "node:worker_threads"; + global { + var process: NodeJS.Process; + namespace NodeJS { + // this namespace merge is here because these are specifically used + // as the type for process.stdin, process.stdout, and process.stderr. + // they can't live in tty.d.ts because we need to disambiguate the imported name. + interface ReadStream extends tty.ReadStream {} + interface WriteStream extends tty.WriteStream {} + interface MemoryUsageFn { + /** + * The `process.memoryUsage()` method iterate over each page to gather informations about memory + * usage which can be slow depending on the program memory allocations. + */ + (): MemoryUsage; + /** + * method returns an integer representing the Resident Set Size (RSS) in bytes. + */ + rss(): number; + } + interface MemoryUsage { + rss: number; + heapTotal: number; + heapUsed: number; + external: number; + arrayBuffers: number; + } + interface CpuUsage { + user: number; + system: number; + } + interface ProcessRelease { + name: string; + sourceUrl?: string | undefined; + headersUrl?: string | undefined; + libUrl?: string | undefined; + lts?: string | undefined; + } + interface ProcessVersions extends Dict { + http_parser: string; + node: string; + v8: string; + ares: string; + uv: string; + zlib: string; + modules: string; + openssl: string; + } + type Platform = + | "aix" + | "android" + | "darwin" + | "freebsd" + | "haiku" + | "linux" + | "openbsd" + | "sunos" + | "win32" + | "cygwin" + | "netbsd"; + type Architecture = + | "arm" + | "arm64" + | "ia32" + | "mips" + | "mipsel" + | "ppc" + | "ppc64" + | "riscv64" + | "s390" + | "s390x" + | "x64"; + type Signals = + | "SIGABRT" + | "SIGALRM" + | "SIGBUS" + | "SIGCHLD" + | "SIGCONT" + | "SIGFPE" + | "SIGHUP" + | "SIGILL" + | "SIGINT" + | "SIGIO" + | "SIGIOT" + | "SIGKILL" + | "SIGPIPE" + | "SIGPOLL" + | "SIGPROF" + | "SIGPWR" + | "SIGQUIT" + | "SIGSEGV" + | "SIGSTKFLT" + | "SIGSTOP" + | "SIGSYS" + | "SIGTERM" + | "SIGTRAP" + | "SIGTSTP" + | "SIGTTIN" + | "SIGTTOU" + | "SIGUNUSED" + | "SIGURG" + | "SIGUSR1" + | "SIGUSR2" + | "SIGVTALRM" + | "SIGWINCH" + | "SIGXCPU" + | "SIGXFSZ" + | "SIGBREAK" + | "SIGLOST" + | "SIGINFO"; + type UncaughtExceptionOrigin = "uncaughtException" | "unhandledRejection"; + type MultipleResolveType = "resolve" | "reject"; + type BeforeExitListener = (code: number) => void; + type DisconnectListener = () => void; + type ExitListener = (code: number) => void; + type RejectionHandledListener = (promise: Promise) => void; + type UncaughtExceptionListener = (error: Error, origin: UncaughtExceptionOrigin) => void; + /** + * Most of the time the unhandledRejection will be an Error, but this should not be relied upon + * as *anything* can be thrown/rejected, it is therefore unsafe to assume that the value is an Error. + */ + type UnhandledRejectionListener = (reason: unknown, promise: Promise) => void; + type WarningListener = (warning: Error) => void; + type MessageListener = (message: unknown, sendHandle: unknown) => void; + type SignalsListener = (signal: Signals) => void; + type MultipleResolveListener = ( + type: MultipleResolveType, + promise: Promise, + value: unknown, + ) => void; + type WorkerListener = (worker: Worker) => void; + interface Socket extends ReadWriteStream { + isTTY?: true | undefined; + } + // Alias for compatibility + interface ProcessEnv extends Dict { + /** + * Can be used to change the default timezone at runtime + */ + TZ?: string; + } + interface HRTime { + (time?: [number, number]): [number, number]; + bigint(): bigint; + } + interface ProcessReport { + /** + * Directory where the report is written. + * working directory of the Node.js process. + * @default '' indicating that reports are written to the current + */ + directory: string; + /** + * Filename where the report is written. + * The default value is the empty string. + * @default '' the output filename will be comprised of a timestamp, + * PID, and sequence number. + */ + filename: string; + /** + * Returns a JSON-formatted diagnostic report for the running process. + * The report's JavaScript stack trace is taken from err, if present. + */ + getReport(err?: Error): string; + /** + * If true, a diagnostic report is generated on fatal errors, + * such as out of memory errors or failed C++ assertions. + * @default false + */ + reportOnFatalError: boolean; + /** + * If true, a diagnostic report is generated when the process + * receives the signal specified by process.report.signal. + * @default false + */ + reportOnSignal: boolean; + /** + * If true, a diagnostic report is generated on uncaught exception. + * @default false + */ + reportOnUncaughtException: boolean; + /** + * The signal used to trigger the creation of a diagnostic report. + * @default 'SIGUSR2' + */ + signal: Signals; + /** + * Writes a diagnostic report to a file. If filename is not provided, the default filename + * includes the date, time, PID, and a sequence number. + * The report's JavaScript stack trace is taken from err, if present. + * + * @param fileName Name of the file where the report is written. + * This should be a relative path, that will be appended to the directory specified in + * `process.report.directory`, or the current working directory of the Node.js process, + * if unspecified. + * @param error A custom error used for reporting the JavaScript stack. + * @return Filename of the generated report. + */ + writeReport(fileName?: string): string; + writeReport(error?: Error): string; + writeReport(fileName?: string, err?: Error): string; + } + interface ResourceUsage { + fsRead: number; + fsWrite: number; + involuntaryContextSwitches: number; + ipcReceived: number; + ipcSent: number; + majorPageFault: number; + maxRSS: number; + minorPageFault: number; + sharedMemorySize: number; + signalsCount: number; + swappedOut: number; + systemCPUTime: number; + unsharedDataSize: number; + unsharedStackSize: number; + userCPUTime: number; + voluntaryContextSwitches: number; + } + interface EmitWarningOptions { + /** + * When `warning` is a `string`, `type` is the name to use for the _type_ of warning being emitted. + * + * @default 'Warning' + */ + type?: string | undefined; + /** + * A unique identifier for the warning instance being emitted. + */ + code?: string | undefined; + /** + * When `warning` is a `string`, `ctor` is an optional function used to limit the generated stack trace. + * + * @default process.emitWarning + */ + ctor?: Function | undefined; + /** + * Additional text to include with the error. + */ + detail?: string | undefined; + } + interface ProcessConfig { + readonly target_defaults: { + readonly cflags: any[]; + readonly default_configuration: string; + readonly defines: string[]; + readonly include_dirs: string[]; + readonly libraries: string[]; + }; + readonly variables: { + readonly clang: number; + readonly host_arch: string; + readonly node_install_npm: boolean; + readonly node_install_waf: boolean; + readonly node_prefix: string; + readonly node_shared_openssl: boolean; + readonly node_shared_v8: boolean; + readonly node_shared_zlib: boolean; + readonly node_use_dtrace: boolean; + readonly node_use_etw: boolean; + readonly node_use_openssl: boolean; + readonly target_arch: string; + readonly v8_no_strict_aliasing: number; + readonly v8_use_snapshot: boolean; + readonly visibility: string; + }; + } + interface Process extends EventEmitter { + /** + * The `process.stdout` property returns a stream connected to`stdout` (fd `1`). It is a `net.Socket` (which is a `Duplex` stream) unless fd `1` refers to a file, in which case it is + * a `Writable` stream. + * + * For example, to copy `process.stdin` to `process.stdout`: + * + * ```js + * import { stdin, stdout } from 'node:process'; + * + * stdin.pipe(stdout); + * ``` + * + * `process.stdout` differs from other Node.js streams in important ways. See `note on process I/O` for more information. + */ + stdout: WriteStream & { + fd: 1; + }; + /** + * The `process.stderr` property returns a stream connected to`stderr` (fd `2`). It is a `net.Socket` (which is a `Duplex` stream) unless fd `2` refers to a file, in which case it is + * a `Writable` stream. + * + * `process.stderr` differs from other Node.js streams in important ways. See `note on process I/O` for more information. + */ + stderr: WriteStream & { + fd: 2; + }; + /** + * The `process.stdin` property returns a stream connected to`stdin` (fd `0`). It is a `net.Socket` (which is a `Duplex` stream) unless fd `0` refers to a file, in which case it is + * a `Readable` stream. + * + * For details of how to read from `stdin` see `readable.read()`. + * + * As a `Duplex` stream, `process.stdin` can also be used in "old" mode that + * is compatible with scripts written for Node.js prior to v0.10\. + * For more information see `Stream compatibility`. + * + * In "old" streams mode the `stdin` stream is paused by default, so one + * must call `process.stdin.resume()` to read from it. Note also that calling`process.stdin.resume()` itself would switch stream to "old" mode. + */ + stdin: ReadStream & { + fd: 0; + }; + openStdin(): Socket; + /** + * The `process.argv` property returns an array containing the command-line + * arguments passed when the Node.js process was launched. The first element will + * be {@link execPath}. See `process.argv0` if access to the original value + * of `argv[0]` is needed. The second element will be the path to the JavaScript + * file being executed. The remaining elements will be any additional command-line + * arguments. + * + * For example, assuming the following script for `process-args.js`: + * + * ```js + * import { argv } from 'node:process'; + * + * // print process.argv + * argv.forEach((val, index) => { + * console.log(`${index}: ${val}`); + * }); + * ``` + * + * Launching the Node.js process as: + * + * ```bash + * node process-args.js one two=three four + * ``` + * + * Would generate the output: + * + * ```text + * 0: /usr/local/bin/node + * 1: /Users/mjr/work/node/process-args.js + * 2: one + * 3: two=three + * 4: four + * ``` + * @since v0.1.27 + */ + argv: string[]; + /** + * The `process.argv0` property stores a read-only copy of the original value of`argv[0]` passed when Node.js starts. + * + * ```console + * $ bash -c 'exec -a customArgv0 ./node' + * > process.argv[0] + * '/Volumes/code/external/node/out/Release/node' + * > process.argv0 + * 'customArgv0' + * ``` + * @since v6.4.0 + */ + argv0: string; + /** + * The `process.execArgv` property returns the set of Node.js-specific command-line + * options passed when the Node.js process was launched. These options do not + * appear in the array returned by the {@link argv} property, and do not + * include the Node.js executable, the name of the script, or any options following + * the script name. These options are useful in order to spawn child processes with + * the same execution environment as the parent. + * + * ```bash + * node --harmony script.js --version + * ``` + * + * Results in `process.execArgv`: + * + * ```js + * ['--harmony'] + * ``` + * + * And `process.argv`: + * + * ```js + * ['/usr/local/bin/node', 'script.js', '--version'] + * ``` + * + * Refer to `Worker constructor` for the detailed behavior of worker + * threads with this property. + * @since v0.7.7 + */ + execArgv: string[]; + /** + * The `process.execPath` property returns the absolute pathname of the executable + * that started the Node.js process. Symbolic links, if any, are resolved. + * + * ```js + * '/usr/local/bin/node' + * ``` + * @since v0.1.100 + */ + execPath: string; + /** + * The `process.abort()` method causes the Node.js process to exit immediately and + * generate a core file. + * + * This feature is not available in `Worker` threads. + * @since v0.7.0 + */ + abort(): never; + /** + * The `process.chdir()` method changes the current working directory of the + * Node.js process or throws an exception if doing so fails (for instance, if + * the specified `directory` does not exist). + * + * ```js + * import { chdir, cwd } from 'node:process'; + * + * console.log(`Starting directory: ${cwd()}`); + * try { + * chdir('/tmp'); + * console.log(`New directory: ${cwd()}`); + * } catch (err) { + * console.error(`chdir: ${err}`); + * } + * ``` + * + * This feature is not available in `Worker` threads. + * @since v0.1.17 + */ + chdir(directory: string): void; + /** + * The `process.cwd()` method returns the current working directory of the Node.js + * process. + * + * ```js + * import { cwd } from 'node:process'; + * + * console.log(`Current directory: ${cwd()}`); + * ``` + * @since v0.1.8 + */ + cwd(): string; + /** + * The port used by the Node.js debugger when enabled. + * + * ```js + * import process from 'node:process'; + * + * process.debugPort = 5858; + * ``` + * @since v0.7.2 + */ + debugPort: number; + /** + * The `process.emitWarning()` method can be used to emit custom or application + * specific process warnings. These can be listened for by adding a handler to the `'warning'` event. + * + * ```js + * import { emitWarning } from 'node:process'; + * + * // Emit a warning with a code and additional detail. + * emitWarning('Something happened!', { + * code: 'MY_WARNING', + * detail: 'This is some additional information', + * }); + * // Emits: + * // (node:56338) [MY_WARNING] Warning: Something happened! + * // This is some additional information + * ``` + * + * In this example, an `Error` object is generated internally by`process.emitWarning()` and passed through to the `'warning'` handler. + * + * ```js + * import process from 'node:process'; + * + * process.on('warning', (warning) => { + * console.warn(warning.name); // 'Warning' + * console.warn(warning.message); // 'Something happened!' + * console.warn(warning.code); // 'MY_WARNING' + * console.warn(warning.stack); // Stack trace + * console.warn(warning.detail); // 'This is some additional information' + * }); + * ``` + * + * If `warning` is passed as an `Error` object, the `options` argument is ignored. + * @since v8.0.0 + * @param warning The warning to emit. + */ + emitWarning(warning: string | Error, ctor?: Function): void; + emitWarning(warning: string | Error, type?: string, ctor?: Function): void; + emitWarning(warning: string | Error, type?: string, code?: string, ctor?: Function): void; + emitWarning(warning: string | Error, options?: EmitWarningOptions): void; + /** + * The `process.env` property returns an object containing the user environment. + * See [`environ(7)`](http://man7.org/linux/man-pages/man7/environ.7.html). + * + * An example of this object looks like: + * + * ```js + * { + * TERM: 'xterm-256color', + * SHELL: '/usr/local/bin/bash', + * USER: 'maciej', + * PATH: '~/.bin/:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin', + * PWD: '/Users/maciej', + * EDITOR: 'vim', + * SHLVL: '1', + * HOME: '/Users/maciej', + * LOGNAME: 'maciej', + * _: '/usr/local/bin/node' + * } + * ``` + * + * It is possible to modify this object, but such modifications will not be + * reflected outside the Node.js process, or (unless explicitly requested) + * to other `Worker` threads. + * In other words, the following example would not work: + * + * ```bash + * node -e 'process.env.foo = "bar"' && echo $foo + * ``` + * + * While the following will: + * + * ```js + * import { env } from 'node:process'; + * + * env.foo = 'bar'; + * console.log(env.foo); + * ``` + * + * Assigning a property on `process.env` will implicitly convert the value + * to a string. **This behavior is deprecated.** Future versions of Node.js may + * throw an error when the value is not a string, number, or boolean. + * + * ```js + * import { env } from 'node:process'; + * + * env.test = null; + * console.log(env.test); + * // => 'null' + * env.test = undefined; + * console.log(env.test); + * // => 'undefined' + * ``` + * + * Use `delete` to delete a property from `process.env`. + * + * ```js + * import { env } from 'node:process'; + * + * env.TEST = 1; + * delete env.TEST; + * console.log(env.TEST); + * // => undefined + * ``` + * + * On Windows operating systems, environment variables are case-insensitive. + * + * ```js + * import { env } from 'node:process'; + * + * env.TEST = 1; + * console.log(env.test); + * // => 1 + * ``` + * + * Unless explicitly specified when creating a `Worker` instance, + * each `Worker` thread has its own copy of `process.env`, based on its + * parent thread's `process.env`, or whatever was specified as the `env` option + * to the `Worker` constructor. Changes to `process.env` will not be visible + * across `Worker` threads, and only the main thread can make changes that + * are visible to the operating system or to native add-ons. On Windows, a copy of`process.env` on a `Worker` instance operates in a case-sensitive manner + * unlike the main thread. + * @since v0.1.27 + */ + env: ProcessEnv; + /** + * The `process.exit()` method instructs Node.js to terminate the process + * synchronously with an exit status of `code`. If `code` is omitted, exit uses + * either the 'success' code `0` or the value of `process.exitCode` if it has been + * set. Node.js will not terminate until all the `'exit'` event listeners are + * called. + * + * To exit with a 'failure' code: + * + * ```js + * import { exit } from 'node:process'; + * + * exit(1); + * ``` + * + * The shell that executed Node.js should see the exit code as `1`. + * + * Calling `process.exit()` will force the process to exit as quickly as possible + * even if there are still asynchronous operations pending that have not yet + * completed fully, including I/O operations to `process.stdout` and`process.stderr`. + * + * In most situations, it is not actually necessary to call `process.exit()`explicitly. The Node.js process will exit on its own _if there is no additional_ + * _work pending_ in the event loop. The `process.exitCode` property can be set to + * tell the process which exit code to use when the process exits gracefully. + * + * For instance, the following example illustrates a _misuse_ of the`process.exit()` method that could lead to data printed to stdout being + * truncated and lost: + * + * ```js + * import { exit } from 'node:process'; + * + * // This is an example of what *not* to do: + * if (someConditionNotMet()) { + * printUsageToStdout(); + * exit(1); + * } + * ``` + * + * The reason this is problematic is because writes to `process.stdout` in Node.js + * are sometimes _asynchronous_ and may occur over multiple ticks of the Node.js + * event loop. Calling `process.exit()`, however, forces the process to exit _before_ those additional writes to `stdout` can be performed. + * + * Rather than calling `process.exit()` directly, the code _should_ set the`process.exitCode` and allow the process to exit naturally by avoiding + * scheduling any additional work for the event loop: + * + * ```js + * import process from 'node:process'; + * + * // How to properly set the exit code while letting + * // the process exit gracefully. + * if (someConditionNotMet()) { + * printUsageToStdout(); + * process.exitCode = 1; + * } + * ``` + * + * If it is necessary to terminate the Node.js process due to an error condition, + * throwing an _uncaught_ error and allowing the process to terminate accordingly + * is safer than calling `process.exit()`. + * + * In `Worker` threads, this function stops the current thread rather + * than the current process. + * @since v0.1.13 + * @param [code=0] The exit code. For string type, only integer strings (e.g.,'1') are allowed. + */ + exit(code?: number): never; + /** + * A number which will be the process exit code, when the process either + * exits gracefully, or is exited via {@link exit} without specifying + * a code. + * + * Specifying a code to {@link exit} will override any + * previous setting of `process.exitCode`. + * @since v0.11.8 + */ + exitCode?: number | undefined; + /** + * The `process.getgid()` method returns the numerical group identity of the + * process. (See [`getgid(2)`](http://man7.org/linux/man-pages/man2/getgid.2.html).) + * + * ```js + * import process from 'process'; + * + * if (process.getgid) { + * console.log(`Current gid: ${process.getgid()}`); + * } + * ``` + * + * This function is only available on POSIX platforms (i.e. not Windows or + * Android). + * @since v0.1.31 + */ + getgid?: () => number; + /** + * The `process.setgid()` method sets the group identity of the process. (See [`setgid(2)`](http://man7.org/linux/man-pages/man2/setgid.2.html).) The `id` can be passed as either a + * numeric ID or a group name + * string. If a group name is specified, this method blocks while resolving the + * associated numeric ID. + * + * ```js + * import process from 'process'; + * + * if (process.getgid && process.setgid) { + * console.log(`Current gid: ${process.getgid()}`); + * try { + * process.setgid(501); + * console.log(`New gid: ${process.getgid()}`); + * } catch (err) { + * console.log(`Failed to set gid: ${err}`); + * } + * } + * ``` + * + * This function is only available on POSIX platforms (i.e. not Windows or + * Android). + * This feature is not available in `Worker` threads. + * @since v0.1.31 + * @param id The group name or ID + */ + setgid?: (id: number | string) => void; + /** + * The `process.getuid()` method returns the numeric user identity of the process. + * (See [`getuid(2)`](http://man7.org/linux/man-pages/man2/getuid.2.html).) + * + * ```js + * import process from 'process'; + * + * if (process.getuid) { + * console.log(`Current uid: ${process.getuid()}`); + * } + * ``` + * + * This function is only available on POSIX platforms (i.e. not Windows or + * Android). + * @since v0.1.28 + */ + getuid?: () => number; + /** + * The `process.setuid(id)` method sets the user identity of the process. (See [`setuid(2)`](http://man7.org/linux/man-pages/man2/setuid.2.html).) The `id` can be passed as either a + * numeric ID or a username string. + * If a username is specified, the method blocks while resolving the associated + * numeric ID. + * + * ```js + * import process from 'process'; + * + * if (process.getuid && process.setuid) { + * console.log(`Current uid: ${process.getuid()}`); + * try { + * process.setuid(501); + * console.log(`New uid: ${process.getuid()}`); + * } catch (err) { + * console.log(`Failed to set uid: ${err}`); + * } + * } + * ``` + * + * This function is only available on POSIX platforms (i.e. not Windows or + * Android). + * This feature is not available in `Worker` threads. + * @since v0.1.28 + */ + setuid?: (id: number | string) => void; + /** + * The `process.geteuid()` method returns the numerical effective user identity of + * the process. (See [`geteuid(2)`](http://man7.org/linux/man-pages/man2/geteuid.2.html).) + * + * ```js + * import process from 'process'; + * + * if (process.geteuid) { + * console.log(`Current uid: ${process.geteuid()}`); + * } + * ``` + * + * This function is only available on POSIX platforms (i.e. not Windows or + * Android). + * @since v2.0.0 + */ + geteuid?: () => number; + /** + * The `process.seteuid()` method sets the effective user identity of the process. + * (See [`seteuid(2)`](http://man7.org/linux/man-pages/man2/seteuid.2.html).) The `id` can be passed as either a numeric ID or a username + * string. If a username is specified, the method blocks while resolving the + * associated numeric ID. + * + * ```js + * import process from 'process'; + * + * if (process.geteuid && process.seteuid) { + * console.log(`Current uid: ${process.geteuid()}`); + * try { + * process.seteuid(501); + * console.log(`New uid: ${process.geteuid()}`); + * } catch (err) { + * console.log(`Failed to set uid: ${err}`); + * } + * } + * ``` + * + * This function is only available on POSIX platforms (i.e. not Windows or + * Android). + * This feature is not available in `Worker` threads. + * @since v2.0.0 + * @param id A user name or ID + */ + seteuid?: (id: number | string) => void; + /** + * The `process.getegid()` method returns the numerical effective group identity + * of the Node.js process. (See [`getegid(2)`](http://man7.org/linux/man-pages/man2/getegid.2.html).) + * + * ```js + * import process from 'process'; + * + * if (process.getegid) { + * console.log(`Current gid: ${process.getegid()}`); + * } + * ``` + * + * This function is only available on POSIX platforms (i.e. not Windows or + * Android). + * @since v2.0.0 + */ + getegid?: () => number; + /** + * The `process.setegid()` method sets the effective group identity of the process. + * (See [`setegid(2)`](http://man7.org/linux/man-pages/man2/setegid.2.html).) The `id` can be passed as either a numeric ID or a group + * name string. If a group name is specified, this method blocks while resolving + * the associated a numeric ID. + * + * ```js + * import process from 'process'; + * + * if (process.getegid && process.setegid) { + * console.log(`Current gid: ${process.getegid()}`); + * try { + * process.setegid(501); + * console.log(`New gid: ${process.getegid()}`); + * } catch (err) { + * console.log(`Failed to set gid: ${err}`); + * } + * } + * ``` + * + * This function is only available on POSIX platforms (i.e. not Windows or + * Android). + * This feature is not available in `Worker` threads. + * @since v2.0.0 + * @param id A group name or ID + */ + setegid?: (id: number | string) => void; + /** + * The `process.getgroups()` method returns an array with the supplementary group + * IDs. POSIX leaves it unspecified if the effective group ID is included but + * Node.js ensures it always is. + * + * ```js + * import process from 'process'; + * + * if (process.getgroups) { + * console.log(process.getgroups()); // [ 16, 21, 297 ] + * } + * ``` + * + * This function is only available on POSIX platforms (i.e. not Windows or + * Android). + * @since v0.9.4 + */ + getgroups?: () => number[]; + /** + * The `process.setgroups()` method sets the supplementary group IDs for the + * Node.js process. This is a privileged operation that requires the Node.js + * process to have `root` or the `CAP_SETGID` capability. + * + * The `groups` array can contain numeric group IDs, group names, or both. + * + * ```js + * import process from 'process'; + * + * if (process.getgroups && process.setgroups) { + * try { + * process.setgroups([501]); + * console.log(process.getgroups()); // new groups + * } catch (err) { + * console.log(`Failed to set groups: ${err}`); + * } + * } + * ``` + * + * This function is only available on POSIX platforms (i.e. not Windows or + * Android). + * This feature is not available in `Worker` threads. + * @since v0.9.4 + */ + setgroups?: (groups: ReadonlyArray) => void; + /** + * The `process.setUncaughtExceptionCaptureCallback()` function sets a function + * that will be invoked when an uncaught exception occurs, which will receive the + * exception value itself as its first argument. + * + * If such a function is set, the `'uncaughtException'` event will + * not be emitted. If `--abort-on-uncaught-exception` was passed from the + * command line or set through `v8.setFlagsFromString()`, the process will + * not abort. Actions configured to take place on exceptions such as report + * generations will be affected too + * + * To unset the capture function,`process.setUncaughtExceptionCaptureCallback(null)` may be used. Calling this + * method with a non-`null` argument while another capture function is set will + * throw an error. + * + * Using this function is mutually exclusive with using the deprecated `domain` built-in module. + * @since v9.3.0 + */ + setUncaughtExceptionCaptureCallback(cb: ((err: Error) => void) | null): void; + /** + * Indicates whether a callback has been set using {@link setUncaughtExceptionCaptureCallback}. + * @since v9.3.0 + */ + hasUncaughtExceptionCaptureCallback(): boolean; + /** + * The `process.sourceMapsEnabled` property returns whether the [Source Map v3](https://sourcemaps.info/spec.html) support for stack traces is enabled. + * @since v20.7.0 + * @experimental + */ + readonly sourceMapsEnabled: boolean; + /** + * This function enables or disables the Source Map v3 support for stack traces. + * It provides same features as launching Node.js process with commandline options --enable-source-maps. + * @since v16.6.0 + * @experimental + */ + setSourceMapsEnabled(value: boolean): void; + /** + * The `process.version` property contains the Node.js version string. + * + * ```js + * import { version } from 'node:process'; + * + * console.log(`Version: ${version}`); + * // Version: v14.8.0 + * ``` + * + * To get the version string without the prepended _v_, use`process.versions.node`. + * @since v0.1.3 + */ + readonly version: string; + /** + * The `process.versions` property returns an object listing the version strings of + * Node.js and its dependencies. `process.versions.modules` indicates the current + * ABI version, which is increased whenever a C++ API changes. Node.js will refuse + * to load modules that were compiled against a different module ABI version. + * + * ```js + * import { versions } from 'node:process'; + * + * console.log(versions); + * ``` + * + * Will generate an object similar to: + * + * ```console + * { node: '20.2.0', + * acorn: '8.8.2', + * ada: '2.4.0', + * ares: '1.19.0', + * base64: '0.5.0', + * brotli: '1.0.9', + * cjs_module_lexer: '1.2.2', + * cldr: '43.0', + * icu: '73.1', + * llhttp: '8.1.0', + * modules: '115', + * napi: '8', + * nghttp2: '1.52.0', + * nghttp3: '0.7.0', + * ngtcp2: '0.8.1', + * openssl: '3.0.8+quic', + * simdutf: '3.2.9', + * tz: '2023c', + * undici: '5.22.0', + * unicode: '15.0', + * uv: '1.44.2', + * uvwasi: '0.0.16', + * v8: '11.3.244.8-node.9', + * zlib: '1.2.13' } + * ``` + * @since v0.2.0 + */ + readonly versions: ProcessVersions; + /** + * The `process.config` property returns a frozen `Object` containing the + * JavaScript representation of the configure options used to compile the current + * Node.js executable. This is the same as the `config.gypi` file that was produced + * when running the `./configure` script. + * + * An example of the possible output looks like: + * + * ```js + * { + * target_defaults: + * { cflags: [], + * default_configuration: 'Release', + * defines: [], + * include_dirs: [], + * libraries: [] }, + * variables: + * { + * host_arch: 'x64', + * napi_build_version: 5, + * node_install_npm: 'true', + * node_prefix: '', + * node_shared_cares: 'false', + * node_shared_http_parser: 'false', + * node_shared_libuv: 'false', + * node_shared_zlib: 'false', + * node_use_openssl: 'true', + * node_shared_openssl: 'false', + * strict_aliasing: 'true', + * target_arch: 'x64', + * v8_use_snapshot: 1 + * } + * } + * ``` + * @since v0.7.7 + */ + readonly config: ProcessConfig; + /** + * The `process.kill()` method sends the `signal` to the process identified by`pid`. + * + * Signal names are strings such as `'SIGINT'` or `'SIGHUP'`. See `Signal Events` and [`kill(2)`](http://man7.org/linux/man-pages/man2/kill.2.html) for more information. + * + * This method will throw an error if the target `pid` does not exist. As a special + * case, a signal of `0` can be used to test for the existence of a process. + * Windows platforms will throw an error if the `pid` is used to kill a process + * group. + * + * Even though the name of this function is `process.kill()`, it is really just a + * signal sender, like the `kill` system call. The signal sent may do something + * other than kill the target process. + * + * ```js + * import process, { kill } from 'node:process'; + * + * process.on('SIGHUP', () => { + * console.log('Got SIGHUP signal.'); + * }); + * + * setTimeout(() => { + * console.log('Exiting.'); + * process.exit(0); + * }, 100); + * + * kill(process.pid, 'SIGHUP'); + * ``` + * + * When `SIGUSR1` is received by a Node.js process, Node.js will start the + * debugger. See `Signal Events`. + * @since v0.0.6 + * @param pid A process ID + * @param [signal='SIGTERM'] The signal to send, either as a string or number. + */ + kill(pid: number, signal?: string | number): true; + /** + * The `process.pid` property returns the PID of the process. + * + * ```js + * import { pid } from 'node:process'; + * + * console.log(`This process is pid ${pid}`); + * ``` + * @since v0.1.15 + */ + readonly pid: number; + /** + * The `process.ppid` property returns the PID of the parent of the + * current process. + * + * ```js + * import { ppid } from 'node:process'; + * + * console.log(`The parent process is pid ${ppid}`); + * ``` + * @since v9.2.0, v8.10.0, v6.13.0 + */ + readonly ppid: number; + /** + * The `process.title` property returns the current process title (i.e. returns + * the current value of `ps`). Assigning a new value to `process.title` modifies + * the current value of `ps`. + * + * When a new value is assigned, different platforms will impose different maximum + * length restrictions on the title. Usually such restrictions are quite limited. + * For instance, on Linux and macOS, `process.title` is limited to the size of the + * binary name plus the length of the command-line arguments because setting the`process.title` overwrites the `argv` memory of the process. Node.js v0.8 + * allowed for longer process title strings by also overwriting the `environ`memory but that was potentially insecure and confusing in some (rather obscure) + * cases. + * + * Assigning a value to `process.title` might not result in an accurate label + * within process manager applications such as macOS Activity Monitor or Windows + * Services Manager. + * @since v0.1.104 + */ + title: string; + /** + * The operating system CPU architecture for which the Node.js binary was compiled. + * Possible values are: `'arm'`, `'arm64'`, `'ia32'`, `'loong64'`, `'mips'`,`'mipsel'`, `'ppc'`, `'ppc64'`, `'riscv64'`, `'s390'`, `'s390x'`, and `'x64'`. + * + * ```js + * import { arch } from 'node:process'; + * + * console.log(`This processor architecture is ${arch}`); + * ``` + * @since v0.5.0 + */ + readonly arch: Architecture; + /** + * The `process.platform` property returns a string identifying the operating + * system platform for which the Node.js binary was compiled. + * + * Currently possible values are: + * + * * `'aix'` + * * `'darwin'` + * * `'freebsd'` + * * `'linux'` + * * `'openbsd'` + * * `'sunos'` + * * `'win32'` + * + * ```js + * import { platform } from 'node:process'; + * + * console.log(`This platform is ${platform}`); + * ``` + * + * The value `'android'` may also be returned if the Node.js is built on the + * Android operating system. However, Android support in Node.js [is experimental](https://github.com/nodejs/node/blob/HEAD/BUILDING.md#androidandroid-based-devices-eg-firefox-os). + * @since v0.1.16 + */ + readonly platform: Platform; + /** + * The `process.mainModule` property provides an alternative way of retrieving `require.main`. The difference is that if the main module changes at + * runtime, `require.main` may still refer to the original main module in + * modules that were required before the change occurred. Generally, it's + * safe to assume that the two refer to the same module. + * + * As with `require.main`, `process.mainModule` will be `undefined` if there + * is no entry script. + * @since v0.1.17 + * @deprecated Since v14.0.0 - Use `main` instead. + */ + mainModule?: Module | undefined; + memoryUsage: MemoryUsageFn; + /** + * Gets the amount of memory available to the process (in bytes) based on + * limits imposed by the OS. If there is no such constraint, or the constraint + * is unknown, `undefined` is returned. + * + * See [`uv_get_constrained_memory`](https://docs.libuv.org/en/v1.x/misc.html#c.uv_get_constrained_memory) for more + * information. + * @since v19.6.0, v18.15.0 + * @experimental + */ + constrainedMemory(): number | undefined; + /** + * The `process.cpuUsage()` method returns the user and system CPU time usage of + * the current process, in an object with properties `user` and `system`, whose + * values are microsecond values (millionth of a second). These values measure time + * spent in user and system code respectively, and may end up being greater than + * actual elapsed time if multiple CPU cores are performing work for this process. + * + * The result of a previous call to `process.cpuUsage()` can be passed as the + * argument to the function, to get a diff reading. + * + * ```js + * import { cpuUsage } from 'node:process'; + * + * const startUsage = cpuUsage(); + * // { user: 38579, system: 6986 } + * + * // spin the CPU for 500 milliseconds + * const now = Date.now(); + * while (Date.now() - now < 500); + * + * console.log(cpuUsage(startUsage)); + * // { user: 514883, system: 11226 } + * ``` + * @since v6.1.0 + * @param previousValue A previous return value from calling `process.cpuUsage()` + */ + cpuUsage(previousValue?: CpuUsage): CpuUsage; + /** + * `process.nextTick()` adds `callback` to the "next tick queue". This queue is + * fully drained after the current operation on the JavaScript stack runs to + * completion and before the event loop is allowed to continue. It's possible to + * create an infinite loop if one were to recursively call `process.nextTick()`. + * See the [Event Loop](https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/#process-nexttick) guide for more background. + * + * ```js + * import { nextTick } from 'node:process'; + * + * console.log('start'); + * nextTick(() => { + * console.log('nextTick callback'); + * }); + * console.log('scheduled'); + * // Output: + * // start + * // scheduled + * // nextTick callback + * ``` + * + * This is important when developing APIs in order to give users the opportunity + * to assign event handlers _after_ an object has been constructed but before any + * I/O has occurred: + * + * ```js + * import { nextTick } from 'node:process'; + * + * function MyThing(options) { + * this.setupOptions(options); + * + * nextTick(() => { + * this.startDoingStuff(); + * }); + * } + * + * const thing = new MyThing(); + * thing.getReadyForStuff(); + * + * // thing.startDoingStuff() gets called now, not before. + * ``` + * + * It is very important for APIs to be either 100% synchronous or 100% + * asynchronous. Consider this example: + * + * ```js + * // WARNING! DO NOT USE! BAD UNSAFE HAZARD! + * function maybeSync(arg, cb) { + * if (arg) { + * cb(); + * return; + * } + * + * fs.stat('file', cb); + * } + * ``` + * + * This API is hazardous because in the following case: + * + * ```js + * const maybeTrue = Math.random() > 0.5; + * + * maybeSync(maybeTrue, () => { + * foo(); + * }); + * + * bar(); + * ``` + * + * It is not clear whether `foo()` or `bar()` will be called first. + * + * The following approach is much better: + * + * ```js + * import { nextTick } from 'node:process'; + * + * function definitelyAsync(arg, cb) { + * if (arg) { + * nextTick(cb); + * return; + * } + * + * fs.stat('file', cb); + * } + * ``` + * @since v0.1.26 + * @param args Additional arguments to pass when invoking the `callback` + */ + nextTick(callback: Function, ...args: any[]): void; + /** + * The `process.release` property returns an `Object` containing metadata related + * to the current release, including URLs for the source tarball and headers-only + * tarball. + * + * `process.release` contains the following properties: + * + * ```js + * { + * name: 'node', + * lts: 'Hydrogen', + * sourceUrl: 'https://nodejs.org/download/release/v18.12.0/node-v18.12.0.tar.gz', + * headersUrl: 'https://nodejs.org/download/release/v18.12.0/node-v18.12.0-headers.tar.gz', + * libUrl: 'https://nodejs.org/download/release/v18.12.0/win-x64/node.lib' + * } + * ``` + * + * In custom builds from non-release versions of the source tree, only the`name` property may be present. The additional properties should not be + * relied upon to exist. + * @since v3.0.0 + */ + readonly release: ProcessRelease; + features: { + inspector: boolean; + debug: boolean; + uv: boolean; + ipv6: boolean; + tls_alpn: boolean; + tls_sni: boolean; + tls_ocsp: boolean; + tls: boolean; + }; + /** + * `process.umask()` returns the Node.js process's file mode creation mask. Child + * processes inherit the mask from the parent process. + * @since v0.1.19 + * @deprecated Calling `process.umask()` with no argument causes the process-wide umask to be written twice. This introduces a race condition between threads, and is a potential * + * security vulnerability. There is no safe, cross-platform alternative API. + */ + umask(): number; + /** + * Can only be set if not in worker thread. + */ + umask(mask: string | number): number; + /** + * The `process.uptime()` method returns the number of seconds the current Node.js + * process has been running. + * + * The return value includes fractions of a second. Use `Math.floor()` to get whole + * seconds. + * @since v0.5.0 + */ + uptime(): number; + hrtime: HRTime; + /** + * If Node.js is spawned with an IPC channel, the `process.send()` method can be + * used to send messages to the parent process. Messages will be received as a `'message'` event on the parent's `ChildProcess` object. + * + * If Node.js was not spawned with an IPC channel, `process.send` will be `undefined`. + * + * The message goes through serialization and parsing. The resulting message might + * not be the same as what is originally sent. + * @since v0.5.9 + * @param options used to parameterize the sending of certain types of handles.`options` supports the following properties: + */ + send?( + message: any, + sendHandle?: any, + options?: { + swallowErrors?: boolean | undefined; + }, + callback?: (error: Error | null) => void, + ): boolean; + /** + * If the Node.js process is spawned with an IPC channel (see the `Child Process` and `Cluster` documentation), the `process.disconnect()` method will close the + * IPC channel to the parent process, allowing the child process to exit gracefully + * once there are no other connections keeping it alive. + * + * The effect of calling `process.disconnect()` is the same as calling `ChildProcess.disconnect()` from the parent process. + * + * If the Node.js process was not spawned with an IPC channel,`process.disconnect()` will be `undefined`. + * @since v0.7.2 + */ + disconnect(): void; + /** + * If the Node.js process is spawned with an IPC channel (see the `Child Process` and `Cluster` documentation), the `process.connected` property will return`true` so long as the IPC + * channel is connected and will return `false` after`process.disconnect()` is called. + * + * Once `process.connected` is `false`, it is no longer possible to send messages + * over the IPC channel using `process.send()`. + * @since v0.7.2 + */ + connected: boolean; + /** + * The `process.allowedNodeEnvironmentFlags` property is a special, + * read-only `Set` of flags allowable within the `NODE_OPTIONS` environment variable. + * + * `process.allowedNodeEnvironmentFlags` extends `Set`, but overrides`Set.prototype.has` to recognize several different possible flag + * representations. `process.allowedNodeEnvironmentFlags.has()` will + * return `true` in the following cases: + * + * * Flags may omit leading single (`-`) or double (`--`) dashes; e.g.,`inspect-brk` for `--inspect-brk`, or `r` for `-r`. + * * Flags passed through to V8 (as listed in `--v8-options`) may replace + * one or more _non-leading_ dashes for an underscore, or vice-versa; + * e.g., `--perf_basic_prof`, `--perf-basic-prof`, `--perf_basic-prof`, + * etc. + * * Flags may contain one or more equals (`=`) characters; all + * characters after and including the first equals will be ignored; + * e.g., `--stack-trace-limit=100`. + * * Flags _must_ be allowable within `NODE_OPTIONS`. + * + * When iterating over `process.allowedNodeEnvironmentFlags`, flags will + * appear only _once_; each will begin with one or more dashes. Flags + * passed through to V8 will contain underscores instead of non-leading + * dashes: + * + * ```js + * import { allowedNodeEnvironmentFlags } from 'node:process'; + * + * allowedNodeEnvironmentFlags.forEach((flag) => { + * // -r + * // --inspect-brk + * // --abort_on_uncaught_exception + * // ... + * }); + * ``` + * + * The methods `add()`, `clear()`, and `delete()` of`process.allowedNodeEnvironmentFlags` do nothing, and will fail + * silently. + * + * If Node.js was compiled _without_ `NODE_OPTIONS` support (shown in {@link config}), `process.allowedNodeEnvironmentFlags` will + * contain what _would have_ been allowable. + * @since v10.10.0 + */ + allowedNodeEnvironmentFlags: ReadonlySet; + /** + * `process.report` is an object whose methods are used to generate diagnostic + * reports for the current process. Additional documentation is available in the `report documentation`. + * @since v11.8.0 + */ + report?: ProcessReport | undefined; + /** + * ```js + * import { resourceUsage } from 'node:process'; + * + * console.log(resourceUsage()); + * /* + * Will output: + * { + * userCPUTime: 82872, + * systemCPUTime: 4143, + * maxRSS: 33164, + * sharedMemorySize: 0, + * unsharedDataSize: 0, + * unsharedStackSize: 0, + * minorPageFault: 2469, + * majorPageFault: 0, + * swappedOut: 0, + * fsRead: 0, + * fsWrite: 8, + * ipcSent: 0, + * ipcReceived: 0, + * signalsCount: 0, + * voluntaryContextSwitches: 79, + * involuntaryContextSwitches: 1 + * } + * + * ``` + * @since v12.6.0 + * @return the resource usage for the current process. All of these values come from the `uv_getrusage` call which returns a [`uv_rusage_t` struct][uv_rusage_t]. + */ + resourceUsage(): ResourceUsage; + /** + * The `process.traceDeprecation` property indicates whether the`--trace-deprecation` flag is set on the current Node.js process. See the + * documentation for the `'warning' event` and the `emitWarning() method` for more information about this + * flag's behavior. + * @since v0.8.0 + */ + traceDeprecation: boolean; + /* EventEmitter */ + addListener(event: "beforeExit", listener: BeforeExitListener): this; + addListener(event: "disconnect", listener: DisconnectListener): this; + addListener(event: "exit", listener: ExitListener): this; + addListener(event: "rejectionHandled", listener: RejectionHandledListener): this; + addListener(event: "uncaughtException", listener: UncaughtExceptionListener): this; + addListener(event: "uncaughtExceptionMonitor", listener: UncaughtExceptionListener): this; + addListener(event: "unhandledRejection", listener: UnhandledRejectionListener): this; + addListener(event: "warning", listener: WarningListener): this; + addListener(event: "message", listener: MessageListener): this; + addListener(event: Signals, listener: SignalsListener): this; + addListener(event: "multipleResolves", listener: MultipleResolveListener): this; + addListener(event: "worker", listener: WorkerListener): this; + emit(event: "beforeExit", code: number): boolean; + emit(event: "disconnect"): boolean; + emit(event: "exit", code: number): boolean; + emit(event: "rejectionHandled", promise: Promise): boolean; + emit(event: "uncaughtException", error: Error): boolean; + emit(event: "uncaughtExceptionMonitor", error: Error): boolean; + emit(event: "unhandledRejection", reason: unknown, promise: Promise): boolean; + emit(event: "warning", warning: Error): boolean; + emit(event: "message", message: unknown, sendHandle: unknown): this; + emit(event: Signals, signal?: Signals): boolean; + emit( + event: "multipleResolves", + type: MultipleResolveType, + promise: Promise, + value: unknown, + ): this; + emit(event: "worker", listener: WorkerListener): this; + on(event: "beforeExit", listener: BeforeExitListener): this; + on(event: "disconnect", listener: DisconnectListener): this; + on(event: "exit", listener: ExitListener): this; + on(event: "rejectionHandled", listener: RejectionHandledListener): this; + on(event: "uncaughtException", listener: UncaughtExceptionListener): this; + on(event: "uncaughtExceptionMonitor", listener: UncaughtExceptionListener): this; + on(event: "unhandledRejection", listener: UnhandledRejectionListener): this; + on(event: "warning", listener: WarningListener): this; + on(event: "message", listener: MessageListener): this; + on(event: Signals, listener: SignalsListener): this; + on(event: "multipleResolves", listener: MultipleResolveListener): this; + on(event: "worker", listener: WorkerListener): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: "beforeExit", listener: BeforeExitListener): this; + once(event: "disconnect", listener: DisconnectListener): this; + once(event: "exit", listener: ExitListener): this; + once(event: "rejectionHandled", listener: RejectionHandledListener): this; + once(event: "uncaughtException", listener: UncaughtExceptionListener): this; + once(event: "uncaughtExceptionMonitor", listener: UncaughtExceptionListener): this; + once(event: "unhandledRejection", listener: UnhandledRejectionListener): this; + once(event: "warning", listener: WarningListener): this; + once(event: "message", listener: MessageListener): this; + once(event: Signals, listener: SignalsListener): this; + once(event: "multipleResolves", listener: MultipleResolveListener): this; + once(event: "worker", listener: WorkerListener): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener(event: "beforeExit", listener: BeforeExitListener): this; + prependListener(event: "disconnect", listener: DisconnectListener): this; + prependListener(event: "exit", listener: ExitListener): this; + prependListener(event: "rejectionHandled", listener: RejectionHandledListener): this; + prependListener(event: "uncaughtException", listener: UncaughtExceptionListener): this; + prependListener(event: "uncaughtExceptionMonitor", listener: UncaughtExceptionListener): this; + prependListener(event: "unhandledRejection", listener: UnhandledRejectionListener): this; + prependListener(event: "warning", listener: WarningListener): this; + prependListener(event: "message", listener: MessageListener): this; + prependListener(event: Signals, listener: SignalsListener): this; + prependListener(event: "multipleResolves", listener: MultipleResolveListener): this; + prependListener(event: "worker", listener: WorkerListener): this; + prependOnceListener(event: "beforeExit", listener: BeforeExitListener): this; + prependOnceListener(event: "disconnect", listener: DisconnectListener): this; + prependOnceListener(event: "exit", listener: ExitListener): this; + prependOnceListener(event: "rejectionHandled", listener: RejectionHandledListener): this; + prependOnceListener(event: "uncaughtException", listener: UncaughtExceptionListener): this; + prependOnceListener(event: "uncaughtExceptionMonitor", listener: UncaughtExceptionListener): this; + prependOnceListener(event: "unhandledRejection", listener: UnhandledRejectionListener): this; + prependOnceListener(event: "warning", listener: WarningListener): this; + prependOnceListener(event: "message", listener: MessageListener): this; + prependOnceListener(event: Signals, listener: SignalsListener): this; + prependOnceListener(event: "multipleResolves", listener: MultipleResolveListener): this; + prependOnceListener(event: "worker", listener: WorkerListener): this; + listeners(event: "beforeExit"): BeforeExitListener[]; + listeners(event: "disconnect"): DisconnectListener[]; + listeners(event: "exit"): ExitListener[]; + listeners(event: "rejectionHandled"): RejectionHandledListener[]; + listeners(event: "uncaughtException"): UncaughtExceptionListener[]; + listeners(event: "uncaughtExceptionMonitor"): UncaughtExceptionListener[]; + listeners(event: "unhandledRejection"): UnhandledRejectionListener[]; + listeners(event: "warning"): WarningListener[]; + listeners(event: "message"): MessageListener[]; + listeners(event: Signals): SignalsListener[]; + listeners(event: "multipleResolves"): MultipleResolveListener[]; + listeners(event: "worker"): WorkerListener[]; + } + } + } + export = process; +} +declare module "node:process" { + import process = require("process"); + export = process; +} diff --git a/task/node_modules/@types/node/punycode.d.ts b/task/node_modules/@types/node/punycode.d.ts new file mode 100644 index 0000000..d2fc9f9 --- /dev/null +++ b/task/node_modules/@types/node/punycode.d.ts @@ -0,0 +1,117 @@ +/** + * **The version of the punycode module bundled in Node.js is being deprecated.**In a future major version of Node.js this module will be removed. Users + * currently depending on the `punycode` module should switch to using the + * userland-provided [Punycode.js](https://github.com/bestiejs/punycode.js) module instead. For punycode-based URL + * encoding, see `url.domainToASCII` or, more generally, the `WHATWG URL API`. + * + * The `punycode` module is a bundled version of the [Punycode.js](https://github.com/bestiejs/punycode.js) module. It + * can be accessed using: + * + * ```js + * const punycode = require('punycode'); + * ``` + * + * [Punycode](https://tools.ietf.org/html/rfc3492) is a character encoding scheme defined by RFC 3492 that is + * primarily intended for use in Internationalized Domain Names. Because host + * names in URLs are limited to ASCII characters only, Domain Names that contain + * non-ASCII characters must be converted into ASCII using the Punycode scheme. + * For instance, the Japanese character that translates into the English word,`'example'` is `'例'`. The Internationalized Domain Name, `'例.com'` (equivalent + * to `'example.com'`) is represented by Punycode as the ASCII string`'xn--fsq.com'`. + * + * The `punycode` module provides a simple implementation of the Punycode standard. + * + * The `punycode` module is a third-party dependency used by Node.js and + * made available to developers as a convenience. Fixes or other modifications to + * the module must be directed to the [Punycode.js](https://github.com/bestiejs/punycode.js) project. + * @deprecated Since v7.0.0 - Deprecated + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/punycode.js) + */ +declare module "punycode" { + /** + * The `punycode.decode()` method converts a [Punycode](https://tools.ietf.org/html/rfc3492) string of ASCII-only + * characters to the equivalent string of Unicode codepoints. + * + * ```js + * punycode.decode('maana-pta'); // 'mañana' + * punycode.decode('--dqo34k'); // '☃-⌘' + * ``` + * @since v0.5.1 + */ + function decode(string: string): string; + /** + * The `punycode.encode()` method converts a string of Unicode codepoints to a [Punycode](https://tools.ietf.org/html/rfc3492) string of ASCII-only characters. + * + * ```js + * punycode.encode('mañana'); // 'maana-pta' + * punycode.encode('☃-⌘'); // '--dqo34k' + * ``` + * @since v0.5.1 + */ + function encode(string: string): string; + /** + * The `punycode.toUnicode()` method converts a string representing a domain name + * containing [Punycode](https://tools.ietf.org/html/rfc3492) encoded characters into Unicode. Only the [Punycode](https://tools.ietf.org/html/rfc3492) encoded parts of the domain name are be + * converted. + * + * ```js + * // decode domain names + * punycode.toUnicode('xn--maana-pta.com'); // 'mañana.com' + * punycode.toUnicode('xn----dqo34k.com'); // '☃-⌘.com' + * punycode.toUnicode('example.com'); // 'example.com' + * ``` + * @since v0.6.1 + */ + function toUnicode(domain: string): string; + /** + * The `punycode.toASCII()` method converts a Unicode string representing an + * Internationalized Domain Name to [Punycode](https://tools.ietf.org/html/rfc3492). Only the non-ASCII parts of the + * domain name will be converted. Calling `punycode.toASCII()` on a string that + * already only contains ASCII characters will have no effect. + * + * ```js + * // encode domain names + * punycode.toASCII('mañana.com'); // 'xn--maana-pta.com' + * punycode.toASCII('☃-⌘.com'); // 'xn----dqo34k.com' + * punycode.toASCII('example.com'); // 'example.com' + * ``` + * @since v0.6.1 + */ + function toASCII(domain: string): string; + /** + * @deprecated since v7.0.0 + * The version of the punycode module bundled in Node.js is being deprecated. + * In a future major version of Node.js this module will be removed. + * Users currently depending on the punycode module should switch to using + * the userland-provided Punycode.js module instead. + */ + const ucs2: ucs2; + interface ucs2 { + /** + * @deprecated since v7.0.0 + * The version of the punycode module bundled in Node.js is being deprecated. + * In a future major version of Node.js this module will be removed. + * Users currently depending on the punycode module should switch to using + * the userland-provided Punycode.js module instead. + */ + decode(string: string): number[]; + /** + * @deprecated since v7.0.0 + * The version of the punycode module bundled in Node.js is being deprecated. + * In a future major version of Node.js this module will be removed. + * Users currently depending on the punycode module should switch to using + * the userland-provided Punycode.js module instead. + */ + encode(codePoints: readonly number[]): string; + } + /** + * @deprecated since v7.0.0 + * The version of the punycode module bundled in Node.js is being deprecated. + * In a future major version of Node.js this module will be removed. + * Users currently depending on the punycode module should switch to using + * the userland-provided Punycode.js module instead. + */ + const version: string; +} +declare module "node:punycode" { + export * from "punycode"; +} diff --git a/task/node_modules/@types/node/querystring.d.ts b/task/node_modules/@types/node/querystring.d.ts new file mode 100644 index 0000000..54ecc96 --- /dev/null +++ b/task/node_modules/@types/node/querystring.d.ts @@ -0,0 +1,141 @@ +/** + * The `node:querystring` module provides utilities for parsing and formatting URL + * query strings. It can be accessed using: + * + * ```js + * const querystring = require('node:querystring'); + * ``` + * + * `querystring` is more performant than `URLSearchParams` but is not a + * standardized API. Use `URLSearchParams` when performance is not critical or + * when compatibility with browser code is desirable. + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/querystring.js) + */ +declare module "querystring" { + interface StringifyOptions { + encodeURIComponent?: ((str: string) => string) | undefined; + } + interface ParseOptions { + maxKeys?: number | undefined; + decodeURIComponent?: ((str: string) => string) | undefined; + } + interface ParsedUrlQuery extends NodeJS.Dict {} + interface ParsedUrlQueryInput extends + NodeJS.Dict< + | string + | number + | boolean + | readonly string[] + | readonly number[] + | readonly boolean[] + | null + > + {} + /** + * The `querystring.stringify()` method produces a URL query string from a + * given `obj` by iterating through the object's "own properties". + * + * It serializes the following types of values passed in `obj`:[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) | + * [number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) | + * [bigint](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt) | + * [boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) | + * [string\[\]](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) | + * [number\[\]](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) | + * [bigint\[\]](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt) | + * [boolean\[\]](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) The numeric values must be finite. Any other input values will be coerced to + * empty strings. + * + * ```js + * querystring.stringify({ foo: 'bar', baz: ['qux', 'quux'], corge: '' }); + * // Returns 'foo=bar&baz=qux&baz=quux&corge=' + * + * querystring.stringify({ foo: 'bar', baz: 'qux' }, ';', ':'); + * // Returns 'foo:bar;baz:qux' + * ``` + * + * By default, characters requiring percent-encoding within the query string will + * be encoded as UTF-8\. If an alternative encoding is required, then an alternative`encodeURIComponent` option will need to be specified: + * + * ```js + * // Assuming gbkEncodeURIComponent function already exists, + * + * querystring.stringify({ w: '中文', foo: 'bar' }, null, null, + * { encodeURIComponent: gbkEncodeURIComponent }); + * ``` + * @since v0.1.25 + * @param obj The object to serialize into a URL query string + * @param [sep='&'] The substring used to delimit key and value pairs in the query string. + * @param [eq='='] . The substring used to delimit keys and values in the query string. + */ + function stringify(obj?: ParsedUrlQueryInput, sep?: string, eq?: string, options?: StringifyOptions): string; + /** + * The `querystring.parse()` method parses a URL query string (`str`) into a + * collection of key and value pairs. + * + * For example, the query string `'foo=bar&abc=xyz&abc=123'` is parsed into: + * + * ```js + * { + * foo: 'bar', + * abc: ['xyz', '123'] + * } + * ``` + * + * The object returned by the `querystring.parse()` method _does not_prototypically inherit from the JavaScript `Object`. This means that typical`Object` methods such as `obj.toString()`, + * `obj.hasOwnProperty()`, and others + * are not defined and _will not work_. + * + * By default, percent-encoded characters within the query string will be assumed + * to use UTF-8 encoding. If an alternative character encoding is used, then an + * alternative `decodeURIComponent` option will need to be specified: + * + * ```js + * // Assuming gbkDecodeURIComponent function already exists... + * + * querystring.parse('w=%D6%D0%CE%C4&foo=bar', null, null, + * { decodeURIComponent: gbkDecodeURIComponent }); + * ``` + * @since v0.1.25 + * @param str The URL query string to parse + * @param [sep='&'] The substring used to delimit key and value pairs in the query string. + * @param [eq='='] . The substring used to delimit keys and values in the query string. + */ + function parse(str: string, sep?: string, eq?: string, options?: ParseOptions): ParsedUrlQuery; + /** + * The querystring.encode() function is an alias for querystring.stringify(). + */ + const encode: typeof stringify; + /** + * The querystring.decode() function is an alias for querystring.parse(). + */ + const decode: typeof parse; + /** + * The `querystring.escape()` method performs URL percent-encoding on the given`str` in a manner that is optimized for the specific requirements of URL + * query strings. + * + * The `querystring.escape()` method is used by `querystring.stringify()` and is + * generally not expected to be used directly. It is exported primarily to allow + * application code to provide a replacement percent-encoding implementation if + * necessary by assigning `querystring.escape` to an alternative function. + * @since v0.1.25 + */ + function escape(str: string): string; + /** + * The `querystring.unescape()` method performs decoding of URL percent-encoded + * characters on the given `str`. + * + * The `querystring.unescape()` method is used by `querystring.parse()` and is + * generally not expected to be used directly. It is exported primarily to allow + * application code to provide a replacement decoding implementation if + * necessary by assigning `querystring.unescape` to an alternative function. + * + * By default, the `querystring.unescape()` method will attempt to use the + * JavaScript built-in `decodeURIComponent()` method to decode. If that fails, + * a safer equivalent that does not throw on malformed URLs will be used. + * @since v0.1.25 + */ + function unescape(str: string): string; +} +declare module "node:querystring" { + export * from "querystring"; +} diff --git a/task/node_modules/@types/node/readline.d.ts b/task/node_modules/@types/node/readline.d.ts new file mode 100644 index 0000000..b06d58b --- /dev/null +++ b/task/node_modules/@types/node/readline.d.ts @@ -0,0 +1,539 @@ +/** + * The `node:readline` module provides an interface for reading data from a `Readable` stream (such as `process.stdin`) one line at a time. + * + * To use the promise-based APIs: + * + * ```js + * import * as readline from 'node:readline/promises'; + * ``` + * + * To use the callback and sync APIs: + * + * ```js + * import * as readline from 'node:readline'; + * ``` + * + * The following simple example illustrates the basic use of the `node:readline`module. + * + * ```js + * import * as readline from 'node:readline/promises'; + * import { stdin as input, stdout as output } from 'node:process'; + * + * const rl = readline.createInterface({ input, output }); + * + * const answer = await rl.question('What do you think of Node.js? '); + * + * console.log(`Thank you for your valuable feedback: ${answer}`); + * + * rl.close(); + * ``` + * + * Once this code is invoked, the Node.js application will not terminate until the`readline.Interface` is closed because the interface waits for data to be + * received on the `input` stream. + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/readline.js) + */ +declare module "readline" { + import { Abortable, EventEmitter } from "node:events"; + import * as promises from "node:readline/promises"; + export { promises }; + export interface Key { + sequence?: string | undefined; + name?: string | undefined; + ctrl?: boolean | undefined; + meta?: boolean | undefined; + shift?: boolean | undefined; + } + /** + * Instances of the `readline.Interface` class are constructed using the`readline.createInterface()` method. Every instance is associated with a + * single `input` `Readable` stream and a single `output` `Writable` stream. + * The `output` stream is used to print prompts for user input that arrives on, + * and is read from, the `input` stream. + * @since v0.1.104 + */ + export class Interface extends EventEmitter { + readonly terminal: boolean; + /** + * The current input data being processed by node. + * + * This can be used when collecting input from a TTY stream to retrieve the + * current value that has been processed thus far, prior to the `line` event + * being emitted. Once the `line` event has been emitted, this property will + * be an empty string. + * + * Be aware that modifying the value during the instance runtime may have + * unintended consequences if `rl.cursor` is not also controlled. + * + * **If not using a TTY stream for input, use the `'line'` event.** + * + * One possible use case would be as follows: + * + * ```js + * const values = ['lorem ipsum', 'dolor sit amet']; + * const rl = readline.createInterface(process.stdin); + * const showResults = debounce(() => { + * console.log( + * '\n', + * values.filter((val) => val.startsWith(rl.line)).join(' '), + * ); + * }, 300); + * process.stdin.on('keypress', (c, k) => { + * showResults(); + * }); + * ``` + * @since v0.1.98 + */ + readonly line: string; + /** + * The cursor position relative to `rl.line`. + * + * This will track where the current cursor lands in the input string, when + * reading input from a TTY stream. The position of cursor determines the + * portion of the input string that will be modified as input is processed, + * as well as the column where the terminal caret will be rendered. + * @since v0.1.98 + */ + readonly cursor: number; + /** + * NOTE: According to the documentation: + * + * > Instances of the `readline.Interface` class are constructed using the + * > `readline.createInterface()` method. + * + * @see https://nodejs.org/dist/latest-v20.x/docs/api/readline.html#class-interfaceconstructor + */ + protected constructor( + input: NodeJS.ReadableStream, + output?: NodeJS.WritableStream, + completer?: Completer | AsyncCompleter, + terminal?: boolean, + ); + /** + * NOTE: According to the documentation: + * + * > Instances of the `readline.Interface` class are constructed using the + * > `readline.createInterface()` method. + * + * @see https://nodejs.org/dist/latest-v20.x/docs/api/readline.html#class-interfaceconstructor + */ + protected constructor(options: ReadLineOptions); + /** + * The `rl.getPrompt()` method returns the current prompt used by `rl.prompt()`. + * @since v15.3.0, v14.17.0 + * @return the current prompt string + */ + getPrompt(): string; + /** + * The `rl.setPrompt()` method sets the prompt that will be written to `output`whenever `rl.prompt()` is called. + * @since v0.1.98 + */ + setPrompt(prompt: string): void; + /** + * The `rl.prompt()` method writes the `Interface` instances configured`prompt` to a new line in `output` in order to provide a user with a new + * location at which to provide input. + * + * When called, `rl.prompt()` will resume the `input` stream if it has been + * paused. + * + * If the `Interface` was created with `output` set to `null` or`undefined` the prompt is not written. + * @since v0.1.98 + * @param preserveCursor If `true`, prevents the cursor placement from being reset to `0`. + */ + prompt(preserveCursor?: boolean): void; + /** + * The `rl.question()` method displays the `query` by writing it to the `output`, + * waits for user input to be provided on `input`, then invokes the `callback`function passing the provided input as the first argument. + * + * When called, `rl.question()` will resume the `input` stream if it has been + * paused. + * + * If the `Interface` was created with `output` set to `null` or`undefined` the `query` is not written. + * + * The `callback` function passed to `rl.question()` does not follow the typical + * pattern of accepting an `Error` object or `null` as the first argument. + * The `callback` is called with the provided answer as the only argument. + * + * An error will be thrown if calling `rl.question()` after `rl.close()`. + * + * Example usage: + * + * ```js + * rl.question('What is your favorite food? ', (answer) => { + * console.log(`Oh, so your favorite food is ${answer}`); + * }); + * ``` + * + * Using an `AbortController` to cancel a question. + * + * ```js + * const ac = new AbortController(); + * const signal = ac.signal; + * + * rl.question('What is your favorite food? ', { signal }, (answer) => { + * console.log(`Oh, so your favorite food is ${answer}`); + * }); + * + * signal.addEventListener('abort', () => { + * console.log('The food question timed out'); + * }, { once: true }); + * + * setTimeout(() => ac.abort(), 10000); + * ``` + * @since v0.3.3 + * @param query A statement or query to write to `output`, prepended to the prompt. + * @param callback A callback function that is invoked with the user's input in response to the `query`. + */ + question(query: string, callback: (answer: string) => void): void; + question(query: string, options: Abortable, callback: (answer: string) => void): void; + /** + * The `rl.pause()` method pauses the `input` stream, allowing it to be resumed + * later if necessary. + * + * Calling `rl.pause()` does not immediately pause other events (including`'line'`) from being emitted by the `Interface` instance. + * @since v0.3.4 + */ + pause(): this; + /** + * The `rl.resume()` method resumes the `input` stream if it has been paused. + * @since v0.3.4 + */ + resume(): this; + /** + * The `rl.close()` method closes the `Interface` instance and + * relinquishes control over the `input` and `output` streams. When called, + * the `'close'` event will be emitted. + * + * Calling `rl.close()` does not immediately stop other events (including `'line'`) + * from being emitted by the `Interface` instance. + * @since v0.1.98 + */ + close(): void; + /** + * The `rl.write()` method will write either `data` or a key sequence identified + * by `key` to the `output`. The `key` argument is supported only if `output` is + * a `TTY` text terminal. See `TTY keybindings` for a list of key + * combinations. + * + * If `key` is specified, `data` is ignored. + * + * When called, `rl.write()` will resume the `input` stream if it has been + * paused. + * + * If the `Interface` was created with `output` set to `null` or`undefined` the `data` and `key` are not written. + * + * ```js + * rl.write('Delete this!'); + * // Simulate Ctrl+U to delete the line written previously + * rl.write(null, { ctrl: true, name: 'u' }); + * ``` + * + * The `rl.write()` method will write the data to the `readline` `Interface`'s`input`_as if it were provided by the user_. + * @since v0.1.98 + */ + write(data: string | Buffer, key?: Key): void; + write(data: undefined | null | string | Buffer, key: Key): void; + /** + * Returns the real position of the cursor in relation to the input + * prompt + string. Long input (wrapping) strings, as well as multiple + * line prompts are included in the calculations. + * @since v13.5.0, v12.16.0 + */ + getCursorPos(): CursorPos; + /** + * events.EventEmitter + * 1. close + * 2. line + * 3. pause + * 4. resume + * 5. SIGCONT + * 6. SIGINT + * 7. SIGTSTP + * 8. history + */ + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "line", listener: (input: string) => void): this; + addListener(event: "pause", listener: () => void): this; + addListener(event: "resume", listener: () => void): this; + addListener(event: "SIGCONT", listener: () => void): this; + addListener(event: "SIGINT", listener: () => void): this; + addListener(event: "SIGTSTP", listener: () => void): this; + addListener(event: "history", listener: (history: string[]) => void): this; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close"): boolean; + emit(event: "line", input: string): boolean; + emit(event: "pause"): boolean; + emit(event: "resume"): boolean; + emit(event: "SIGCONT"): boolean; + emit(event: "SIGINT"): boolean; + emit(event: "SIGTSTP"): boolean; + emit(event: "history", history: string[]): boolean; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "close", listener: () => void): this; + on(event: "line", listener: (input: string) => void): this; + on(event: "pause", listener: () => void): this; + on(event: "resume", listener: () => void): this; + on(event: "SIGCONT", listener: () => void): this; + on(event: "SIGINT", listener: () => void): this; + on(event: "SIGTSTP", listener: () => void): this; + on(event: "history", listener: (history: string[]) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "line", listener: (input: string) => void): this; + once(event: "pause", listener: () => void): this; + once(event: "resume", listener: () => void): this; + once(event: "SIGCONT", listener: () => void): this; + once(event: "SIGINT", listener: () => void): this; + once(event: "SIGTSTP", listener: () => void): this; + once(event: "history", listener: (history: string[]) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "line", listener: (input: string) => void): this; + prependListener(event: "pause", listener: () => void): this; + prependListener(event: "resume", listener: () => void): this; + prependListener(event: "SIGCONT", listener: () => void): this; + prependListener(event: "SIGINT", listener: () => void): this; + prependListener(event: "SIGTSTP", listener: () => void): this; + prependListener(event: "history", listener: (history: string[]) => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "line", listener: (input: string) => void): this; + prependOnceListener(event: "pause", listener: () => void): this; + prependOnceListener(event: "resume", listener: () => void): this; + prependOnceListener(event: "SIGCONT", listener: () => void): this; + prependOnceListener(event: "SIGINT", listener: () => void): this; + prependOnceListener(event: "SIGTSTP", listener: () => void): this; + prependOnceListener(event: "history", listener: (history: string[]) => void): this; + [Symbol.asyncIterator](): AsyncIterableIterator; + } + export type ReadLine = Interface; // type forwarded for backwards compatibility + export type Completer = (line: string) => CompleterResult; + export type AsyncCompleter = ( + line: string, + callback: (err?: null | Error, result?: CompleterResult) => void, + ) => void; + export type CompleterResult = [string[], string]; + export interface ReadLineOptions { + input: NodeJS.ReadableStream; + output?: NodeJS.WritableStream | undefined; + completer?: Completer | AsyncCompleter | undefined; + terminal?: boolean | undefined; + /** + * Initial list of history lines. This option makes sense + * only if `terminal` is set to `true` by the user or by an internal `output` + * check, otherwise the history caching mechanism is not initialized at all. + * @default [] + */ + history?: string[] | undefined; + historySize?: number | undefined; + prompt?: string | undefined; + crlfDelay?: number | undefined; + /** + * If `true`, when a new input line added + * to the history list duplicates an older one, this removes the older line + * from the list. + * @default false + */ + removeHistoryDuplicates?: boolean | undefined; + escapeCodeTimeout?: number | undefined; + tabSize?: number | undefined; + } + /** + * The `readline.createInterface()` method creates a new `readline.Interface`instance. + * + * ```js + * const readline = require('node:readline'); + * const rl = readline.createInterface({ + * input: process.stdin, + * output: process.stdout, + * }); + * ``` + * + * Once the `readline.Interface` instance is created, the most common case is to + * listen for the `'line'` event: + * + * ```js + * rl.on('line', (line) => { + * console.log(`Received: ${line}`); + * }); + * ``` + * + * If `terminal` is `true` for this instance then the `output` stream will get + * the best compatibility if it defines an `output.columns` property and emits + * a `'resize'` event on the `output` if or when the columns ever change + * (`process.stdout` does this automatically when it is a TTY). + * + * When creating a `readline.Interface` using `stdin` as input, the program + * will not terminate until it receives an [EOF character](https://en.wikipedia.org/wiki/End-of-file#EOF_character). To exit without + * waiting for user input, call `process.stdin.unref()`. + * @since v0.1.98 + */ + export function createInterface( + input: NodeJS.ReadableStream, + output?: NodeJS.WritableStream, + completer?: Completer | AsyncCompleter, + terminal?: boolean, + ): Interface; + export function createInterface(options: ReadLineOptions): Interface; + /** + * The `readline.emitKeypressEvents()` method causes the given `Readable` stream to begin emitting `'keypress'` events corresponding to received input. + * + * Optionally, `interface` specifies a `readline.Interface` instance for which + * autocompletion is disabled when copy-pasted input is detected. + * + * If the `stream` is a `TTY`, then it must be in raw mode. + * + * This is automatically called by any readline instance on its `input` if the`input` is a terminal. Closing the `readline` instance does not stop + * the `input` from emitting `'keypress'` events. + * + * ```js + * readline.emitKeypressEvents(process.stdin); + * if (process.stdin.isTTY) + * process.stdin.setRawMode(true); + * ``` + * + * ## Example: Tiny CLI + * + * The following example illustrates the use of `readline.Interface` class to + * implement a small command-line interface: + * + * ```js + * const readline = require('node:readline'); + * const rl = readline.createInterface({ + * input: process.stdin, + * output: process.stdout, + * prompt: 'OHAI> ', + * }); + * + * rl.prompt(); + * + * rl.on('line', (line) => { + * switch (line.trim()) { + * case 'hello': + * console.log('world!'); + * break; + * default: + * console.log(`Say what? I might have heard '${line.trim()}'`); + * break; + * } + * rl.prompt(); + * }).on('close', () => { + * console.log('Have a great day!'); + * process.exit(0); + * }); + * ``` + * + * ## Example: Read file stream line-by-Line + * + * A common use case for `readline` is to consume an input file one line at a + * time. The easiest way to do so is leveraging the `fs.ReadStream` API as + * well as a `for await...of` loop: + * + * ```js + * const fs = require('node:fs'); + * const readline = require('node:readline'); + * + * async function processLineByLine() { + * const fileStream = fs.createReadStream('input.txt'); + * + * const rl = readline.createInterface({ + * input: fileStream, + * crlfDelay: Infinity, + * }); + * // Note: we use the crlfDelay option to recognize all instances of CR LF + * // ('\r\n') in input.txt as a single line break. + * + * for await (const line of rl) { + * // Each line in input.txt will be successively available here as `line`. + * console.log(`Line from file: ${line}`); + * } + * } + * + * processLineByLine(); + * ``` + * + * Alternatively, one could use the `'line'` event: + * + * ```js + * const fs = require('node:fs'); + * const readline = require('node:readline'); + * + * const rl = readline.createInterface({ + * input: fs.createReadStream('sample.txt'), + * crlfDelay: Infinity, + * }); + * + * rl.on('line', (line) => { + * console.log(`Line from file: ${line}`); + * }); + * ``` + * + * Currently, `for await...of` loop can be a bit slower. If `async` / `await`flow and speed are both essential, a mixed approach can be applied: + * + * ```js + * const { once } = require('node:events'); + * const { createReadStream } = require('node:fs'); + * const { createInterface } = require('node:readline'); + * + * (async function processLineByLine() { + * try { + * const rl = createInterface({ + * input: createReadStream('big-file.txt'), + * crlfDelay: Infinity, + * }); + * + * rl.on('line', (line) => { + * // Process the line. + * }); + * + * await once(rl, 'close'); + * + * console.log('File processed.'); + * } catch (err) { + * console.error(err); + * } + * })(); + * ``` + * @since v0.7.7 + */ + export function emitKeypressEvents(stream: NodeJS.ReadableStream, readlineInterface?: Interface): void; + export type Direction = -1 | 0 | 1; + export interface CursorPos { + rows: number; + cols: number; + } + /** + * The `readline.clearLine()` method clears current line of given `TTY` stream + * in a specified direction identified by `dir`. + * @since v0.7.7 + * @param callback Invoked once the operation completes. + * @return `false` if `stream` wishes for the calling code to wait for the `'drain'` event to be emitted before continuing to write additional data; otherwise `true`. + */ + export function clearLine(stream: NodeJS.WritableStream, dir: Direction, callback?: () => void): boolean; + /** + * The `readline.clearScreenDown()` method clears the given `TTY` stream from + * the current position of the cursor down. + * @since v0.7.7 + * @param callback Invoked once the operation completes. + * @return `false` if `stream` wishes for the calling code to wait for the `'drain'` event to be emitted before continuing to write additional data; otherwise `true`. + */ + export function clearScreenDown(stream: NodeJS.WritableStream, callback?: () => void): boolean; + /** + * The `readline.cursorTo()` method moves cursor to the specified position in a + * given `TTY` `stream`. + * @since v0.7.7 + * @param callback Invoked once the operation completes. + * @return `false` if `stream` wishes for the calling code to wait for the `'drain'` event to be emitted before continuing to write additional data; otherwise `true`. + */ + export function cursorTo(stream: NodeJS.WritableStream, x: number, y?: number, callback?: () => void): boolean; + /** + * The `readline.moveCursor()` method moves the cursor _relative_ to its current + * position in a given `TTY` `stream`. + * @since v0.7.7 + * @param callback Invoked once the operation completes. + * @return `false` if `stream` wishes for the calling code to wait for the `'drain'` event to be emitted before continuing to write additional data; otherwise `true`. + */ + export function moveCursor(stream: NodeJS.WritableStream, dx: number, dy: number, callback?: () => void): boolean; +} +declare module "node:readline" { + export * from "readline"; +} diff --git a/task/node_modules/@types/node/readline/promises.d.ts b/task/node_modules/@types/node/readline/promises.d.ts new file mode 100644 index 0000000..73fb111 --- /dev/null +++ b/task/node_modules/@types/node/readline/promises.d.ts @@ -0,0 +1,150 @@ +/** + * @since v17.0.0 + * @experimental + */ +declare module "readline/promises" { + import { AsyncCompleter, Completer, Direction, Interface as _Interface, ReadLineOptions } from "node:readline"; + import { Abortable } from "node:events"; + /** + * Instances of the `readlinePromises.Interface` class are constructed using the`readlinePromises.createInterface()` method. Every instance is associated with a + * single `input` `Readable` stream and a single `output` `Writable` stream. + * The `output` stream is used to print prompts for user input that arrives on, + * and is read from, the `input` stream. + * @since v17.0.0 + */ + class Interface extends _Interface { + /** + * The `rl.question()` method displays the `query` by writing it to the `output`, + * waits for user input to be provided on `input`, then invokes the `callback`function passing the provided input as the first argument. + * + * When called, `rl.question()` will resume the `input` stream if it has been + * paused. + * + * If the `Interface` was created with `output` set to `null` or`undefined` the `query` is not written. + * + * If the question is called after `rl.close()`, it returns a rejected promise. + * + * Example usage: + * + * ```js + * const answer = await rl.question('What is your favorite food? '); + * console.log(`Oh, so your favorite food is ${answer}`); + * ``` + * + * Using an `AbortSignal` to cancel a question. + * + * ```js + * const signal = AbortSignal.timeout(10_000); + * + * signal.addEventListener('abort', () => { + * console.log('The food question timed out'); + * }, { once: true }); + * + * const answer = await rl.question('What is your favorite food? ', { signal }); + * console.log(`Oh, so your favorite food is ${answer}`); + * ``` + * @since v17.0.0 + * @param query A statement or query to write to `output`, prepended to the prompt. + * @return A promise that is fulfilled with the user's input in response to the `query`. + */ + question(query: string): Promise; + question(query: string, options: Abortable): Promise; + } + /** + * @since v17.0.0 + */ + class Readline { + /** + * @param stream A TTY stream. + */ + constructor( + stream: NodeJS.WritableStream, + options?: { + autoCommit?: boolean; + }, + ); + /** + * The `rl.clearLine()` method adds to the internal list of pending action an + * action that clears current line of the associated `stream` in a specified + * direction identified by `dir`. + * Call `rl.commit()` to see the effect of this method, unless `autoCommit: true`was passed to the constructor. + * @since v17.0.0 + * @return this + */ + clearLine(dir: Direction): this; + /** + * The `rl.clearScreenDown()` method adds to the internal list of pending action an + * action that clears the associated stream from the current position of the + * cursor down. + * Call `rl.commit()` to see the effect of this method, unless `autoCommit: true`was passed to the constructor. + * @since v17.0.0 + * @return this + */ + clearScreenDown(): this; + /** + * The `rl.commit()` method sends all the pending actions to the associated`stream` and clears the internal list of pending actions. + * @since v17.0.0 + */ + commit(): Promise; + /** + * The `rl.cursorTo()` method adds to the internal list of pending action an action + * that moves cursor to the specified position in the associated `stream`. + * Call `rl.commit()` to see the effect of this method, unless `autoCommit: true`was passed to the constructor. + * @since v17.0.0 + * @return this + */ + cursorTo(x: number, y?: number): this; + /** + * The `rl.moveCursor()` method adds to the internal list of pending action an + * action that moves the cursor _relative_ to its current position in the + * associated `stream`. + * Call `rl.commit()` to see the effect of this method, unless `autoCommit: true`was passed to the constructor. + * @since v17.0.0 + * @return this + */ + moveCursor(dx: number, dy: number): this; + /** + * The `rl.rollback` methods clears the internal list of pending actions without + * sending it to the associated `stream`. + * @since v17.0.0 + * @return this + */ + rollback(): this; + } + /** + * The `readlinePromises.createInterface()` method creates a new `readlinePromises.Interface`instance. + * + * ```js + * const readlinePromises = require('node:readline/promises'); + * const rl = readlinePromises.createInterface({ + * input: process.stdin, + * output: process.stdout, + * }); + * ``` + * + * Once the `readlinePromises.Interface` instance is created, the most common case + * is to listen for the `'line'` event: + * + * ```js + * rl.on('line', (line) => { + * console.log(`Received: ${line}`); + * }); + * ``` + * + * If `terminal` is `true` for this instance then the `output` stream will get + * the best compatibility if it defines an `output.columns` property and emits + * a `'resize'` event on the `output` if or when the columns ever change + * (`process.stdout` does this automatically when it is a TTY). + * @since v17.0.0 + */ + function createInterface( + input: NodeJS.ReadableStream, + output?: NodeJS.WritableStream, + completer?: Completer | AsyncCompleter, + terminal?: boolean, + ): Interface; + function createInterface(options: ReadLineOptions): Interface; +} +declare module "node:readline/promises" { + export * from "readline/promises"; +} diff --git a/task/node_modules/@types/node/repl.d.ts b/task/node_modules/@types/node/repl.d.ts new file mode 100644 index 0000000..6c5f81b --- /dev/null +++ b/task/node_modules/@types/node/repl.d.ts @@ -0,0 +1,430 @@ +/** + * The `node:repl` module provides a Read-Eval-Print-Loop (REPL) implementation + * that is available both as a standalone program or includible in other + * applications. It can be accessed using: + * + * ```js + * const repl = require('node:repl'); + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/repl.js) + */ +declare module "repl" { + import { AsyncCompleter, Completer, Interface } from "node:readline"; + import { Context } from "node:vm"; + import { InspectOptions } from "node:util"; + interface ReplOptions { + /** + * The input prompt to display. + * @default "> " + */ + prompt?: string | undefined; + /** + * The `Readable` stream from which REPL input will be read. + * @default process.stdin + */ + input?: NodeJS.ReadableStream | undefined; + /** + * The `Writable` stream to which REPL output will be written. + * @default process.stdout + */ + output?: NodeJS.WritableStream | undefined; + /** + * If `true`, specifies that the output should be treated as a TTY terminal, and have + * ANSI/VT100 escape codes written to it. + * Default: checking the value of the `isTTY` property on the output stream upon + * instantiation. + */ + terminal?: boolean | undefined; + /** + * The function to be used when evaluating each given line of input. + * Default: an async wrapper for the JavaScript `eval()` function. An `eval` function can + * error with `repl.Recoverable` to indicate the input was incomplete and prompt for + * additional lines. + * + * @see https://nodejs.org/dist/latest-v20.x/docs/api/repl.html#repl_default_evaluation + * @see https://nodejs.org/dist/latest-v20.x/docs/api/repl.html#repl_custom_evaluation_functions + */ + eval?: REPLEval | undefined; + /** + * Defines if the repl prints output previews or not. + * @default `true` Always `false` in case `terminal` is falsy. + */ + preview?: boolean | undefined; + /** + * If `true`, specifies that the default `writer` function should include ANSI color + * styling to REPL output. If a custom `writer` function is provided then this has no + * effect. + * Default: the REPL instance's `terminal` value. + */ + useColors?: boolean | undefined; + /** + * If `true`, specifies that the default evaluation function will use the JavaScript + * `global` as the context as opposed to creating a new separate context for the REPL + * instance. The node CLI REPL sets this value to `true`. + * Default: `false`. + */ + useGlobal?: boolean | undefined; + /** + * If `true`, specifies that the default writer will not output the return value of a + * command if it evaluates to `undefined`. + * Default: `false`. + */ + ignoreUndefined?: boolean | undefined; + /** + * The function to invoke to format the output of each command before writing to `output`. + * Default: a wrapper for `util.inspect`. + * + * @see https://nodejs.org/dist/latest-v20.x/docs/api/repl.html#repl_customizing_repl_output + */ + writer?: REPLWriter | undefined; + /** + * An optional function used for custom Tab auto completion. + * + * @see https://nodejs.org/dist/latest-v20.x/docs/api/readline.html#readline_use_of_the_completer_function + */ + completer?: Completer | AsyncCompleter | undefined; + /** + * A flag that specifies whether the default evaluator executes all JavaScript commands in + * strict mode or default (sloppy) mode. + * Accepted values are: + * - `repl.REPL_MODE_SLOPPY` - evaluates expressions in sloppy mode. + * - `repl.REPL_MODE_STRICT` - evaluates expressions in strict mode. This is equivalent to + * prefacing every repl statement with `'use strict'`. + */ + replMode?: typeof REPL_MODE_SLOPPY | typeof REPL_MODE_STRICT | undefined; + /** + * Stop evaluating the current piece of code when `SIGINT` is received, i.e. `Ctrl+C` is + * pressed. This cannot be used together with a custom `eval` function. + * Default: `false`. + */ + breakEvalOnSigint?: boolean | undefined; + } + type REPLEval = ( + this: REPLServer, + evalCmd: string, + context: Context, + file: string, + cb: (err: Error | null, result: any) => void, + ) => void; + type REPLWriter = (this: REPLServer, obj: any) => string; + /** + * This is the default "writer" value, if none is passed in the REPL options, + * and it can be overridden by custom print functions. + */ + const writer: REPLWriter & { + options: InspectOptions; + }; + type REPLCommandAction = (this: REPLServer, text: string) => void; + interface REPLCommand { + /** + * Help text to be displayed when `.help` is entered. + */ + help?: string | undefined; + /** + * The function to execute, optionally accepting a single string argument. + */ + action: REPLCommandAction; + } + /** + * Instances of `repl.REPLServer` are created using the {@link start} method + * or directly using the JavaScript `new` keyword. + * + * ```js + * const repl = require('node:repl'); + * + * const options = { useColors: true }; + * + * const firstInstance = repl.start(options); + * const secondInstance = new repl.REPLServer(options); + * ``` + * @since v0.1.91 + */ + class REPLServer extends Interface { + /** + * The `vm.Context` provided to the `eval` function to be used for JavaScript + * evaluation. + */ + readonly context: Context; + /** + * @deprecated since v14.3.0 - Use `input` instead. + */ + readonly inputStream: NodeJS.ReadableStream; + /** + * @deprecated since v14.3.0 - Use `output` instead. + */ + readonly outputStream: NodeJS.WritableStream; + /** + * The `Readable` stream from which REPL input will be read. + */ + readonly input: NodeJS.ReadableStream; + /** + * The `Writable` stream to which REPL output will be written. + */ + readonly output: NodeJS.WritableStream; + /** + * The commands registered via `replServer.defineCommand()`. + */ + readonly commands: NodeJS.ReadOnlyDict; + /** + * A value indicating whether the REPL is currently in "editor mode". + * + * @see https://nodejs.org/dist/latest-v20.x/docs/api/repl.html#repl_commands_and_special_keys + */ + readonly editorMode: boolean; + /** + * A value indicating whether the `_` variable has been assigned. + * + * @see https://nodejs.org/dist/latest-v20.x/docs/api/repl.html#repl_assignment_of_the_underscore_variable + */ + readonly underscoreAssigned: boolean; + /** + * The last evaluation result from the REPL (assigned to the `_` variable inside of the REPL). + * + * @see https://nodejs.org/dist/latest-v20.x/docs/api/repl.html#repl_assignment_of_the_underscore_variable + */ + readonly last: any; + /** + * A value indicating whether the `_error` variable has been assigned. + * + * @since v9.8.0 + * @see https://nodejs.org/dist/latest-v20.x/docs/api/repl.html#repl_assignment_of_the_underscore_variable + */ + readonly underscoreErrAssigned: boolean; + /** + * The last error raised inside the REPL (assigned to the `_error` variable inside of the REPL). + * + * @since v9.8.0 + * @see https://nodejs.org/dist/latest-v20.x/docs/api/repl.html#repl_assignment_of_the_underscore_variable + */ + readonly lastError: any; + /** + * Specified in the REPL options, this is the function to be used when evaluating each + * given line of input. If not specified in the REPL options, this is an async wrapper + * for the JavaScript `eval()` function. + */ + readonly eval: REPLEval; + /** + * Specified in the REPL options, this is a value indicating whether the default + * `writer` function should include ANSI color styling to REPL output. + */ + readonly useColors: boolean; + /** + * Specified in the REPL options, this is a value indicating whether the default `eval` + * function will use the JavaScript `global` as the context as opposed to creating a new + * separate context for the REPL instance. + */ + readonly useGlobal: boolean; + /** + * Specified in the REPL options, this is a value indicating whether the default `writer` + * function should output the result of a command if it evaluates to `undefined`. + */ + readonly ignoreUndefined: boolean; + /** + * Specified in the REPL options, this is the function to invoke to format the output of + * each command before writing to `outputStream`. If not specified in the REPL options, + * this will be a wrapper for `util.inspect`. + */ + readonly writer: REPLWriter; + /** + * Specified in the REPL options, this is the function to use for custom Tab auto-completion. + */ + readonly completer: Completer | AsyncCompleter; + /** + * Specified in the REPL options, this is a flag that specifies whether the default `eval` + * function should execute all JavaScript commands in strict mode or default (sloppy) mode. + * Possible values are: + * - `repl.REPL_MODE_SLOPPY` - evaluates expressions in sloppy mode. + * - `repl.REPL_MODE_STRICT` - evaluates expressions in strict mode. This is equivalent to + * prefacing every repl statement with `'use strict'`. + */ + readonly replMode: typeof REPL_MODE_SLOPPY | typeof REPL_MODE_STRICT; + /** + * NOTE: According to the documentation: + * + * > Instances of `repl.REPLServer` are created using the `repl.start()` method and + * > _should not_ be created directly using the JavaScript `new` keyword. + * + * `REPLServer` cannot be subclassed due to implementation specifics in NodeJS. + * + * @see https://nodejs.org/dist/latest-v20.x/docs/api/repl.html#repl_class_replserver + */ + private constructor(); + /** + * The `replServer.defineCommand()` method is used to add new `.`\-prefixed commands + * to the REPL instance. Such commands are invoked by typing a `.` followed by the`keyword`. The `cmd` is either a `Function` or an `Object` with the following + * properties: + * + * The following example shows two new commands added to the REPL instance: + * + * ```js + * const repl = require('node:repl'); + * + * const replServer = repl.start({ prompt: '> ' }); + * replServer.defineCommand('sayhello', { + * help: 'Say hello', + * action(name) { + * this.clearBufferedCommand(); + * console.log(`Hello, ${name}!`); + * this.displayPrompt(); + * }, + * }); + * replServer.defineCommand('saybye', function saybye() { + * console.log('Goodbye!'); + * this.close(); + * }); + * ``` + * + * The new commands can then be used from within the REPL instance: + * + * ```console + * > .sayhello Node.js User + * Hello, Node.js User! + * > .saybye + * Goodbye! + * ``` + * @since v0.3.0 + * @param keyword The command keyword (_without_ a leading `.` character). + * @param cmd The function to invoke when the command is processed. + */ + defineCommand(keyword: string, cmd: REPLCommandAction | REPLCommand): void; + /** + * The `replServer.displayPrompt()` method readies the REPL instance for input + * from the user, printing the configured `prompt` to a new line in the `output`and resuming the `input` to accept new input. + * + * When multi-line input is being entered, an ellipsis is printed rather than the + * 'prompt'. + * + * When `preserveCursor` is `true`, the cursor placement will not be reset to `0`. + * + * The `replServer.displayPrompt` method is primarily intended to be called from + * within the action function for commands registered using the`replServer.defineCommand()` method. + * @since v0.1.91 + */ + displayPrompt(preserveCursor?: boolean): void; + /** + * The `replServer.clearBufferedCommand()` method clears any command that has been + * buffered but not yet executed. This method is primarily intended to be + * called from within the action function for commands registered using the`replServer.defineCommand()` method. + * @since v9.0.0 + */ + clearBufferedCommand(): void; + /** + * Initializes a history log file for the REPL instance. When executing the + * Node.js binary and using the command-line REPL, a history file is initialized + * by default. However, this is not the case when creating a REPL + * programmatically. Use this method to initialize a history log file when working + * with REPL instances programmatically. + * @since v11.10.0 + * @param historyPath the path to the history file + * @param callback called when history writes are ready or upon error + */ + setupHistory(path: string, callback: (err: Error | null, repl: this) => void): void; + /** + * events.EventEmitter + * 1. close - inherited from `readline.Interface` + * 2. line - inherited from `readline.Interface` + * 3. pause - inherited from `readline.Interface` + * 4. resume - inherited from `readline.Interface` + * 5. SIGCONT - inherited from `readline.Interface` + * 6. SIGINT - inherited from `readline.Interface` + * 7. SIGTSTP - inherited from `readline.Interface` + * 8. exit + * 9. reset + */ + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "line", listener: (input: string) => void): this; + addListener(event: "pause", listener: () => void): this; + addListener(event: "resume", listener: () => void): this; + addListener(event: "SIGCONT", listener: () => void): this; + addListener(event: "SIGINT", listener: () => void): this; + addListener(event: "SIGTSTP", listener: () => void): this; + addListener(event: "exit", listener: () => void): this; + addListener(event: "reset", listener: (context: Context) => void): this; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close"): boolean; + emit(event: "line", input: string): boolean; + emit(event: "pause"): boolean; + emit(event: "resume"): boolean; + emit(event: "SIGCONT"): boolean; + emit(event: "SIGINT"): boolean; + emit(event: "SIGTSTP"): boolean; + emit(event: "exit"): boolean; + emit(event: "reset", context: Context): boolean; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "close", listener: () => void): this; + on(event: "line", listener: (input: string) => void): this; + on(event: "pause", listener: () => void): this; + on(event: "resume", listener: () => void): this; + on(event: "SIGCONT", listener: () => void): this; + on(event: "SIGINT", listener: () => void): this; + on(event: "SIGTSTP", listener: () => void): this; + on(event: "exit", listener: () => void): this; + on(event: "reset", listener: (context: Context) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "line", listener: (input: string) => void): this; + once(event: "pause", listener: () => void): this; + once(event: "resume", listener: () => void): this; + once(event: "SIGCONT", listener: () => void): this; + once(event: "SIGINT", listener: () => void): this; + once(event: "SIGTSTP", listener: () => void): this; + once(event: "exit", listener: () => void): this; + once(event: "reset", listener: (context: Context) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "line", listener: (input: string) => void): this; + prependListener(event: "pause", listener: () => void): this; + prependListener(event: "resume", listener: () => void): this; + prependListener(event: "SIGCONT", listener: () => void): this; + prependListener(event: "SIGINT", listener: () => void): this; + prependListener(event: "SIGTSTP", listener: () => void): this; + prependListener(event: "exit", listener: () => void): this; + prependListener(event: "reset", listener: (context: Context) => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "line", listener: (input: string) => void): this; + prependOnceListener(event: "pause", listener: () => void): this; + prependOnceListener(event: "resume", listener: () => void): this; + prependOnceListener(event: "SIGCONT", listener: () => void): this; + prependOnceListener(event: "SIGINT", listener: () => void): this; + prependOnceListener(event: "SIGTSTP", listener: () => void): this; + prependOnceListener(event: "exit", listener: () => void): this; + prependOnceListener(event: "reset", listener: (context: Context) => void): this; + } + /** + * A flag passed in the REPL options. Evaluates expressions in sloppy mode. + */ + const REPL_MODE_SLOPPY: unique symbol; + /** + * A flag passed in the REPL options. Evaluates expressions in strict mode. + * This is equivalent to prefacing every repl statement with `'use strict'`. + */ + const REPL_MODE_STRICT: unique symbol; + /** + * The `repl.start()` method creates and starts a {@link REPLServer} instance. + * + * If `options` is a string, then it specifies the input prompt: + * + * ```js + * const repl = require('node:repl'); + * + * // a Unix style prompt + * repl.start('$ '); + * ``` + * @since v0.1.91 + */ + function start(options?: string | ReplOptions): REPLServer; + /** + * Indicates a recoverable error that a `REPLServer` can use to support multi-line input. + * + * @see https://nodejs.org/dist/latest-v20.x/docs/api/repl.html#repl_recoverable_errors + */ + class Recoverable extends SyntaxError { + err: Error; + constructor(err: Error); + } +} +declare module "node:repl" { + export * from "repl"; +} diff --git a/task/node_modules/@types/node/stream.d.ts b/task/node_modules/@types/node/stream.d.ts new file mode 100644 index 0000000..15c633f --- /dev/null +++ b/task/node_modules/@types/node/stream.d.ts @@ -0,0 +1,1701 @@ +/** + * A stream is an abstract interface for working with streaming data in Node.js. + * The `node:stream` module provides an API for implementing the stream interface. + * + * There are many stream objects provided by Node.js. For instance, a `request to an HTTP server` and `process.stdout` are both stream instances. + * + * Streams can be readable, writable, or both. All streams are instances of `EventEmitter`. + * + * To access the `node:stream` module: + * + * ```js + * const stream = require('node:stream'); + * ``` + * + * The `node:stream` module is useful for creating new types of stream instances. + * It is usually not necessary to use the `node:stream` module to consume streams. + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/stream.js) + */ +declare module "stream" { + import { Abortable, EventEmitter } from "node:events"; + import { Blob as NodeBlob } from "node:buffer"; + import * as streamPromises from "node:stream/promises"; + import * as streamConsumers from "node:stream/consumers"; + import * as streamWeb from "node:stream/web"; + + type ComposeFnParam = (source: any) => void; + + class internal extends EventEmitter { + pipe( + destination: T, + options?: { + end?: boolean | undefined; + }, + ): T; + compose( + stream: T | ComposeFnParam | Iterable | AsyncIterable, + options?: { signal: AbortSignal }, + ): T; + } + import Stream = internal.Stream; + import Readable = internal.Readable; + import ReadableOptions = internal.ReadableOptions; + interface ArrayOptions { + /** the maximum concurrent invocations of `fn` to call on the stream at once. **Default: 1**. */ + concurrency?: number; + /** allows destroying the stream if the signal is aborted. */ + signal?: AbortSignal; + } + class ReadableBase extends Stream implements NodeJS.ReadableStream { + /** + * A utility method for creating Readable Streams out of iterators. + */ + static from(iterable: Iterable | AsyncIterable, options?: ReadableOptions): Readable; + /** + * Returns whether the stream has been read from or cancelled. + * @since v16.8.0 + */ + static isDisturbed(stream: Readable | NodeJS.ReadableStream): boolean; + /** + * Returns whether the stream was destroyed or errored before emitting `'end'`. + * @since v16.8.0 + * @experimental + */ + readonly readableAborted: boolean; + /** + * Is `true` if it is safe to call `readable.read()`, which means + * the stream has not been destroyed or emitted `'error'` or `'end'`. + * @since v11.4.0 + */ + readable: boolean; + /** + * Returns whether `'data'` has been emitted. + * @since v16.7.0, v14.18.0 + * @experimental + */ + readonly readableDidRead: boolean; + /** + * Getter for the property `encoding` of a given `Readable` stream. The `encoding`property can be set using the `readable.setEncoding()` method. + * @since v12.7.0 + */ + readonly readableEncoding: BufferEncoding | null; + /** + * Becomes `true` when `'end'` event is emitted. + * @since v12.9.0 + */ + readonly readableEnded: boolean; + /** + * This property reflects the current state of a `Readable` stream as described + * in the `Three states` section. + * @since v9.4.0 + */ + readonly readableFlowing: boolean | null; + /** + * Returns the value of `highWaterMark` passed when creating this `Readable`. + * @since v9.3.0 + */ + readonly readableHighWaterMark: number; + /** + * This property contains the number of bytes (or objects) in the queue + * ready to be read. The value provides introspection data regarding + * the status of the `highWaterMark`. + * @since v9.4.0 + */ + readonly readableLength: number; + /** + * Getter for the property `objectMode` of a given `Readable` stream. + * @since v12.3.0 + */ + readonly readableObjectMode: boolean; + /** + * Is `true` after `readable.destroy()` has been called. + * @since v8.0.0 + */ + destroyed: boolean; + /** + * Is `true` after `'close'` has been emitted. + * @since v18.0.0 + */ + readonly closed: boolean; + /** + * Returns error if the stream has been destroyed with an error. + * @since v18.0.0 + */ + readonly errored: Error | null; + constructor(opts?: ReadableOptions); + _construct?(callback: (error?: Error | null) => void): void; + _read(size: number): void; + /** + * The `readable.read()` method reads data out of the internal buffer and + * returns it. If no data is available to be read, `null` is returned. By default, + * the data is returned as a `Buffer` object unless an encoding has been + * specified using the `readable.setEncoding()` method or the stream is operating + * in object mode. + * + * The optional `size` argument specifies a specific number of bytes to read. If`size` bytes are not available to be read, `null` will be returned _unless_the stream has ended, in which + * case all of the data remaining in the internal + * buffer will be returned. + * + * If the `size` argument is not specified, all of the data contained in the + * internal buffer will be returned. + * + * The `size` argument must be less than or equal to 1 GiB. + * + * The `readable.read()` method should only be called on `Readable` streams + * operating in paused mode. In flowing mode, `readable.read()` is called + * automatically until the internal buffer is fully drained. + * + * ```js + * const readable = getReadableStreamSomehow(); + * + * // 'readable' may be triggered multiple times as data is buffered in + * readable.on('readable', () => { + * let chunk; + * console.log('Stream is readable (new data received in buffer)'); + * // Use a loop to make sure we read all currently available data + * while (null !== (chunk = readable.read())) { + * console.log(`Read ${chunk.length} bytes of data...`); + * } + * }); + * + * // 'end' will be triggered once when there is no more data available + * readable.on('end', () => { + * console.log('Reached end of stream.'); + * }); + * ``` + * + * Each call to `readable.read()` returns a chunk of data, or `null`. The chunks + * are not concatenated. A `while` loop is necessary to consume all data + * currently in the buffer. When reading a large file `.read()` may return `null`, + * having consumed all buffered content so far, but there is still more data to + * come not yet buffered. In this case a new `'readable'` event will be emitted + * when there is more data in the buffer. Finally the `'end'` event will be + * emitted when there is no more data to come. + * + * Therefore to read a file's whole contents from a `readable`, it is necessary + * to collect chunks across multiple `'readable'` events: + * + * ```js + * const chunks = []; + * + * readable.on('readable', () => { + * let chunk; + * while (null !== (chunk = readable.read())) { + * chunks.push(chunk); + * } + * }); + * + * readable.on('end', () => { + * const content = chunks.join(''); + * }); + * ``` + * + * A `Readable` stream in object mode will always return a single item from + * a call to `readable.read(size)`, regardless of the value of the`size` argument. + * + * If the `readable.read()` method returns a chunk of data, a `'data'` event will + * also be emitted. + * + * Calling {@link read} after the `'end'` event has + * been emitted will return `null`. No runtime error will be raised. + * @since v0.9.4 + * @param size Optional argument to specify how much data to read. + */ + read(size?: number): any; + /** + * The `readable.setEncoding()` method sets the character encoding for + * data read from the `Readable` stream. + * + * By default, no encoding is assigned and stream data will be returned as`Buffer` objects. Setting an encoding causes the stream data + * to be returned as strings of the specified encoding rather than as `Buffer`objects. For instance, calling `readable.setEncoding('utf8')` will cause the + * output data to be interpreted as UTF-8 data, and passed as strings. Calling`readable.setEncoding('hex')` will cause the data to be encoded in hexadecimal + * string format. + * + * The `Readable` stream will properly handle multi-byte characters delivered + * through the stream that would otherwise become improperly decoded if simply + * pulled from the stream as `Buffer` objects. + * + * ```js + * const readable = getReadableStreamSomehow(); + * readable.setEncoding('utf8'); + * readable.on('data', (chunk) => { + * assert.equal(typeof chunk, 'string'); + * console.log('Got %d characters of string data:', chunk.length); + * }); + * ``` + * @since v0.9.4 + * @param encoding The encoding to use. + */ + setEncoding(encoding: BufferEncoding): this; + /** + * The `readable.pause()` method will cause a stream in flowing mode to stop + * emitting `'data'` events, switching out of flowing mode. Any data that + * becomes available will remain in the internal buffer. + * + * ```js + * const readable = getReadableStreamSomehow(); + * readable.on('data', (chunk) => { + * console.log(`Received ${chunk.length} bytes of data.`); + * readable.pause(); + * console.log('There will be no additional data for 1 second.'); + * setTimeout(() => { + * console.log('Now data will start flowing again.'); + * readable.resume(); + * }, 1000); + * }); + * ``` + * + * The `readable.pause()` method has no effect if there is a `'readable'`event listener. + * @since v0.9.4 + */ + pause(): this; + /** + * The `readable.resume()` method causes an explicitly paused `Readable` stream to + * resume emitting `'data'` events, switching the stream into flowing mode. + * + * The `readable.resume()` method can be used to fully consume the data from a + * stream without actually processing any of that data: + * + * ```js + * getReadableStreamSomehow() + * .resume() + * .on('end', () => { + * console.log('Reached the end, but did not read anything.'); + * }); + * ``` + * + * The `readable.resume()` method has no effect if there is a `'readable'`event listener. + * @since v0.9.4 + */ + resume(): this; + /** + * The `readable.isPaused()` method returns the current operating state of the`Readable`. This is used primarily by the mechanism that underlies the`readable.pipe()` method. In most + * typical cases, there will be no reason to + * use this method directly. + * + * ```js + * const readable = new stream.Readable(); + * + * readable.isPaused(); // === false + * readable.pause(); + * readable.isPaused(); // === true + * readable.resume(); + * readable.isPaused(); // === false + * ``` + * @since v0.11.14 + */ + isPaused(): boolean; + /** + * The `readable.unpipe()` method detaches a `Writable` stream previously attached + * using the {@link pipe} method. + * + * If the `destination` is not specified, then _all_ pipes are detached. + * + * If the `destination` is specified, but no pipe is set up for it, then + * the method does nothing. + * + * ```js + * const fs = require('node:fs'); + * const readable = getReadableStreamSomehow(); + * const writable = fs.createWriteStream('file.txt'); + * // All the data from readable goes into 'file.txt', + * // but only for the first second. + * readable.pipe(writable); + * setTimeout(() => { + * console.log('Stop writing to file.txt.'); + * readable.unpipe(writable); + * console.log('Manually close the file stream.'); + * writable.end(); + * }, 1000); + * ``` + * @since v0.9.4 + * @param destination Optional specific stream to unpipe + */ + unpipe(destination?: NodeJS.WritableStream): this; + /** + * Passing `chunk` as `null` signals the end of the stream (EOF) and behaves the + * same as `readable.push(null)`, after which no more data can be written. The EOF + * signal is put at the end of the buffer and any buffered data will still be + * flushed. + * + * The `readable.unshift()` method pushes a chunk of data back into the internal + * buffer. This is useful in certain situations where a stream is being consumed by + * code that needs to "un-consume" some amount of data that it has optimistically + * pulled out of the source, so that the data can be passed on to some other party. + * + * The `stream.unshift(chunk)` method cannot be called after the `'end'` event + * has been emitted or a runtime error will be thrown. + * + * Developers using `stream.unshift()` often should consider switching to + * use of a `Transform` stream instead. See the `API for stream implementers` section for more information. + * + * ```js + * // Pull off a header delimited by \n\n. + * // Use unshift() if we get too much. + * // Call the callback with (error, header, stream). + * const { StringDecoder } = require('node:string_decoder'); + * function parseHeader(stream, callback) { + * stream.on('error', callback); + * stream.on('readable', onReadable); + * const decoder = new StringDecoder('utf8'); + * let header = ''; + * function onReadable() { + * let chunk; + * while (null !== (chunk = stream.read())) { + * const str = decoder.write(chunk); + * if (str.includes('\n\n')) { + * // Found the header boundary. + * const split = str.split(/\n\n/); + * header += split.shift(); + * const remaining = split.join('\n\n'); + * const buf = Buffer.from(remaining, 'utf8'); + * stream.removeListener('error', callback); + * // Remove the 'readable' listener before unshifting. + * stream.removeListener('readable', onReadable); + * if (buf.length) + * stream.unshift(buf); + * // Now the body of the message can be read from the stream. + * callback(null, header, stream); + * return; + * } + * // Still reading the header. + * header += str; + * } + * } + * } + * ``` + * + * Unlike {@link push}, `stream.unshift(chunk)` will not + * end the reading process by resetting the internal reading state of the stream. + * This can cause unexpected results if `readable.unshift()` is called during a + * read (i.e. from within a {@link _read} implementation on a + * custom stream). Following the call to `readable.unshift()` with an immediate {@link push} will reset the reading state appropriately, + * however it is best to simply avoid calling `readable.unshift()` while in the + * process of performing a read. + * @since v0.9.11 + * @param chunk Chunk of data to unshift onto the read queue. For streams not operating in object mode, `chunk` must be a string, `Buffer`, `Uint8Array`, or `null`. For object mode + * streams, `chunk` may be any JavaScript value. + * @param encoding Encoding of string chunks. Must be a valid `Buffer` encoding, such as `'utf8'` or `'ascii'`. + */ + unshift(chunk: any, encoding?: BufferEncoding): void; + /** + * Prior to Node.js 0.10, streams did not implement the entire `node:stream`module API as it is currently defined. (See `Compatibility` for more + * information.) + * + * When using an older Node.js library that emits `'data'` events and has a {@link pause} method that is advisory only, the`readable.wrap()` method can be used to create a `Readable` + * stream that uses + * the old stream as its data source. + * + * It will rarely be necessary to use `readable.wrap()` but the method has been + * provided as a convenience for interacting with older Node.js applications and + * libraries. + * + * ```js + * const { OldReader } = require('./old-api-module.js'); + * const { Readable } = require('node:stream'); + * const oreader = new OldReader(); + * const myReader = new Readable().wrap(oreader); + * + * myReader.on('readable', () => { + * myReader.read(); // etc. + * }); + * ``` + * @since v0.9.4 + * @param stream An "old style" readable stream + */ + wrap(stream: NodeJS.ReadableStream): this; + push(chunk: any, encoding?: BufferEncoding): boolean; + /** + * The iterator created by this method gives users the option to cancel the destruction + * of the stream if the `for await...of` loop is exited by `return`, `break`, or `throw`, + * or if the iterator should destroy the stream if the stream emitted an error during iteration. + * @since v16.3.0 + * @param options.destroyOnReturn When set to `false`, calling `return` on the async iterator, + * or exiting a `for await...of` iteration using a `break`, `return`, or `throw` will not destroy the stream. + * **Default: `true`**. + */ + iterator(options?: { destroyOnReturn?: boolean }): AsyncIterableIterator; + /** + * This method allows mapping over the stream. The *fn* function will be called for every chunk in the stream. + * If the *fn* function returns a promise - that promise will be `await`ed before being passed to the result stream. + * @since v17.4.0, v16.14.0 + * @param fn a function to map over every chunk in the stream. Async or not. + * @returns a stream mapped with the function *fn*. + */ + map(fn: (data: any, options?: Pick) => any, options?: ArrayOptions): Readable; + /** + * This method allows filtering the stream. For each chunk in the stream the *fn* function will be called + * and if it returns a truthy value, the chunk will be passed to the result stream. + * If the *fn* function returns a promise - that promise will be `await`ed. + * @since v17.4.0, v16.14.0 + * @param fn a function to filter chunks from the stream. Async or not. + * @returns a stream filtered with the predicate *fn*. + */ + filter( + fn: (data: any, options?: Pick) => boolean | Promise, + options?: ArrayOptions, + ): Readable; + /** + * This method allows iterating a stream. For each chunk in the stream the *fn* function will be called. + * If the *fn* function returns a promise - that promise will be `await`ed. + * + * This method is different from `for await...of` loops in that it can optionally process chunks concurrently. + * In addition, a `forEach` iteration can only be stopped by having passed a `signal` option + * and aborting the related AbortController while `for await...of` can be stopped with `break` or `return`. + * In either case the stream will be destroyed. + * + * This method is different from listening to the `'data'` event in that it uses the `readable` event + * in the underlying machinary and can limit the number of concurrent *fn* calls. + * @since v17.5.0 + * @param fn a function to call on each chunk of the stream. Async or not. + * @returns a promise for when the stream has finished. + */ + forEach( + fn: (data: any, options?: Pick) => void | Promise, + options?: ArrayOptions, + ): Promise; + /** + * This method allows easily obtaining the contents of a stream. + * + * As this method reads the entire stream into memory, it negates the benefits of streams. It's intended + * for interoperability and convenience, not as the primary way to consume streams. + * @since v17.5.0 + * @returns a promise containing an array with the contents of the stream. + */ + toArray(options?: Pick): Promise; + /** + * This method is similar to `Array.prototype.some` and calls *fn* on each chunk in the stream + * until the awaited return value is `true` (or any truthy value). Once an *fn* call on a chunk + * `await`ed return value is truthy, the stream is destroyed and the promise is fulfilled with `true`. + * If none of the *fn* calls on the chunks return a truthy value, the promise is fulfilled with `false`. + * @since v17.5.0 + * @param fn a function to call on each chunk of the stream. Async or not. + * @returns a promise evaluating to `true` if *fn* returned a truthy value for at least one of the chunks. + */ + some( + fn: (data: any, options?: Pick) => boolean | Promise, + options?: ArrayOptions, + ): Promise; + /** + * This method is similar to `Array.prototype.find` and calls *fn* on each chunk in the stream + * to find a chunk with a truthy value for *fn*. Once an *fn* call's awaited return value is truthy, + * the stream is destroyed and the promise is fulfilled with value for which *fn* returned a truthy value. + * If all of the *fn* calls on the chunks return a falsy value, the promise is fulfilled with `undefined`. + * @since v17.5.0 + * @param fn a function to call on each chunk of the stream. Async or not. + * @returns a promise evaluating to the first chunk for which *fn* evaluated with a truthy value, + * or `undefined` if no element was found. + */ + find( + fn: (data: any, options?: Pick) => data is T, + options?: ArrayOptions, + ): Promise; + find( + fn: (data: any, options?: Pick) => boolean | Promise, + options?: ArrayOptions, + ): Promise; + /** + * This method is similar to `Array.prototype.every` and calls *fn* on each chunk in the stream + * to check if all awaited return values are truthy value for *fn*. Once an *fn* call on a chunk + * `await`ed return value is falsy, the stream is destroyed and the promise is fulfilled with `false`. + * If all of the *fn* calls on the chunks return a truthy value, the promise is fulfilled with `true`. + * @since v17.5.0 + * @param fn a function to call on each chunk of the stream. Async or not. + * @returns a promise evaluating to `true` if *fn* returned a truthy value for every one of the chunks. + */ + every( + fn: (data: any, options?: Pick) => boolean | Promise, + options?: ArrayOptions, + ): Promise; + /** + * This method returns a new stream by applying the given callback to each chunk of the stream + * and then flattening the result. + * + * It is possible to return a stream or another iterable or async iterable from *fn* and the result streams + * will be merged (flattened) into the returned stream. + * @since v17.5.0 + * @param fn a function to map over every chunk in the stream. May be async. May be a stream or generator. + * @returns a stream flat-mapped with the function *fn*. + */ + flatMap(fn: (data: any, options?: Pick) => any, options?: ArrayOptions): Readable; + /** + * This method returns a new stream with the first *limit* chunks dropped from the start. + * @since v17.5.0 + * @param limit the number of chunks to drop from the readable. + * @returns a stream with *limit* chunks dropped from the start. + */ + drop(limit: number, options?: Pick): Readable; + /** + * This method returns a new stream with the first *limit* chunks. + * @since v17.5.0 + * @param limit the number of chunks to take from the readable. + * @returns a stream with *limit* chunks taken. + */ + take(limit: number, options?: Pick): Readable; + /** + * This method returns a new stream with chunks of the underlying stream paired with a counter + * in the form `[index, chunk]`. The first index value is `0` and it increases by 1 for each chunk produced. + * @since v17.5.0 + * @returns a stream of indexed pairs. + */ + asIndexedPairs(options?: Pick): Readable; + /** + * This method calls *fn* on each chunk of the stream in order, passing it the result from the calculation + * on the previous element. It returns a promise for the final value of the reduction. + * + * If no *initial* value is supplied the first chunk of the stream is used as the initial value. + * If the stream is empty, the promise is rejected with a `TypeError` with the `ERR_INVALID_ARGS` code property. + * + * The reducer function iterates the stream element-by-element which means that there is no *concurrency* parameter + * or parallelism. To perform a reduce concurrently, you can extract the async function to `readable.map` method. + * @since v17.5.0 + * @param fn a reducer function to call over every chunk in the stream. Async or not. + * @param initial the initial value to use in the reduction. + * @returns a promise for the final value of the reduction. + */ + reduce( + fn: (previous: any, data: any, options?: Pick) => T, + initial?: undefined, + options?: Pick, + ): Promise; + reduce( + fn: (previous: T, data: any, options?: Pick) => T, + initial: T, + options?: Pick, + ): Promise; + _destroy(error: Error | null, callback: (error?: Error | null) => void): void; + /** + * Destroy the stream. Optionally emit an `'error'` event, and emit a `'close'`event (unless `emitClose` is set to `false`). After this call, the readable + * stream will release any internal resources and subsequent calls to `push()`will be ignored. + * + * Once `destroy()` has been called any further calls will be a no-op and no + * further errors except from `_destroy()` may be emitted as `'error'`. + * + * Implementors should not override this method, but instead implement `readable._destroy()`. + * @since v8.0.0 + * @param error Error which will be passed as payload in `'error'` event + */ + destroy(error?: Error): this; + /** + * Event emitter + * The defined events on documents including: + * 1. close + * 2. data + * 3. end + * 4. error + * 5. pause + * 6. readable + * 7. resume + */ + addListener(event: "close", listener: () => void): this; + addListener(event: "data", listener: (chunk: any) => void): this; + addListener(event: "end", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "pause", listener: () => void): this; + addListener(event: "readable", listener: () => void): this; + addListener(event: "resume", listener: () => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + emit(event: "close"): boolean; + emit(event: "data", chunk: any): boolean; + emit(event: "end"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "pause"): boolean; + emit(event: "readable"): boolean; + emit(event: "resume"): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on(event: "close", listener: () => void): this; + on(event: "data", listener: (chunk: any) => void): this; + on(event: "end", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "pause", listener: () => void): this; + on(event: "readable", listener: () => void): this; + on(event: "resume", listener: () => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "data", listener: (chunk: any) => void): this; + once(event: "end", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "pause", listener: () => void): this; + once(event: "readable", listener: () => void): this; + once(event: "resume", listener: () => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "data", listener: (chunk: any) => void): this; + prependListener(event: "end", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "pause", listener: () => void): this; + prependListener(event: "readable", listener: () => void): this; + prependListener(event: "resume", listener: () => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "data", listener: (chunk: any) => void): this; + prependOnceListener(event: "end", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "pause", listener: () => void): this; + prependOnceListener(event: "readable", listener: () => void): this; + prependOnceListener(event: "resume", listener: () => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + removeListener(event: "close", listener: () => void): this; + removeListener(event: "data", listener: (chunk: any) => void): this; + removeListener(event: "end", listener: () => void): this; + removeListener(event: "error", listener: (err: Error) => void): this; + removeListener(event: "pause", listener: () => void): this; + removeListener(event: "readable", listener: () => void): this; + removeListener(event: "resume", listener: () => void): this; + removeListener(event: string | symbol, listener: (...args: any[]) => void): this; + [Symbol.asyncIterator](): AsyncIterableIterator; + /** + * Calls `readable.destroy()` with an `AbortError` and returns a promise that fulfills when the stream is finished. + * @since v20.4.0 + */ + [Symbol.asyncDispose](): Promise; + } + import WritableOptions = internal.WritableOptions; + class WritableBase extends Stream implements NodeJS.WritableStream { + /** + * Is `true` if it is safe to call `writable.write()`, which means + * the stream has not been destroyed, errored, or ended. + * @since v11.4.0 + */ + readonly writable: boolean; + /** + * Is `true` after `writable.end()` has been called. This property + * does not indicate whether the data has been flushed, for this use `writable.writableFinished` instead. + * @since v12.9.0 + */ + readonly writableEnded: boolean; + /** + * Is set to `true` immediately before the `'finish'` event is emitted. + * @since v12.6.0 + */ + readonly writableFinished: boolean; + /** + * Return the value of `highWaterMark` passed when creating this `Writable`. + * @since v9.3.0 + */ + readonly writableHighWaterMark: number; + /** + * This property contains the number of bytes (or objects) in the queue + * ready to be written. The value provides introspection data regarding + * the status of the `highWaterMark`. + * @since v9.4.0 + */ + readonly writableLength: number; + /** + * Getter for the property `objectMode` of a given `Writable` stream. + * @since v12.3.0 + */ + readonly writableObjectMode: boolean; + /** + * Number of times `writable.uncork()` needs to be + * called in order to fully uncork the stream. + * @since v13.2.0, v12.16.0 + */ + readonly writableCorked: number; + /** + * Is `true` after `writable.destroy()` has been called. + * @since v8.0.0 + */ + destroyed: boolean; + /** + * Is `true` after `'close'` has been emitted. + * @since v18.0.0 + */ + readonly closed: boolean; + /** + * Returns error if the stream has been destroyed with an error. + * @since v18.0.0 + */ + readonly errored: Error | null; + /** + * Is `true` if the stream's buffer has been full and stream will emit `'drain'`. + * @since v15.2.0, v14.17.0 + */ + readonly writableNeedDrain: boolean; + constructor(opts?: WritableOptions); + _write(chunk: any, encoding: BufferEncoding, callback: (error?: Error | null) => void): void; + _writev?( + chunks: Array<{ + chunk: any; + encoding: BufferEncoding; + }>, + callback: (error?: Error | null) => void, + ): void; + _construct?(callback: (error?: Error | null) => void): void; + _destroy(error: Error | null, callback: (error?: Error | null) => void): void; + _final(callback: (error?: Error | null) => void): void; + /** + * The `writable.write()` method writes some data to the stream, and calls the + * supplied `callback` once the data has been fully handled. If an error + * occurs, the `callback` will be called with the error as its + * first argument. The `callback` is called asynchronously and before `'error'` is + * emitted. + * + * The return value is `true` if the internal buffer is less than the`highWaterMark` configured when the stream was created after admitting `chunk`. + * If `false` is returned, further attempts to write data to the stream should + * stop until the `'drain'` event is emitted. + * + * While a stream is not draining, calls to `write()` will buffer `chunk`, and + * return false. Once all currently buffered chunks are drained (accepted for + * delivery by the operating system), the `'drain'` event will be emitted. + * Once `write()` returns false, do not write more chunks + * until the `'drain'` event is emitted. While calling `write()` on a stream that + * is not draining is allowed, Node.js will buffer all written chunks until + * maximum memory usage occurs, at which point it will abort unconditionally. + * Even before it aborts, high memory usage will cause poor garbage collector + * performance and high RSS (which is not typically released back to the system, + * even after the memory is no longer required). Since TCP sockets may never + * drain if the remote peer does not read the data, writing a socket that is + * not draining may lead to a remotely exploitable vulnerability. + * + * Writing data while the stream is not draining is particularly + * problematic for a `Transform`, because the `Transform` streams are paused + * by default until they are piped or a `'data'` or `'readable'` event handler + * is added. + * + * If the data to be written can be generated or fetched on demand, it is + * recommended to encapsulate the logic into a `Readable` and use {@link pipe}. However, if calling `write()` is preferred, it is + * possible to respect backpressure and avoid memory issues using the `'drain'` event: + * + * ```js + * function write(data, cb) { + * if (!stream.write(data)) { + * stream.once('drain', cb); + * } else { + * process.nextTick(cb); + * } + * } + * + * // Wait for cb to be called before doing any other write. + * write('hello', () => { + * console.log('Write completed, do more writes now.'); + * }); + * ``` + * + * A `Writable` stream in object mode will always ignore the `encoding` argument. + * @since v0.9.4 + * @param chunk Optional data to write. For streams not operating in object mode, `chunk` must be a string, `Buffer` or `Uint8Array`. For object mode streams, `chunk` may be any + * JavaScript value other than `null`. + * @param [encoding='utf8'] The encoding, if `chunk` is a string. + * @param callback Callback for when this chunk of data is flushed. + * @return `false` if the stream wishes for the calling code to wait for the `'drain'` event to be emitted before continuing to write additional data; otherwise `true`. + */ + write(chunk: any, callback?: (error: Error | null | undefined) => void): boolean; + write(chunk: any, encoding: BufferEncoding, callback?: (error: Error | null | undefined) => void): boolean; + /** + * The `writable.setDefaultEncoding()` method sets the default `encoding` for a `Writable` stream. + * @since v0.11.15 + * @param encoding The new default encoding + */ + setDefaultEncoding(encoding: BufferEncoding): this; + /** + * Calling the `writable.end()` method signals that no more data will be written + * to the `Writable`. The optional `chunk` and `encoding` arguments allow one + * final additional chunk of data to be written immediately before closing the + * stream. + * + * Calling the {@link write} method after calling {@link end} will raise an error. + * + * ```js + * // Write 'hello, ' and then end with 'world!'. + * const fs = require('node:fs'); + * const file = fs.createWriteStream('example.txt'); + * file.write('hello, '); + * file.end('world!'); + * // Writing more now is not allowed! + * ``` + * @since v0.9.4 + * @param chunk Optional data to write. For streams not operating in object mode, `chunk` must be a string, `Buffer` or `Uint8Array`. For object mode streams, `chunk` may be any + * JavaScript value other than `null`. + * @param encoding The encoding if `chunk` is a string + * @param callback Callback for when the stream is finished. + */ + end(cb?: () => void): this; + end(chunk: any, cb?: () => void): this; + end(chunk: any, encoding: BufferEncoding, cb?: () => void): this; + /** + * The `writable.cork()` method forces all written data to be buffered in memory. + * The buffered data will be flushed when either the {@link uncork} or {@link end} methods are called. + * + * The primary intent of `writable.cork()` is to accommodate a situation in which + * several small chunks are written to the stream in rapid succession. Instead of + * immediately forwarding them to the underlying destination, `writable.cork()`buffers all the chunks until `writable.uncork()` is called, which will pass them + * all to `writable._writev()`, if present. This prevents a head-of-line blocking + * situation where data is being buffered while waiting for the first small chunk + * to be processed. However, use of `writable.cork()` without implementing`writable._writev()` may have an adverse effect on throughput. + * + * See also: `writable.uncork()`, `writable._writev()`. + * @since v0.11.2 + */ + cork(): void; + /** + * The `writable.uncork()` method flushes all data buffered since {@link cork} was called. + * + * When using `writable.cork()` and `writable.uncork()` to manage the buffering + * of writes to a stream, defer calls to `writable.uncork()` using`process.nextTick()`. Doing so allows batching of all`writable.write()` calls that occur within a given Node.js event + * loop phase. + * + * ```js + * stream.cork(); + * stream.write('some '); + * stream.write('data '); + * process.nextTick(() => stream.uncork()); + * ``` + * + * If the `writable.cork()` method is called multiple times on a stream, the + * same number of calls to `writable.uncork()` must be called to flush the buffered + * data. + * + * ```js + * stream.cork(); + * stream.write('some '); + * stream.cork(); + * stream.write('data '); + * process.nextTick(() => { + * stream.uncork(); + * // The data will not be flushed until uncork() is called a second time. + * stream.uncork(); + * }); + * ``` + * + * See also: `writable.cork()`. + * @since v0.11.2 + */ + uncork(): void; + /** + * Destroy the stream. Optionally emit an `'error'` event, and emit a `'close'`event (unless `emitClose` is set to `false`). After this call, the writable + * stream has ended and subsequent calls to `write()` or `end()` will result in + * an `ERR_STREAM_DESTROYED` error. + * This is a destructive and immediate way to destroy a stream. Previous calls to`write()` may not have drained, and may trigger an `ERR_STREAM_DESTROYED` error. + * Use `end()` instead of destroy if data should flush before close, or wait for + * the `'drain'` event before destroying the stream. + * + * Once `destroy()` has been called any further calls will be a no-op and no + * further errors except from `_destroy()` may be emitted as `'error'`. + * + * Implementors should not override this method, + * but instead implement `writable._destroy()`. + * @since v8.0.0 + * @param error Optional, an error to emit with `'error'` event. + */ + destroy(error?: Error): this; + /** + * Event emitter + * The defined events on documents including: + * 1. close + * 2. drain + * 3. error + * 4. finish + * 5. pipe + * 6. unpipe + */ + addListener(event: "close", listener: () => void): this; + addListener(event: "drain", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "finish", listener: () => void): this; + addListener(event: "pipe", listener: (src: Readable) => void): this; + addListener(event: "unpipe", listener: (src: Readable) => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + emit(event: "close"): boolean; + emit(event: "drain"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "finish"): boolean; + emit(event: "pipe", src: Readable): boolean; + emit(event: "unpipe", src: Readable): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on(event: "close", listener: () => void): this; + on(event: "drain", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "finish", listener: () => void): this; + on(event: "pipe", listener: (src: Readable) => void): this; + on(event: "unpipe", listener: (src: Readable) => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "drain", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "finish", listener: () => void): this; + once(event: "pipe", listener: (src: Readable) => void): this; + once(event: "unpipe", listener: (src: Readable) => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "drain", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "finish", listener: () => void): this; + prependListener(event: "pipe", listener: (src: Readable) => void): this; + prependListener(event: "unpipe", listener: (src: Readable) => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "drain", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "finish", listener: () => void): this; + prependOnceListener(event: "pipe", listener: (src: Readable) => void): this; + prependOnceListener(event: "unpipe", listener: (src: Readable) => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + removeListener(event: "close", listener: () => void): this; + removeListener(event: "drain", listener: () => void): this; + removeListener(event: "error", listener: (err: Error) => void): this; + removeListener(event: "finish", listener: () => void): this; + removeListener(event: "pipe", listener: (src: Readable) => void): this; + removeListener(event: "unpipe", listener: (src: Readable) => void): this; + removeListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + namespace internal { + class Stream extends internal { + constructor(opts?: ReadableOptions); + } + interface StreamOptions extends Abortable { + emitClose?: boolean | undefined; + highWaterMark?: number | undefined; + objectMode?: boolean | undefined; + construct?(this: T, callback: (error?: Error | null) => void): void; + destroy?(this: T, error: Error | null, callback: (error: Error | null) => void): void; + autoDestroy?: boolean | undefined; + } + interface ReadableOptions extends StreamOptions { + encoding?: BufferEncoding | undefined; + read?(this: Readable, size: number): void; + } + /** + * @since v0.9.4 + */ + class Readable extends ReadableBase { + /** + * A utility method for creating a `Readable` from a web `ReadableStream`. + * @since v17.0.0 + * @experimental + */ + static fromWeb( + readableStream: streamWeb.ReadableStream, + options?: Pick, + ): Readable; + /** + * A utility method for creating a web `ReadableStream` from a `Readable`. + * @since v17.0.0 + * @experimental + */ + static toWeb(streamReadable: Readable): streamWeb.ReadableStream; + } + interface WritableOptions extends StreamOptions { + decodeStrings?: boolean | undefined; + defaultEncoding?: BufferEncoding | undefined; + write?( + this: Writable, + chunk: any, + encoding: BufferEncoding, + callback: (error?: Error | null) => void, + ): void; + writev?( + this: Writable, + chunks: Array<{ + chunk: any; + encoding: BufferEncoding; + }>, + callback: (error?: Error | null) => void, + ): void; + final?(this: Writable, callback: (error?: Error | null) => void): void; + } + /** + * @since v0.9.4 + */ + class Writable extends WritableBase { + /** + * A utility method for creating a `Writable` from a web `WritableStream`. + * @since v17.0.0 + * @experimental + */ + static fromWeb( + writableStream: streamWeb.WritableStream, + options?: Pick, + ): Writable; + /** + * A utility method for creating a web `WritableStream` from a `Writable`. + * @since v17.0.0 + * @experimental + */ + static toWeb(streamWritable: Writable): streamWeb.WritableStream; + } + interface DuplexOptions extends ReadableOptions, WritableOptions { + allowHalfOpen?: boolean | undefined; + readableObjectMode?: boolean | undefined; + writableObjectMode?: boolean | undefined; + readableHighWaterMark?: number | undefined; + writableHighWaterMark?: number | undefined; + writableCorked?: number | undefined; + construct?(this: Duplex, callback: (error?: Error | null) => void): void; + read?(this: Duplex, size: number): void; + write?(this: Duplex, chunk: any, encoding: BufferEncoding, callback: (error?: Error | null) => void): void; + writev?( + this: Duplex, + chunks: Array<{ + chunk: any; + encoding: BufferEncoding; + }>, + callback: (error?: Error | null) => void, + ): void; + final?(this: Duplex, callback: (error?: Error | null) => void): void; + destroy?(this: Duplex, error: Error | null, callback: (error: Error | null) => void): void; + } + /** + * Duplex streams are streams that implement both the `Readable` and `Writable` interfaces. + * + * Examples of `Duplex` streams include: + * + * * `TCP sockets` + * * `zlib streams` + * * `crypto streams` + * @since v0.9.4 + */ + class Duplex extends ReadableBase implements WritableBase { + readonly writable: boolean; + readonly writableEnded: boolean; + readonly writableFinished: boolean; + readonly writableHighWaterMark: number; + readonly writableLength: number; + readonly writableObjectMode: boolean; + readonly writableCorked: number; + readonly writableNeedDrain: boolean; + readonly closed: boolean; + readonly errored: Error | null; + /** + * If `false` then the stream will automatically end the writable side when the + * readable side ends. Set initially by the `allowHalfOpen` constructor option, + * which defaults to `true`. + * + * This can be changed manually to change the half-open behavior of an existing`Duplex` stream instance, but must be changed before the `'end'` event is + * emitted. + * @since v0.9.4 + */ + allowHalfOpen: boolean; + constructor(opts?: DuplexOptions); + /** + * A utility method for creating duplex streams. + * + * - `Stream` converts writable stream into writable `Duplex` and readable stream + * to `Duplex`. + * - `Blob` converts into readable `Duplex`. + * - `string` converts into readable `Duplex`. + * - `ArrayBuffer` converts into readable `Duplex`. + * - `AsyncIterable` converts into a readable `Duplex`. Cannot yield `null`. + * - `AsyncGeneratorFunction` converts into a readable/writable transform + * `Duplex`. Must take a source `AsyncIterable` as first parameter. Cannot yield + * `null`. + * - `AsyncFunction` converts into a writable `Duplex`. Must return + * either `null` or `undefined` + * - `Object ({ writable, readable })` converts `readable` and + * `writable` into `Stream` and then combines them into `Duplex` where the + * `Duplex` will write to the `writable` and read from the `readable`. + * - `Promise` converts into readable `Duplex`. Value `null` is ignored. + * + * @since v16.8.0 + */ + static from( + src: + | Stream + | NodeBlob + | ArrayBuffer + | string + | Iterable + | AsyncIterable + | AsyncGeneratorFunction + | Promise + | Object, + ): Duplex; + _write(chunk: any, encoding: BufferEncoding, callback: (error?: Error | null) => void): void; + _writev?( + chunks: Array<{ + chunk: any; + encoding: BufferEncoding; + }>, + callback: (error?: Error | null) => void, + ): void; + _destroy(error: Error | null, callback: (error: Error | null) => void): void; + _final(callback: (error?: Error | null) => void): void; + write(chunk: any, encoding?: BufferEncoding, cb?: (error: Error | null | undefined) => void): boolean; + write(chunk: any, cb?: (error: Error | null | undefined) => void): boolean; + setDefaultEncoding(encoding: BufferEncoding): this; + end(cb?: () => void): this; + end(chunk: any, cb?: () => void): this; + end(chunk: any, encoding?: BufferEncoding, cb?: () => void): this; + cork(): void; + uncork(): void; + /** + * A utility method for creating a web `ReadableStream` and `WritableStream` from a `Duplex`. + * @since v17.0.0 + * @experimental + */ + static toWeb(streamDuplex: Duplex): { + readable: streamWeb.ReadableStream; + writable: streamWeb.WritableStream; + }; + /** + * A utility method for creating a `Duplex` from a web `ReadableStream` and `WritableStream`. + * @since v17.0.0 + * @experimental + */ + static fromWeb( + duplexStream: { + readable: streamWeb.ReadableStream; + writable: streamWeb.WritableStream; + }, + options?: Pick< + DuplexOptions, + "allowHalfOpen" | "decodeStrings" | "encoding" | "highWaterMark" | "objectMode" | "signal" + >, + ): Duplex; + /** + * Event emitter + * The defined events on documents including: + * 1. close + * 2. data + * 3. drain + * 4. end + * 5. error + * 6. finish + * 7. pause + * 8. pipe + * 9. readable + * 10. resume + * 11. unpipe + */ + addListener(event: "close", listener: () => void): this; + addListener(event: "data", listener: (chunk: any) => void): this; + addListener(event: "drain", listener: () => void): this; + addListener(event: "end", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "finish", listener: () => void): this; + addListener(event: "pause", listener: () => void): this; + addListener(event: "pipe", listener: (src: Readable) => void): this; + addListener(event: "readable", listener: () => void): this; + addListener(event: "resume", listener: () => void): this; + addListener(event: "unpipe", listener: (src: Readable) => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + emit(event: "close"): boolean; + emit(event: "data", chunk: any): boolean; + emit(event: "drain"): boolean; + emit(event: "end"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "finish"): boolean; + emit(event: "pause"): boolean; + emit(event: "pipe", src: Readable): boolean; + emit(event: "readable"): boolean; + emit(event: "resume"): boolean; + emit(event: "unpipe", src: Readable): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on(event: "close", listener: () => void): this; + on(event: "data", listener: (chunk: any) => void): this; + on(event: "drain", listener: () => void): this; + on(event: "end", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "finish", listener: () => void): this; + on(event: "pause", listener: () => void): this; + on(event: "pipe", listener: (src: Readable) => void): this; + on(event: "readable", listener: () => void): this; + on(event: "resume", listener: () => void): this; + on(event: "unpipe", listener: (src: Readable) => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "data", listener: (chunk: any) => void): this; + once(event: "drain", listener: () => void): this; + once(event: "end", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "finish", listener: () => void): this; + once(event: "pause", listener: () => void): this; + once(event: "pipe", listener: (src: Readable) => void): this; + once(event: "readable", listener: () => void): this; + once(event: "resume", listener: () => void): this; + once(event: "unpipe", listener: (src: Readable) => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "data", listener: (chunk: any) => void): this; + prependListener(event: "drain", listener: () => void): this; + prependListener(event: "end", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "finish", listener: () => void): this; + prependListener(event: "pause", listener: () => void): this; + prependListener(event: "pipe", listener: (src: Readable) => void): this; + prependListener(event: "readable", listener: () => void): this; + prependListener(event: "resume", listener: () => void): this; + prependListener(event: "unpipe", listener: (src: Readable) => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "data", listener: (chunk: any) => void): this; + prependOnceListener(event: "drain", listener: () => void): this; + prependOnceListener(event: "end", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "finish", listener: () => void): this; + prependOnceListener(event: "pause", listener: () => void): this; + prependOnceListener(event: "pipe", listener: (src: Readable) => void): this; + prependOnceListener(event: "readable", listener: () => void): this; + prependOnceListener(event: "resume", listener: () => void): this; + prependOnceListener(event: "unpipe", listener: (src: Readable) => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + removeListener(event: "close", listener: () => void): this; + removeListener(event: "data", listener: (chunk: any) => void): this; + removeListener(event: "drain", listener: () => void): this; + removeListener(event: "end", listener: () => void): this; + removeListener(event: "error", listener: (err: Error) => void): this; + removeListener(event: "finish", listener: () => void): this; + removeListener(event: "pause", listener: () => void): this; + removeListener(event: "pipe", listener: (src: Readable) => void): this; + removeListener(event: "readable", listener: () => void): this; + removeListener(event: "resume", listener: () => void): this; + removeListener(event: "unpipe", listener: (src: Readable) => void): this; + removeListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + type TransformCallback = (error?: Error | null, data?: any) => void; + interface TransformOptions extends DuplexOptions { + construct?(this: Transform, callback: (error?: Error | null) => void): void; + read?(this: Transform, size: number): void; + write?( + this: Transform, + chunk: any, + encoding: BufferEncoding, + callback: (error?: Error | null) => void, + ): void; + writev?( + this: Transform, + chunks: Array<{ + chunk: any; + encoding: BufferEncoding; + }>, + callback: (error?: Error | null) => void, + ): void; + final?(this: Transform, callback: (error?: Error | null) => void): void; + destroy?(this: Transform, error: Error | null, callback: (error: Error | null) => void): void; + transform?(this: Transform, chunk: any, encoding: BufferEncoding, callback: TransformCallback): void; + flush?(this: Transform, callback: TransformCallback): void; + } + /** + * Transform streams are `Duplex` streams where the output is in some way + * related to the input. Like all `Duplex` streams, `Transform` streams + * implement both the `Readable` and `Writable` interfaces. + * + * Examples of `Transform` streams include: + * + * * `zlib streams` + * * `crypto streams` + * @since v0.9.4 + */ + class Transform extends Duplex { + constructor(opts?: TransformOptions); + _transform(chunk: any, encoding: BufferEncoding, callback: TransformCallback): void; + _flush(callback: TransformCallback): void; + } + /** + * The `stream.PassThrough` class is a trivial implementation of a `Transform` stream that simply passes the input bytes across to the output. Its purpose is + * primarily for examples and testing, but there are some use cases where`stream.PassThrough` is useful as a building block for novel sorts of streams. + */ + class PassThrough extends Transform {} + /** + * A stream to attach a signal to. + * + * Attaches an AbortSignal to a readable or writeable stream. This lets code + * control stream destruction using an `AbortController`. + * + * Calling `abort` on the `AbortController` corresponding to the passed`AbortSignal` will behave the same way as calling `.destroy(new AbortError())`on the stream, and `controller.error(new + * AbortError())` for webstreams. + * + * ```js + * const fs = require('node:fs'); + * + * const controller = new AbortController(); + * const read = addAbortSignal( + * controller.signal, + * fs.createReadStream(('object.json')), + * ); + * // Later, abort the operation closing the stream + * controller.abort(); + * ``` + * + * Or using an `AbortSignal` with a readable stream as an async iterable: + * + * ```js + * const controller = new AbortController(); + * setTimeout(() => controller.abort(), 10_000); // set a timeout + * const stream = addAbortSignal( + * controller.signal, + * fs.createReadStream(('object.json')), + * ); + * (async () => { + * try { + * for await (const chunk of stream) { + * await process(chunk); + * } + * } catch (e) { + * if (e.name === 'AbortError') { + * // The operation was cancelled + * } else { + * throw e; + * } + * } + * })(); + * ``` + * + * Or using an `AbortSignal` with a ReadableStream: + * + * ```js + * const controller = new AbortController(); + * const rs = new ReadableStream({ + * start(controller) { + * controller.enqueue('hello'); + * controller.enqueue('world'); + * controller.close(); + * }, + * }); + * + * addAbortSignal(controller.signal, rs); + * + * finished(rs, (err) => { + * if (err) { + * if (err.name === 'AbortError') { + * // The operation was cancelled + * } + * } + * }); + * + * const reader = rs.getReader(); + * + * reader.read().then(({ value, done }) => { + * console.log(value); // hello + * console.log(done); // false + * controller.abort(); + * }); + * ``` + * @since v15.4.0 + * @param signal A signal representing possible cancellation + * @param stream a stream to attach a signal to + */ + function addAbortSignal(signal: AbortSignal, stream: T): T; + /** + * Returns the default highWaterMark used by streams. + * Defaults to `16384` (16 KiB), or `16` for `objectMode`. + * @since v19.9.0 + * @param objectMode + */ + function getDefaultHighWaterMark(objectMode: boolean): number; + /** + * Sets the default highWaterMark used by streams. + * @since v19.9.0 + * @param objectMode + * @param value highWaterMark value + */ + function setDefaultHighWaterMark(objectMode: boolean, value: number): void; + interface FinishedOptions extends Abortable { + error?: boolean | undefined; + readable?: boolean | undefined; + writable?: boolean | undefined; + } + /** + * A readable and/or writable stream/webstream. + * + * A function to get notified when a stream is no longer readable, writable + * or has experienced an error or a premature close event. + * + * ```js + * const { finished } = require('node:stream'); + * const fs = require('node:fs'); + * + * const rs = fs.createReadStream('archive.tar'); + * + * finished(rs, (err) => { + * if (err) { + * console.error('Stream failed.', err); + * } else { + * console.log('Stream is done reading.'); + * } + * }); + * + * rs.resume(); // Drain the stream. + * ``` + * + * Especially useful in error handling scenarios where a stream is destroyed + * prematurely (like an aborted HTTP request), and will not emit `'end'`or `'finish'`. + * + * The `finished` API provides `promise version`. + * + * `stream.finished()` leaves dangling event listeners (in particular`'error'`, `'end'`, `'finish'` and `'close'`) after `callback` has been + * invoked. The reason for this is so that unexpected `'error'` events (due to + * incorrect stream implementations) do not cause unexpected crashes. + * If this is unwanted behavior then the returned cleanup function needs to be + * invoked in the callback: + * + * ```js + * const cleanup = finished(rs, (err) => { + * cleanup(); + * // ... + * }); + * ``` + * @since v10.0.0 + * @param stream A readable and/or writable stream. + * @param callback A callback function that takes an optional error argument. + * @return A cleanup function which removes all registered listeners. + */ + function finished( + stream: NodeJS.ReadableStream | NodeJS.WritableStream | NodeJS.ReadWriteStream, + options: FinishedOptions, + callback: (err?: NodeJS.ErrnoException | null) => void, + ): () => void; + function finished( + stream: NodeJS.ReadableStream | NodeJS.WritableStream | NodeJS.ReadWriteStream, + callback: (err?: NodeJS.ErrnoException | null) => void, + ): () => void; + namespace finished { + function __promisify__( + stream: NodeJS.ReadableStream | NodeJS.WritableStream | NodeJS.ReadWriteStream, + options?: FinishedOptions, + ): Promise; + } + type PipelineSourceFunction = () => Iterable | AsyncIterable; + type PipelineSource = Iterable | AsyncIterable | NodeJS.ReadableStream | PipelineSourceFunction; + type PipelineTransform, U> = + | NodeJS.ReadWriteStream + | (( + source: S extends (...args: any[]) => Iterable | AsyncIterable ? AsyncIterable + : S, + ) => AsyncIterable); + type PipelineTransformSource = PipelineSource | PipelineTransform; + type PipelineDestinationIterableFunction = (source: AsyncIterable) => AsyncIterable; + type PipelineDestinationPromiseFunction = (source: AsyncIterable) => Promise

; + type PipelineDestination, P> = S extends + PipelineTransformSource ? + | NodeJS.WritableStream + | PipelineDestinationIterableFunction + | PipelineDestinationPromiseFunction + : never; + type PipelineCallback> = S extends + PipelineDestinationPromiseFunction ? (err: NodeJS.ErrnoException | null, value: P) => void + : (err: NodeJS.ErrnoException | null) => void; + type PipelinePromise> = S extends + PipelineDestinationPromiseFunction ? Promise

: Promise; + interface PipelineOptions { + signal?: AbortSignal | undefined; + end?: boolean | undefined; + } + /** + * A module method to pipe between streams and generators forwarding errors and + * properly cleaning up and provide a callback when the pipeline is complete. + * + * ```js + * const { pipeline } = require('node:stream'); + * const fs = require('node:fs'); + * const zlib = require('node:zlib'); + * + * // Use the pipeline API to easily pipe a series of streams + * // together and get notified when the pipeline is fully done. + * + * // A pipeline to gzip a potentially huge tar file efficiently: + * + * pipeline( + * fs.createReadStream('archive.tar'), + * zlib.createGzip(), + * fs.createWriteStream('archive.tar.gz'), + * (err) => { + * if (err) { + * console.error('Pipeline failed.', err); + * } else { + * console.log('Pipeline succeeded.'); + * } + * }, + * ); + * ``` + * + * The `pipeline` API provides a `promise version`. + * + * `stream.pipeline()` will call `stream.destroy(err)` on all streams except: + * + * * `Readable` streams which have emitted `'end'` or `'close'`. + * * `Writable` streams which have emitted `'finish'` or `'close'`. + * + * `stream.pipeline()` leaves dangling event listeners on the streams + * after the `callback` has been invoked. In the case of reuse of streams after + * failure, this can cause event listener leaks and swallowed errors. If the last + * stream is readable, dangling event listeners will be removed so that the last + * stream can be consumed later. + * + * `stream.pipeline()` closes all the streams when an error is raised. + * The `IncomingRequest` usage with `pipeline` could lead to an unexpected behavior + * once it would destroy the socket without sending the expected response. + * See the example below: + * + * ```js + * const fs = require('node:fs'); + * const http = require('node:http'); + * const { pipeline } = require('node:stream'); + * + * const server = http.createServer((req, res) => { + * const fileStream = fs.createReadStream('./fileNotExist.txt'); + * pipeline(fileStream, res, (err) => { + * if (err) { + * console.log(err); // No such file + * // this message can't be sent once `pipeline` already destroyed the socket + * return res.end('error!!!'); + * } + * }); + * }); + * ``` + * @since v10.0.0 + * @param callback Called when the pipeline is fully done. + */ + function pipeline, B extends PipelineDestination>( + source: A, + destination: B, + callback?: PipelineCallback, + ): B extends NodeJS.WritableStream ? B : NodeJS.WritableStream; + function pipeline< + A extends PipelineSource, + T1 extends PipelineTransform, + B extends PipelineDestination, + >( + source: A, + transform1: T1, + destination: B, + callback?: PipelineCallback, + ): B extends NodeJS.WritableStream ? B : NodeJS.WritableStream; + function pipeline< + A extends PipelineSource, + T1 extends PipelineTransform, + T2 extends PipelineTransform, + B extends PipelineDestination, + >( + source: A, + transform1: T1, + transform2: T2, + destination: B, + callback?: PipelineCallback, + ): B extends NodeJS.WritableStream ? B : NodeJS.WritableStream; + function pipeline< + A extends PipelineSource, + T1 extends PipelineTransform, + T2 extends PipelineTransform, + T3 extends PipelineTransform, + B extends PipelineDestination, + >( + source: A, + transform1: T1, + transform2: T2, + transform3: T3, + destination: B, + callback?: PipelineCallback, + ): B extends NodeJS.WritableStream ? B : NodeJS.WritableStream; + function pipeline< + A extends PipelineSource, + T1 extends PipelineTransform, + T2 extends PipelineTransform, + T3 extends PipelineTransform, + T4 extends PipelineTransform, + B extends PipelineDestination, + >( + source: A, + transform1: T1, + transform2: T2, + transform3: T3, + transform4: T4, + destination: B, + callback?: PipelineCallback, + ): B extends NodeJS.WritableStream ? B : NodeJS.WritableStream; + function pipeline( + streams: ReadonlyArray, + callback?: (err: NodeJS.ErrnoException | null) => void, + ): NodeJS.WritableStream; + function pipeline( + stream1: NodeJS.ReadableStream, + stream2: NodeJS.ReadWriteStream | NodeJS.WritableStream, + ...streams: Array< + NodeJS.ReadWriteStream | NodeJS.WritableStream | ((err: NodeJS.ErrnoException | null) => void) + > + ): NodeJS.WritableStream; + namespace pipeline { + function __promisify__, B extends PipelineDestination>( + source: A, + destination: B, + options?: PipelineOptions, + ): PipelinePromise; + function __promisify__< + A extends PipelineSource, + T1 extends PipelineTransform, + B extends PipelineDestination, + >( + source: A, + transform1: T1, + destination: B, + options?: PipelineOptions, + ): PipelinePromise; + function __promisify__< + A extends PipelineSource, + T1 extends PipelineTransform, + T2 extends PipelineTransform, + B extends PipelineDestination, + >( + source: A, + transform1: T1, + transform2: T2, + destination: B, + options?: PipelineOptions, + ): PipelinePromise; + function __promisify__< + A extends PipelineSource, + T1 extends PipelineTransform, + T2 extends PipelineTransform, + T3 extends PipelineTransform, + B extends PipelineDestination, + >( + source: A, + transform1: T1, + transform2: T2, + transform3: T3, + destination: B, + options?: PipelineOptions, + ): PipelinePromise; + function __promisify__< + A extends PipelineSource, + T1 extends PipelineTransform, + T2 extends PipelineTransform, + T3 extends PipelineTransform, + T4 extends PipelineTransform, + B extends PipelineDestination, + >( + source: A, + transform1: T1, + transform2: T2, + transform3: T3, + transform4: T4, + destination: B, + options?: PipelineOptions, + ): PipelinePromise; + function __promisify__( + streams: ReadonlyArray, + options?: PipelineOptions, + ): Promise; + function __promisify__( + stream1: NodeJS.ReadableStream, + stream2: NodeJS.ReadWriteStream | NodeJS.WritableStream, + ...streams: Array + ): Promise; + } + interface Pipe { + close(): void; + hasRef(): boolean; + ref(): void; + unref(): void; + } + /** + * Returns whether the stream has encountered an error. + * @since v17.3.0, v16.14.0 + * @experimental + */ + function isErrored(stream: Readable | Writable | NodeJS.ReadableStream | NodeJS.WritableStream): boolean; + /** + * Returns whether the stream is readable. + * @since v17.4.0, v16.14.0 + * @experimental + */ + function isReadable(stream: Readable | NodeJS.ReadableStream): boolean; + const promises: typeof streamPromises; + const consumers: typeof streamConsumers; + } + export = internal; +} +declare module "node:stream" { + import stream = require("stream"); + export = stream; +} diff --git a/task/node_modules/@types/node/stream/consumers.d.ts b/task/node_modules/@types/node/stream/consumers.d.ts new file mode 100644 index 0000000..5ad9cba --- /dev/null +++ b/task/node_modules/@types/node/stream/consumers.d.ts @@ -0,0 +1,12 @@ +declare module "stream/consumers" { + import { Blob as NodeBlob } from "node:buffer"; + import { Readable } from "node:stream"; + function buffer(stream: NodeJS.ReadableStream | Readable | AsyncIterable): Promise; + function text(stream: NodeJS.ReadableStream | Readable | AsyncIterable): Promise; + function arrayBuffer(stream: NodeJS.ReadableStream | Readable | AsyncIterable): Promise; + function blob(stream: NodeJS.ReadableStream | Readable | AsyncIterable): Promise; + function json(stream: NodeJS.ReadableStream | Readable | AsyncIterable): Promise; +} +declare module "node:stream/consumers" { + export * from "stream/consumers"; +} diff --git a/task/node_modules/@types/node/stream/promises.d.ts b/task/node_modules/@types/node/stream/promises.d.ts new file mode 100644 index 0000000..6eac5b7 --- /dev/null +++ b/task/node_modules/@types/node/stream/promises.d.ts @@ -0,0 +1,83 @@ +declare module "stream/promises" { + import { + FinishedOptions, + PipelineDestination, + PipelineOptions, + PipelinePromise, + PipelineSource, + PipelineTransform, + } from "node:stream"; + function finished( + stream: NodeJS.ReadableStream | NodeJS.WritableStream | NodeJS.ReadWriteStream, + options?: FinishedOptions, + ): Promise; + function pipeline, B extends PipelineDestination>( + source: A, + destination: B, + options?: PipelineOptions, + ): PipelinePromise; + function pipeline< + A extends PipelineSource, + T1 extends PipelineTransform, + B extends PipelineDestination, + >( + source: A, + transform1: T1, + destination: B, + options?: PipelineOptions, + ): PipelinePromise; + function pipeline< + A extends PipelineSource, + T1 extends PipelineTransform, + T2 extends PipelineTransform, + B extends PipelineDestination, + >( + source: A, + transform1: T1, + transform2: T2, + destination: B, + options?: PipelineOptions, + ): PipelinePromise; + function pipeline< + A extends PipelineSource, + T1 extends PipelineTransform, + T2 extends PipelineTransform, + T3 extends PipelineTransform, + B extends PipelineDestination, + >( + source: A, + transform1: T1, + transform2: T2, + transform3: T3, + destination: B, + options?: PipelineOptions, + ): PipelinePromise; + function pipeline< + A extends PipelineSource, + T1 extends PipelineTransform, + T2 extends PipelineTransform, + T3 extends PipelineTransform, + T4 extends PipelineTransform, + B extends PipelineDestination, + >( + source: A, + transform1: T1, + transform2: T2, + transform3: T3, + transform4: T4, + destination: B, + options?: PipelineOptions, + ): PipelinePromise; + function pipeline( + streams: ReadonlyArray, + options?: PipelineOptions, + ): Promise; + function pipeline( + stream1: NodeJS.ReadableStream, + stream2: NodeJS.ReadWriteStream | NodeJS.WritableStream, + ...streams: Array + ): Promise; +} +declare module "node:stream/promises" { + export * from "stream/promises"; +} diff --git a/task/node_modules/@types/node/stream/web.d.ts b/task/node_modules/@types/node/stream/web.d.ts new file mode 100644 index 0000000..0d91613 --- /dev/null +++ b/task/node_modules/@types/node/stream/web.d.ts @@ -0,0 +1,350 @@ +declare module "stream/web" { + // stub module, pending copy&paste from .d.ts or manual impl + // copy from lib.dom.d.ts + interface ReadableWritablePair { + readable: ReadableStream; + /** + * Provides a convenient, chainable way of piping this readable stream + * through a transform stream (or any other { writable, readable } + * pair). It simply pipes the stream into the writable side of the + * supplied pair, and returns the readable side for further use. + * + * Piping a stream will lock it for the duration of the pipe, preventing + * any other consumer from acquiring a reader. + */ + writable: WritableStream; + } + interface StreamPipeOptions { + preventAbort?: boolean; + preventCancel?: boolean; + /** + * Pipes this readable stream to a given writable stream destination. + * The way in which the piping process behaves under various error + * conditions can be customized with a number of passed options. It + * returns a promise that fulfills when the piping process completes + * successfully, or rejects if any errors were encountered. + * + * Piping a stream will lock it for the duration of the pipe, preventing + * any other consumer from acquiring a reader. + * + * Errors and closures of the source and destination streams propagate + * as follows: + * + * An error in this source readable stream will abort destination, + * unless preventAbort is truthy. The returned promise will be rejected + * with the source's error, or with any error that occurs during + * aborting the destination. + * + * An error in destination will cancel this source readable stream, + * unless preventCancel is truthy. The returned promise will be rejected + * with the destination's error, or with any error that occurs during + * canceling the source. + * + * When this source readable stream closes, destination will be closed, + * unless preventClose is truthy. The returned promise will be fulfilled + * once this process completes, unless an error is encountered while + * closing the destination, in which case it will be rejected with that + * error. + * + * If destination starts out closed or closing, this source readable + * stream will be canceled, unless preventCancel is true. The returned + * promise will be rejected with an error indicating piping to a closed + * stream failed, or with any error that occurs during canceling the + * source. + * + * The signal option can be set to an AbortSignal to allow aborting an + * ongoing pipe operation via the corresponding AbortController. In this + * case, this source readable stream will be canceled, and destination + * aborted, unless the respective options preventCancel or preventAbort + * are set. + */ + preventClose?: boolean; + signal?: AbortSignal; + } + interface ReadableStreamGenericReader { + readonly closed: Promise; + cancel(reason?: any): Promise; + } + interface ReadableStreamDefaultReadValueResult { + done: false; + value: T; + } + interface ReadableStreamDefaultReadDoneResult { + done: true; + value?: undefined; + } + type ReadableStreamController = ReadableStreamDefaultController; + type ReadableStreamDefaultReadResult = + | ReadableStreamDefaultReadValueResult + | ReadableStreamDefaultReadDoneResult; + interface ReadableStreamReadValueResult { + done: false; + value: T; + } + interface ReadableStreamReadDoneResult { + done: true; + value?: T; + } + type ReadableStreamReadResult = ReadableStreamReadValueResult | ReadableStreamReadDoneResult; + interface ReadableByteStreamControllerCallback { + (controller: ReadableByteStreamController): void | PromiseLike; + } + interface UnderlyingSinkAbortCallback { + (reason?: any): void | PromiseLike; + } + interface UnderlyingSinkCloseCallback { + (): void | PromiseLike; + } + interface UnderlyingSinkStartCallback { + (controller: WritableStreamDefaultController): any; + } + interface UnderlyingSinkWriteCallback { + (chunk: W, controller: WritableStreamDefaultController): void | PromiseLike; + } + interface UnderlyingSourceCancelCallback { + (reason?: any): void | PromiseLike; + } + interface UnderlyingSourcePullCallback { + (controller: ReadableStreamController): void | PromiseLike; + } + interface UnderlyingSourceStartCallback { + (controller: ReadableStreamController): any; + } + interface TransformerFlushCallback { + (controller: TransformStreamDefaultController): void | PromiseLike; + } + interface TransformerStartCallback { + (controller: TransformStreamDefaultController): any; + } + interface TransformerTransformCallback { + (chunk: I, controller: TransformStreamDefaultController): void | PromiseLike; + } + interface UnderlyingByteSource { + autoAllocateChunkSize?: number; + cancel?: ReadableStreamErrorCallback; + pull?: ReadableByteStreamControllerCallback; + start?: ReadableByteStreamControllerCallback; + type: "bytes"; + } + interface UnderlyingSource { + cancel?: UnderlyingSourceCancelCallback; + pull?: UnderlyingSourcePullCallback; + start?: UnderlyingSourceStartCallback; + type?: undefined; + } + interface UnderlyingSink { + abort?: UnderlyingSinkAbortCallback; + close?: UnderlyingSinkCloseCallback; + start?: UnderlyingSinkStartCallback; + type?: undefined; + write?: UnderlyingSinkWriteCallback; + } + interface ReadableStreamErrorCallback { + (reason: any): void | PromiseLike; + } + /** This Streams API interface represents a readable stream of byte data. */ + interface ReadableStream { + readonly locked: boolean; + cancel(reason?: any): Promise; + getReader(): ReadableStreamDefaultReader; + getReader(options: { mode: "byob" }): ReadableStreamBYOBReader; + pipeThrough(transform: ReadableWritablePair, options?: StreamPipeOptions): ReadableStream; + pipeTo(destination: WritableStream, options?: StreamPipeOptions): Promise; + tee(): [ReadableStream, ReadableStream]; + values(options?: { preventCancel?: boolean }): AsyncIterableIterator; + [Symbol.asyncIterator](): AsyncIterableIterator; + } + const ReadableStream: { + prototype: ReadableStream; + new(underlyingSource: UnderlyingByteSource, strategy?: QueuingStrategy): ReadableStream; + new(underlyingSource?: UnderlyingSource, strategy?: QueuingStrategy): ReadableStream; + }; + interface ReadableStreamDefaultReader extends ReadableStreamGenericReader { + read(): Promise>; + releaseLock(): void; + } + interface ReadableStreamBYOBReader extends ReadableStreamGenericReader { + read(view: T): Promise>; + releaseLock(): void; + } + const ReadableStreamDefaultReader: { + prototype: ReadableStreamDefaultReader; + new(stream: ReadableStream): ReadableStreamDefaultReader; + }; + const ReadableStreamBYOBReader: any; + const ReadableStreamBYOBRequest: any; + interface ReadableByteStreamController { + readonly byobRequest: undefined; + readonly desiredSize: number | null; + close(): void; + enqueue(chunk: ArrayBufferView): void; + error(error?: any): void; + } + const ReadableByteStreamController: { + prototype: ReadableByteStreamController; + new(): ReadableByteStreamController; + }; + interface ReadableStreamDefaultController { + readonly desiredSize: number | null; + close(): void; + enqueue(chunk?: R): void; + error(e?: any): void; + } + const ReadableStreamDefaultController: { + prototype: ReadableStreamDefaultController; + new(): ReadableStreamDefaultController; + }; + interface Transformer { + flush?: TransformerFlushCallback; + readableType?: undefined; + start?: TransformerStartCallback; + transform?: TransformerTransformCallback; + writableType?: undefined; + } + interface TransformStream { + readonly readable: ReadableStream; + readonly writable: WritableStream; + } + const TransformStream: { + prototype: TransformStream; + new( + transformer?: Transformer, + writableStrategy?: QueuingStrategy, + readableStrategy?: QueuingStrategy, + ): TransformStream; + }; + interface TransformStreamDefaultController { + readonly desiredSize: number | null; + enqueue(chunk?: O): void; + error(reason?: any): void; + terminate(): void; + } + const TransformStreamDefaultController: { + prototype: TransformStreamDefaultController; + new(): TransformStreamDefaultController; + }; + /** + * This Streams API interface provides a standard abstraction for writing + * streaming data to a destination, known as a sink. This object comes with + * built-in back pressure and queuing. + */ + interface WritableStream { + readonly locked: boolean; + abort(reason?: any): Promise; + close(): Promise; + getWriter(): WritableStreamDefaultWriter; + } + const WritableStream: { + prototype: WritableStream; + new(underlyingSink?: UnderlyingSink, strategy?: QueuingStrategy): WritableStream; + }; + /** + * This Streams API interface is the object returned by + * WritableStream.getWriter() and once created locks the < writer to the + * WritableStream ensuring that no other streams can write to the underlying + * sink. + */ + interface WritableStreamDefaultWriter { + readonly closed: Promise; + readonly desiredSize: number | null; + readonly ready: Promise; + abort(reason?: any): Promise; + close(): Promise; + releaseLock(): void; + write(chunk?: W): Promise; + } + const WritableStreamDefaultWriter: { + prototype: WritableStreamDefaultWriter; + new(stream: WritableStream): WritableStreamDefaultWriter; + }; + /** + * This Streams API interface represents a controller allowing control of a + * WritableStream's state. When constructing a WritableStream, the + * underlying sink is given a corresponding WritableStreamDefaultController + * instance to manipulate. + */ + interface WritableStreamDefaultController { + error(e?: any): void; + } + const WritableStreamDefaultController: { + prototype: WritableStreamDefaultController; + new(): WritableStreamDefaultController; + }; + interface QueuingStrategy { + highWaterMark?: number; + size?: QueuingStrategySize; + } + interface QueuingStrategySize { + (chunk?: T): number; + } + interface QueuingStrategyInit { + /** + * Creates a new ByteLengthQueuingStrategy with the provided high water + * mark. + * + * Note that the provided high water mark will not be validated ahead of + * time. Instead, if it is negative, NaN, or not a number, the resulting + * ByteLengthQueuingStrategy will cause the corresponding stream + * constructor to throw. + */ + highWaterMark: number; + } + /** + * This Streams API interface provides a built-in byte length queuing + * strategy that can be used when constructing streams. + */ + interface ByteLengthQueuingStrategy extends QueuingStrategy { + readonly highWaterMark: number; + readonly size: QueuingStrategySize; + } + const ByteLengthQueuingStrategy: { + prototype: ByteLengthQueuingStrategy; + new(init: QueuingStrategyInit): ByteLengthQueuingStrategy; + }; + /** + * This Streams API interface provides a built-in byte length queuing + * strategy that can be used when constructing streams. + */ + interface CountQueuingStrategy extends QueuingStrategy { + readonly highWaterMark: number; + readonly size: QueuingStrategySize; + } + const CountQueuingStrategy: { + prototype: CountQueuingStrategy; + new(init: QueuingStrategyInit): CountQueuingStrategy; + }; + interface TextEncoderStream { + /** Returns "utf-8". */ + readonly encoding: "utf-8"; + readonly readable: ReadableStream; + readonly writable: WritableStream; + readonly [Symbol.toStringTag]: string; + } + const TextEncoderStream: { + prototype: TextEncoderStream; + new(): TextEncoderStream; + }; + interface TextDecoderOptions { + fatal?: boolean; + ignoreBOM?: boolean; + } + type BufferSource = ArrayBufferView | ArrayBuffer; + interface TextDecoderStream { + /** Returns encoding's name, lower cased. */ + readonly encoding: string; + /** Returns `true` if error mode is "fatal", and `false` otherwise. */ + readonly fatal: boolean; + /** Returns `true` if ignore BOM flag is set, and `false` otherwise. */ + readonly ignoreBOM: boolean; + readonly readable: ReadableStream; + readonly writable: WritableStream; + readonly [Symbol.toStringTag]: string; + } + const TextDecoderStream: { + prototype: TextDecoderStream; + new(label?: string, options?: TextDecoderOptions): TextDecoderStream; + }; +} +declare module "node:stream/web" { + export * from "stream/web"; +} diff --git a/task/node_modules/@types/node/string_decoder.d.ts b/task/node_modules/@types/node/string_decoder.d.ts new file mode 100644 index 0000000..b8691e1 --- /dev/null +++ b/task/node_modules/@types/node/string_decoder.d.ts @@ -0,0 +1,67 @@ +/** + * The `node:string_decoder` module provides an API for decoding `Buffer` objects + * into strings in a manner that preserves encoded multi-byte UTF-8 and UTF-16 + * characters. It can be accessed using: + * + * ```js + * const { StringDecoder } = require('node:string_decoder'); + * ``` + * + * The following example shows the basic use of the `StringDecoder` class. + * + * ```js + * const { StringDecoder } = require('node:string_decoder'); + * const decoder = new StringDecoder('utf8'); + * + * const cent = Buffer.from([0xC2, 0xA2]); + * console.log(decoder.write(cent)); // Prints: ¢ + * + * const euro = Buffer.from([0xE2, 0x82, 0xAC]); + * console.log(decoder.write(euro)); // Prints: € + * ``` + * + * When a `Buffer` instance is written to the `StringDecoder` instance, an + * internal buffer is used to ensure that the decoded string does not contain + * any incomplete multibyte characters. These are held in the buffer until the + * next call to `stringDecoder.write()` or until `stringDecoder.end()` is called. + * + * In the following example, the three UTF-8 encoded bytes of the European Euro + * symbol (`€`) are written over three separate operations: + * + * ```js + * const { StringDecoder } = require('node:string_decoder'); + * const decoder = new StringDecoder('utf8'); + * + * decoder.write(Buffer.from([0xE2])); + * decoder.write(Buffer.from([0x82])); + * console.log(decoder.end(Buffer.from([0xAC]))); // Prints: € + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/string_decoder.js) + */ +declare module "string_decoder" { + class StringDecoder { + constructor(encoding?: BufferEncoding); + /** + * Returns a decoded string, ensuring that any incomplete multibyte characters at + * the end of the `Buffer`, or `TypedArray`, or `DataView` are omitted from the + * returned string and stored in an internal buffer for the next call to`stringDecoder.write()` or `stringDecoder.end()`. + * @since v0.1.99 + * @param buffer The bytes to decode. + */ + write(buffer: Buffer): string; + /** + * Returns any remaining input stored in the internal buffer as a string. Bytes + * representing incomplete UTF-8 and UTF-16 characters will be replaced with + * substitution characters appropriate for the character encoding. + * + * If the `buffer` argument is provided, one final call to `stringDecoder.write()`is performed before returning the remaining input. + * After `end()` is called, the `stringDecoder` object can be reused for new input. + * @since v0.9.3 + * @param buffer The bytes to decode. + */ + end(buffer?: Buffer): string; + } +} +declare module "node:string_decoder" { + export * from "string_decoder"; +} diff --git a/task/node_modules/@types/node/test.d.ts b/task/node_modules/@types/node/test.d.ts new file mode 100644 index 0000000..44b6a96 --- /dev/null +++ b/task/node_modules/@types/node/test.d.ts @@ -0,0 +1,1382 @@ +/** + * The `node:test` module facilitates the creation of JavaScript tests. + * To access it: + * + * ```js + * import test from 'node:test'; + * ``` + * + * This module is only available under the `node:` scheme. The following will not + * work: + * + * ```js + * import test from 'test'; + * ``` + * + * Tests created via the `test` module consist of a single function that is + * processed in one of three ways: + * + * 1. A synchronous function that is considered failing if it throws an exception, + * and is considered passing otherwise. + * 2. A function that returns a `Promise` that is considered failing if the`Promise` rejects, and is considered passing if the `Promise` fulfills. + * 3. A function that receives a callback function. If the callback receives any + * truthy value as its first argument, the test is considered failing. If a + * falsy value is passed as the first argument to the callback, the test is + * considered passing. If the test function receives a callback function and + * also returns a `Promise`, the test will fail. + * + * The following example illustrates how tests are written using the`test` module. + * + * ```js + * test('synchronous passing test', (t) => { + * // This test passes because it does not throw an exception. + * assert.strictEqual(1, 1); + * }); + * + * test('synchronous failing test', (t) => { + * // This test fails because it throws an exception. + * assert.strictEqual(1, 2); + * }); + * + * test('asynchronous passing test', async (t) => { + * // This test passes because the Promise returned by the async + * // function is settled and not rejected. + * assert.strictEqual(1, 1); + * }); + * + * test('asynchronous failing test', async (t) => { + * // This test fails because the Promise returned by the async + * // function is rejected. + * assert.strictEqual(1, 2); + * }); + * + * test('failing test using Promises', (t) => { + * // Promises can be used directly as well. + * return new Promise((resolve, reject) => { + * setImmediate(() => { + * reject(new Error('this will cause the test to fail')); + * }); + * }); + * }); + * + * test('callback passing test', (t, done) => { + * // done() is the callback function. When the setImmediate() runs, it invokes + * // done() with no arguments. + * setImmediate(done); + * }); + * + * test('callback failing test', (t, done) => { + * // When the setImmediate() runs, done() is invoked with an Error object and + * // the test fails. + * setImmediate(() => { + * done(new Error('callback failure')); + * }); + * }); + * ``` + * + * If any tests fail, the process exit code is set to `1`. + * @since v18.0.0, v16.17.0 + * @see [source](https://github.com/nodejs/node/blob/v20.4.0/lib/test.js) + */ +declare module "node:test" { + import { Readable } from "node:stream"; + import { AsyncResource } from "node:async_hooks"; + /** + * ```js + * import { tap } from 'node:test/reporters'; + * import { run } from 'node:test'; + * import process from 'node:process'; + * import path from 'node:path'; + * + * run({ files: [path.resolve('./tests/test.js')] }) + * .compose(tap) + * .pipe(process.stdout); + * ``` + * @since v18.9.0, v16.19.0 + * @param options Configuration options for running tests. The following properties are supported: + */ + function run(options?: RunOptions): TestsStream; + /** + * The `test()` function is the value imported from the `test` module. Each + * invocation of this function results in reporting the test to the `TestsStream`. + * + * The `TestContext` object passed to the `fn` argument can be used to perform + * actions related to the current test. Examples include skipping the test, adding + * additional diagnostic information, or creating subtests. + * + * `test()` returns a `Promise` that fulfills once the test completes. + * if `test()` is called within a `describe()` block, it fulfills immediately. + * The return value can usually be discarded for top level tests. + * However, the return value from subtests should be used to prevent the parent + * test from finishing first and cancelling the subtest + * as shown in the following example. + * + * ```js + * test('top level test', async (t) => { + * // The setTimeout() in the following subtest would cause it to outlive its + * // parent test if 'await' is removed on the next line. Once the parent test + * // completes, it will cancel any outstanding subtests. + * await t.test('longer running subtest', async (t) => { + * return new Promise((resolve, reject) => { + * setTimeout(resolve, 1000); + * }); + * }); + * }); + * ``` + * + * The `timeout` option can be used to fail the test if it takes longer than`timeout` milliseconds to complete. However, it is not a reliable mechanism for + * canceling tests because a running test might block the application thread and + * thus prevent the scheduled cancellation. + * @since v18.0.0, v16.17.0 + * @param [name='The name'] The name of the test, which is displayed when reporting test results. + * @param options Configuration options for the test. The following properties are supported: + * @param [fn='A no-op function'] The function under test. The first argument to this function is a {@link TestContext} object. If the test uses callbacks, the callback function is passed as the + * second argument. + * @return Fulfilled with `undefined` once the test completes, or immediately if the test runs within {@link describe}. + */ + function test(name?: string, fn?: TestFn): Promise; + function test(name?: string, options?: TestOptions, fn?: TestFn): Promise; + function test(options?: TestOptions, fn?: TestFn): Promise; + function test(fn?: TestFn): Promise; + namespace test { + export { after, afterEach, before, beforeEach, describe, it, mock, only, run, skip, test, todo }; + } + /** + * The `describe()` function imported from the `node:test` module. Each + * invocation of this function results in the creation of a Subtest. + * After invocation of top level `describe` functions, + * all top level tests and suites will execute. + * @param [name='The name'] The name of the suite, which is displayed when reporting test results. + * @param options Configuration options for the suite. supports the same options as `test([name][, options][, fn])`. + * @param [fn='A no-op function'] The function under suite declaring all subtests and subsuites. The first argument to this function is a {@link SuiteContext} object. + * @return Immediately fulfilled with `undefined`. + */ + function describe(name?: string, options?: TestOptions, fn?: SuiteFn): Promise; + function describe(name?: string, fn?: SuiteFn): Promise; + function describe(options?: TestOptions, fn?: SuiteFn): Promise; + function describe(fn?: SuiteFn): Promise; + namespace describe { + /** + * Shorthand for skipping a suite, same as `describe([name], { skip: true }[, fn])`. + */ + function skip(name?: string, options?: TestOptions, fn?: SuiteFn): Promise; + function skip(name?: string, fn?: SuiteFn): Promise; + function skip(options?: TestOptions, fn?: SuiteFn): Promise; + function skip(fn?: SuiteFn): Promise; + /** + * Shorthand for marking a suite as `TODO`, same as `describe([name], { todo: true }[, fn])`. + */ + function todo(name?: string, options?: TestOptions, fn?: SuiteFn): Promise; + function todo(name?: string, fn?: SuiteFn): Promise; + function todo(options?: TestOptions, fn?: SuiteFn): Promise; + function todo(fn?: SuiteFn): Promise; + /** + * Shorthand for marking a suite as `only`, same as `describe([name], { only: true }[, fn])`. + * @since v18.15.0 + */ + function only(name?: string, options?: TestOptions, fn?: SuiteFn): Promise; + function only(name?: string, fn?: SuiteFn): Promise; + function only(options?: TestOptions, fn?: SuiteFn): Promise; + function only(fn?: SuiteFn): Promise; + } + /** + * Shorthand for `test()`. + * + * The `it()` function is imported from the `node:test` module. + * @since v18.6.0, v16.17.0 + */ + function it(name?: string, options?: TestOptions, fn?: TestFn): Promise; + function it(name?: string, fn?: TestFn): Promise; + function it(options?: TestOptions, fn?: TestFn): Promise; + function it(fn?: TestFn): Promise; + namespace it { + /** + * Shorthand for skipping a test, same as `it([name], { skip: true }[, fn])`. + */ + function skip(name?: string, options?: TestOptions, fn?: TestFn): Promise; + function skip(name?: string, fn?: TestFn): Promise; + function skip(options?: TestOptions, fn?: TestFn): Promise; + function skip(fn?: TestFn): Promise; + /** + * Shorthand for marking a test as `TODO`, same as `it([name], { todo: true }[, fn])`. + */ + function todo(name?: string, options?: TestOptions, fn?: TestFn): Promise; + function todo(name?: string, fn?: TestFn): Promise; + function todo(options?: TestOptions, fn?: TestFn): Promise; + function todo(fn?: TestFn): Promise; + /** + * Shorthand for marking a test as `only`, same as `it([name], { only: true }[, fn])`. + * @since v18.15.0 + */ + function only(name?: string, options?: TestOptions, fn?: TestFn): Promise; + function only(name?: string, fn?: TestFn): Promise; + function only(options?: TestOptions, fn?: TestFn): Promise; + function only(fn?: TestFn): Promise; + } + /** + * Shorthand for skipping a test, same as `test([name], { skip: true }[, fn])`. + * @since v20.2.0 + */ + function skip(name?: string, options?: TestOptions, fn?: TestFn): Promise; + function skip(name?: string, fn?: TestFn): Promise; + function skip(options?: TestOptions, fn?: TestFn): Promise; + function skip(fn?: TestFn): Promise; + /** + * Shorthand for marking a test as `TODO`, same as `test([name], { todo: true }[, fn])`. + * @since v20.2.0 + */ + function todo(name?: string, options?: TestOptions, fn?: TestFn): Promise; + function todo(name?: string, fn?: TestFn): Promise; + function todo(options?: TestOptions, fn?: TestFn): Promise; + function todo(fn?: TestFn): Promise; + /** + * Shorthand for marking a test as `only`, same as `test([name], { only: true }[, fn])`. + * @since v20.2.0 + */ + function only(name?: string, options?: TestOptions, fn?: TestFn): Promise; + function only(name?: string, fn?: TestFn): Promise; + function only(options?: TestOptions, fn?: TestFn): Promise; + function only(fn?: TestFn): Promise; + /** + * The type of a function under test. The first argument to this function is a + * {@link TestContext} object. If the test uses callbacks, the callback function is passed as + * the second argument. + */ + type TestFn = (t: TestContext, done: (result?: any) => void) => void | Promise; + /** + * The type of a function under Suite. + */ + type SuiteFn = (s: SuiteContext) => void | Promise; + interface TestShard { + /** + * A positive integer between 1 and `` that specifies the index of the shard to run. + */ + index: number; + /** + * A positive integer that specifies the total number of shards to split the test files to. + */ + total: number; + } + interface RunOptions { + /** + * If a number is provided, then that many files would run in parallel. + * If truthy, it would run (number of cpu cores - 1) files in parallel. + * If falsy, it would only run one file at a time. + * If unspecified, subtests inherit this value from their parent. + * @default true + */ + concurrency?: number | boolean | undefined; + /** + * An array containing the list of files to run. + * If unspecified, the test runner execution model will be used. + */ + files?: readonly string[] | undefined; + /** + * Allows aborting an in-progress test execution. + * @default undefined + */ + signal?: AbortSignal | undefined; + /** + * A number of milliseconds the test will fail after. + * If unspecified, subtests inherit this value from their parent. + * @default Infinity + */ + timeout?: number | undefined; + /** + * Sets inspector port of test child process. + * If a nullish value is provided, each process gets its own port, + * incremented from the primary's `process.debugPort`. + */ + inspectPort?: number | (() => number) | undefined; + /** + * That can be used to only run tests whose name matches the provided pattern. + * Test name patterns are interpreted as JavaScript regular expressions. + * For each test that is executed, any corresponding test hooks, such as `beforeEach()`, are also run. + */ + testNamePatterns?: string | RegExp | string[] | RegExp[]; + /** + * If truthy, the test context will only run tests that have the `only` option set + */ + only?: boolean; + /** + * A function that accepts the TestsStream instance and can be used to setup listeners before any tests are run. + */ + setup?: (root: Test) => void | Promise; + /** + * Whether to run in watch mode or not. + * @default false + */ + watch?: boolean | undefined; + /** + * Running tests in a specific shard. + * @default undefined + */ + shard?: TestShard | undefined; + } + class Test extends AsyncResource { + concurrency: number; + nesting: number; + only: boolean; + reporter: TestsStream; + runOnlySubtests: boolean; + testNumber: number; + timeout: number | null; + } + /** + * A successful call to `run()` method will return a new `TestsStream` object, streaming a series of events representing the execution of the tests.`TestsStream` will emit events, in the + * order of the tests definition + * @since v18.9.0, v16.19.0 + */ + class TestsStream extends Readable implements NodeJS.ReadableStream { + addListener(event: "test:diagnostic", listener: (data: DiagnosticData) => void): this; + addListener(event: "test:fail", listener: (data: TestFail) => void): this; + addListener(event: "test:pass", listener: (data: TestPass) => void): this; + addListener(event: "test:plan", listener: (data: TestPlan) => void): this; + addListener(event: "test:start", listener: (data: TestStart) => void): this; + addListener(event: "test:stderr", listener: (data: TestStderr) => void): this; + addListener(event: "test:stdout", listener: (data: TestStdout) => void): this; + addListener(event: string, listener: (...args: any[]) => void): this; + emit(event: "test:diagnostic", data: DiagnosticData): boolean; + emit(event: "test:fail", data: TestFail): boolean; + emit(event: "test:pass", data: TestPass): boolean; + emit(event: "test:plan", data: TestPlan): boolean; + emit(event: "test:start", data: TestStart): boolean; + emit(event: "test:stderr", data: TestStderr): boolean; + emit(event: "test:stdout", data: TestStdout): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on(event: "test:diagnostic", listener: (data: DiagnosticData) => void): this; + on(event: "test:fail", listener: (data: TestFail) => void): this; + on(event: "test:pass", listener: (data: TestPass) => void): this; + on(event: "test:plan", listener: (data: TestPlan) => void): this; + on(event: "test:start", listener: (data: TestStart) => void): this; + on(event: "test:stderr", listener: (data: TestStderr) => void): this; + on(event: "test:stdout", listener: (data: TestStdout) => void): this; + on(event: string, listener: (...args: any[]) => void): this; + once(event: "test:diagnostic", listener: (data: DiagnosticData) => void): this; + once(event: "test:fail", listener: (data: TestFail) => void): this; + once(event: "test:pass", listener: (data: TestPass) => void): this; + once(event: "test:plan", listener: (data: TestPlan) => void): this; + once(event: "test:start", listener: (data: TestStart) => void): this; + once(event: "test:stderr", listener: (data: TestStderr) => void): this; + once(event: "test:stdout", listener: (data: TestStdout) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "test:diagnostic", listener: (data: DiagnosticData) => void): this; + prependListener(event: "test:fail", listener: (data: TestFail) => void): this; + prependListener(event: "test:pass", listener: (data: TestPass) => void): this; + prependListener(event: "test:plan", listener: (data: TestPlan) => void): this; + prependListener(event: "test:start", listener: (data: TestStart) => void): this; + prependListener(event: "test:stderr", listener: (data: TestStderr) => void): this; + prependListener(event: "test:stdout", listener: (data: TestStdout) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "test:diagnostic", listener: (data: DiagnosticData) => void): this; + prependOnceListener(event: "test:fail", listener: (data: TestFail) => void): this; + prependOnceListener(event: "test:pass", listener: (data: TestPass) => void): this; + prependOnceListener(event: "test:plan", listener: (data: TestPlan) => void): this; + prependOnceListener(event: "test:start", listener: (data: TestStart) => void): this; + prependOnceListener(event: "test:stderr", listener: (data: TestStderr) => void): this; + prependOnceListener(event: "test:stdout", listener: (data: TestStdout) => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + } + /** + * An instance of `TestContext` is passed to each test function in order to + * interact with the test runner. However, the `TestContext` constructor is not + * exposed as part of the API. + * @since v18.0.0, v16.17.0 + */ + class TestContext { + /** + * This function is used to create a hook running before subtest of the current test. + * @param fn The hook function. If the hook uses callbacks, the callback function is passed as + * the second argument. Default: A no-op function. + * @param options Configuration options for the hook. + * @since v20.1.0 + */ + before: typeof before; + /** + * This function is used to create a hook running before each subtest of the current test. + * @param fn The hook function. If the hook uses callbacks, the callback function is passed as + * the second argument. Default: A no-op function. + * @param options Configuration options for the hook. + * @since v18.8.0 + */ + beforeEach: typeof beforeEach; + /** + * This function is used to create a hook that runs after the current test finishes. + * @param fn The hook function. If the hook uses callbacks, the callback function is passed as + * the second argument. Default: A no-op function. + * @param options Configuration options for the hook. + * @since v18.13.0 + */ + after: typeof after; + /** + * This function is used to create a hook running after each subtest of the current test. + * @param fn The hook function. If the hook uses callbacks, the callback function is passed as + * the second argument. Default: A no-op function. + * @param options Configuration options for the hook. + * @since v18.8.0 + */ + afterEach: typeof afterEach; + /** + * This function is used to write diagnostics to the output. Any diagnostic + * information is included at the end of the test's results. This function does + * not return a value. + * + * ```js + * test('top level test', (t) => { + * t.diagnostic('A diagnostic message'); + * }); + * ``` + * @since v18.0.0, v16.17.0 + * @param message Message to be reported. + */ + diagnostic(message: string): void; + /** + * The name of the test. + * @since v18.8.0, v16.18.0 + */ + readonly name: string; + /** + * If `shouldRunOnlyTests` is truthy, the test context will only run tests that + * have the `only` option set. Otherwise, all tests are run. If Node.js was not + * started with the `--test-only` command-line option, this function is a + * no-op. + * + * ```js + * test('top level test', (t) => { + * // The test context can be set to run subtests with the 'only' option. + * t.runOnly(true); + * return Promise.all([ + * t.test('this subtest is now skipped'), + * t.test('this subtest is run', { only: true }), + * ]); + * }); + * ``` + * @since v18.0.0, v16.17.0 + * @param shouldRunOnlyTests Whether or not to run `only` tests. + */ + runOnly(shouldRunOnlyTests: boolean): void; + /** + * ```js + * test('top level test', async (t) => { + * await fetch('some/uri', { signal: t.signal }); + * }); + * ``` + * @since v18.7.0, v16.17.0 + */ + readonly signal: AbortSignal; + /** + * This function causes the test's output to indicate the test as skipped. If`message` is provided, it is included in the output. Calling `skip()` does + * not terminate execution of the test function. This function does not return a + * value. + * + * ```js + * test('top level test', (t) => { + * // Make sure to return here as well if the test contains additional logic. + * t.skip('this is skipped'); + * }); + * ``` + * @since v18.0.0, v16.17.0 + * @param message Optional skip message. + */ + skip(message?: string): void; + /** + * This function adds a `TODO` directive to the test's output. If `message` is + * provided, it is included in the output. Calling `todo()` does not terminate + * execution of the test function. This function does not return a value. + * + * ```js + * test('top level test', (t) => { + * // This test is marked as `TODO` + * t.todo('this is a todo'); + * }); + * ``` + * @since v18.0.0, v16.17.0 + * @param message Optional `TODO` message. + */ + todo(message?: string): void; + /** + * This function is used to create subtests under the current test. This function behaves in + * the same fashion as the top level {@link test} function. + * @since v18.0.0 + * @param name The name of the test, which is displayed when reporting test results. + * Default: The `name` property of fn, or `''` if `fn` does not have a name. + * @param options Configuration options for the test + * @param fn The function under test. This first argument to this function is a + * {@link TestContext} object. If the test uses callbacks, the callback function is + * passed as the second argument. Default: A no-op function. + * @returns A {@link Promise} resolved with `undefined` once the test completes. + */ + test: typeof test; + /** + * Each test provides its own MockTracker instance. + */ + readonly mock: MockTracker; + } + /** + * An instance of `SuiteContext` is passed to each suite function in order to + * interact with the test runner. However, the `SuiteContext` constructor is not + * exposed as part of the API. + * @since v18.7.0, v16.17.0 + */ + class SuiteContext { + /** + * The name of the suite. + * @since v18.8.0, v16.18.0 + */ + readonly name: string; + /** + * Can be used to abort test subtasks when the test has been aborted. + * @since v18.7.0, v16.17.0 + */ + readonly signal: AbortSignal; + } + interface TestOptions { + /** + * If a number is provided, then that many tests would run in parallel. + * If truthy, it would run (number of cpu cores - 1) tests in parallel. + * For subtests, it will be `Infinity` tests in parallel. + * If falsy, it would only run one test at a time. + * If unspecified, subtests inherit this value from their parent. + * @default false + */ + concurrency?: number | boolean | undefined; + /** + * If truthy, and the test context is configured to run `only` tests, then this test will be + * run. Otherwise, the test is skipped. + * @default false + */ + only?: boolean | undefined; + /** + * Allows aborting an in-progress test. + * @since v18.8.0 + */ + signal?: AbortSignal | undefined; + /** + * If truthy, the test is skipped. If a string is provided, that string is displayed in the + * test results as the reason for skipping the test. + * @default false + */ + skip?: boolean | string | undefined; + /** + * A number of milliseconds the test will fail after. If unspecified, subtests inherit this + * value from their parent. + * @default Infinity + * @since v18.7.0 + */ + timeout?: number | undefined; + /** + * If truthy, the test marked as `TODO`. If a string is provided, that string is displayed in + * the test results as the reason why the test is `TODO`. + * @default false + */ + todo?: boolean | string | undefined; + } + /** + * This function is used to create a hook running before running a suite. + * + * ```js + * describe('tests', async () => { + * before(() => console.log('about to run some test')); + * it('is a subtest', () => { + * assert.ok('some relevant assertion here'); + * }); + * }); + * ``` + * @since v18.8.0, v16.18.0 + * @param [fn='A no-op function'] The hook function. If the hook uses callbacks, the callback function is passed as the second argument. + * @param options Configuration options for the hook. The following properties are supported: + */ + function before(fn?: HookFn, options?: HookOptions): void; + /** + * This function is used to create a hook running after running a suite. + * + * ```js + * describe('tests', async () => { + * after(() => console.log('finished running tests')); + * it('is a subtest', () => { + * assert.ok('some relevant assertion here'); + * }); + * }); + * ``` + * @since v18.8.0, v16.18.0 + * @param [fn='A no-op function'] The hook function. If the hook uses callbacks, the callback function is passed as the second argument. + * @param options Configuration options for the hook. The following properties are supported: + */ + function after(fn?: HookFn, options?: HookOptions): void; + /** + * This function is used to create a hook running + * before each subtest of the current suite. + * + * ```js + * describe('tests', async () => { + * beforeEach(() => console.log('about to run a test')); + * it('is a subtest', () => { + * assert.ok('some relevant assertion here'); + * }); + * }); + * ``` + * @since v18.8.0, v16.18.0 + * @param [fn='A no-op function'] The hook function. If the hook uses callbacks, the callback function is passed as the second argument. + * @param options Configuration options for the hook. The following properties are supported: + */ + function beforeEach(fn?: HookFn, options?: HookOptions): void; + /** + * This function is used to create a hook running + * after each subtest of the current test. + * + * ```js + * describe('tests', async () => { + * afterEach(() => console.log('finished running a test')); + * it('is a subtest', () => { + * assert.ok('some relevant assertion here'); + * }); + * }); + * ``` + * @since v18.8.0, v16.18.0 + * @param [fn='A no-op function'] The hook function. If the hook uses callbacks, the callback function is passed as the second argument. + * @param options Configuration options for the hook. The following properties are supported: + */ + function afterEach(fn?: HookFn, options?: HookOptions): void; + /** + * The hook function. If the hook uses callbacks, the callback function is passed as the + * second argument. + */ + type HookFn = (s: SuiteContext, done: (result?: any) => void) => any; + /** + * Configuration options for hooks. + * @since v18.8.0 + */ + interface HookOptions { + /** + * Allows aborting an in-progress hook. + */ + signal?: AbortSignal | undefined; + /** + * A number of milliseconds the hook will fail after. If unspecified, subtests inherit this + * value from their parent. + * @default Infinity + */ + timeout?: number | undefined; + } + interface MockFunctionOptions { + /** + * The number of times that the mock will use the behavior of `implementation`. + * Once the mock function has been called `times` times, + * it will automatically restore the behavior of `original`. + * This value must be an integer greater than zero. + * @default Infinity + */ + times?: number | undefined; + } + interface MockMethodOptions extends MockFunctionOptions { + /** + * If `true`, `object[methodName]` is treated as a getter. + * This option cannot be used with the `setter` option. + */ + getter?: boolean | undefined; + /** + * If `true`, `object[methodName]` is treated as a setter. + * This option cannot be used with the `getter` option. + */ + setter?: boolean | undefined; + } + type Mock = F & { + mock: MockFunctionContext; + }; + type NoOpFunction = (...args: any[]) => undefined; + type FunctionPropertyNames = { + [K in keyof T]: T[K] extends Function ? K : never; + }[keyof T]; + /** + * The `MockTracker` class is used to manage mocking functionality. The test runner + * module provides a top level `mock` export which is a `MockTracker` instance. + * Each test also provides its own `MockTracker` instance via the test context's`mock` property. + * @since v19.1.0, v18.13.0 + */ + class MockTracker { + /** + * This function is used to create a mock function. + * + * The following example creates a mock function that increments a counter by one + * on each invocation. The `times` option is used to modify the mock behavior such + * that the first two invocations add two to the counter instead of one. + * + * ```js + * test('mocks a counting function', (t) => { + * let cnt = 0; + * + * function addOne() { + * cnt++; + * return cnt; + * } + * + * function addTwo() { + * cnt += 2; + * return cnt; + * } + * + * const fn = t.mock.fn(addOne, addTwo, { times: 2 }); + * + * assert.strictEqual(fn(), 2); + * assert.strictEqual(fn(), 4); + * assert.strictEqual(fn(), 5); + * assert.strictEqual(fn(), 6); + * }); + * ``` + * @since v19.1.0, v18.13.0 + * @param [original='A no-op function'] An optional function to create a mock on. + * @param implementation An optional function used as the mock implementation for `original`. This is useful for creating mocks that exhibit one behavior for a specified number of calls and + * then restore the behavior of `original`. + * @param options Optional configuration options for the mock function. The following properties are supported: + * @return The mocked function. The mocked function contains a special `mock` property, which is an instance of {@link MockFunctionContext}, and can be used for inspecting and changing the + * behavior of the mocked function. + */ + fn(original?: F, options?: MockFunctionOptions): Mock; + fn( + original?: F, + implementation?: Implementation, + options?: MockFunctionOptions, + ): Mock; + /** + * This function is used to create a mock on an existing object method. The + * following example demonstrates how a mock is created on an existing object + * method. + * + * ```js + * test('spies on an object method', (t) => { + * const number = { + * value: 5, + * subtract(a) { + * return this.value - a; + * }, + * }; + * + * t.mock.method(number, 'subtract'); + * assert.strictEqual(number.subtract.mock.calls.length, 0); + * assert.strictEqual(number.subtract(3), 2); + * assert.strictEqual(number.subtract.mock.calls.length, 1); + * + * const call = number.subtract.mock.calls[0]; + * + * assert.deepStrictEqual(call.arguments, [3]); + * assert.strictEqual(call.result, 2); + * assert.strictEqual(call.error, undefined); + * assert.strictEqual(call.target, undefined); + * assert.strictEqual(call.this, number); + * }); + * ``` + * @since v19.1.0, v18.13.0 + * @param object The object whose method is being mocked. + * @param methodName The identifier of the method on `object` to mock. If `object[methodName]` is not a function, an error is thrown. + * @param implementation An optional function used as the mock implementation for `object[methodName]`. + * @param options Optional configuration options for the mock method. The following properties are supported: + * @return The mocked method. The mocked method contains a special `mock` property, which is an instance of {@link MockFunctionContext}, and can be used for inspecting and changing the + * behavior of the mocked method. + */ + method< + MockedObject extends object, + MethodName extends FunctionPropertyNames, + >( + object: MockedObject, + methodName: MethodName, + options?: MockFunctionOptions, + ): MockedObject[MethodName] extends Function ? Mock + : never; + method< + MockedObject extends object, + MethodName extends FunctionPropertyNames, + Implementation extends Function, + >( + object: MockedObject, + methodName: MethodName, + implementation: Implementation, + options?: MockFunctionOptions, + ): MockedObject[MethodName] extends Function ? Mock + : never; + method( + object: MockedObject, + methodName: keyof MockedObject, + options: MockMethodOptions, + ): Mock; + method( + object: MockedObject, + methodName: keyof MockedObject, + implementation: Function, + options: MockMethodOptions, + ): Mock; + + /** + * This function is syntax sugar for `MockTracker.method` with `options.getter`set to `true`. + * @since v19.3.0, v18.13.0 + */ + getter< + MockedObject extends object, + MethodName extends keyof MockedObject, + >( + object: MockedObject, + methodName: MethodName, + options?: MockFunctionOptions, + ): Mock<() => MockedObject[MethodName]>; + getter< + MockedObject extends object, + MethodName extends keyof MockedObject, + Implementation extends Function, + >( + object: MockedObject, + methodName: MethodName, + implementation?: Implementation, + options?: MockFunctionOptions, + ): Mock<(() => MockedObject[MethodName]) | Implementation>; + /** + * This function is syntax sugar for `MockTracker.method` with `options.setter`set to `true`. + * @since v19.3.0, v18.13.0 + */ + setter< + MockedObject extends object, + MethodName extends keyof MockedObject, + >( + object: MockedObject, + methodName: MethodName, + options?: MockFunctionOptions, + ): Mock<(value: MockedObject[MethodName]) => void>; + setter< + MockedObject extends object, + MethodName extends keyof MockedObject, + Implementation extends Function, + >( + object: MockedObject, + methodName: MethodName, + implementation?: Implementation, + options?: MockFunctionOptions, + ): Mock<((value: MockedObject[MethodName]) => void) | Implementation>; + /** + * This function restores the default behavior of all mocks that were previously + * created by this `MockTracker` and disassociates the mocks from the`MockTracker` instance. Once disassociated, the mocks can still be used, but the`MockTracker` instance can no longer be + * used to reset their behavior or + * otherwise interact with them. + * + * After each test completes, this function is called on the test context's`MockTracker`. If the global `MockTracker` is used extensively, calling this + * function manually is recommended. + * @since v19.1.0, v18.13.0 + */ + reset(): void; + /** + * This function restores the default behavior of all mocks that were previously + * created by this `MockTracker`. Unlike `mock.reset()`, `mock.restoreAll()` does + * not disassociate the mocks from the `MockTracker` instance. + * @since v19.1.0, v18.13.0 + */ + restoreAll(): void; + timers: MockTimers; + } + const mock: MockTracker; + interface MockFunctionCall< + F extends Function, + ReturnType = F extends (...args: any) => infer T ? T + : F extends abstract new(...args: any) => infer T ? T + : unknown, + Args = F extends (...args: infer Y) => any ? Y + : F extends abstract new(...args: infer Y) => any ? Y + : unknown[], + > { + /** + * An array of the arguments passed to the mock function. + */ + arguments: Args; + /** + * If the mocked function threw then this property contains the thrown value. + */ + error: unknown | undefined; + /** + * The value returned by the mocked function. + * + * If the mocked function threw, it will be `undefined`. + */ + result: ReturnType | undefined; + /** + * An `Error` object whose stack can be used to determine the callsite of the mocked function invocation. + */ + stack: Error; + /** + * If the mocked function is a constructor, this field contains the class being constructed. + * Otherwise this will be `undefined`. + */ + target: F extends abstract new(...args: any) => any ? F : undefined; + /** + * The mocked function's `this` value. + */ + this: unknown; + } + /** + * The `MockFunctionContext` class is used to inspect or manipulate the behavior of + * mocks created via the `MockTracker` APIs. + * @since v19.1.0, v18.13.0 + */ + class MockFunctionContext { + /** + * A getter that returns a copy of the internal array used to track calls to the + * mock. Each entry in the array is an object with the following properties. + * @since v19.1.0, v18.13.0 + */ + readonly calls: Array>; + /** + * This function returns the number of times that this mock has been invoked. This + * function is more efficient than checking `ctx.calls.length` because `ctx.calls`is a getter that creates a copy of the internal call tracking array. + * @since v19.1.0, v18.13.0 + * @return The number of times that this mock has been invoked. + */ + callCount(): number; + /** + * This function is used to change the behavior of an existing mock. + * + * The following example creates a mock function using `t.mock.fn()`, calls the + * mock function, and then changes the mock implementation to a different function. + * + * ```js + * test('changes a mock behavior', (t) => { + * let cnt = 0; + * + * function addOne() { + * cnt++; + * return cnt; + * } + * + * function addTwo() { + * cnt += 2; + * return cnt; + * } + * + * const fn = t.mock.fn(addOne); + * + * assert.strictEqual(fn(), 1); + * fn.mock.mockImplementation(addTwo); + * assert.strictEqual(fn(), 3); + * assert.strictEqual(fn(), 5); + * }); + * ``` + * @since v19.1.0, v18.13.0 + * @param implementation The function to be used as the mock's new implementation. + */ + mockImplementation(implementation: Function): void; + /** + * This function is used to change the behavior of an existing mock for a single + * invocation. Once invocation `onCall` has occurred, the mock will revert to + * whatever behavior it would have used had `mockImplementationOnce()` not been + * called. + * + * The following example creates a mock function using `t.mock.fn()`, calls the + * mock function, changes the mock implementation to a different function for the + * next invocation, and then resumes its previous behavior. + * + * ```js + * test('changes a mock behavior once', (t) => { + * let cnt = 0; + * + * function addOne() { + * cnt++; + * return cnt; + * } + * + * function addTwo() { + * cnt += 2; + * return cnt; + * } + * + * const fn = t.mock.fn(addOne); + * + * assert.strictEqual(fn(), 1); + * fn.mock.mockImplementationOnce(addTwo); + * assert.strictEqual(fn(), 3); + * assert.strictEqual(fn(), 4); + * }); + * ``` + * @since v19.1.0, v18.13.0 + * @param implementation The function to be used as the mock's implementation for the invocation number specified by `onCall`. + * @param onCall The invocation number that will use `implementation`. If the specified invocation has already occurred then an exception is thrown. + */ + mockImplementationOnce(implementation: Function, onCall?: number): void; + /** + * Resets the call history of the mock function. + * @since v19.3.0, v18.13.0 + */ + resetCalls(): void; + /** + * Resets the implementation of the mock function to its original behavior. The + * mock can still be used after calling this function. + * @since v19.1.0, v18.13.0 + */ + restore(): void; + } + type Timer = "setInterval" | "clearInterval" | "setTimeout" | "clearTimeout"; + /** + * Mocking timers is a technique commonly used in software testing to simulate and + * control the behavior of timers, such as `setInterval` and `setTimeout`, + * without actually waiting for the specified time intervals. + * + * The `MockTracker` provides a top-level `timers` export + * which is a `MockTimers` instance. + * @since v20.4.0 + * @experimental + */ + class MockTimers { + /** + * Enables timer mocking for the specified timers. + * + * **Note:** When you enable mocking for a specific timer, its associated + * clear function will also be implicitly mocked. + * + * Example usage: + * + * ```js + * import { mock } from 'node:test'; + * mock.timers.enable(['setInterval']); + * ``` + * + * The above example enables mocking for the `setInterval` timer and + * implicitly mocks the `clearInterval` function. Only the `setInterval`and `clearInterval` functions from `node:timers`,`node:timers/promises`, and`globalThis` will be mocked. + * + * Alternatively, if you call `mock.timers.enable()` without any parameters: + * + * All timers (`'setInterval'`, `'clearInterval'`, `'setTimeout'`, and `'clearTimeout'`) + * will be mocked. The `setInterval`, `clearInterval`, `setTimeout`, and `clearTimeout`functions from `node:timers`, `node:timers/promises`, + * and `globalThis` will be mocked. + * @since v20.4.0 + */ + enable(timers?: Timer[]): void; + /** + * This function restores the default behavior of all mocks that were previously + * created by this `MockTimers` instance and disassociates the mocks + * from the `MockTracker` instance. + * + * **Note:** After each test completes, this function is called on + * the test context's `MockTracker`. + * + * ```js + * import { mock } from 'node:test'; + * mock.timers.reset(); + * ``` + * @since v20.4.0 + */ + reset(): void; + /** + * Advances time for all mocked timers. + * + * **Note:** This diverges from how `setTimeout` in Node.js behaves and accepts + * only positive numbers. In Node.js, `setTimeout` with negative numbers is + * only supported for web compatibility reasons. + * + * The following example mocks a `setTimeout` function and + * by using `.tick` advances in + * time triggering all pending timers. + * + * ```js + * import assert from 'node:assert'; + * import { test } from 'node:test'; + * + * test('mocks setTimeout to be executed synchronously without having to actually wait for it', (context) => { + * const fn = context.mock.fn(); + * + * context.mock.timers.enable(['setTimeout']); + * + * setTimeout(fn, 9999); + * + * assert.strictEqual(fn.mock.callCount(), 0); + * + * // Advance in time + * context.mock.timers.tick(9999); + * + * assert.strictEqual(fn.mock.callCount(), 1); + * }); + * ``` + * + * Alternativelly, the `.tick` function can be called many times + * + * ```js + * import assert from 'node:assert'; + * import { test } from 'node:test'; + * + * test('mocks setTimeout to be executed synchronously without having to actually wait for it', (context) => { + * const fn = context.mock.fn(); + * context.mock.timers.enable(['setTimeout']); + * const nineSecs = 9000; + * setTimeout(fn, nineSecs); + * + * const twoSeconds = 3000; + * context.mock.timers.tick(twoSeconds); + * context.mock.timers.tick(twoSeconds); + * context.mock.timers.tick(twoSeconds); + * + * assert.strictEqual(fn.mock.callCount(), 1); + * }); + * ``` + * @since v20.4.0 + */ + tick(milliseconds: number): void; + /** + * Triggers all pending mocked timers immediately. + * + * The example below triggers all pending timers immediately, + * causing them to execute without any delay. + * + * ```js + * import assert from 'node:assert'; + * import { test } from 'node:test'; + * + * test('runAll functions following the given order', (context) => { + * context.mock.timers.enable(['setTimeout']); + * const results = []; + * setTimeout(() => results.push(1), 9999); + * + * // Notice that if both timers have the same timeout, + * // the order of execution is guaranteed + * setTimeout(() => results.push(3), 8888); + * setTimeout(() => results.push(2), 8888); + * + * assert.deepStrictEqual(results, []); + * + * context.mock.timers.runAll(); + * + * assert.deepStrictEqual(results, [3, 2, 1]); + * }); + * ``` + * + * **Note:** The `runAll()` function is specifically designed for + * triggering timers in the context of timer mocking. + * It does not have any effect on real-time system + * clocks or actual timers outside of the mocking environment. + * @since v20.4.0 + */ + runAll(): void; + /** + * Calls {@link MockTimers.reset()}. + */ + [Symbol.dispose](): void; + } + export { + after, + afterEach, + before, + beforeEach, + describe, + it, + Mock, + mock, + only, + run, + skip, + test, + test as default, + todo, + }; +} + +interface TestLocationInfo { + /** + * The column number where the test is defined, or + * `undefined` if the test was run through the REPL. + */ + column?: number; + /** + * The path of the test file, `undefined` if test is not ran through a file. + */ + file?: string; + /** + * The line number where the test is defined, or + * `undefined` if the test was run through the REPL. + */ + line?: number; +} +interface DiagnosticData extends TestLocationInfo { + /** + * The diagnostic message. + */ + message: string; + /** + * The nesting level of the test. + */ + nesting: number; +} +interface TestFail extends TestLocationInfo { + /** + * Additional execution metadata. + */ + details: { + /** + * The duration of the test in milliseconds. + */ + duration_ms: number; + /** + * The error thrown by the test. + */ + error: Error; + /** + * The type of the test, used to denote whether this is a suite. + * @since 20.0.0, 19.9.0, 18.17.0 + */ + type?: "suite"; + }; + /** + * The test name. + */ + name: string; + /** + * The nesting level of the test. + */ + nesting: number; + /** + * The ordinal number of the test. + */ + testNumber: number; + /** + * Present if `context.todo` is called. + */ + todo?: string | boolean; + /** + * Present if `context.skip` is called. + */ + skip?: string | boolean; +} +interface TestPass extends TestLocationInfo { + /** + * Additional execution metadata. + */ + details: { + /** + * The duration of the test in milliseconds. + */ + duration_ms: number; + /** + * The type of the test, used to denote whether this is a suite. + * @since 20.0.0, 19.9.0, 18.17.0 + */ + type?: "suite"; + }; + /** + * The test name. + */ + name: string; + /** + * The nesting level of the test. + */ + nesting: number; + /** + * The ordinal number of the test. + */ + testNumber: number; + /** + * Present if `context.todo` is called. + */ + todo?: string | boolean; + /** + * Present if `context.skip` is called. + */ + skip?: string | boolean; +} +interface TestPlan extends TestLocationInfo { + /** + * The nesting level of the test. + */ + nesting: number; + /** + * The number of subtests that have ran. + */ + count: number; +} +interface TestStart extends TestLocationInfo { + /** + * The test name. + */ + name: string; + /** + * The nesting level of the test. + */ + nesting: number; +} +interface TestStderr extends TestLocationInfo { + /** + * The message written to `stderr` + */ + message: string; +} +interface TestStdout extends TestLocationInfo { + /** + * The message written to `stdout` + */ + message: string; +} +interface TestEnqueue extends TestLocationInfo { + /** + * The test name + */ + name: string; + /** + * The nesting level of the test. + */ + nesting: number; +} +interface TestDequeue extends TestLocationInfo { + /** + * The test name + */ + name: string; + /** + * The nesting level of the test. + */ + nesting: number; +} + +/** + * The `node:test/reporters` module exposes the builtin-reporters for `node:test`. + * To access it: + * + * ```js + * import test from 'node:test/reporters'; + * ``` + * + * This module is only available under the `node:` scheme. The following will not + * work: + * + * ```js + * import test from 'test/reporters'; + * ``` + * @since v19.9.0 + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/test/reporters.js) + */ +declare module "node:test/reporters" { + import { Transform } from "node:stream"; + + type TestEvent = + | { type: "test:diagnostic"; data: DiagnosticData } + | { type: "test:fail"; data: TestFail } + | { type: "test:pass"; data: TestPass } + | { type: "test:plan"; data: TestPlan } + | { type: "test:start"; data: TestStart } + | { type: "test:stderr"; data: TestStderr } + | { type: "test:stdout"; data: TestStdout } + | { type: "test:enqueue"; data: TestEnqueue } + | { type: "test:dequeue"; data: TestDequeue } + | { type: "test:watch:drained" }; + type TestEventGenerator = AsyncGenerator; + + /** + * The `dot` reporter outputs the test results in a compact format, + * where each passing test is represented by a `.`, + * and each failing test is represented by a `X`. + */ + function dot(source: TestEventGenerator): AsyncGenerator<"\n" | "." | "X", void>; + /** + * The `tap` reporter outputs the test results in the [TAP](https://testanything.org/) format. + */ + function tap(source: TestEventGenerator): AsyncGenerator; + /** + * The `spec` reporter outputs the test results in a human-readable format. + */ + class Spec extends Transform { + constructor(); + } + /** + * The `junit` reporter outputs test results in a jUnit XML format + */ + function junit(source: TestEventGenerator): AsyncGenerator; + export { dot, junit, Spec as spec, tap, TestEvent }; +} diff --git a/task/node_modules/@types/node/timers.d.ts b/task/node_modules/@types/node/timers.d.ts new file mode 100644 index 0000000..039f31f --- /dev/null +++ b/task/node_modules/@types/node/timers.d.ts @@ -0,0 +1,240 @@ +/** + * The `timer` module exposes a global API for scheduling functions to + * be called at some future period of time. Because the timer functions are + * globals, there is no need to call `require('node:timers')` to use the API. + * + * The timer functions within Node.js implement a similar API as the timers API + * provided by Web Browsers but use a different internal implementation that is + * built around the Node.js [Event Loop](https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/#setimmediate-vs-settimeout). + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/timers.js) + */ +declare module "timers" { + import { Abortable } from "node:events"; + import { + setImmediate as setImmediatePromise, + setInterval as setIntervalPromise, + setTimeout as setTimeoutPromise, + } from "node:timers/promises"; + interface TimerOptions extends Abortable { + /** + * Set to `false` to indicate that the scheduled `Timeout` + * should not require the Node.js event loop to remain active. + * @default true + */ + ref?: boolean | undefined; + } + let setTimeout: typeof global.setTimeout; + let clearTimeout: typeof global.clearTimeout; + let setInterval: typeof global.setInterval; + let clearInterval: typeof global.clearInterval; + let setImmediate: typeof global.setImmediate; + let clearImmediate: typeof global.clearImmediate; + global { + namespace NodeJS { + // compatibility with older typings + interface Timer extends RefCounted { + hasRef(): boolean; + refresh(): this; + [Symbol.toPrimitive](): number; + } + /** + * This object is created internally and is returned from `setImmediate()`. It + * can be passed to `clearImmediate()` in order to cancel the scheduled + * actions. + * + * By default, when an immediate is scheduled, the Node.js event loop will continue + * running as long as the immediate is active. The `Immediate` object returned by `setImmediate()` exports both `immediate.ref()` and `immediate.unref()`functions that can be used to + * control this default behavior. + */ + class Immediate implements RefCounted { + /** + * When called, requests that the Node.js event loop _not_ exit so long as the`Immediate` is active. Calling `immediate.ref()` multiple times will have no + * effect. + * + * By default, all `Immediate` objects are "ref'ed", making it normally unnecessary + * to call `immediate.ref()` unless `immediate.unref()` had been called previously. + * @since v9.7.0 + * @return a reference to `immediate` + */ + ref(): this; + /** + * When called, the active `Immediate` object will not require the Node.js event + * loop to remain active. If there is no other activity keeping the event loop + * running, the process may exit before the `Immediate` object's callback is + * invoked. Calling `immediate.unref()` multiple times will have no effect. + * @since v9.7.0 + * @return a reference to `immediate` + */ + unref(): this; + /** + * If true, the `Immediate` object will keep the Node.js event loop active. + * @since v11.0.0 + */ + hasRef(): boolean; + _onImmediate: Function; // to distinguish it from the Timeout class + /** + * Cancels the immediate. This is similar to calling `clearImmediate()`. + * @since v20.5.0 + */ + [Symbol.dispose](): void; + } + /** + * This object is created internally and is returned from `setTimeout()` and `setInterval()`. It can be passed to either `clearTimeout()` or `clearInterval()` in order to cancel the + * scheduled actions. + * + * By default, when a timer is scheduled using either `setTimeout()` or `setInterval()`, the Node.js event loop will continue running as long as the + * timer is active. Each of the `Timeout` objects returned by these functions + * export both `timeout.ref()` and `timeout.unref()` functions that can be used to + * control this default behavior. + */ + class Timeout implements Timer { + /** + * When called, requests that the Node.js event loop _not_ exit so long as the`Timeout` is active. Calling `timeout.ref()` multiple times will have no effect. + * + * By default, all `Timeout` objects are "ref'ed", making it normally unnecessary + * to call `timeout.ref()` unless `timeout.unref()` had been called previously. + * @since v0.9.1 + * @return a reference to `timeout` + */ + ref(): this; + /** + * When called, the active `Timeout` object will not require the Node.js event loop + * to remain active. If there is no other activity keeping the event loop running, + * the process may exit before the `Timeout` object's callback is invoked. Calling`timeout.unref()` multiple times will have no effect. + * @since v0.9.1 + * @return a reference to `timeout` + */ + unref(): this; + /** + * If true, the `Timeout` object will keep the Node.js event loop active. + * @since v11.0.0 + */ + hasRef(): boolean; + /** + * Sets the timer's start time to the current time, and reschedules the timer to + * call its callback at the previously specified duration adjusted to the current + * time. This is useful for refreshing a timer without allocating a new + * JavaScript object. + * + * Using this on a timer that has already called its callback will reactivate the + * timer. + * @since v10.2.0 + * @return a reference to `timeout` + */ + refresh(): this; + [Symbol.toPrimitive](): number; + /** + * Cancels the timeout. + * @since v20.5.0 + */ + [Symbol.dispose](): void; + } + } + /** + * Schedules execution of a one-time `callback` after `delay` milliseconds. + * + * The `callback` will likely not be invoked in precisely `delay` milliseconds. + * Node.js makes no guarantees about the exact timing of when callbacks will fire, + * nor of their ordering. The callback will be called as close as possible to the + * time specified. + * + * When `delay` is larger than `2147483647` or less than `1`, the `delay`will be set to `1`. Non-integer delays are truncated to an integer. + * + * If `callback` is not a function, a `TypeError` will be thrown. + * + * This method has a custom variant for promises that is available using `timersPromises.setTimeout()`. + * @since v0.0.1 + * @param callback The function to call when the timer elapses. + * @param [delay=1] The number of milliseconds to wait before calling the `callback`. + * @param args Optional arguments to pass when the `callback` is called. + * @return for use with {@link clearTimeout} + */ + function setTimeout( + callback: (...args: TArgs) => void, + ms?: number, + ...args: TArgs + ): NodeJS.Timeout; + // util.promisify no rest args compability + // eslint-disable-next-line @typescript-eslint/no-invalid-void-type + function setTimeout(callback: (args: void) => void, ms?: number): NodeJS.Timeout; + namespace setTimeout { + const __promisify__: typeof setTimeoutPromise; + } + /** + * Cancels a `Timeout` object created by `setTimeout()`. + * @since v0.0.1 + * @param timeout A `Timeout` object as returned by {@link setTimeout} or the `primitive` of the `Timeout` object as a string or a number. + */ + function clearTimeout(timeoutId: NodeJS.Timeout | string | number | undefined): void; + /** + * Schedules repeated execution of `callback` every `delay` milliseconds. + * + * When `delay` is larger than `2147483647` or less than `1`, the `delay` will be + * set to `1`. Non-integer delays are truncated to an integer. + * + * If `callback` is not a function, a `TypeError` will be thrown. + * + * This method has a custom variant for promises that is available using `timersPromises.setInterval()`. + * @since v0.0.1 + * @param callback The function to call when the timer elapses. + * @param [delay=1] The number of milliseconds to wait before calling the `callback`. + * @param args Optional arguments to pass when the `callback` is called. + * @return for use with {@link clearInterval} + */ + function setInterval( + callback: (...args: TArgs) => void, + ms?: number, + ...args: TArgs + ): NodeJS.Timeout; + // util.promisify no rest args compability + // eslint-disable-next-line @typescript-eslint/no-invalid-void-type + function setInterval(callback: (args: void) => void, ms?: number): NodeJS.Timeout; + namespace setInterval { + const __promisify__: typeof setIntervalPromise; + } + /** + * Cancels a `Timeout` object created by `setInterval()`. + * @since v0.0.1 + * @param timeout A `Timeout` object as returned by {@link setInterval} or the `primitive` of the `Timeout` object as a string or a number. + */ + function clearInterval(intervalId: NodeJS.Timeout | string | number | undefined): void; + /** + * Schedules the "immediate" execution of the `callback` after I/O events' + * callbacks. + * + * When multiple calls to `setImmediate()` are made, the `callback` functions are + * queued for execution in the order in which they are created. The entire callback + * queue is processed every event loop iteration. If an immediate timer is queued + * from inside an executing callback, that timer will not be triggered until the + * next event loop iteration. + * + * If `callback` is not a function, a `TypeError` will be thrown. + * + * This method has a custom variant for promises that is available using `timersPromises.setImmediate()`. + * @since v0.9.1 + * @param callback The function to call at the end of this turn of the Node.js `Event Loop` + * @param args Optional arguments to pass when the `callback` is called. + * @return for use with {@link clearImmediate} + */ + function setImmediate( + callback: (...args: TArgs) => void, + ...args: TArgs + ): NodeJS.Immediate; + // util.promisify no rest args compability + // eslint-disable-next-line @typescript-eslint/no-invalid-void-type + function setImmediate(callback: (args: void) => void): NodeJS.Immediate; + namespace setImmediate { + const __promisify__: typeof setImmediatePromise; + } + /** + * Cancels an `Immediate` object created by `setImmediate()`. + * @since v0.9.1 + * @param immediate An `Immediate` object as returned by {@link setImmediate}. + */ + function clearImmediate(immediateId: NodeJS.Immediate | undefined): void; + function queueMicrotask(callback: () => void): void; + } +} +declare module "node:timers" { + export * from "timers"; +} diff --git a/task/node_modules/@types/node/timers/promises.d.ts b/task/node_modules/@types/node/timers/promises.d.ts new file mode 100644 index 0000000..5a54dc7 --- /dev/null +++ b/task/node_modules/@types/node/timers/promises.d.ts @@ -0,0 +1,93 @@ +/** + * The `timers/promises` API provides an alternative set of timer functions + * that return `Promise` objects. The API is accessible via`require('node:timers/promises')`. + * + * ```js + * import { + * setTimeout, + * setImmediate, + * setInterval, + * } from 'timers/promises'; + * ``` + * @since v15.0.0 + */ +declare module "timers/promises" { + import { TimerOptions } from "node:timers"; + /** + * ```js + * import { + * setTimeout, + * } from 'timers/promises'; + * + * const res = await setTimeout(100, 'result'); + * + * console.log(res); // Prints 'result' + * ``` + * @since v15.0.0 + * @param [delay=1] The number of milliseconds to wait before fulfilling the promise. + * @param value A value with which the promise is fulfilled. + */ + function setTimeout(delay?: number, value?: T, options?: TimerOptions): Promise; + /** + * ```js + * import { + * setImmediate, + * } from 'timers/promises'; + * + * const res = await setImmediate('result'); + * + * console.log(res); // Prints 'result' + * ``` + * @since v15.0.0 + * @param value A value with which the promise is fulfilled. + */ + function setImmediate(value?: T, options?: TimerOptions): Promise; + /** + * Returns an async iterator that generates values in an interval of `delay` ms. + * If `ref` is `true`, you need to call `next()` of async iterator explicitly + * or implicitly to keep the event loop alive. + * + * ```js + * import { + * setInterval, + * } from 'timers/promises'; + * + * const interval = 100; + * for await (const startTime of setInterval(interval, Date.now())) { + * const now = Date.now(); + * console.log(now); + * if ((now - startTime) > 1000) + * break; + * } + * console.log(Date.now()); + * ``` + * @since v15.9.0 + */ + function setInterval(delay?: number, value?: T, options?: TimerOptions): AsyncIterable; + interface Scheduler { + /** + * ```js + * import { scheduler } from 'node:timers/promises'; + * + * await scheduler.wait(1000); // Wait one second before continuing + * ``` + * An experimental API defined by the Scheduling APIs draft specification being developed as a standard Web Platform API. + * Calling timersPromises.scheduler.wait(delay, options) is roughly equivalent to calling timersPromises.setTimeout(delay, undefined, options) except that the ref option is not supported. + * @since v16.14.0 + * @experimental + * @param [delay=1] The number of milliseconds to wait before fulfilling the promise. + */ + wait: (delay?: number, options?: TimerOptions) => Promise; + /** + * An experimental API defined by the Scheduling APIs draft specification being developed as a standard Web Platform API. + * Calling timersPromises.scheduler.yield() is equivalent to calling timersPromises.setImmediate() with no arguments. + * @since v16.14.0 + * @experimental + */ + yield: () => Promise; + } + const scheduler: Scheduler; +} +declare module "node:timers/promises" { + export * from "timers/promises"; +} diff --git a/task/node_modules/@types/node/tls.d.ts b/task/node_modules/@types/node/tls.d.ts new file mode 100644 index 0000000..b289e84 --- /dev/null +++ b/task/node_modules/@types/node/tls.d.ts @@ -0,0 +1,1210 @@ +/** + * The `node:tls` module provides an implementation of the Transport Layer Security + * (TLS) and Secure Socket Layer (SSL) protocols that is built on top of OpenSSL. + * The module can be accessed using: + * + * ```js + * const tls = require('node:tls'); + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/tls.js) + */ +declare module "tls" { + import { X509Certificate } from "node:crypto"; + import * as net from "node:net"; + import * as stream from "stream"; + const CLIENT_RENEG_LIMIT: number; + const CLIENT_RENEG_WINDOW: number; + interface Certificate { + /** + * Country code. + */ + C: string; + /** + * Street. + */ + ST: string; + /** + * Locality. + */ + L: string; + /** + * Organization. + */ + O: string; + /** + * Organizational unit. + */ + OU: string; + /** + * Common name. + */ + CN: string; + } + interface PeerCertificate { + /** + * `true` if a Certificate Authority (CA), `false` otherwise. + * @since v18.13.0 + */ + ca: boolean; + /** + * The DER encoded X.509 certificate data. + */ + raw: Buffer; + /** + * The certificate subject. + */ + subject: Certificate; + /** + * The certificate issuer, described in the same terms as the `subject`. + */ + issuer: Certificate; + /** + * The date-time the certificate is valid from. + */ + valid_from: string; + /** + * The date-time the certificate is valid to. + */ + valid_to: string; + /** + * The certificate serial number, as a hex string. + */ + serialNumber: string; + /** + * The SHA-1 digest of the DER encoded certificate. + * It is returned as a `:` separated hexadecimal string. + */ + fingerprint: string; + /** + * The SHA-256 digest of the DER encoded certificate. + * It is returned as a `:` separated hexadecimal string. + */ + fingerprint256: string; + /** + * The SHA-512 digest of the DER encoded certificate. + * It is returned as a `:` separated hexadecimal string. + */ + fingerprint512: string; + /** + * The extended key usage, a set of OIDs. + */ + ext_key_usage?: string[]; + /** + * A string containing concatenated names for the subject, + * an alternative to the `subject` names. + */ + subjectaltname?: string; + /** + * An array describing the AuthorityInfoAccess, used with OCSP. + */ + infoAccess?: NodeJS.Dict; + /** + * For RSA keys: The RSA bit size. + * + * For EC keys: The key size in bits. + */ + bits?: number; + /** + * The RSA exponent, as a string in hexadecimal number notation. + */ + exponent?: string; + /** + * The RSA modulus, as a hexadecimal string. + */ + modulus?: string; + /** + * The public key. + */ + pubkey?: Buffer; + /** + * The ASN.1 name of the OID of the elliptic curve. + * Well-known curves are identified by an OID. + * While it is unusual, it is possible that the curve + * is identified by its mathematical properties, + * in which case it will not have an OID. + */ + asn1Curve?: string; + /** + * The NIST name for the elliptic curve,if it has one + * (not all well-known curves have been assigned names by NIST). + */ + nistCurve?: string; + } + interface DetailedPeerCertificate extends PeerCertificate { + /** + * The issuer certificate object. + * For self-signed certificates, this may be a circular reference. + */ + issuerCertificate: DetailedPeerCertificate; + } + interface CipherNameAndProtocol { + /** + * The cipher name. + */ + name: string; + /** + * SSL/TLS protocol version. + */ + version: string; + /** + * IETF name for the cipher suite. + */ + standardName: string; + } + interface EphemeralKeyInfo { + /** + * The supported types are 'DH' and 'ECDH'. + */ + type: string; + /** + * The name property is available only when type is 'ECDH'. + */ + name?: string | undefined; + /** + * The size of parameter of an ephemeral key exchange. + */ + size: number; + } + interface KeyObject { + /** + * Private keys in PEM format. + */ + pem: string | Buffer; + /** + * Optional passphrase. + */ + passphrase?: string | undefined; + } + interface PxfObject { + /** + * PFX or PKCS12 encoded private key and certificate chain. + */ + buf: string | Buffer; + /** + * Optional passphrase. + */ + passphrase?: string | undefined; + } + interface TLSSocketOptions extends SecureContextOptions, CommonConnectionOptions { + /** + * If true the TLS socket will be instantiated in server-mode. + * Defaults to false. + */ + isServer?: boolean | undefined; + /** + * An optional net.Server instance. + */ + server?: net.Server | undefined; + /** + * An optional Buffer instance containing a TLS session. + */ + session?: Buffer | undefined; + /** + * If true, specifies that the OCSP status request extension will be + * added to the client hello and an 'OCSPResponse' event will be + * emitted on the socket before establishing a secure communication + */ + requestOCSP?: boolean | undefined; + } + /** + * Performs transparent encryption of written data and all required TLS + * negotiation. + * + * Instances of `tls.TLSSocket` implement the duplex `Stream` interface. + * + * Methods that return TLS connection metadata (e.g.{@link TLSSocket.getPeerCertificate}) will only return data while the + * connection is open. + * @since v0.11.4 + */ + class TLSSocket extends net.Socket { + /** + * Construct a new tls.TLSSocket object from an existing TCP socket. + */ + constructor(socket: net.Socket, options?: TLSSocketOptions); + /** + * This property is `true` if the peer certificate was signed by one of the CAs + * specified when creating the `tls.TLSSocket` instance, otherwise `false`. + * @since v0.11.4 + */ + authorized: boolean; + /** + * Returns the reason why the peer's certificate was not been verified. This + * property is set only when `tlsSocket.authorized === false`. + * @since v0.11.4 + */ + authorizationError: Error; + /** + * Always returns `true`. This may be used to distinguish TLS sockets from regular`net.Socket` instances. + * @since v0.11.4 + */ + encrypted: true; + /** + * String containing the selected ALPN protocol. + * Before a handshake has completed, this value is always null. + * When a handshake is completed but not ALPN protocol was selected, tlsSocket.alpnProtocol equals false. + */ + alpnProtocol: string | false | null; + /** + * Returns an object representing the local certificate. The returned object has + * some properties corresponding to the fields of the certificate. + * + * See {@link TLSSocket.getPeerCertificate} for an example of the certificate + * structure. + * + * If there is no local certificate, an empty object will be returned. If the + * socket has been destroyed, `null` will be returned. + * @since v11.2.0 + */ + getCertificate(): PeerCertificate | object | null; + /** + * Returns an object containing information on the negotiated cipher suite. + * + * For example, a TLSv1.2 protocol with AES256-SHA cipher: + * + * ```json + * { + * "name": "AES256-SHA", + * "standardName": "TLS_RSA_WITH_AES_256_CBC_SHA", + * "version": "SSLv3" + * } + * ``` + * + * See [SSL\_CIPHER\_get\_name](https://www.openssl.org/docs/man1.1.1/man3/SSL_CIPHER_get_name.html) for more information. + * @since v0.11.4 + */ + getCipher(): CipherNameAndProtocol; + /** + * Returns an object representing the type, name, and size of parameter of + * an ephemeral key exchange in `perfect forward secrecy` on a client + * connection. It returns an empty object when the key exchange is not + * ephemeral. As this is only supported on a client socket; `null` is returned + * if called on a server socket. The supported types are `'DH'` and `'ECDH'`. The`name` property is available only when type is `'ECDH'`. + * + * For example: `{ type: 'ECDH', name: 'prime256v1', size: 256 }`. + * @since v5.0.0 + */ + getEphemeralKeyInfo(): EphemeralKeyInfo | object | null; + /** + * As the `Finished` messages are message digests of the complete handshake + * (with a total of 192 bits for TLS 1.0 and more for SSL 3.0), they can + * be used for external authentication procedures when the authentication + * provided by SSL/TLS is not desired or is not enough. + * + * Corresponds to the `SSL_get_finished` routine in OpenSSL and may be used + * to implement the `tls-unique` channel binding from [RFC 5929](https://tools.ietf.org/html/rfc5929). + * @since v9.9.0 + * @return The latest `Finished` message that has been sent to the socket as part of a SSL/TLS handshake, or `undefined` if no `Finished` message has been sent yet. + */ + getFinished(): Buffer | undefined; + /** + * Returns an object representing the peer's certificate. If the peer does not + * provide a certificate, an empty object will be returned. If the socket has been + * destroyed, `null` will be returned. + * + * If the full certificate chain was requested, each certificate will include an`issuerCertificate` property containing an object representing its issuer's + * certificate. + * @since v0.11.4 + * @param detailed Include the full certificate chain if `true`, otherwise include just the peer's certificate. + * @return A certificate object. + */ + getPeerCertificate(detailed: true): DetailedPeerCertificate; + getPeerCertificate(detailed?: false): PeerCertificate; + getPeerCertificate(detailed?: boolean): PeerCertificate | DetailedPeerCertificate; + /** + * As the `Finished` messages are message digests of the complete handshake + * (with a total of 192 bits for TLS 1.0 and more for SSL 3.0), they can + * be used for external authentication procedures when the authentication + * provided by SSL/TLS is not desired or is not enough. + * + * Corresponds to the `SSL_get_peer_finished` routine in OpenSSL and may be used + * to implement the `tls-unique` channel binding from [RFC 5929](https://tools.ietf.org/html/rfc5929). + * @since v9.9.0 + * @return The latest `Finished` message that is expected or has actually been received from the socket as part of a SSL/TLS handshake, or `undefined` if there is no `Finished` message so + * far. + */ + getPeerFinished(): Buffer | undefined; + /** + * Returns a string containing the negotiated SSL/TLS protocol version of the + * current connection. The value `'unknown'` will be returned for connected + * sockets that have not completed the handshaking process. The value `null` will + * be returned for server sockets or disconnected client sockets. + * + * Protocol versions are: + * + * * `'SSLv3'` + * * `'TLSv1'` + * * `'TLSv1.1'` + * * `'TLSv1.2'` + * * `'TLSv1.3'` + * + * See the OpenSSL [`SSL_get_version`](https://www.openssl.org/docs/man1.1.1/man3/SSL_get_version.html) documentation for more information. + * @since v5.7.0 + */ + getProtocol(): string | null; + /** + * Returns the TLS session data or `undefined` if no session was + * negotiated. On the client, the data can be provided to the `session` option of {@link connect} to resume the connection. On the server, it may be useful + * for debugging. + * + * See `Session Resumption` for more information. + * + * Note: `getSession()` works only for TLSv1.2 and below. For TLSv1.3, applications + * must use the `'session'` event (it also works for TLSv1.2 and below). + * @since v0.11.4 + */ + getSession(): Buffer | undefined; + /** + * See [SSL\_get\_shared\_sigalgs](https://www.openssl.org/docs/man1.1.1/man3/SSL_get_shared_sigalgs.html) for more information. + * @since v12.11.0 + * @return List of signature algorithms shared between the server and the client in the order of decreasing preference. + */ + getSharedSigalgs(): string[]; + /** + * For a client, returns the TLS session ticket if one is available, or`undefined`. For a server, always returns `undefined`. + * + * It may be useful for debugging. + * + * See `Session Resumption` for more information. + * @since v0.11.4 + */ + getTLSTicket(): Buffer | undefined; + /** + * See `Session Resumption` for more information. + * @since v0.5.6 + * @return `true` if the session was reused, `false` otherwise. + */ + isSessionReused(): boolean; + /** + * The `tlsSocket.renegotiate()` method initiates a TLS renegotiation process. + * Upon completion, the `callback` function will be passed a single argument + * that is either an `Error` (if the request failed) or `null`. + * + * This method can be used to request a peer's certificate after the secure + * connection has been established. + * + * When running as the server, the socket will be destroyed with an error after`handshakeTimeout` timeout. + * + * For TLSv1.3, renegotiation cannot be initiated, it is not supported by the + * protocol. + * @since v0.11.8 + * @param callback If `renegotiate()` returned `true`, callback is attached once to the `'secure'` event. If `renegotiate()` returned `false`, `callback` will be called in the next tick with + * an error, unless the `tlsSocket` has been destroyed, in which case `callback` will not be called at all. + * @return `true` if renegotiation was initiated, `false` otherwise. + */ + renegotiate( + options: { + rejectUnauthorized?: boolean | undefined; + requestCert?: boolean | undefined; + }, + callback: (err: Error | null) => void, + ): undefined | boolean; + /** + * The `tlsSocket.setMaxSendFragment()` method sets the maximum TLS fragment size. + * Returns `true` if setting the limit succeeded; `false` otherwise. + * + * Smaller fragment sizes decrease the buffering latency on the client: larger + * fragments are buffered by the TLS layer until the entire fragment is received + * and its integrity is verified; large fragments can span multiple roundtrips + * and their processing can be delayed due to packet loss or reordering. However, + * smaller fragments add extra TLS framing bytes and CPU overhead, which may + * decrease overall server throughput. + * @since v0.11.11 + * @param [size=16384] The maximum TLS fragment size. The maximum value is `16384`. + */ + setMaxSendFragment(size: number): boolean; + /** + * Disables TLS renegotiation for this `TLSSocket` instance. Once called, attempts + * to renegotiate will trigger an `'error'` event on the `TLSSocket`. + * @since v8.4.0 + */ + disableRenegotiation(): void; + /** + * When enabled, TLS packet trace information is written to `stderr`. This can be + * used to debug TLS connection problems. + * + * The format of the output is identical to the output of`openssl s_client -trace` or `openssl s_server -trace`. While it is produced by + * OpenSSL's `SSL_trace()` function, the format is undocumented, can change + * without notice, and should not be relied on. + * @since v12.2.0 + */ + enableTrace(): void; + /** + * Returns the peer certificate as an `X509Certificate` object. + * + * If there is no peer certificate, or the socket has been destroyed,`undefined` will be returned. + * @since v15.9.0 + */ + getPeerX509Certificate(): X509Certificate | undefined; + /** + * Returns the local certificate as an `X509Certificate` object. + * + * If there is no local certificate, or the socket has been destroyed,`undefined` will be returned. + * @since v15.9.0 + */ + getX509Certificate(): X509Certificate | undefined; + /** + * Keying material is used for validations to prevent different kind of attacks in + * network protocols, for example in the specifications of IEEE 802.1X. + * + * Example + * + * ```js + * const keyingMaterial = tlsSocket.exportKeyingMaterial( + * 128, + * 'client finished'); + * + * /* + * Example return value of keyingMaterial: + * + * + * ``` + * + * See the OpenSSL [`SSL_export_keying_material`](https://www.openssl.org/docs/man1.1.1/man3/SSL_export_keying_material.html) documentation for more + * information. + * @since v13.10.0, v12.17.0 + * @param length number of bytes to retrieve from keying material + * @param label an application specific label, typically this will be a value from the [IANA Exporter Label + * Registry](https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#exporter-labels). + * @param context Optionally provide a context. + * @return requested bytes of the keying material + */ + exportKeyingMaterial(length: number, label: string, context: Buffer): Buffer; + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "OCSPResponse", listener: (response: Buffer) => void): this; + addListener(event: "secureConnect", listener: () => void): this; + addListener(event: "session", listener: (session: Buffer) => void): this; + addListener(event: "keylog", listener: (line: Buffer) => void): this; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "OCSPResponse", response: Buffer): boolean; + emit(event: "secureConnect"): boolean; + emit(event: "session", session: Buffer): boolean; + emit(event: "keylog", line: Buffer): boolean; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "OCSPResponse", listener: (response: Buffer) => void): this; + on(event: "secureConnect", listener: () => void): this; + on(event: "session", listener: (session: Buffer) => void): this; + on(event: "keylog", listener: (line: Buffer) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "OCSPResponse", listener: (response: Buffer) => void): this; + once(event: "secureConnect", listener: () => void): this; + once(event: "session", listener: (session: Buffer) => void): this; + once(event: "keylog", listener: (line: Buffer) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "OCSPResponse", listener: (response: Buffer) => void): this; + prependListener(event: "secureConnect", listener: () => void): this; + prependListener(event: "session", listener: (session: Buffer) => void): this; + prependListener(event: "keylog", listener: (line: Buffer) => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "OCSPResponse", listener: (response: Buffer) => void): this; + prependOnceListener(event: "secureConnect", listener: () => void): this; + prependOnceListener(event: "session", listener: (session: Buffer) => void): this; + prependOnceListener(event: "keylog", listener: (line: Buffer) => void): this; + } + interface CommonConnectionOptions { + /** + * An optional TLS context object from tls.createSecureContext() + */ + secureContext?: SecureContext | undefined; + /** + * When enabled, TLS packet trace information is written to `stderr`. This can be + * used to debug TLS connection problems. + * @default false + */ + enableTrace?: boolean | undefined; + /** + * If true the server will request a certificate from clients that + * connect and attempt to verify that certificate. Defaults to + * false. + */ + requestCert?: boolean | undefined; + /** + * An array of strings or a Buffer naming possible ALPN protocols. + * (Protocols should be ordered by their priority.) + */ + ALPNProtocols?: string[] | Uint8Array[] | Uint8Array | undefined; + /** + * SNICallback(servername, cb) A function that will be + * called if the client supports SNI TLS extension. Two arguments + * will be passed when called: servername and cb. SNICallback should + * invoke cb(null, ctx), where ctx is a SecureContext instance. + * (tls.createSecureContext(...) can be used to get a proper + * SecureContext.) If SNICallback wasn't provided the default callback + * with high-level API will be used (see below). + */ + SNICallback?: ((servername: string, cb: (err: Error | null, ctx?: SecureContext) => void) => void) | undefined; + /** + * If true the server will reject any connection which is not + * authorized with the list of supplied CAs. This option only has an + * effect if requestCert is true. + * @default true + */ + rejectUnauthorized?: boolean | undefined; + } + interface TlsOptions extends SecureContextOptions, CommonConnectionOptions, net.ServerOpts { + /** + * Abort the connection if the SSL/TLS handshake does not finish in the + * specified number of milliseconds. A 'tlsClientError' is emitted on + * the tls.Server object whenever a handshake times out. Default: + * 120000 (120 seconds). + */ + handshakeTimeout?: number | undefined; + /** + * The number of seconds after which a TLS session created by the + * server will no longer be resumable. See Session Resumption for more + * information. Default: 300. + */ + sessionTimeout?: number | undefined; + /** + * 48-bytes of cryptographically strong pseudo-random data. + */ + ticketKeys?: Buffer | undefined; + /** + * @param socket + * @param identity identity parameter sent from the client. + * @return pre-shared key that must either be + * a buffer or `null` to stop the negotiation process. Returned PSK must be + * compatible with the selected cipher's digest. + * + * When negotiating TLS-PSK (pre-shared keys), this function is called + * with the identity provided by the client. + * If the return value is `null` the negotiation process will stop and an + * "unknown_psk_identity" alert message will be sent to the other party. + * If the server wishes to hide the fact that the PSK identity was not known, + * the callback must provide some random data as `psk` to make the connection + * fail with "decrypt_error" before negotiation is finished. + * PSK ciphers are disabled by default, and using TLS-PSK thus + * requires explicitly specifying a cipher suite with the `ciphers` option. + * More information can be found in the RFC 4279. + */ + pskCallback?(socket: TLSSocket, identity: string): DataView | NodeJS.TypedArray | null; + /** + * hint to send to a client to help + * with selecting the identity during TLS-PSK negotiation. Will be ignored + * in TLS 1.3. Upon failing to set pskIdentityHint `tlsClientError` will be + * emitted with `ERR_TLS_PSK_SET_IDENTIY_HINT_FAILED` code. + */ + pskIdentityHint?: string | undefined; + } + interface PSKCallbackNegotation { + psk: DataView | NodeJS.TypedArray; + identity: string; + } + interface ConnectionOptions extends SecureContextOptions, CommonConnectionOptions { + host?: string | undefined; + port?: number | undefined; + path?: string | undefined; // Creates unix socket connection to path. If this option is specified, `host` and `port` are ignored. + socket?: stream.Duplex | undefined; // Establish secure connection on a given socket rather than creating a new socket + checkServerIdentity?: typeof checkServerIdentity | undefined; + servername?: string | undefined; // SNI TLS Extension + session?: Buffer | undefined; + minDHSize?: number | undefined; + lookup?: net.LookupFunction | undefined; + timeout?: number | undefined; + /** + * When negotiating TLS-PSK (pre-shared keys), this function is called + * with optional identity `hint` provided by the server or `null` + * in case of TLS 1.3 where `hint` was removed. + * It will be necessary to provide a custom `tls.checkServerIdentity()` + * for the connection as the default one will try to check hostname/IP + * of the server against the certificate but that's not applicable for PSK + * because there won't be a certificate present. + * More information can be found in the RFC 4279. + * + * @param hint message sent from the server to help client + * decide which identity to use during negotiation. + * Always `null` if TLS 1.3 is used. + * @returns Return `null` to stop the negotiation process. `psk` must be + * compatible with the selected cipher's digest. + * `identity` must use UTF-8 encoding. + */ + pskCallback?(hint: string | null): PSKCallbackNegotation | null; + } + /** + * Accepts encrypted connections using TLS or SSL. + * @since v0.3.2 + */ + class Server extends net.Server { + constructor(secureConnectionListener?: (socket: TLSSocket) => void); + constructor(options: TlsOptions, secureConnectionListener?: (socket: TLSSocket) => void); + /** + * The `server.addContext()` method adds a secure context that will be used if + * the client request's SNI name matches the supplied `hostname` (or wildcard). + * + * When there are multiple matching contexts, the most recently added one is + * used. + * @since v0.5.3 + * @param hostname A SNI host name or wildcard (e.g. `'*'`) + * @param context An object containing any of the possible properties from the {@link createSecureContext} `options` arguments (e.g. `key`, `cert`, `ca`, etc), or a TLS context object created + * with {@link createSecureContext} itself. + */ + addContext(hostname: string, context: SecureContextOptions): void; + /** + * Returns the session ticket keys. + * + * See `Session Resumption` for more information. + * @since v3.0.0 + * @return A 48-byte buffer containing the session ticket keys. + */ + getTicketKeys(): Buffer; + /** + * The `server.setSecureContext()` method replaces the secure context of an + * existing server. Existing connections to the server are not interrupted. + * @since v11.0.0 + * @param options An object containing any of the possible properties from the {@link createSecureContext} `options` arguments (e.g. `key`, `cert`, `ca`, etc). + */ + setSecureContext(options: SecureContextOptions): void; + /** + * Sets the session ticket keys. + * + * Changes to the ticket keys are effective only for future server connections. + * Existing or currently pending server connections will use the previous keys. + * + * See `Session Resumption` for more information. + * @since v3.0.0 + * @param keys A 48-byte buffer containing the session ticket keys. + */ + setTicketKeys(keys: Buffer): void; + /** + * events.EventEmitter + * 1. tlsClientError + * 2. newSession + * 3. OCSPRequest + * 4. resumeSession + * 5. secureConnection + * 6. keylog + */ + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; + addListener( + event: "newSession", + listener: (sessionId: Buffer, sessionData: Buffer, callback: () => void) => void, + ): this; + addListener( + event: "OCSPRequest", + listener: ( + certificate: Buffer, + issuer: Buffer, + callback: (err: Error | null, resp: Buffer) => void, + ) => void, + ): this; + addListener( + event: "resumeSession", + listener: (sessionId: Buffer, callback: (err: Error | null, sessionData: Buffer | null) => void) => void, + ): this; + addListener(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; + addListener(event: "keylog", listener: (line: Buffer, tlsSocket: TLSSocket) => void): this; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "tlsClientError", err: Error, tlsSocket: TLSSocket): boolean; + emit(event: "newSession", sessionId: Buffer, sessionData: Buffer, callback: () => void): boolean; + emit( + event: "OCSPRequest", + certificate: Buffer, + issuer: Buffer, + callback: (err: Error | null, resp: Buffer) => void, + ): boolean; + emit( + event: "resumeSession", + sessionId: Buffer, + callback: (err: Error | null, sessionData: Buffer | null) => void, + ): boolean; + emit(event: "secureConnection", tlsSocket: TLSSocket): boolean; + emit(event: "keylog", line: Buffer, tlsSocket: TLSSocket): boolean; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; + on(event: "newSession", listener: (sessionId: Buffer, sessionData: Buffer, callback: () => void) => void): this; + on( + event: "OCSPRequest", + listener: ( + certificate: Buffer, + issuer: Buffer, + callback: (err: Error | null, resp: Buffer) => void, + ) => void, + ): this; + on( + event: "resumeSession", + listener: (sessionId: Buffer, callback: (err: Error | null, sessionData: Buffer | null) => void) => void, + ): this; + on(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; + on(event: "keylog", listener: (line: Buffer, tlsSocket: TLSSocket) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; + once( + event: "newSession", + listener: (sessionId: Buffer, sessionData: Buffer, callback: () => void) => void, + ): this; + once( + event: "OCSPRequest", + listener: ( + certificate: Buffer, + issuer: Buffer, + callback: (err: Error | null, resp: Buffer) => void, + ) => void, + ): this; + once( + event: "resumeSession", + listener: (sessionId: Buffer, callback: (err: Error | null, sessionData: Buffer | null) => void) => void, + ): this; + once(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; + once(event: "keylog", listener: (line: Buffer, tlsSocket: TLSSocket) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; + prependListener( + event: "newSession", + listener: (sessionId: Buffer, sessionData: Buffer, callback: () => void) => void, + ): this; + prependListener( + event: "OCSPRequest", + listener: ( + certificate: Buffer, + issuer: Buffer, + callback: (err: Error | null, resp: Buffer) => void, + ) => void, + ): this; + prependListener( + event: "resumeSession", + listener: (sessionId: Buffer, callback: (err: Error | null, sessionData: Buffer | null) => void) => void, + ): this; + prependListener(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; + prependListener(event: "keylog", listener: (line: Buffer, tlsSocket: TLSSocket) => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; + prependOnceListener( + event: "newSession", + listener: (sessionId: Buffer, sessionData: Buffer, callback: () => void) => void, + ): this; + prependOnceListener( + event: "OCSPRequest", + listener: ( + certificate: Buffer, + issuer: Buffer, + callback: (err: Error | null, resp: Buffer) => void, + ) => void, + ): this; + prependOnceListener( + event: "resumeSession", + listener: (sessionId: Buffer, callback: (err: Error | null, sessionData: Buffer | null) => void) => void, + ): this; + prependOnceListener(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; + prependOnceListener(event: "keylog", listener: (line: Buffer, tlsSocket: TLSSocket) => void): this; + } + /** + * @deprecated since v0.11.3 Use `tls.TLSSocket` instead. + */ + interface SecurePair { + encrypted: TLSSocket; + cleartext: TLSSocket; + } + type SecureVersion = "TLSv1.3" | "TLSv1.2" | "TLSv1.1" | "TLSv1"; + interface SecureContextOptions { + /** + * If set, this will be called when a client opens a connection using the ALPN extension. + * One argument will be passed to the callback: an object containing `servername` and `protocols` fields, + * respectively containing the server name from the SNI extension (if any) and an array of + * ALPN protocol name strings. The callback must return either one of the strings listed in `protocols`, + * which will be returned to the client as the selected ALPN protocol, or `undefined`, + * to reject the connection with a fatal alert. If a string is returned that does not match one of + * the client's ALPN protocols, an error will be thrown. + * This option cannot be used with the `ALPNProtocols` option, and setting both options will throw an error. + */ + ALPNCallback?: ((arg: { servername: string; protocols: string[] }) => string | undefined) | undefined; + /** + * Optionally override the trusted CA certificates. Default is to trust + * the well-known CAs curated by Mozilla. Mozilla's CAs are completely + * replaced when CAs are explicitly specified using this option. + */ + ca?: string | Buffer | Array | undefined; + /** + * Cert chains in PEM format. One cert chain should be provided per + * private key. Each cert chain should consist of the PEM formatted + * certificate for a provided private key, followed by the PEM + * formatted intermediate certificates (if any), in order, and not + * including the root CA (the root CA must be pre-known to the peer, + * see ca). When providing multiple cert chains, they do not have to + * be in the same order as their private keys in key. If the + * intermediate certificates are not provided, the peer will not be + * able to validate the certificate, and the handshake will fail. + */ + cert?: string | Buffer | Array | undefined; + /** + * Colon-separated list of supported signature algorithms. The list + * can contain digest algorithms (SHA256, MD5 etc.), public key + * algorithms (RSA-PSS, ECDSA etc.), combination of both (e.g + * 'RSA+SHA384') or TLS v1.3 scheme names (e.g. rsa_pss_pss_sha512). + */ + sigalgs?: string | undefined; + /** + * Cipher suite specification, replacing the default. For more + * information, see modifying the default cipher suite. Permitted + * ciphers can be obtained via tls.getCiphers(). Cipher names must be + * uppercased in order for OpenSSL to accept them. + */ + ciphers?: string | undefined; + /** + * Name of an OpenSSL engine which can provide the client certificate. + */ + clientCertEngine?: string | undefined; + /** + * PEM formatted CRLs (Certificate Revocation Lists). + */ + crl?: string | Buffer | Array | undefined; + /** + * `'auto'` or custom Diffie-Hellman parameters, required for non-ECDHE perfect forward secrecy. + * If omitted or invalid, the parameters are silently discarded and DHE ciphers will not be available. + * ECDHE-based perfect forward secrecy will still be available. + */ + dhparam?: string | Buffer | undefined; + /** + * A string describing a named curve or a colon separated list of curve + * NIDs or names, for example P-521:P-384:P-256, to use for ECDH key + * agreement. Set to auto to select the curve automatically. Use + * crypto.getCurves() to obtain a list of available curve names. On + * recent releases, openssl ecparam -list_curves will also display the + * name and description of each available elliptic curve. Default: + * tls.DEFAULT_ECDH_CURVE. + */ + ecdhCurve?: string | undefined; + /** + * Attempt to use the server's cipher suite preferences instead of the + * client's. When true, causes SSL_OP_CIPHER_SERVER_PREFERENCE to be + * set in secureOptions + */ + honorCipherOrder?: boolean | undefined; + /** + * Private keys in PEM format. PEM allows the option of private keys + * being encrypted. Encrypted keys will be decrypted with + * options.passphrase. Multiple keys using different algorithms can be + * provided either as an array of unencrypted key strings or buffers, + * or an array of objects in the form {pem: [, + * passphrase: ]}. The object form can only occur in an array. + * object.passphrase is optional. Encrypted keys will be decrypted with + * object.passphrase if provided, or options.passphrase if it is not. + */ + key?: string | Buffer | Array | undefined; + /** + * Name of an OpenSSL engine to get private key from. Should be used + * together with privateKeyIdentifier. + */ + privateKeyEngine?: string | undefined; + /** + * Identifier of a private key managed by an OpenSSL engine. Should be + * used together with privateKeyEngine. Should not be set together with + * key, because both options define a private key in different ways. + */ + privateKeyIdentifier?: string | undefined; + /** + * Optionally set the maximum TLS version to allow. One + * of `'TLSv1.3'`, `'TLSv1.2'`, `'TLSv1.1'`, or `'TLSv1'`. Cannot be specified along with the + * `secureProtocol` option, use one or the other. + * **Default:** `'TLSv1.3'`, unless changed using CLI options. Using + * `--tls-max-v1.2` sets the default to `'TLSv1.2'`. Using `--tls-max-v1.3` sets the default to + * `'TLSv1.3'`. If multiple of the options are provided, the highest maximum is used. + */ + maxVersion?: SecureVersion | undefined; + /** + * Optionally set the minimum TLS version to allow. One + * of `'TLSv1.3'`, `'TLSv1.2'`, `'TLSv1.1'`, or `'TLSv1'`. Cannot be specified along with the + * `secureProtocol` option, use one or the other. It is not recommended to use + * less than TLSv1.2, but it may be required for interoperability. + * **Default:** `'TLSv1.2'`, unless changed using CLI options. Using + * `--tls-v1.0` sets the default to `'TLSv1'`. Using `--tls-v1.1` sets the default to + * `'TLSv1.1'`. Using `--tls-min-v1.3` sets the default to + * 'TLSv1.3'. If multiple of the options are provided, the lowest minimum is used. + */ + minVersion?: SecureVersion | undefined; + /** + * Shared passphrase used for a single private key and/or a PFX. + */ + passphrase?: string | undefined; + /** + * PFX or PKCS12 encoded private key and certificate chain. pfx is an + * alternative to providing key and cert individually. PFX is usually + * encrypted, if it is, passphrase will be used to decrypt it. Multiple + * PFX can be provided either as an array of unencrypted PFX buffers, + * or an array of objects in the form {buf: [, + * passphrase: ]}. The object form can only occur in an array. + * object.passphrase is optional. Encrypted PFX will be decrypted with + * object.passphrase if provided, or options.passphrase if it is not. + */ + pfx?: string | Buffer | Array | undefined; + /** + * Optionally affect the OpenSSL protocol behavior, which is not + * usually necessary. This should be used carefully if at all! Value is + * a numeric bitmask of the SSL_OP_* options from OpenSSL Options + */ + secureOptions?: number | undefined; // Value is a numeric bitmask of the `SSL_OP_*` options + /** + * Legacy mechanism to select the TLS protocol version to use, it does + * not support independent control of the minimum and maximum version, + * and does not support limiting the protocol to TLSv1.3. Use + * minVersion and maxVersion instead. The possible values are listed as + * SSL_METHODS, use the function names as strings. For example, use + * 'TLSv1_1_method' to force TLS version 1.1, or 'TLS_method' to allow + * any TLS protocol version up to TLSv1.3. It is not recommended to use + * TLS versions less than 1.2, but it may be required for + * interoperability. Default: none, see minVersion. + */ + secureProtocol?: string | undefined; + /** + * Opaque identifier used by servers to ensure session state is not + * shared between applications. Unused by clients. + */ + sessionIdContext?: string | undefined; + /** + * 48-bytes of cryptographically strong pseudo-random data. + * See Session Resumption for more information. + */ + ticketKeys?: Buffer | undefined; + /** + * The number of seconds after which a TLS session created by the + * server will no longer be resumable. See Session Resumption for more + * information. Default: 300. + */ + sessionTimeout?: number | undefined; + } + interface SecureContext { + context: any; + } + /** + * Verifies the certificate `cert` is issued to `hostname`. + * + * Returns [Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error) object, populating it with `reason`, `host`, and `cert` on + * failure. On success, returns [undefined](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Undefined_type). + * + * This function is intended to be used in combination with the`checkServerIdentity` option that can be passed to {@link connect} and as + * such operates on a `certificate object`. For other purposes, consider using `x509.checkHost()` instead. + * + * This function can be overwritten by providing an alternative function as the`options.checkServerIdentity` option that is passed to `tls.connect()`. The + * overwriting function can call `tls.checkServerIdentity()` of course, to augment + * the checks done with additional verification. + * + * This function is only called if the certificate passed all other checks, such as + * being issued by trusted CA (`options.ca`). + * + * Earlier versions of Node.js incorrectly accepted certificates for a given`hostname` if a matching `uniformResourceIdentifier` subject alternative name + * was present (see [CVE-2021-44531](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-44531)). Applications that wish to accept`uniformResourceIdentifier` subject alternative names can use + * a custom`options.checkServerIdentity` function that implements the desired behavior. + * @since v0.8.4 + * @param hostname The host name or IP address to verify the certificate against. + * @param cert A `certificate object` representing the peer's certificate. + */ + function checkServerIdentity(hostname: string, cert: PeerCertificate): Error | undefined; + /** + * Creates a new {@link Server}. The `secureConnectionListener`, if provided, is + * automatically set as a listener for the `'secureConnection'` event. + * + * The `ticketKeys` options is automatically shared between `node:cluster` module + * workers. + * + * The following illustrates a simple echo server: + * + * ```js + * const tls = require('node:tls'); + * const fs = require('node:fs'); + * + * const options = { + * key: fs.readFileSync('server-key.pem'), + * cert: fs.readFileSync('server-cert.pem'), + * + * // This is necessary only if using client certificate authentication. + * requestCert: true, + * + * // This is necessary only if the client uses a self-signed certificate. + * ca: [ fs.readFileSync('client-cert.pem') ], + * }; + * + * const server = tls.createServer(options, (socket) => { + * console.log('server connected', + * socket.authorized ? 'authorized' : 'unauthorized'); + * socket.write('welcome!\n'); + * socket.setEncoding('utf8'); + * socket.pipe(socket); + * }); + * server.listen(8000, () => { + * console.log('server bound'); + * }); + * ``` + * + * The server can be tested by connecting to it using the example client from {@link connect}. + * @since v0.3.2 + */ + function createServer(secureConnectionListener?: (socket: TLSSocket) => void): Server; + function createServer(options: TlsOptions, secureConnectionListener?: (socket: TLSSocket) => void): Server; + /** + * The `callback` function, if specified, will be added as a listener for the `'secureConnect'` event. + * + * `tls.connect()` returns a {@link TLSSocket} object. + * + * Unlike the `https` API, `tls.connect()` does not enable the + * SNI (Server Name Indication) extension by default, which may cause some + * servers to return an incorrect certificate or reject the connection + * altogether. To enable SNI, set the `servername` option in addition + * to `host`. + * + * The following illustrates a client for the echo server example from {@link createServer}: + * + * ```js + * // Assumes an echo server that is listening on port 8000. + * const tls = require('node:tls'); + * const fs = require('node:fs'); + * + * const options = { + * // Necessary only if the server requires client certificate authentication. + * key: fs.readFileSync('client-key.pem'), + * cert: fs.readFileSync('client-cert.pem'), + * + * // Necessary only if the server uses a self-signed certificate. + * ca: [ fs.readFileSync('server-cert.pem') ], + * + * // Necessary only if the server's cert isn't for "localhost". + * checkServerIdentity: () => { return null; }, + * }; + * + * const socket = tls.connect(8000, options, () => { + * console.log('client connected', + * socket.authorized ? 'authorized' : 'unauthorized'); + * process.stdin.pipe(socket); + * process.stdin.resume(); + * }); + * socket.setEncoding('utf8'); + * socket.on('data', (data) => { + * console.log(data); + * }); + * socket.on('end', () => { + * console.log('server ends connection'); + * }); + * ``` + * @since v0.11.3 + */ + function connect(options: ConnectionOptions, secureConnectListener?: () => void): TLSSocket; + function connect( + port: number, + host?: string, + options?: ConnectionOptions, + secureConnectListener?: () => void, + ): TLSSocket; + function connect(port: number, options?: ConnectionOptions, secureConnectListener?: () => void): TLSSocket; + /** + * Creates a new secure pair object with two streams, one of which reads and writes + * the encrypted data and the other of which reads and writes the cleartext data. + * Generally, the encrypted stream is piped to/from an incoming encrypted data + * stream and the cleartext one is used as a replacement for the initial encrypted + * stream. + * + * `tls.createSecurePair()` returns a `tls.SecurePair` object with `cleartext` and`encrypted` stream properties. + * + * Using `cleartext` has the same API as {@link TLSSocket}. + * + * The `tls.createSecurePair()` method is now deprecated in favor of`tls.TLSSocket()`. For example, the code: + * + * ```js + * pair = tls.createSecurePair(// ... ); + * pair.encrypted.pipe(socket); + * socket.pipe(pair.encrypted); + * ``` + * + * can be replaced by: + * + * ```js + * secureSocket = tls.TLSSocket(socket, options); + * ``` + * + * where `secureSocket` has the same API as `pair.cleartext`. + * @since v0.3.2 + * @deprecated Since v0.11.3 - Use {@link TLSSocket} instead. + * @param context A secure context object as returned by `tls.createSecureContext()` + * @param isServer `true` to specify that this TLS connection should be opened as a server. + * @param requestCert `true` to specify whether a server should request a certificate from a connecting client. Only applies when `isServer` is `true`. + * @param rejectUnauthorized If not `false` a server automatically reject clients with invalid certificates. Only applies when `isServer` is `true`. + */ + function createSecurePair( + context?: SecureContext, + isServer?: boolean, + requestCert?: boolean, + rejectUnauthorized?: boolean, + ): SecurePair; + /** + * {@link createServer} sets the default value of the `honorCipherOrder` option + * to `true`, other APIs that create secure contexts leave it unset. + * + * {@link createServer} uses a 128 bit truncated SHA1 hash value generated + * from `process.argv` as the default value of the `sessionIdContext` option, other + * APIs that create secure contexts have no default value. + * + * The `tls.createSecureContext()` method creates a `SecureContext` object. It is + * usable as an argument to several `tls` APIs, such as `server.addContext()`, + * but has no public methods. The {@link Server} constructor and the {@link createServer} method do not support the `secureContext` option. + * + * A key is _required_ for ciphers that use certificates. Either `key` or`pfx` can be used to provide it. + * + * If the `ca` option is not given, then Node.js will default to using [Mozilla's publicly trusted list of + * CAs](https://hg.mozilla.org/mozilla-central/raw-file/tip/security/nss/lib/ckfw/builtins/certdata.txt). + * + * Custom DHE parameters are discouraged in favor of the new `dhparam: 'auto'`option. When set to `'auto'`, well-known DHE parameters of sufficient strength + * will be selected automatically. Otherwise, if necessary, `openssl dhparam` can + * be used to create custom parameters. The key length must be greater than or + * equal to 1024 bits or else an error will be thrown. Although 1024 bits is + * permissible, use 2048 bits or larger for stronger security. + * @since v0.11.13 + */ + function createSecureContext(options?: SecureContextOptions): SecureContext; + /** + * Returns an array with the names of the supported TLS ciphers. The names are + * lower-case for historical reasons, but must be uppercased to be used in + * the `ciphers` option of {@link createSecureContext}. + * + * Not all supported ciphers are enabled by default. See `Modifying the default TLS cipher suite`. + * + * Cipher names that start with `'tls_'` are for TLSv1.3, all the others are for + * TLSv1.2 and below. + * + * ```js + * console.log(tls.getCiphers()); // ['aes128-gcm-sha256', 'aes128-sha', ...] + * ``` + * @since v0.10.2 + */ + function getCiphers(): string[]; + /** + * The default curve name to use for ECDH key agreement in a tls server. + * The default value is 'auto'. See tls.createSecureContext() for further + * information. + */ + let DEFAULT_ECDH_CURVE: string; + /** + * The default value of the maxVersion option of + * tls.createSecureContext(). It can be assigned any of the supported TLS + * protocol versions, 'TLSv1.3', 'TLSv1.2', 'TLSv1.1', or 'TLSv1'. Default: + * 'TLSv1.3', unless changed using CLI options. Using --tls-max-v1.2 sets + * the default to 'TLSv1.2'. Using --tls-max-v1.3 sets the default to + * 'TLSv1.3'. If multiple of the options are provided, the highest maximum + * is used. + */ + let DEFAULT_MAX_VERSION: SecureVersion; + /** + * The default value of the minVersion option of tls.createSecureContext(). + * It can be assigned any of the supported TLS protocol versions, + * 'TLSv1.3', 'TLSv1.2', 'TLSv1.1', or 'TLSv1'. Default: 'TLSv1.2', unless + * changed using CLI options. Using --tls-min-v1.0 sets the default to + * 'TLSv1'. Using --tls-min-v1.1 sets the default to 'TLSv1.1'. Using + * --tls-min-v1.3 sets the default to 'TLSv1.3'. If multiple of the options + * are provided, the lowest minimum is used. + */ + let DEFAULT_MIN_VERSION: SecureVersion; + /** + * The default value of the ciphers option of tls.createSecureContext(). + * It can be assigned any of the supported OpenSSL ciphers. + * Defaults to the content of crypto.constants.defaultCoreCipherList, unless + * changed using CLI options using --tls-default-ciphers. + */ + let DEFAULT_CIPHERS: string; + /** + * An immutable array of strings representing the root certificates (in PEM + * format) used for verifying peer certificates. This is the default value + * of the ca option to tls.createSecureContext(). + */ + const rootCertificates: readonly string[]; +} +declare module "node:tls" { + export * from "tls"; +} diff --git a/task/node_modules/@types/node/trace_events.d.ts b/task/node_modules/@types/node/trace_events.d.ts new file mode 100644 index 0000000..3361359 --- /dev/null +++ b/task/node_modules/@types/node/trace_events.d.ts @@ -0,0 +1,182 @@ +/** + * The `node:trace_events` module provides a mechanism to centralize tracing + * information generated by V8, Node.js core, and userspace code. + * + * Tracing can be enabled with the `--trace-event-categories` command-line flag + * or by using the `node:trace_events` module. The `--trace-event-categories` flag + * accepts a list of comma-separated category names. + * + * The available categories are: + * + * * `node`: An empty placeholder. + * * `node.async_hooks`: Enables capture of detailed `async_hooks` trace data. + * The `async_hooks` events have a unique `asyncId` and a special `triggerId` `triggerAsyncId` property. + * * `node.bootstrap`: Enables capture of Node.js bootstrap milestones. + * * `node.console`: Enables capture of `console.time()` and `console.count()`output. + * * `node.threadpoolwork.sync`: Enables capture of trace data for threadpool + * synchronous operations, such as `blob`, `zlib`, `crypto` and `node_api`. + * * `node.threadpoolwork.async`: Enables capture of trace data for threadpool + * asynchronous operations, such as `blob`, `zlib`, `crypto` and `node_api`. + * * `node.dns.native`: Enables capture of trace data for DNS queries. + * * `node.net.native`: Enables capture of trace data for network. + * * `node.environment`: Enables capture of Node.js Environment milestones. + * * `node.fs.sync`: Enables capture of trace data for file system sync methods. + * * `node.fs_dir.sync`: Enables capture of trace data for file system sync + * directory methods. + * * `node.fs.async`: Enables capture of trace data for file system async methods. + * * `node.fs_dir.async`: Enables capture of trace data for file system async + * directory methods. + * * `node.perf`: Enables capture of `Performance API` measurements. + * * `node.perf.usertiming`: Enables capture of only Performance API User Timing + * measures and marks. + * * `node.perf.timerify`: Enables capture of only Performance API timerify + * measurements. + * * `node.promises.rejections`: Enables capture of trace data tracking the number + * of unhandled Promise rejections and handled-after-rejections. + * * `node.vm.script`: Enables capture of trace data for the `node:vm` module's`runInNewContext()`, `runInContext()`, and `runInThisContext()` methods. + * * `v8`: The `V8` events are GC, compiling, and execution related. + * * `node.http`: Enables capture of trace data for http request / response. + * + * By default the `node`, `node.async_hooks`, and `v8` categories are enabled. + * + * ```bash + * node --trace-event-categories v8,node,node.async_hooks server.js + * ``` + * + * Prior versions of Node.js required the use of the `--trace-events-enabled`flag to enable trace events. This requirement has been removed. However, the`--trace-events-enabled` flag _may_ still be + * used and will enable the`node`, `node.async_hooks`, and `v8` trace event categories by default. + * + * ```bash + * node --trace-events-enabled + * + * # is equivalent to + * + * node --trace-event-categories v8,node,node.async_hooks + * ``` + * + * Alternatively, trace events may be enabled using the `node:trace_events` module: + * + * ```js + * const trace_events = require('node:trace_events'); + * const tracing = trace_events.createTracing({ categories: ['node.perf'] }); + * tracing.enable(); // Enable trace event capture for the 'node.perf' category + * + * // do work + * + * tracing.disable(); // Disable trace event capture for the 'node.perf' category + * ``` + * + * Running Node.js with tracing enabled will produce log files that can be opened + * in the [`chrome://tracing`](https://www.chromium.org/developers/how-tos/trace-event-profiling-tool) tab of Chrome. + * + * The logging file is by default called `node_trace.${rotation}.log`, where`${rotation}` is an incrementing log-rotation id. The filepath pattern can + * be specified with `--trace-event-file-pattern` that accepts a template + * string that supports `${rotation}` and `${pid}`: + * + * ```bash + * node --trace-event-categories v8 --trace-event-file-pattern '${pid}-${rotation}.log' server.js + * ``` + * + * To guarantee that the log file is properly generated after signal events like`SIGINT`, `SIGTERM`, or `SIGBREAK`, make sure to have the appropriate handlers + * in your code, such as: + * + * ```js + * process.on('SIGINT', function onSigint() { + * console.info('Received SIGINT.'); + * process.exit(130); // Or applicable exit code depending on OS and signal + * }); + * ``` + * + * The tracing system uses the same time source + * as the one used by `process.hrtime()`. + * However the trace-event timestamps are expressed in microseconds, + * unlike `process.hrtime()` which returns nanoseconds. + * + * The features from this module are not available in `Worker` threads. + * @experimental + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/trace_events.js) + */ +declare module "trace_events" { + /** + * The `Tracing` object is used to enable or disable tracing for sets of + * categories. Instances are created using the + * `trace_events.createTracing()` method. + * + * When created, the `Tracing` object is disabled. Calling the + * `tracing.enable()` method adds the categories to the set of enabled trace + * event categories. Calling `tracing.disable()` will remove the categories + * from the set of enabled trace event categories. + */ + interface Tracing { + /** + * A comma-separated list of the trace event categories covered by this + * `Tracing` object. + */ + readonly categories: string; + /** + * Disables this `Tracing` object. + * + * Only trace event categories _not_ covered by other enabled `Tracing` + * objects and _not_ specified by the `--trace-event-categories` flag + * will be disabled. + */ + disable(): void; + /** + * Enables this `Tracing` object for the set of categories covered by + * the `Tracing` object. + */ + enable(): void; + /** + * `true` only if the `Tracing` object has been enabled. + */ + readonly enabled: boolean; + } + interface CreateTracingOptions { + /** + * An array of trace category names. Values included in the array are + * coerced to a string when possible. An error will be thrown if the + * value cannot be coerced. + */ + categories: string[]; + } + /** + * Creates and returns a `Tracing` object for the given set of `categories`. + * + * ```js + * const trace_events = require('node:trace_events'); + * const categories = ['node.perf', 'node.async_hooks']; + * const tracing = trace_events.createTracing({ categories }); + * tracing.enable(); + * // do stuff + * tracing.disable(); + * ``` + * @since v10.0.0 + * @return . + */ + function createTracing(options: CreateTracingOptions): Tracing; + /** + * Returns a comma-separated list of all currently-enabled trace event + * categories. The current set of enabled trace event categories is determined + * by the _union_ of all currently-enabled `Tracing` objects and any categories + * enabled using the `--trace-event-categories` flag. + * + * Given the file `test.js` below, the command`node --trace-event-categories node.perf test.js` will print`'node.async_hooks,node.perf'` to the console. + * + * ```js + * const trace_events = require('node:trace_events'); + * const t1 = trace_events.createTracing({ categories: ['node.async_hooks'] }); + * const t2 = trace_events.createTracing({ categories: ['node.perf'] }); + * const t3 = trace_events.createTracing({ categories: ['v8'] }); + * + * t1.enable(); + * t2.enable(); + * + * console.log(trace_events.getEnabledCategories()); + * ``` + * @since v10.0.0 + */ + function getEnabledCategories(): string | undefined; +} +declare module "node:trace_events" { + export * from "trace_events"; +} diff --git a/task/node_modules/@types/node/ts4.8/assert.d.ts b/task/node_modules/@types/node/ts4.8/assert.d.ts new file mode 100644 index 0000000..cd82143 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/assert.d.ts @@ -0,0 +1,996 @@ +/** + * The `node:assert` module provides a set of assertion functions for verifying + * invariants. + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/assert.js) + */ +declare module "assert" { + /** + * An alias of {@link ok}. + * @since v0.5.9 + * @param value The input that is checked for being truthy. + */ + function assert(value: unknown, message?: string | Error): asserts value; + namespace assert { + /** + * Indicates the failure of an assertion. All errors thrown by the `node:assert`module will be instances of the `AssertionError` class. + */ + class AssertionError extends Error { + /** + * Set to the `actual` argument for methods such as {@link assert.strictEqual()}. + */ + actual: unknown; + /** + * Set to the `expected` argument for methods such as {@link assert.strictEqual()}. + */ + expected: unknown; + /** + * Set to the passed in operator value. + */ + operator: string; + /** + * Indicates if the message was auto-generated (`true`) or not. + */ + generatedMessage: boolean; + /** + * Value is always `ERR_ASSERTION` to show that the error is an assertion error. + */ + code: "ERR_ASSERTION"; + constructor(options?: { + /** If provided, the error message is set to this value. */ + message?: string | undefined; + /** The `actual` property on the error instance. */ + actual?: unknown | undefined; + /** The `expected` property on the error instance. */ + expected?: unknown | undefined; + /** The `operator` property on the error instance. */ + operator?: string | undefined; + /** If provided, the generated stack trace omits frames before this function. */ + // eslint-disable-next-line @typescript-eslint/ban-types + stackStartFn?: Function | undefined; + }); + } + /** + * This feature is deprecated and will be removed in a future version. + * Please consider using alternatives such as the `mock` helper function. + * @since v14.2.0, v12.19.0 + * @deprecated Deprecated + */ + class CallTracker { + /** + * The wrapper function is expected to be called exactly `exact` times. If the + * function has not been called exactly `exact` times when `tracker.verify()` is called, then `tracker.verify()` will throw an + * error. + * + * ```js + * import assert from 'node:assert'; + * + * // Creates call tracker. + * const tracker = new assert.CallTracker(); + * + * function func() {} + * + * // Returns a function that wraps func() that must be called exact times + * // before tracker.verify(). + * const callsfunc = tracker.calls(func); + * ``` + * @since v14.2.0, v12.19.0 + * @param [fn='A no-op function'] + * @param [exact=1] + * @return that wraps `fn`. + */ + calls(exact?: number): () => void; + calls any>(fn?: Func, exact?: number): Func; + /** + * Example: + * + * ```js + * import assert from 'node:assert'; + * + * const tracker = new assert.CallTracker(); + * + * function func() {} + * const callsfunc = tracker.calls(func); + * callsfunc(1, 2, 3); + * + * assert.deepStrictEqual(tracker.getCalls(callsfunc), + * [{ thisArg: undefined, arguments: [1, 2, 3] }]); + * ``` + * @since v18.8.0, v16.18.0 + * @param fn + * @return An Array with all the calls to a tracked function. + */ + getCalls(fn: Function): CallTrackerCall[]; + /** + * The arrays contains information about the expected and actual number of calls of + * the functions that have not been called the expected number of times. + * + * ```js + * import assert from 'node:assert'; + * + * // Creates call tracker. + * const tracker = new assert.CallTracker(); + * + * function func() {} + * + * // Returns a function that wraps func() that must be called exact times + * // before tracker.verify(). + * const callsfunc = tracker.calls(func, 2); + * + * // Returns an array containing information on callsfunc() + * console.log(tracker.report()); + * // [ + * // { + * // message: 'Expected the func function to be executed 2 time(s) but was + * // executed 0 time(s).', + * // actual: 0, + * // expected: 2, + * // operator: 'func', + * // stack: stack trace + * // } + * // ] + * ``` + * @since v14.2.0, v12.19.0 + * @return An Array of objects containing information about the wrapper functions returned by `calls`. + */ + report(): CallTrackerReportInformation[]; + /** + * Reset calls of the call tracker. + * If a tracked function is passed as an argument, the calls will be reset for it. + * If no arguments are passed, all tracked functions will be reset. + * + * ```js + * import assert from 'node:assert'; + * + * const tracker = new assert.CallTracker(); + * + * function func() {} + * const callsfunc = tracker.calls(func); + * + * callsfunc(); + * // Tracker was called once + * assert.strictEqual(tracker.getCalls(callsfunc).length, 1); + * + * tracker.reset(callsfunc); + * assert.strictEqual(tracker.getCalls(callsfunc).length, 0); + * ``` + * @since v18.8.0, v16.18.0 + * @param fn a tracked function to reset. + */ + reset(fn?: Function): void; + /** + * Iterates through the list of functions passed to `tracker.calls()` and will throw an error for functions that + * have not been called the expected number of times. + * + * ```js + * import assert from 'node:assert'; + * + * // Creates call tracker. + * const tracker = new assert.CallTracker(); + * + * function func() {} + * + * // Returns a function that wraps func() that must be called exact times + * // before tracker.verify(). + * const callsfunc = tracker.calls(func, 2); + * + * callsfunc(); + * + * // Will throw an error since callsfunc() was only called once. + * tracker.verify(); + * ``` + * @since v14.2.0, v12.19.0 + */ + verify(): void; + } + interface CallTrackerCall { + thisArg: object; + arguments: unknown[]; + } + interface CallTrackerReportInformation { + message: string; + /** The actual number of times the function was called. */ + actual: number; + /** The number of times the function was expected to be called. */ + expected: number; + /** The name of the function that is wrapped. */ + operator: string; + /** A stack trace of the function. */ + stack: object; + } + type AssertPredicate = RegExp | (new() => object) | ((thrown: unknown) => boolean) | object | Error; + /** + * Throws an `AssertionError` with the provided error message or a default + * error message. If the `message` parameter is an instance of an `Error` then + * it will be thrown instead of the `AssertionError`. + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.fail(); + * // AssertionError [ERR_ASSERTION]: Failed + * + * assert.fail('boom'); + * // AssertionError [ERR_ASSERTION]: boom + * + * assert.fail(new TypeError('need array')); + * // TypeError: need array + * ``` + * + * Using `assert.fail()` with more than two arguments is possible but deprecated. + * See below for further details. + * @since v0.1.21 + * @param [message='Failed'] + */ + function fail(message?: string | Error): never; + /** @deprecated since v10.0.0 - use fail([message]) or other assert functions instead. */ + function fail( + actual: unknown, + expected: unknown, + message?: string | Error, + operator?: string, + // eslint-disable-next-line @typescript-eslint/ban-types + stackStartFn?: Function, + ): never; + /** + * Tests if `value` is truthy. It is equivalent to`assert.equal(!!value, true, message)`. + * + * If `value` is not truthy, an `AssertionError` is thrown with a `message`property set equal to the value of the `message` parameter. If the `message`parameter is `undefined`, a default + * error message is assigned. If the `message`parameter is an instance of an `Error` then it will be thrown instead of the`AssertionError`. + * If no arguments are passed in at all `message` will be set to the string:`` 'No value argument passed to `assert.ok()`' ``. + * + * Be aware that in the `repl` the error message will be different to the one + * thrown in a file! See below for further details. + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.ok(true); + * // OK + * assert.ok(1); + * // OK + * + * assert.ok(); + * // AssertionError: No value argument passed to `assert.ok()` + * + * assert.ok(false, 'it\'s false'); + * // AssertionError: it's false + * + * // In the repl: + * assert.ok(typeof 123 === 'string'); + * // AssertionError: false == true + * + * // In a file (e.g. test.js): + * assert.ok(typeof 123 === 'string'); + * // AssertionError: The expression evaluated to a falsy value: + * // + * // assert.ok(typeof 123 === 'string') + * + * assert.ok(false); + * // AssertionError: The expression evaluated to a falsy value: + * // + * // assert.ok(false) + * + * assert.ok(0); + * // AssertionError: The expression evaluated to a falsy value: + * // + * // assert.ok(0) + * ``` + * + * ```js + * import assert from 'node:assert/strict'; + * + * // Using `assert()` works the same: + * assert(0); + * // AssertionError: The expression evaluated to a falsy value: + * // + * // assert(0) + * ``` + * @since v0.1.21 + */ + function ok(value: unknown, message?: string | Error): asserts value; + /** + * **Strict assertion mode** + * + * An alias of {@link strictEqual}. + * + * **Legacy assertion mode** + * + * > Stability: 3 - Legacy: Use {@link strictEqual} instead. + * + * Tests shallow, coercive equality between the `actual` and `expected` parameters + * using the [`==` operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Equality). `NaN` is specially handled + * and treated as being identical if both sides are `NaN`. + * + * ```js + * import assert from 'node:assert'; + * + * assert.equal(1, 1); + * // OK, 1 == 1 + * assert.equal(1, '1'); + * // OK, 1 == '1' + * assert.equal(NaN, NaN); + * // OK + * + * assert.equal(1, 2); + * // AssertionError: 1 == 2 + * assert.equal({ a: { b: 1 } }, { a: { b: 1 } }); + * // AssertionError: { a: { b: 1 } } == { a: { b: 1 } } + * ``` + * + * If the values are not equal, an `AssertionError` is thrown with a `message`property set equal to the value of the `message` parameter. If the `message`parameter is undefined, a default + * error message is assigned. If the `message`parameter is an instance of an `Error` then it will be thrown instead of the`AssertionError`. + * @since v0.1.21 + */ + function equal(actual: unknown, expected: unknown, message?: string | Error): void; + /** + * **Strict assertion mode** + * + * An alias of {@link notStrictEqual}. + * + * **Legacy assertion mode** + * + * > Stability: 3 - Legacy: Use {@link notStrictEqual} instead. + * + * Tests shallow, coercive inequality with the [`!=` operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Inequality). `NaN` is + * specially handled and treated as being identical if both sides are `NaN`. + * + * ```js + * import assert from 'node:assert'; + * + * assert.notEqual(1, 2); + * // OK + * + * assert.notEqual(1, 1); + * // AssertionError: 1 != 1 + * + * assert.notEqual(1, '1'); + * // AssertionError: 1 != '1' + * ``` + * + * If the values are equal, an `AssertionError` is thrown with a `message`property set equal to the value of the `message` parameter. If the `message`parameter is undefined, a default error + * message is assigned. If the `message`parameter is an instance of an `Error` then it will be thrown instead of the`AssertionError`. + * @since v0.1.21 + */ + function notEqual(actual: unknown, expected: unknown, message?: string | Error): void; + /** + * **Strict assertion mode** + * + * An alias of {@link deepStrictEqual}. + * + * **Legacy assertion mode** + * + * > Stability: 3 - Legacy: Use {@link deepStrictEqual} instead. + * + * Tests for deep equality between the `actual` and `expected` parameters. Consider + * using {@link deepStrictEqual} instead. {@link deepEqual} can have + * surprising results. + * + * _Deep equality_ means that the enumerable "own" properties of child objects + * are also recursively evaluated by the following rules. + * @since v0.1.21 + */ + function deepEqual(actual: unknown, expected: unknown, message?: string | Error): void; + /** + * **Strict assertion mode** + * + * An alias of {@link notDeepStrictEqual}. + * + * **Legacy assertion mode** + * + * > Stability: 3 - Legacy: Use {@link notDeepStrictEqual} instead. + * + * Tests for any deep inequality. Opposite of {@link deepEqual}. + * + * ```js + * import assert from 'node:assert'; + * + * const obj1 = { + * a: { + * b: 1, + * }, + * }; + * const obj2 = { + * a: { + * b: 2, + * }, + * }; + * const obj3 = { + * a: { + * b: 1, + * }, + * }; + * const obj4 = { __proto__: obj1 }; + * + * assert.notDeepEqual(obj1, obj1); + * // AssertionError: { a: { b: 1 } } notDeepEqual { a: { b: 1 } } + * + * assert.notDeepEqual(obj1, obj2); + * // OK + * + * assert.notDeepEqual(obj1, obj3); + * // AssertionError: { a: { b: 1 } } notDeepEqual { a: { b: 1 } } + * + * assert.notDeepEqual(obj1, obj4); + * // OK + * ``` + * + * If the values are deeply equal, an `AssertionError` is thrown with a`message` property set equal to the value of the `message` parameter. If the`message` parameter is undefined, a default + * error message is assigned. If the`message` parameter is an instance of an `Error` then it will be thrown + * instead of the `AssertionError`. + * @since v0.1.21 + */ + function notDeepEqual(actual: unknown, expected: unknown, message?: string | Error): void; + /** + * Tests strict equality between the `actual` and `expected` parameters as + * determined by [`Object.is()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is). + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.strictEqual(1, 2); + * // AssertionError [ERR_ASSERTION]: Expected inputs to be strictly equal: + * // + * // 1 !== 2 + * + * assert.strictEqual(1, 1); + * // OK + * + * assert.strictEqual('Hello foobar', 'Hello World!'); + * // AssertionError [ERR_ASSERTION]: Expected inputs to be strictly equal: + * // + actual - expected + * // + * // + 'Hello foobar' + * // - 'Hello World!' + * // ^ + * + * const apples = 1; + * const oranges = 2; + * assert.strictEqual(apples, oranges, `apples ${apples} !== oranges ${oranges}`); + * // AssertionError [ERR_ASSERTION]: apples 1 !== oranges 2 + * + * assert.strictEqual(1, '1', new TypeError('Inputs are not identical')); + * // TypeError: Inputs are not identical + * ``` + * + * If the values are not strictly equal, an `AssertionError` is thrown with a`message` property set equal to the value of the `message` parameter. If the`message` parameter is undefined, a + * default error message is assigned. If the`message` parameter is an instance of an `Error` then it will be thrown + * instead of the `AssertionError`. + * @since v0.1.21 + */ + function strictEqual(actual: unknown, expected: T, message?: string | Error): asserts actual is T; + /** + * Tests strict inequality between the `actual` and `expected` parameters as + * determined by [`Object.is()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is). + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.notStrictEqual(1, 2); + * // OK + * + * assert.notStrictEqual(1, 1); + * // AssertionError [ERR_ASSERTION]: Expected "actual" to be strictly unequal to: + * // + * // 1 + * + * assert.notStrictEqual(1, '1'); + * // OK + * ``` + * + * If the values are strictly equal, an `AssertionError` is thrown with a`message` property set equal to the value of the `message` parameter. If the`message` parameter is undefined, a + * default error message is assigned. If the`message` parameter is an instance of an `Error` then it will be thrown + * instead of the `AssertionError`. + * @since v0.1.21 + */ + function notStrictEqual(actual: unknown, expected: unknown, message?: string | Error): void; + /** + * Tests for deep equality between the `actual` and `expected` parameters. + * "Deep" equality means that the enumerable "own" properties of child objects + * are recursively evaluated also by the following rules. + * @since v1.2.0 + */ + function deepStrictEqual(actual: unknown, expected: T, message?: string | Error): asserts actual is T; + /** + * Tests for deep strict inequality. Opposite of {@link deepStrictEqual}. + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.notDeepStrictEqual({ a: 1 }, { a: '1' }); + * // OK + * ``` + * + * If the values are deeply and strictly equal, an `AssertionError` is thrown + * with a `message` property set equal to the value of the `message` parameter. If + * the `message` parameter is undefined, a default error message is assigned. If + * the `message` parameter is an instance of an `Error` then it will be thrown + * instead of the `AssertionError`. + * @since v1.2.0 + */ + function notDeepStrictEqual(actual: unknown, expected: unknown, message?: string | Error): void; + /** + * Expects the function `fn` to throw an error. + * + * If specified, `error` can be a [`Class`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes), + * [`RegExp`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions), a validation function, + * a validation object where each property will be tested for strict deep equality, + * or an instance of error where each property will be tested for strict deep + * equality including the non-enumerable `message` and `name` properties. When + * using an object, it is also possible to use a regular expression, when + * validating against a string property. See below for examples. + * + * If specified, `message` will be appended to the message provided by the`AssertionError` if the `fn` call fails to throw or in case the error validation + * fails. + * + * Custom validation object/error instance: + * + * ```js + * import assert from 'node:assert/strict'; + * + * const err = new TypeError('Wrong value'); + * err.code = 404; + * err.foo = 'bar'; + * err.info = { + * nested: true, + * baz: 'text', + * }; + * err.reg = /abc/i; + * + * assert.throws( + * () => { + * throw err; + * }, + * { + * name: 'TypeError', + * message: 'Wrong value', + * info: { + * nested: true, + * baz: 'text', + * }, + * // Only properties on the validation object will be tested for. + * // Using nested objects requires all properties to be present. Otherwise + * // the validation is going to fail. + * }, + * ); + * + * // Using regular expressions to validate error properties: + * assert.throws( + * () => { + * throw err; + * }, + * { + * // The `name` and `message` properties are strings and using regular + * // expressions on those will match against the string. If they fail, an + * // error is thrown. + * name: /^TypeError$/, + * message: /Wrong/, + * foo: 'bar', + * info: { + * nested: true, + * // It is not possible to use regular expressions for nested properties! + * baz: 'text', + * }, + * // The `reg` property contains a regular expression and only if the + * // validation object contains an identical regular expression, it is going + * // to pass. + * reg: /abc/i, + * }, + * ); + * + * // Fails due to the different `message` and `name` properties: + * assert.throws( + * () => { + * const otherErr = new Error('Not found'); + * // Copy all enumerable properties from `err` to `otherErr`. + * for (const [key, value] of Object.entries(err)) { + * otherErr[key] = value; + * } + * throw otherErr; + * }, + * // The error's `message` and `name` properties will also be checked when using + * // an error as validation object. + * err, + * ); + * ``` + * + * Validate instanceof using constructor: + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.throws( + * () => { + * throw new Error('Wrong value'); + * }, + * Error, + * ); + * ``` + * + * Validate error message using [`RegExp`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions): + * + * Using a regular expression runs `.toString` on the error object, and will + * therefore also include the error name. + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.throws( + * () => { + * throw new Error('Wrong value'); + * }, + * /^Error: Wrong value$/, + * ); + * ``` + * + * Custom error validation: + * + * The function must return `true` to indicate all internal validations passed. + * It will otherwise fail with an `AssertionError`. + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.throws( + * () => { + * throw new Error('Wrong value'); + * }, + * (err) => { + * assert(err instanceof Error); + * assert(/value/.test(err)); + * // Avoid returning anything from validation functions besides `true`. + * // Otherwise, it's not clear what part of the validation failed. Instead, + * // throw an error about the specific validation that failed (as done in this + * // example) and add as much helpful debugging information to that error as + * // possible. + * return true; + * }, + * 'unexpected error', + * ); + * ``` + * + * `error` cannot be a string. If a string is provided as the second + * argument, then `error` is assumed to be omitted and the string will be used for`message` instead. This can lead to easy-to-miss mistakes. Using the same + * message as the thrown error message is going to result in an`ERR_AMBIGUOUS_ARGUMENT` error. Please read the example below carefully if using + * a string as the second argument gets considered: + * + * ```js + * import assert from 'node:assert/strict'; + * + * function throwingFirst() { + * throw new Error('First'); + * } + * + * function throwingSecond() { + * throw new Error('Second'); + * } + * + * function notThrowing() {} + * + * // The second argument is a string and the input function threw an Error. + * // The first case will not throw as it does not match for the error message + * // thrown by the input function! + * assert.throws(throwingFirst, 'Second'); + * // In the next example the message has no benefit over the message from the + * // error and since it is not clear if the user intended to actually match + * // against the error message, Node.js throws an `ERR_AMBIGUOUS_ARGUMENT` error. + * assert.throws(throwingSecond, 'Second'); + * // TypeError [ERR_AMBIGUOUS_ARGUMENT] + * + * // The string is only used (as message) in case the function does not throw: + * assert.throws(notThrowing, 'Second'); + * // AssertionError [ERR_ASSERTION]: Missing expected exception: Second + * + * // If it was intended to match for the error message do this instead: + * // It does not throw because the error messages match. + * assert.throws(throwingSecond, /Second$/); + * + * // If the error message does not match, an AssertionError is thrown. + * assert.throws(throwingFirst, /Second$/); + * // AssertionError [ERR_ASSERTION] + * ``` + * + * Due to the confusing error-prone notation, avoid a string as the second + * argument. + * @since v0.1.21 + */ + function throws(block: () => unknown, message?: string | Error): void; + function throws(block: () => unknown, error: AssertPredicate, message?: string | Error): void; + /** + * Asserts that the function `fn` does not throw an error. + * + * Using `assert.doesNotThrow()` is actually not useful because there + * is no benefit in catching an error and then rethrowing it. Instead, consider + * adding a comment next to the specific code path that should not throw and keep + * error messages as expressive as possible. + * + * When `assert.doesNotThrow()` is called, it will immediately call the `fn`function. + * + * If an error is thrown and it is the same type as that specified by the `error`parameter, then an `AssertionError` is thrown. If the error is of a + * different type, or if the `error` parameter is undefined, the error is + * propagated back to the caller. + * + * If specified, `error` can be a [`Class`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes), + * [`RegExp`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions), or a validation + * function. See {@link throws} for more details. + * + * The following, for instance, will throw the `TypeError` because there is no + * matching error type in the assertion: + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.doesNotThrow( + * () => { + * throw new TypeError('Wrong value'); + * }, + * SyntaxError, + * ); + * ``` + * + * However, the following will result in an `AssertionError` with the message + * 'Got unwanted exception...': + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.doesNotThrow( + * () => { + * throw new TypeError('Wrong value'); + * }, + * TypeError, + * ); + * ``` + * + * If an `AssertionError` is thrown and a value is provided for the `message`parameter, the value of `message` will be appended to the `AssertionError` message: + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.doesNotThrow( + * () => { + * throw new TypeError('Wrong value'); + * }, + * /Wrong value/, + * 'Whoops', + * ); + * // Throws: AssertionError: Got unwanted exception: Whoops + * ``` + * @since v0.1.21 + */ + function doesNotThrow(block: () => unknown, message?: string | Error): void; + function doesNotThrow(block: () => unknown, error: AssertPredicate, message?: string | Error): void; + /** + * Throws `value` if `value` is not `undefined` or `null`. This is useful when + * testing the `error` argument in callbacks. The stack trace contains all frames + * from the error passed to `ifError()` including the potential new frames for`ifError()` itself. + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.ifError(null); + * // OK + * assert.ifError(0); + * // AssertionError [ERR_ASSERTION]: ifError got unwanted exception: 0 + * assert.ifError('error'); + * // AssertionError [ERR_ASSERTION]: ifError got unwanted exception: 'error' + * assert.ifError(new Error()); + * // AssertionError [ERR_ASSERTION]: ifError got unwanted exception: Error + * + * // Create some random error frames. + * let err; + * (function errorFrame() { + * err = new Error('test error'); + * })(); + * + * (function ifErrorFrame() { + * assert.ifError(err); + * })(); + * // AssertionError [ERR_ASSERTION]: ifError got unwanted exception: test error + * // at ifErrorFrame + * // at errorFrame + * ``` + * @since v0.1.97 + */ + function ifError(value: unknown): asserts value is null | undefined; + /** + * Awaits the `asyncFn` promise or, if `asyncFn` is a function, immediately + * calls the function and awaits the returned promise to complete. It will then + * check that the promise is rejected. + * + * If `asyncFn` is a function and it throws an error synchronously,`assert.rejects()` will return a rejected `Promise` with that error. If the + * function does not return a promise, `assert.rejects()` will return a rejected`Promise` with an `ERR_INVALID_RETURN_VALUE` error. In both cases the error + * handler is skipped. + * + * Besides the async nature to await the completion behaves identically to {@link throws}. + * + * If specified, `error` can be a [`Class`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes), + * [`RegExp`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions), a validation function, + * an object where each property will be tested for, or an instance of error where + * each property will be tested for including the non-enumerable `message` and`name` properties. + * + * If specified, `message` will be the message provided by the `AssertionError` if the `asyncFn` fails to reject. + * + * ```js + * import assert from 'node:assert/strict'; + * + * await assert.rejects( + * async () => { + * throw new TypeError('Wrong value'); + * }, + * { + * name: 'TypeError', + * message: 'Wrong value', + * }, + * ); + * ``` + * + * ```js + * import assert from 'node:assert/strict'; + * + * await assert.rejects( + * async () => { + * throw new TypeError('Wrong value'); + * }, + * (err) => { + * assert.strictEqual(err.name, 'TypeError'); + * assert.strictEqual(err.message, 'Wrong value'); + * return true; + * }, + * ); + * ``` + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.rejects( + * Promise.reject(new Error('Wrong value')), + * Error, + * ).then(() => { + * // ... + * }); + * ``` + * + * `error` cannot be a string. If a string is provided as the second + * argument, then `error` is assumed to be omitted and the string will be used for`message` instead. This can lead to easy-to-miss mistakes. Please read the + * example in {@link throws} carefully if using a string as the second + * argument gets considered. + * @since v10.0.0 + */ + function rejects(block: (() => Promise) | Promise, message?: string | Error): Promise; + function rejects( + block: (() => Promise) | Promise, + error: AssertPredicate, + message?: string | Error, + ): Promise; + /** + * Awaits the `asyncFn` promise or, if `asyncFn` is a function, immediately + * calls the function and awaits the returned promise to complete. It will then + * check that the promise is not rejected. + * + * If `asyncFn` is a function and it throws an error synchronously,`assert.doesNotReject()` will return a rejected `Promise` with that error. If + * the function does not return a promise, `assert.doesNotReject()` will return a + * rejected `Promise` with an `ERR_INVALID_RETURN_VALUE` error. In both cases + * the error handler is skipped. + * + * Using `assert.doesNotReject()` is actually not useful because there is little + * benefit in catching a rejection and then rejecting it again. Instead, consider + * adding a comment next to the specific code path that should not reject and keep + * error messages as expressive as possible. + * + * If specified, `error` can be a [`Class`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes), + * [`RegExp`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions), or a validation + * function. See {@link throws} for more details. + * + * Besides the async nature to await the completion behaves identically to {@link doesNotThrow}. + * + * ```js + * import assert from 'node:assert/strict'; + * + * await assert.doesNotReject( + * async () => { + * throw new TypeError('Wrong value'); + * }, + * SyntaxError, + * ); + * ``` + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.doesNotReject(Promise.reject(new TypeError('Wrong value'))) + * .then(() => { + * // ... + * }); + * ``` + * @since v10.0.0 + */ + function doesNotReject( + block: (() => Promise) | Promise, + message?: string | Error, + ): Promise; + function doesNotReject( + block: (() => Promise) | Promise, + error: AssertPredicate, + message?: string | Error, + ): Promise; + /** + * Expects the `string` input to match the regular expression. + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.match('I will fail', /pass/); + * // AssertionError [ERR_ASSERTION]: The input did not match the regular ... + * + * assert.match(123, /pass/); + * // AssertionError [ERR_ASSERTION]: The "string" argument must be of type string. + * + * assert.match('I will pass', /pass/); + * // OK + * ``` + * + * If the values do not match, or if the `string` argument is of another type than`string`, an `AssertionError` is thrown with a `message` property set equal + * to the value of the `message` parameter. If the `message` parameter is + * undefined, a default error message is assigned. If the `message` parameter is an + * instance of an `Error` then it will be thrown instead of the `AssertionError`. + * @since v13.6.0, v12.16.0 + */ + function match(value: string, regExp: RegExp, message?: string | Error): void; + /** + * Expects the `string` input not to match the regular expression. + * + * ```js + * import assert from 'node:assert/strict'; + * + * assert.doesNotMatch('I will fail', /fail/); + * // AssertionError [ERR_ASSERTION]: The input was expected to not match the ... + * + * assert.doesNotMatch(123, /pass/); + * // AssertionError [ERR_ASSERTION]: The "string" argument must be of type string. + * + * assert.doesNotMatch('I will pass', /different/); + * // OK + * ``` + * + * If the values do match, or if the `string` argument is of another type than`string`, an `AssertionError` is thrown with a `message` property set equal + * to the value of the `message` parameter. If the `message` parameter is + * undefined, a default error message is assigned. If the `message` parameter is an + * instance of an `Error` then it will be thrown instead of the `AssertionError`. + * @since v13.6.0, v12.16.0 + */ + function doesNotMatch(value: string, regExp: RegExp, message?: string | Error): void; + const strict: + & Omit< + typeof assert, + | "equal" + | "notEqual" + | "deepEqual" + | "notDeepEqual" + | "ok" + | "strictEqual" + | "deepStrictEqual" + | "ifError" + | "strict" + > + & { + (value: unknown, message?: string | Error): asserts value; + equal: typeof strictEqual; + notEqual: typeof notStrictEqual; + deepEqual: typeof deepStrictEqual; + notDeepEqual: typeof notDeepStrictEqual; + // Mapped types and assertion functions are incompatible? + // TS2775: Assertions require every name in the call target + // to be declared with an explicit type annotation. + ok: typeof ok; + strictEqual: typeof strictEqual; + deepStrictEqual: typeof deepStrictEqual; + ifError: typeof ifError; + strict: typeof strict; + }; + } + export = assert; +} +declare module "node:assert" { + import assert = require("assert"); + export = assert; +} diff --git a/task/node_modules/@types/node/ts4.8/assert/strict.d.ts b/task/node_modules/@types/node/ts4.8/assert/strict.d.ts new file mode 100644 index 0000000..f333913 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/assert/strict.d.ts @@ -0,0 +1,8 @@ +declare module "assert/strict" { + import { strict } from "node:assert"; + export = strict; +} +declare module "node:assert/strict" { + import { strict } from "node:assert"; + export = strict; +} diff --git a/task/node_modules/@types/node/ts4.8/async_hooks.d.ts b/task/node_modules/@types/node/ts4.8/async_hooks.d.ts new file mode 100644 index 0000000..0667a61 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/async_hooks.d.ts @@ -0,0 +1,539 @@ +/** + * We strongly discourage the use of the `async_hooks` API. + * Other APIs that can cover most of its use cases include: + * + * * `AsyncLocalStorage` tracks async context + * * `process.getActiveResourcesInfo()` tracks active resources + * + * The `node:async_hooks` module provides an API to track asynchronous resources. + * It can be accessed using: + * + * ```js + * import async_hooks from 'node:async_hooks'; + * ``` + * @experimental + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/async_hooks.js) + */ +declare module "async_hooks" { + /** + * ```js + * import { executionAsyncId } from 'node:async_hooks'; + * import fs from 'node:fs'; + * + * console.log(executionAsyncId()); // 1 - bootstrap + * const path = '.'; + * fs.open(path, 'r', (err, fd) => { + * console.log(executionAsyncId()); // 6 - open() + * }); + * ``` + * + * The ID returned from `executionAsyncId()` is related to execution timing, not + * causality (which is covered by `triggerAsyncId()`): + * + * ```js + * const server = net.createServer((conn) => { + * // Returns the ID of the server, not of the new connection, because the + * // callback runs in the execution scope of the server's MakeCallback(). + * async_hooks.executionAsyncId(); + * + * }).listen(port, () => { + * // Returns the ID of a TickObject (process.nextTick()) because all + * // callbacks passed to .listen() are wrapped in a nextTick(). + * async_hooks.executionAsyncId(); + * }); + * ``` + * + * Promise contexts may not get precise `executionAsyncIds` by default. + * See the section on `promise execution tracking`. + * @since v8.1.0 + * @return The `asyncId` of the current execution context. Useful to track when something calls. + */ + function executionAsyncId(): number; + /** + * Resource objects returned by `executionAsyncResource()` are most often internal + * Node.js handle objects with undocumented APIs. Using any functions or properties + * on the object is likely to crash your application and should be avoided. + * + * Using `executionAsyncResource()` in the top-level execution context will + * return an empty object as there is no handle or request object to use, + * but having an object representing the top-level can be helpful. + * + * ```js + * import { open } from 'node:fs'; + * import { executionAsyncId, executionAsyncResource } from 'node:async_hooks'; + * + * console.log(executionAsyncId(), executionAsyncResource()); // 1 {} + * open(new URL(import.meta.url), 'r', (err, fd) => { + * console.log(executionAsyncId(), executionAsyncResource()); // 7 FSReqWrap + * }); + * ``` + * + * This can be used to implement continuation local storage without the + * use of a tracking `Map` to store the metadata: + * + * ```js + * import { createServer } from 'node:http'; + * import { + * executionAsyncId, + * executionAsyncResource, + * createHook, + * } from 'async_hooks'; + * const sym = Symbol('state'); // Private symbol to avoid pollution + * + * createHook({ + * init(asyncId, type, triggerAsyncId, resource) { + * const cr = executionAsyncResource(); + * if (cr) { + * resource[sym] = cr[sym]; + * } + * }, + * }).enable(); + * + * const server = createServer((req, res) => { + * executionAsyncResource()[sym] = { state: req.url }; + * setTimeout(function() { + * res.end(JSON.stringify(executionAsyncResource()[sym])); + * }, 100); + * }).listen(3000); + * ``` + * @since v13.9.0, v12.17.0 + * @return The resource representing the current execution. Useful to store data within the resource. + */ + function executionAsyncResource(): object; + /** + * ```js + * const server = net.createServer((conn) => { + * // The resource that caused (or triggered) this callback to be called + * // was that of the new connection. Thus the return value of triggerAsyncId() + * // is the asyncId of "conn". + * async_hooks.triggerAsyncId(); + * + * }).listen(port, () => { + * // Even though all callbacks passed to .listen() are wrapped in a nextTick() + * // the callback itself exists because the call to the server's .listen() + * // was made. So the return value would be the ID of the server. + * async_hooks.triggerAsyncId(); + * }); + * ``` + * + * Promise contexts may not get valid `triggerAsyncId`s by default. See + * the section on `promise execution tracking`. + * @return The ID of the resource responsible for calling the callback that is currently being executed. + */ + function triggerAsyncId(): number; + interface HookCallbacks { + /** + * Called when a class is constructed that has the possibility to emit an asynchronous event. + * @param asyncId a unique ID for the async resource + * @param type the type of the async resource + * @param triggerAsyncId the unique ID of the async resource in whose execution context this async resource was created + * @param resource reference to the resource representing the async operation, needs to be released during destroy + */ + init?(asyncId: number, type: string, triggerAsyncId: number, resource: object): void; + /** + * When an asynchronous operation is initiated or completes a callback is called to notify the user. + * The before callback is called just before said callback is executed. + * @param asyncId the unique identifier assigned to the resource about to execute the callback. + */ + before?(asyncId: number): void; + /** + * Called immediately after the callback specified in before is completed. + * @param asyncId the unique identifier assigned to the resource which has executed the callback. + */ + after?(asyncId: number): void; + /** + * Called when a promise has resolve() called. This may not be in the same execution id + * as the promise itself. + * @param asyncId the unique id for the promise that was resolve()d. + */ + promiseResolve?(asyncId: number): void; + /** + * Called after the resource corresponding to asyncId is destroyed + * @param asyncId a unique ID for the async resource + */ + destroy?(asyncId: number): void; + } + interface AsyncHook { + /** + * Enable the callbacks for a given AsyncHook instance. If no callbacks are provided enabling is a noop. + */ + enable(): this; + /** + * Disable the callbacks for a given AsyncHook instance from the global pool of AsyncHook callbacks to be executed. Once a hook has been disabled it will not be called again until enabled. + */ + disable(): this; + } + /** + * Registers functions to be called for different lifetime events of each async + * operation. + * + * The callbacks `init()`/`before()`/`after()`/`destroy()` are called for the + * respective asynchronous event during a resource's lifetime. + * + * All callbacks are optional. For example, if only resource cleanup needs to + * be tracked, then only the `destroy` callback needs to be passed. The + * specifics of all functions that can be passed to `callbacks` is in the `Hook Callbacks` section. + * + * ```js + * import { createHook } from 'node:async_hooks'; + * + * const asyncHook = createHook({ + * init(asyncId, type, triggerAsyncId, resource) { }, + * destroy(asyncId) { }, + * }); + * ``` + * + * The callbacks will be inherited via the prototype chain: + * + * ```js + * class MyAsyncCallbacks { + * init(asyncId, type, triggerAsyncId, resource) { } + * destroy(asyncId) {} + * } + * + * class MyAddedCallbacks extends MyAsyncCallbacks { + * before(asyncId) { } + * after(asyncId) { } + * } + * + * const asyncHook = async_hooks.createHook(new MyAddedCallbacks()); + * ``` + * + * Because promises are asynchronous resources whose lifecycle is tracked + * via the async hooks mechanism, the `init()`, `before()`, `after()`, and`destroy()` callbacks _must not_ be async functions that return promises. + * @since v8.1.0 + * @param callbacks The `Hook Callbacks` to register + * @return Instance used for disabling and enabling hooks + */ + function createHook(callbacks: HookCallbacks): AsyncHook; + interface AsyncResourceOptions { + /** + * The ID of the execution context that created this async event. + * @default executionAsyncId() + */ + triggerAsyncId?: number | undefined; + /** + * Disables automatic `emitDestroy` when the object is garbage collected. + * This usually does not need to be set (even if `emitDestroy` is called + * manually), unless the resource's `asyncId` is retrieved and the + * sensitive API's `emitDestroy` is called with it. + * @default false + */ + requireManualDestroy?: boolean | undefined; + } + /** + * The class `AsyncResource` is designed to be extended by the embedder's async + * resources. Using this, users can easily trigger the lifetime events of their + * own resources. + * + * The `init` hook will trigger when an `AsyncResource` is instantiated. + * + * The following is an overview of the `AsyncResource` API. + * + * ```js + * import { AsyncResource, executionAsyncId } from 'node:async_hooks'; + * + * // AsyncResource() is meant to be extended. Instantiating a + * // new AsyncResource() also triggers init. If triggerAsyncId is omitted then + * // async_hook.executionAsyncId() is used. + * const asyncResource = new AsyncResource( + * type, { triggerAsyncId: executionAsyncId(), requireManualDestroy: false }, + * ); + * + * // Run a function in the execution context of the resource. This will + * // * establish the context of the resource + * // * trigger the AsyncHooks before callbacks + * // * call the provided function `fn` with the supplied arguments + * // * trigger the AsyncHooks after callbacks + * // * restore the original execution context + * asyncResource.runInAsyncScope(fn, thisArg, ...args); + * + * // Call AsyncHooks destroy callbacks. + * asyncResource.emitDestroy(); + * + * // Return the unique ID assigned to the AsyncResource instance. + * asyncResource.asyncId(); + * + * // Return the trigger ID for the AsyncResource instance. + * asyncResource.triggerAsyncId(); + * ``` + */ + class AsyncResource { + /** + * AsyncResource() is meant to be extended. Instantiating a + * new AsyncResource() also triggers init. If triggerAsyncId is omitted then + * async_hook.executionAsyncId() is used. + * @param type The type of async event. + * @param triggerAsyncId The ID of the execution context that created + * this async event (default: `executionAsyncId()`), or an + * AsyncResourceOptions object (since v9.3.0) + */ + constructor(type: string, triggerAsyncId?: number | AsyncResourceOptions); + /** + * Binds the given function to the current execution context. + * @since v14.8.0, v12.19.0 + * @param fn The function to bind to the current execution context. + * @param type An optional name to associate with the underlying `AsyncResource`. + */ + static bind any, ThisArg>( + fn: Func, + type?: string, + thisArg?: ThisArg, + ): Func; + /** + * Binds the given function to execute to this `AsyncResource`'s scope. + * @since v14.8.0, v12.19.0 + * @param fn The function to bind to the current `AsyncResource`. + */ + bind any>(fn: Func): Func; + /** + * Call the provided function with the provided arguments in the execution context + * of the async resource. This will establish the context, trigger the AsyncHooks + * before callbacks, call the function, trigger the AsyncHooks after callbacks, and + * then restore the original execution context. + * @since v9.6.0 + * @param fn The function to call in the execution context of this async resource. + * @param thisArg The receiver to be used for the function call. + * @param args Optional arguments to pass to the function. + */ + runInAsyncScope( + fn: (this: This, ...args: any[]) => Result, + thisArg?: This, + ...args: any[] + ): Result; + /** + * Call all `destroy` hooks. This should only ever be called once. An error will + * be thrown if it is called more than once. This **must** be manually called. If + * the resource is left to be collected by the GC then the `destroy` hooks will + * never be called. + * @return A reference to `asyncResource`. + */ + emitDestroy(): this; + /** + * @return The unique `asyncId` assigned to the resource. + */ + asyncId(): number; + /** + * @return The same `triggerAsyncId` that is passed to the `AsyncResource` constructor. + */ + triggerAsyncId(): number; + } + /** + * This class creates stores that stay coherent through asynchronous operations. + * + * While you can create your own implementation on top of the `node:async_hooks`module, `AsyncLocalStorage` should be preferred as it is a performant and memory + * safe implementation that involves significant optimizations that are non-obvious + * to implement. + * + * The following example uses `AsyncLocalStorage` to build a simple logger + * that assigns IDs to incoming HTTP requests and includes them in messages + * logged within each request. + * + * ```js + * import http from 'node:http'; + * import { AsyncLocalStorage } from 'node:async_hooks'; + * + * const asyncLocalStorage = new AsyncLocalStorage(); + * + * function logWithId(msg) { + * const id = asyncLocalStorage.getStore(); + * console.log(`${id !== undefined ? id : '-'}:`, msg); + * } + * + * let idSeq = 0; + * http.createServer((req, res) => { + * asyncLocalStorage.run(idSeq++, () => { + * logWithId('start'); + * // Imagine any chain of async operations here + * setImmediate(() => { + * logWithId('finish'); + * res.end(); + * }); + * }); + * }).listen(8080); + * + * http.get('http://localhost:8080'); + * http.get('http://localhost:8080'); + * // Prints: + * // 0: start + * // 1: start + * // 0: finish + * // 1: finish + * ``` + * + * Each instance of `AsyncLocalStorage` maintains an independent storage context. + * Multiple instances can safely exist simultaneously without risk of interfering + * with each other's data. + * @since v13.10.0, v12.17.0 + */ + class AsyncLocalStorage { + /** + * Binds the given function to the current execution context. + * @since v19.8.0 + * @experimental + * @param fn The function to bind to the current execution context. + * @return A new function that calls `fn` within the captured execution context. + */ + static bind any>(fn: Func): Func; + /** + * Captures the current execution context and returns a function that accepts a + * function as an argument. Whenever the returned function is called, it + * calls the function passed to it within the captured context. + * + * ```js + * const asyncLocalStorage = new AsyncLocalStorage(); + * const runInAsyncScope = asyncLocalStorage.run(123, () => AsyncLocalStorage.snapshot()); + * const result = asyncLocalStorage.run(321, () => runInAsyncScope(() => asyncLocalStorage.getStore())); + * console.log(result); // returns 123 + * ``` + * + * AsyncLocalStorage.snapshot() can replace the use of AsyncResource for simple + * async context tracking purposes, for example: + * + * ```js + * class Foo { + * #runInAsyncScope = AsyncLocalStorage.snapshot(); + * + * get() { return this.#runInAsyncScope(() => asyncLocalStorage.getStore()); } + * } + * + * const foo = asyncLocalStorage.run(123, () => new Foo()); + * console.log(asyncLocalStorage.run(321, () => foo.get())); // returns 123 + * ``` + * @since v19.8.0 + * @experimental + * @return A new function with the signature `(fn: (...args) : R, ...args) : R`. + */ + static snapshot(): (fn: (...args: TArgs) => R, ...args: TArgs) => R; + /** + * Disables the instance of `AsyncLocalStorage`. All subsequent calls + * to `asyncLocalStorage.getStore()` will return `undefined` until`asyncLocalStorage.run()` or `asyncLocalStorage.enterWith()` is called again. + * + * When calling `asyncLocalStorage.disable()`, all current contexts linked to the + * instance will be exited. + * + * Calling `asyncLocalStorage.disable()` is required before the`asyncLocalStorage` can be garbage collected. This does not apply to stores + * provided by the `asyncLocalStorage`, as those objects are garbage collected + * along with the corresponding async resources. + * + * Use this method when the `asyncLocalStorage` is not in use anymore + * in the current process. + * @since v13.10.0, v12.17.0 + * @experimental + */ + disable(): void; + /** + * Returns the current store. + * If called outside of an asynchronous context initialized by + * calling `asyncLocalStorage.run()` or `asyncLocalStorage.enterWith()`, it + * returns `undefined`. + * @since v13.10.0, v12.17.0 + */ + getStore(): T | undefined; + /** + * Runs a function synchronously within a context and returns its + * return value. The store is not accessible outside of the callback function. + * The store is accessible to any asynchronous operations created within the + * callback. + * + * The optional `args` are passed to the callback function. + * + * If the callback function throws an error, the error is thrown by `run()` too. + * The stacktrace is not impacted by this call and the context is exited. + * + * Example: + * + * ```js + * const store = { id: 2 }; + * try { + * asyncLocalStorage.run(store, () => { + * asyncLocalStorage.getStore(); // Returns the store object + * setTimeout(() => { + * asyncLocalStorage.getStore(); // Returns the store object + * }, 200); + * throw new Error(); + * }); + * } catch (e) { + * asyncLocalStorage.getStore(); // Returns undefined + * // The error will be caught here + * } + * ``` + * @since v13.10.0, v12.17.0 + */ + run(store: T, callback: () => R): R; + run(store: T, callback: (...args: TArgs) => R, ...args: TArgs): R; + /** + * Runs a function synchronously outside of a context and returns its + * return value. The store is not accessible within the callback function or + * the asynchronous operations created within the callback. Any `getStore()`call done within the callback function will always return `undefined`. + * + * The optional `args` are passed to the callback function. + * + * If the callback function throws an error, the error is thrown by `exit()` too. + * The stacktrace is not impacted by this call and the context is re-entered. + * + * Example: + * + * ```js + * // Within a call to run + * try { + * asyncLocalStorage.getStore(); // Returns the store object or value + * asyncLocalStorage.exit(() => { + * asyncLocalStorage.getStore(); // Returns undefined + * throw new Error(); + * }); + * } catch (e) { + * asyncLocalStorage.getStore(); // Returns the same object or value + * // The error will be caught here + * } + * ``` + * @since v13.10.0, v12.17.0 + * @experimental + */ + exit(callback: (...args: TArgs) => R, ...args: TArgs): R; + /** + * Transitions into the context for the remainder of the current + * synchronous execution and then persists the store through any following + * asynchronous calls. + * + * Example: + * + * ```js + * const store = { id: 1 }; + * // Replaces previous store with the given store object + * asyncLocalStorage.enterWith(store); + * asyncLocalStorage.getStore(); // Returns the store object + * someAsyncOperation(() => { + * asyncLocalStorage.getStore(); // Returns the same object + * }); + * ``` + * + * This transition will continue for the _entire_ synchronous execution. + * This means that if, for example, the context is entered within an event + * handler subsequent event handlers will also run within that context unless + * specifically bound to another context with an `AsyncResource`. That is why`run()` should be preferred over `enterWith()` unless there are strong reasons + * to use the latter method. + * + * ```js + * const store = { id: 1 }; + * + * emitter.on('my-event', () => { + * asyncLocalStorage.enterWith(store); + * }); + * emitter.on('my-event', () => { + * asyncLocalStorage.getStore(); // Returns the same object + * }); + * + * asyncLocalStorage.getStore(); // Returns undefined + * emitter.emit('my-event'); + * asyncLocalStorage.getStore(); // Returns the same object + * ``` + * @since v13.11.0, v12.17.0 + * @experimental + */ + enterWith(store: T): void; + } +} +declare module "node:async_hooks" { + export * from "async_hooks"; +} diff --git a/task/node_modules/@types/node/ts4.8/buffer.d.ts b/task/node_modules/@types/node/ts4.8/buffer.d.ts new file mode 100644 index 0000000..1ee5c01 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/buffer.d.ts @@ -0,0 +1,2362 @@ +/** + * `Buffer` objects are used to represent a fixed-length sequence of bytes. Many + * Node.js APIs support `Buffer`s. + * + * The `Buffer` class is a subclass of JavaScript's [`Uint8Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array) class and + * extends it with methods that cover additional use cases. Node.js APIs accept + * plain [`Uint8Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array) s wherever `Buffer`s are supported as well. + * + * While the `Buffer` class is available within the global scope, it is still + * recommended to explicitly reference it via an import or require statement. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * // Creates a zero-filled Buffer of length 10. + * const buf1 = Buffer.alloc(10); + * + * // Creates a Buffer of length 10, + * // filled with bytes which all have the value `1`. + * const buf2 = Buffer.alloc(10, 1); + * + * // Creates an uninitialized buffer of length 10. + * // This is faster than calling Buffer.alloc() but the returned + * // Buffer instance might contain old data that needs to be + * // overwritten using fill(), write(), or other functions that fill the Buffer's + * // contents. + * const buf3 = Buffer.allocUnsafe(10); + * + * // Creates a Buffer containing the bytes [1, 2, 3]. + * const buf4 = Buffer.from([1, 2, 3]); + * + * // Creates a Buffer containing the bytes [1, 1, 1, 1] – the entries + * // are all truncated using `(value & 255)` to fit into the range 0–255. + * const buf5 = Buffer.from([257, 257.5, -255, '1']); + * + * // Creates a Buffer containing the UTF-8-encoded bytes for the string 'tést': + * // [0x74, 0xc3, 0xa9, 0x73, 0x74] (in hexadecimal notation) + * // [116, 195, 169, 115, 116] (in decimal notation) + * const buf6 = Buffer.from('tést'); + * + * // Creates a Buffer containing the Latin-1 bytes [0x74, 0xe9, 0x73, 0x74]. + * const buf7 = Buffer.from('tést', 'latin1'); + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/buffer.js) + */ +declare module "buffer" { + import { BinaryLike } from "node:crypto"; + import { ReadableStream as WebReadableStream } from "node:stream/web"; + /** + * This function returns `true` if `input` contains only valid UTF-8-encoded data, + * including the case in which `input` is empty. + * + * Throws if the `input` is a detached array buffer. + * @since v19.4.0, v18.14.0 + * @param input The input to validate. + */ + export function isUtf8(input: Buffer | ArrayBuffer | NodeJS.TypedArray): boolean; + /** + * This function returns `true` if `input` contains only valid ASCII-encoded data, + * including the case in which `input` is empty. + * + * Throws if the `input` is a detached array buffer. + * @since v19.6.0, v18.15.0 + * @param input The input to validate. + */ + export function isAscii(input: Buffer | ArrayBuffer | NodeJS.TypedArray): boolean; + export const INSPECT_MAX_BYTES: number; + export const kMaxLength: number; + export const kStringMaxLength: number; + export const constants: { + MAX_LENGTH: number; + MAX_STRING_LENGTH: number; + }; + export type TranscodeEncoding = + | "ascii" + | "utf8" + | "utf-8" + | "utf16le" + | "utf-16le" + | "ucs2" + | "ucs-2" + | "latin1" + | "binary"; + /** + * Re-encodes the given `Buffer` or `Uint8Array` instance from one character + * encoding to another. Returns a new `Buffer` instance. + * + * Throws if the `fromEnc` or `toEnc` specify invalid character encodings or if + * conversion from `fromEnc` to `toEnc` is not permitted. + * + * Encodings supported by `buffer.transcode()` are: `'ascii'`, `'utf8'`,`'utf16le'`, `'ucs2'`, `'latin1'`, and `'binary'`. + * + * The transcoding process will use substitution characters if a given byte + * sequence cannot be adequately represented in the target encoding. For instance: + * + * ```js + * import { Buffer, transcode } from 'node:buffer'; + * + * const newBuf = transcode(Buffer.from('€'), 'utf8', 'ascii'); + * console.log(newBuf.toString('ascii')); + * // Prints: '?' + * ``` + * + * Because the Euro (`€`) sign is not representable in US-ASCII, it is replaced + * with `?` in the transcoded `Buffer`. + * @since v7.1.0 + * @param source A `Buffer` or `Uint8Array` instance. + * @param fromEnc The current encoding. + * @param toEnc To target encoding. + */ + export function transcode(source: Uint8Array, fromEnc: TranscodeEncoding, toEnc: TranscodeEncoding): Buffer; + export const SlowBuffer: { + /** @deprecated since v6.0.0, use `Buffer.allocUnsafeSlow()` */ + new(size: number): Buffer; + prototype: Buffer; + }; + /** + * Resolves a `'blob:nodedata:...'` an associated `Blob` object registered using + * a prior call to `URL.createObjectURL()`. + * @since v16.7.0 + * @experimental + * @param id A `'blob:nodedata:...` URL string returned by a prior call to `URL.createObjectURL()`. + */ + export function resolveObjectURL(id: string): Blob | undefined; + export { Buffer }; + /** + * @experimental + */ + export interface BlobOptions { + /** + * @default 'utf8' + */ + encoding?: BufferEncoding | undefined; + /** + * The Blob content-type. The intent is for `type` to convey + * the MIME media type of the data, however no validation of the type format + * is performed. + */ + type?: string | undefined; + } + /** + * A [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob) encapsulates immutable, raw data that can be safely shared across + * multiple worker threads. + * @since v15.7.0, v14.18.0 + */ + export class Blob { + /** + * The total size of the `Blob` in bytes. + * @since v15.7.0, v14.18.0 + */ + readonly size: number; + /** + * The content-type of the `Blob`. + * @since v15.7.0, v14.18.0 + */ + readonly type: string; + /** + * Creates a new `Blob` object containing a concatenation of the given sources. + * + * {ArrayBuffer}, {TypedArray}, {DataView}, and {Buffer} sources are copied into + * the 'Blob' and can therefore be safely modified after the 'Blob' is created. + * + * String sources are also copied into the `Blob`. + */ + constructor(sources: Array, options?: BlobOptions); + /** + * Returns a promise that fulfills with an [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer) containing a copy of + * the `Blob` data. + * @since v15.7.0, v14.18.0 + */ + arrayBuffer(): Promise; + /** + * Creates and returns a new `Blob` containing a subset of this `Blob` objects + * data. The original `Blob` is not altered. + * @since v15.7.0, v14.18.0 + * @param start The starting index. + * @param end The ending index. + * @param type The content-type for the new `Blob` + */ + slice(start?: number, end?: number, type?: string): Blob; + /** + * Returns a promise that fulfills with the contents of the `Blob` decoded as a + * UTF-8 string. + * @since v15.7.0, v14.18.0 + */ + text(): Promise; + /** + * Returns a new `ReadableStream` that allows the content of the `Blob` to be read. + * @since v16.7.0 + */ + stream(): WebReadableStream; + } + export interface FileOptions { + /** + * One of either `'transparent'` or `'native'`. When set to `'native'`, line endings in string source parts will be + * converted to the platform native line-ending as specified by `require('node:os').EOL`. + */ + endings?: "native" | "transparent"; + /** The File content-type. */ + type?: string; + /** The last modified date of the file. `Default`: Date.now(). */ + lastModified?: number; + } + /** + * A [`File`](https://developer.mozilla.org/en-US/docs/Web/API/File) provides information about files. + * @since v19.2.0, v18.13.0 + */ + export class File extends Blob { + constructor(sources: Array, fileName: string, options?: FileOptions); + /** + * The name of the `File`. + * @since v19.2.0, v18.13.0 + */ + readonly name: string; + /** + * The last modified date of the `File`. + * @since v19.2.0, v18.13.0 + */ + readonly lastModified: number; + } + export import atob = globalThis.atob; + export import btoa = globalThis.btoa; + import { Blob as NodeBlob } from "buffer"; + // This conditional type will be the existing global Blob in a browser, or + // the copy below in a Node environment. + type __Blob = typeof globalThis extends { onmessage: any; Blob: any } ? {} : NodeBlob; + global { + namespace NodeJS { + export { BufferEncoding }; + } + // Buffer class + type BufferEncoding = + | "ascii" + | "utf8" + | "utf-8" + | "utf16le" + | "utf-16le" + | "ucs2" + | "ucs-2" + | "base64" + | "base64url" + | "latin1" + | "binary" + | "hex"; + type WithImplicitCoercion = + | T + | { + valueOf(): T; + }; + /** + * Raw data is stored in instances of the Buffer class. + * A Buffer is similar to an array of integers but corresponds to a raw memory allocation outside the V8 heap. A Buffer cannot be resized. + * Valid string encodings: 'ascii'|'utf8'|'utf16le'|'ucs2'(alias of 'utf16le')|'base64'|'base64url'|'binary'(deprecated)|'hex' + */ + interface BufferConstructor { + /** + * Allocates a new buffer containing the given {str}. + * + * @param str String to store in buffer. + * @param encoding encoding to use, optional. Default is 'utf8' + * @deprecated since v10.0.0 - Use `Buffer.from(string[, encoding])` instead. + */ + new(str: string, encoding?: BufferEncoding): Buffer; + /** + * Allocates a new buffer of {size} octets. + * + * @param size count of octets to allocate. + * @deprecated since v10.0.0 - Use `Buffer.alloc()` instead (also see `Buffer.allocUnsafe()`). + */ + new(size: number): Buffer; + /** + * Allocates a new buffer containing the given {array} of octets. + * + * @param array The octets to store. + * @deprecated since v10.0.0 - Use `Buffer.from(array)` instead. + */ + new(array: Uint8Array): Buffer; + /** + * Produces a Buffer backed by the same allocated memory as + * the given {ArrayBuffer}/{SharedArrayBuffer}. + * + * @param arrayBuffer The ArrayBuffer with which to share memory. + * @deprecated since v10.0.0 - Use `Buffer.from(arrayBuffer[, byteOffset[, length]])` instead. + */ + new(arrayBuffer: ArrayBuffer | SharedArrayBuffer): Buffer; + /** + * Allocates a new buffer containing the given {array} of octets. + * + * @param array The octets to store. + * @deprecated since v10.0.0 - Use `Buffer.from(array)` instead. + */ + new(array: readonly any[]): Buffer; + /** + * Copies the passed {buffer} data onto a new {Buffer} instance. + * + * @param buffer The buffer to copy. + * @deprecated since v10.0.0 - Use `Buffer.from(buffer)` instead. + */ + new(buffer: Buffer): Buffer; + /** + * Allocates a new `Buffer` using an `array` of bytes in the range `0` – `255`. + * Array entries outside that range will be truncated to fit into it. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * // Creates a new Buffer containing the UTF-8 bytes of the string 'buffer'. + * const buf = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]); + * ``` + * + * If `array` is an `Array`\-like object (that is, one with a `length` property of + * type `number`), it is treated as if it is an array, unless it is a `Buffer` or + * a `Uint8Array`. This means all other `TypedArray` variants get treated as an`Array`. To create a `Buffer` from the bytes backing a `TypedArray`, use `Buffer.copyBytesFrom()`. + * + * A `TypeError` will be thrown if `array` is not an `Array` or another type + * appropriate for `Buffer.from()` variants. + * + * `Buffer.from(array)` and `Buffer.from(string)` may also use the internal`Buffer` pool like `Buffer.allocUnsafe()` does. + * @since v5.10.0 + */ + from( + arrayBuffer: WithImplicitCoercion, + byteOffset?: number, + length?: number, + ): Buffer; + /** + * Creates a new Buffer using the passed {data} + * @param data data to create a new Buffer + */ + from(data: Uint8Array | readonly number[]): Buffer; + from(data: WithImplicitCoercion): Buffer; + /** + * Creates a new Buffer containing the given JavaScript string {str}. + * If provided, the {encoding} parameter identifies the character encoding. + * If not provided, {encoding} defaults to 'utf8'. + */ + from( + str: + | WithImplicitCoercion + | { + [Symbol.toPrimitive](hint: "string"): string; + }, + encoding?: BufferEncoding, + ): Buffer; + /** + * Creates a new Buffer using the passed {data} + * @param values to create a new Buffer + */ + of(...items: number[]): Buffer; + /** + * Returns `true` if `obj` is a `Buffer`, `false` otherwise. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * Buffer.isBuffer(Buffer.alloc(10)); // true + * Buffer.isBuffer(Buffer.from('foo')); // true + * Buffer.isBuffer('a string'); // false + * Buffer.isBuffer([]); // false + * Buffer.isBuffer(new Uint8Array(1024)); // false + * ``` + * @since v0.1.101 + */ + isBuffer(obj: any): obj is Buffer; + /** + * Returns `true` if `encoding` is the name of a supported character encoding, + * or `false` otherwise. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * console.log(Buffer.isEncoding('utf8')); + * // Prints: true + * + * console.log(Buffer.isEncoding('hex')); + * // Prints: true + * + * console.log(Buffer.isEncoding('utf/8')); + * // Prints: false + * + * console.log(Buffer.isEncoding('')); + * // Prints: false + * ``` + * @since v0.9.1 + * @param encoding A character encoding name to check. + */ + isEncoding(encoding: string): encoding is BufferEncoding; + /** + * Returns the byte length of a string when encoded using `encoding`. + * This is not the same as [`String.prototype.length`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/length), which does not account + * for the encoding that is used to convert the string into bytes. + * + * For `'base64'`, `'base64url'`, and `'hex'`, this function assumes valid input. + * For strings that contain non-base64/hex-encoded data (e.g. whitespace), the + * return value might be greater than the length of a `Buffer` created from the + * string. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const str = '\u00bd + \u00bc = \u00be'; + * + * console.log(`${str}: ${str.length} characters, ` + + * `${Buffer.byteLength(str, 'utf8')} bytes`); + * // Prints: ½ + ¼ = ¾: 9 characters, 12 bytes + * ``` + * + * When `string` is a + * `Buffer`/[`DataView`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView)/[`TypedArray`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/- + * Reference/Global_Objects/TypedArray)/[`ArrayBuffer`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer)/[`SharedArrayBuffer`](https://develop- + * er.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer), the byte length as reported by `.byteLength`is returned. + * @since v0.1.90 + * @param string A value to calculate the length of. + * @param [encoding='utf8'] If `string` is a string, this is its encoding. + * @return The number of bytes contained within `string`. + */ + byteLength( + string: string | NodeJS.ArrayBufferView | ArrayBuffer | SharedArrayBuffer, + encoding?: BufferEncoding, + ): number; + /** + * Returns a new `Buffer` which is the result of concatenating all the `Buffer`instances in the `list` together. + * + * If the list has no items, or if the `totalLength` is 0, then a new zero-length`Buffer` is returned. + * + * If `totalLength` is not provided, it is calculated from the `Buffer` instances + * in `list` by adding their lengths. + * + * If `totalLength` is provided, it is coerced to an unsigned integer. If the + * combined length of the `Buffer`s in `list` exceeds `totalLength`, the result is + * truncated to `totalLength`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * // Create a single `Buffer` from a list of three `Buffer` instances. + * + * const buf1 = Buffer.alloc(10); + * const buf2 = Buffer.alloc(14); + * const buf3 = Buffer.alloc(18); + * const totalLength = buf1.length + buf2.length + buf3.length; + * + * console.log(totalLength); + * // Prints: 42 + * + * const bufA = Buffer.concat([buf1, buf2, buf3], totalLength); + * + * console.log(bufA); + * // Prints: + * console.log(bufA.length); + * // Prints: 42 + * ``` + * + * `Buffer.concat()` may also use the internal `Buffer` pool like `Buffer.allocUnsafe()` does. + * @since v0.7.11 + * @param list List of `Buffer` or {@link Uint8Array} instances to concatenate. + * @param totalLength Total length of the `Buffer` instances in `list` when concatenated. + */ + concat(list: readonly Uint8Array[], totalLength?: number): Buffer; + /** + * Copies the underlying memory of `view` into a new `Buffer`. + * + * ```js + * const u16 = new Uint16Array([0, 0xffff]); + * const buf = Buffer.copyBytesFrom(u16, 1, 1); + * u16[1] = 0; + * console.log(buf.length); // 2 + * console.log(buf[0]); // 255 + * console.log(buf[1]); // 255 + * ``` + * @since v19.8.0 + * @param view The {TypedArray} to copy. + * @param [offset=': 0'] The starting offset within `view`. + * @param [length=view.length - offset] The number of elements from `view` to copy. + */ + copyBytesFrom(view: NodeJS.TypedArray, offset?: number, length?: number): Buffer; + /** + * Compares `buf1` to `buf2`, typically for the purpose of sorting arrays of`Buffer` instances. This is equivalent to calling `buf1.compare(buf2)`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf1 = Buffer.from('1234'); + * const buf2 = Buffer.from('0123'); + * const arr = [buf1, buf2]; + * + * console.log(arr.sort(Buffer.compare)); + * // Prints: [ , ] + * // (This result is equal to: [buf2, buf1].) + * ``` + * @since v0.11.13 + * @return Either `-1`, `0`, or `1`, depending on the result of the comparison. See `compare` for details. + */ + compare(buf1: Uint8Array, buf2: Uint8Array): -1 | 0 | 1; + /** + * Allocates a new `Buffer` of `size` bytes. If `fill` is `undefined`, the`Buffer` will be zero-filled. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.alloc(5); + * + * console.log(buf); + * // Prints: + * ``` + * + * If `size` is larger than {@link constants.MAX_LENGTH} or smaller than 0, `ERR_OUT_OF_RANGE` is thrown. + * + * If `fill` is specified, the allocated `Buffer` will be initialized by calling `buf.fill(fill)`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.alloc(5, 'a'); + * + * console.log(buf); + * // Prints: + * ``` + * + * If both `fill` and `encoding` are specified, the allocated `Buffer` will be + * initialized by calling `buf.fill(fill, encoding)`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64'); + * + * console.log(buf); + * // Prints: + * ``` + * + * Calling `Buffer.alloc()` can be measurably slower than the alternative `Buffer.allocUnsafe()` but ensures that the newly created `Buffer` instance + * contents will never contain sensitive data from previous allocations, including + * data that might not have been allocated for `Buffer`s. + * + * A `TypeError` will be thrown if `size` is not a number. + * @since v5.10.0 + * @param size The desired length of the new `Buffer`. + * @param [fill=0] A value to pre-fill the new `Buffer` with. + * @param [encoding='utf8'] If `fill` is a string, this is its encoding. + */ + alloc(size: number, fill?: string | Uint8Array | number, encoding?: BufferEncoding): Buffer; + /** + * Allocates a new `Buffer` of `size` bytes. If `size` is larger than {@link constants.MAX_LENGTH} or smaller than 0, `ERR_OUT_OF_RANGE` is thrown. + * + * The underlying memory for `Buffer` instances created in this way is _not_ + * _initialized_. The contents of the newly created `Buffer` are unknown and _may contain sensitive data_. Use `Buffer.alloc()` instead to initialize`Buffer` instances with zeroes. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(10); + * + * console.log(buf); + * // Prints (contents may vary): + * + * buf.fill(0); + * + * console.log(buf); + * // Prints: + * ``` + * + * A `TypeError` will be thrown if `size` is not a number. + * + * The `Buffer` module pre-allocates an internal `Buffer` instance of + * size `Buffer.poolSize` that is used as a pool for the fast allocation of new`Buffer` instances created using `Buffer.allocUnsafe()`, `Buffer.from(array)`, + * and `Buffer.concat()` only when `size` is less than or equal to`Buffer.poolSize >> 1` (floor of `Buffer.poolSize` divided by two). + * + * Use of this pre-allocated internal memory pool is a key difference between + * calling `Buffer.alloc(size, fill)` vs. `Buffer.allocUnsafe(size).fill(fill)`. + * Specifically, `Buffer.alloc(size, fill)` will _never_ use the internal `Buffer`pool, while `Buffer.allocUnsafe(size).fill(fill)`_will_ use the internal`Buffer` pool if `size` is less + * than or equal to half `Buffer.poolSize`. The + * difference is subtle but can be important when an application requires the + * additional performance that `Buffer.allocUnsafe()` provides. + * @since v5.10.0 + * @param size The desired length of the new `Buffer`. + */ + allocUnsafe(size: number): Buffer; + /** + * Allocates a new `Buffer` of `size` bytes. If `size` is larger than {@link constants.MAX_LENGTH} or smaller than 0, `ERR_OUT_OF_RANGE` is thrown. A zero-length `Buffer` is created if + * `size` is 0. + * + * The underlying memory for `Buffer` instances created in this way is _not_ + * _initialized_. The contents of the newly created `Buffer` are unknown and _may contain sensitive data_. Use `buf.fill(0)` to initialize + * such `Buffer` instances with zeroes. + * + * When using `Buffer.allocUnsafe()` to allocate new `Buffer` instances, + * allocations under 4 KiB are sliced from a single pre-allocated `Buffer`. This + * allows applications to avoid the garbage collection overhead of creating many + * individually allocated `Buffer` instances. This approach improves both + * performance and memory usage by eliminating the need to track and clean up as + * many individual `ArrayBuffer` objects. + * + * However, in the case where a developer may need to retain a small chunk of + * memory from a pool for an indeterminate amount of time, it may be appropriate + * to create an un-pooled `Buffer` instance using `Buffer.allocUnsafeSlow()` and + * then copying out the relevant bits. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * // Need to keep around a few small chunks of memory. + * const store = []; + * + * socket.on('readable', () => { + * let data; + * while (null !== (data = readable.read())) { + * // Allocate for retained data. + * const sb = Buffer.allocUnsafeSlow(10); + * + * // Copy the data into the new allocation. + * data.copy(sb, 0, 0, 10); + * + * store.push(sb); + * } + * }); + * ``` + * + * A `TypeError` will be thrown if `size` is not a number. + * @since v5.12.0 + * @param size The desired length of the new `Buffer`. + */ + allocUnsafeSlow(size: number): Buffer; + /** + * This is the size (in bytes) of pre-allocated internal `Buffer` instances used + * for pooling. This value may be modified. + * @since v0.11.3 + */ + poolSize: number; + } + interface Buffer extends Uint8Array { + /** + * Writes `string` to `buf` at `offset` according to the character encoding in`encoding`. The `length` parameter is the number of bytes to write. If `buf` did + * not contain enough space to fit the entire string, only part of `string` will be + * written. However, partially encoded characters will not be written. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.alloc(256); + * + * const len = buf.write('\u00bd + \u00bc = \u00be', 0); + * + * console.log(`${len} bytes: ${buf.toString('utf8', 0, len)}`); + * // Prints: 12 bytes: ½ + ¼ = ¾ + * + * const buffer = Buffer.alloc(10); + * + * const length = buffer.write('abcd', 8); + * + * console.log(`${length} bytes: ${buffer.toString('utf8', 8, 10)}`); + * // Prints: 2 bytes : ab + * ``` + * @since v0.1.90 + * @param string String to write to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write `string`. + * @param [length=buf.length - offset] Maximum number of bytes to write (written bytes will not exceed `buf.length - offset`). + * @param [encoding='utf8'] The character encoding of `string`. + * @return Number of bytes written. + */ + write(string: string, encoding?: BufferEncoding): number; + write(string: string, offset: number, encoding?: BufferEncoding): number; + write(string: string, offset: number, length: number, encoding?: BufferEncoding): number; + /** + * Decodes `buf` to a string according to the specified character encoding in`encoding`. `start` and `end` may be passed to decode only a subset of `buf`. + * + * If `encoding` is `'utf8'` and a byte sequence in the input is not valid UTF-8, + * then each invalid byte is replaced with the replacement character `U+FFFD`. + * + * The maximum length of a string instance (in UTF-16 code units) is available + * as {@link constants.MAX_STRING_LENGTH}. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf1 = Buffer.allocUnsafe(26); + * + * for (let i = 0; i < 26; i++) { + * // 97 is the decimal ASCII value for 'a'. + * buf1[i] = i + 97; + * } + * + * console.log(buf1.toString('utf8')); + * // Prints: abcdefghijklmnopqrstuvwxyz + * console.log(buf1.toString('utf8', 0, 5)); + * // Prints: abcde + * + * const buf2 = Buffer.from('tést'); + * + * console.log(buf2.toString('hex')); + * // Prints: 74c3a97374 + * console.log(buf2.toString('utf8', 0, 3)); + * // Prints: té + * console.log(buf2.toString(undefined, 0, 3)); + * // Prints: té + * ``` + * @since v0.1.90 + * @param [encoding='utf8'] The character encoding to use. + * @param [start=0] The byte offset to start decoding at. + * @param [end=buf.length] The byte offset to stop decoding at (not inclusive). + */ + toString(encoding?: BufferEncoding, start?: number, end?: number): string; + /** + * Returns a JSON representation of `buf`. [`JSON.stringify()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) implicitly calls + * this function when stringifying a `Buffer` instance. + * + * `Buffer.from()` accepts objects in the format returned from this method. + * In particular, `Buffer.from(buf.toJSON())` works like `Buffer.from(buf)`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]); + * const json = JSON.stringify(buf); + * + * console.log(json); + * // Prints: {"type":"Buffer","data":[1,2,3,4,5]} + * + * const copy = JSON.parse(json, (key, value) => { + * return value && value.type === 'Buffer' ? + * Buffer.from(value) : + * value; + * }); + * + * console.log(copy); + * // Prints: + * ``` + * @since v0.9.2 + */ + toJSON(): { + type: "Buffer"; + data: number[]; + }; + /** + * Returns `true` if both `buf` and `otherBuffer` have exactly the same bytes,`false` otherwise. Equivalent to `buf.compare(otherBuffer) === 0`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf1 = Buffer.from('ABC'); + * const buf2 = Buffer.from('414243', 'hex'); + * const buf3 = Buffer.from('ABCD'); + * + * console.log(buf1.equals(buf2)); + * // Prints: true + * console.log(buf1.equals(buf3)); + * // Prints: false + * ``` + * @since v0.11.13 + * @param otherBuffer A `Buffer` or {@link Uint8Array} with which to compare `buf`. + */ + equals(otherBuffer: Uint8Array): boolean; + /** + * Compares `buf` with `target` and returns a number indicating whether `buf`comes before, after, or is the same as `target` in sort order. + * Comparison is based on the actual sequence of bytes in each `Buffer`. + * + * * `0` is returned if `target` is the same as `buf` + * * `1` is returned if `target` should come _before_`buf` when sorted. + * * `-1` is returned if `target` should come _after_`buf` when sorted. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf1 = Buffer.from('ABC'); + * const buf2 = Buffer.from('BCD'); + * const buf3 = Buffer.from('ABCD'); + * + * console.log(buf1.compare(buf1)); + * // Prints: 0 + * console.log(buf1.compare(buf2)); + * // Prints: -1 + * console.log(buf1.compare(buf3)); + * // Prints: -1 + * console.log(buf2.compare(buf1)); + * // Prints: 1 + * console.log(buf2.compare(buf3)); + * // Prints: 1 + * console.log([buf1, buf2, buf3].sort(Buffer.compare)); + * // Prints: [ , , ] + * // (This result is equal to: [buf1, buf3, buf2].) + * ``` + * + * The optional `targetStart`, `targetEnd`, `sourceStart`, and `sourceEnd`arguments can be used to limit the comparison to specific ranges within `target`and `buf` respectively. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf1 = Buffer.from([1, 2, 3, 4, 5, 6, 7, 8, 9]); + * const buf2 = Buffer.from([5, 6, 7, 8, 9, 1, 2, 3, 4]); + * + * console.log(buf1.compare(buf2, 5, 9, 0, 4)); + * // Prints: 0 + * console.log(buf1.compare(buf2, 0, 6, 4)); + * // Prints: -1 + * console.log(buf1.compare(buf2, 5, 6, 5)); + * // Prints: 1 + * ``` + * + * `ERR_OUT_OF_RANGE` is thrown if `targetStart < 0`, `sourceStart < 0`,`targetEnd > target.byteLength`, or `sourceEnd > source.byteLength`. + * @since v0.11.13 + * @param target A `Buffer` or {@link Uint8Array} with which to compare `buf`. + * @param [targetStart=0] The offset within `target` at which to begin comparison. + * @param [targetEnd=target.length] The offset within `target` at which to end comparison (not inclusive). + * @param [sourceStart=0] The offset within `buf` at which to begin comparison. + * @param [sourceEnd=buf.length] The offset within `buf` at which to end comparison (not inclusive). + */ + compare( + target: Uint8Array, + targetStart?: number, + targetEnd?: number, + sourceStart?: number, + sourceEnd?: number, + ): -1 | 0 | 1; + /** + * Copies data from a region of `buf` to a region in `target`, even if the `target`memory region overlaps with `buf`. + * + * [`TypedArray.prototype.set()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/set) performs the same operation, and is available + * for all TypedArrays, including Node.js `Buffer`s, although it takes + * different function arguments. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * // Create two `Buffer` instances. + * const buf1 = Buffer.allocUnsafe(26); + * const buf2 = Buffer.allocUnsafe(26).fill('!'); + * + * for (let i = 0; i < 26; i++) { + * // 97 is the decimal ASCII value for 'a'. + * buf1[i] = i + 97; + * } + * + * // Copy `buf1` bytes 16 through 19 into `buf2` starting at byte 8 of `buf2`. + * buf1.copy(buf2, 8, 16, 20); + * // This is equivalent to: + * // buf2.set(buf1.subarray(16, 20), 8); + * + * console.log(buf2.toString('ascii', 0, 25)); + * // Prints: !!!!!!!!qrst!!!!!!!!!!!!! + * ``` + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * // Create a `Buffer` and copy data from one region to an overlapping region + * // within the same `Buffer`. + * + * const buf = Buffer.allocUnsafe(26); + * + * for (let i = 0; i < 26; i++) { + * // 97 is the decimal ASCII value for 'a'. + * buf[i] = i + 97; + * } + * + * buf.copy(buf, 0, 4, 10); + * + * console.log(buf.toString()); + * // Prints: efghijghijklmnopqrstuvwxyz + * ``` + * @since v0.1.90 + * @param target A `Buffer` or {@link Uint8Array} to copy into. + * @param [targetStart=0] The offset within `target` at which to begin writing. + * @param [sourceStart=0] The offset within `buf` from which to begin copying. + * @param [sourceEnd=buf.length] The offset within `buf` at which to stop copying (not inclusive). + * @return The number of bytes copied. + */ + copy(target: Uint8Array, targetStart?: number, sourceStart?: number, sourceEnd?: number): number; + /** + * Returns a new `Buffer` that references the same memory as the original, but + * offset and cropped by the `start` and `end` indices. + * + * This method is not compatible with the `Uint8Array.prototype.slice()`, + * which is a superclass of `Buffer`. To copy the slice, use`Uint8Array.prototype.slice()`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from('buffer'); + * + * const copiedBuf = Uint8Array.prototype.slice.call(buf); + * copiedBuf[0]++; + * console.log(copiedBuf.toString()); + * // Prints: cuffer + * + * console.log(buf.toString()); + * // Prints: buffer + * + * // With buf.slice(), the original buffer is modified. + * const notReallyCopiedBuf = buf.slice(); + * notReallyCopiedBuf[0]++; + * console.log(notReallyCopiedBuf.toString()); + * // Prints: cuffer + * console.log(buf.toString()); + * // Also prints: cuffer (!) + * ``` + * @since v0.3.0 + * @deprecated Use `subarray` instead. + * @param [start=0] Where the new `Buffer` will start. + * @param [end=buf.length] Where the new `Buffer` will end (not inclusive). + */ + slice(start?: number, end?: number): Buffer; + /** + * Returns a new `Buffer` that references the same memory as the original, but + * offset and cropped by the `start` and `end` indices. + * + * Specifying `end` greater than `buf.length` will return the same result as + * that of `end` equal to `buf.length`. + * + * This method is inherited from [`TypedArray.prototype.subarray()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/subarray). + * + * Modifying the new `Buffer` slice will modify the memory in the original `Buffer`because the allocated memory of the two objects overlap. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * // Create a `Buffer` with the ASCII alphabet, take a slice, and modify one byte + * // from the original `Buffer`. + * + * const buf1 = Buffer.allocUnsafe(26); + * + * for (let i = 0; i < 26; i++) { + * // 97 is the decimal ASCII value for 'a'. + * buf1[i] = i + 97; + * } + * + * const buf2 = buf1.subarray(0, 3); + * + * console.log(buf2.toString('ascii', 0, buf2.length)); + * // Prints: abc + * + * buf1[0] = 33; + * + * console.log(buf2.toString('ascii', 0, buf2.length)); + * // Prints: !bc + * ``` + * + * Specifying negative indexes causes the slice to be generated relative to the + * end of `buf` rather than the beginning. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from('buffer'); + * + * console.log(buf.subarray(-6, -1).toString()); + * // Prints: buffe + * // (Equivalent to buf.subarray(0, 5).) + * + * console.log(buf.subarray(-6, -2).toString()); + * // Prints: buff + * // (Equivalent to buf.subarray(0, 4).) + * + * console.log(buf.subarray(-5, -2).toString()); + * // Prints: uff + * // (Equivalent to buf.subarray(1, 4).) + * ``` + * @since v3.0.0 + * @param [start=0] Where the new `Buffer` will start. + * @param [end=buf.length] Where the new `Buffer` will end (not inclusive). + */ + subarray(start?: number, end?: number): Buffer; + /** + * Writes `value` to `buf` at the specified `offset` as big-endian. + * + * `value` is interpreted and written as a two's complement signed integer. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(8); + * + * buf.writeBigInt64BE(0x0102030405060708n, 0); + * + * console.log(buf); + * // Prints: + * ``` + * @since v12.0.0, v10.20.0 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy: `0 <= offset <= buf.length - 8`. + * @return `offset` plus the number of bytes written. + */ + writeBigInt64BE(value: bigint, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as little-endian. + * + * `value` is interpreted and written as a two's complement signed integer. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(8); + * + * buf.writeBigInt64LE(0x0102030405060708n, 0); + * + * console.log(buf); + * // Prints: + * ``` + * @since v12.0.0, v10.20.0 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy: `0 <= offset <= buf.length - 8`. + * @return `offset` plus the number of bytes written. + */ + writeBigInt64LE(value: bigint, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as big-endian. + * + * This function is also available under the `writeBigUint64BE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(8); + * + * buf.writeBigUInt64BE(0xdecafafecacefaden, 0); + * + * console.log(buf); + * // Prints: + * ``` + * @since v12.0.0, v10.20.0 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy: `0 <= offset <= buf.length - 8`. + * @return `offset` plus the number of bytes written. + */ + writeBigUInt64BE(value: bigint, offset?: number): number; + /** + * @alias Buffer.writeBigUInt64BE + * @since v14.10.0, v12.19.0 + */ + writeBigUint64BE(value: bigint, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as little-endian + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(8); + * + * buf.writeBigUInt64LE(0xdecafafecacefaden, 0); + * + * console.log(buf); + * // Prints: + * ``` + * + * This function is also available under the `writeBigUint64LE` alias. + * @since v12.0.0, v10.20.0 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy: `0 <= offset <= buf.length - 8`. + * @return `offset` plus the number of bytes written. + */ + writeBigUInt64LE(value: bigint, offset?: number): number; + /** + * @alias Buffer.writeBigUInt64LE + * @since v14.10.0, v12.19.0 + */ + writeBigUint64LE(value: bigint, offset?: number): number; + /** + * Writes `byteLength` bytes of `value` to `buf` at the specified `offset`as little-endian. Supports up to 48 bits of accuracy. Behavior is undefined + * when `value` is anything other than an unsigned integer. + * + * This function is also available under the `writeUintLE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(6); + * + * buf.writeUIntLE(0x1234567890ab, 0, 6); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.5.5 + * @param value Number to be written to `buf`. + * @param offset Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - byteLength`. + * @param byteLength Number of bytes to write. Must satisfy `0 < byteLength <= 6`. + * @return `offset` plus the number of bytes written. + */ + writeUIntLE(value: number, offset: number, byteLength: number): number; + /** + * @alias Buffer.writeUIntLE + * @since v14.9.0, v12.19.0 + */ + writeUintLE(value: number, offset: number, byteLength: number): number; + /** + * Writes `byteLength` bytes of `value` to `buf` at the specified `offset`as big-endian. Supports up to 48 bits of accuracy. Behavior is undefined + * when `value` is anything other than an unsigned integer. + * + * This function is also available under the `writeUintBE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(6); + * + * buf.writeUIntBE(0x1234567890ab, 0, 6); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.5.5 + * @param value Number to be written to `buf`. + * @param offset Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - byteLength`. + * @param byteLength Number of bytes to write. Must satisfy `0 < byteLength <= 6`. + * @return `offset` plus the number of bytes written. + */ + writeUIntBE(value: number, offset: number, byteLength: number): number; + /** + * @alias Buffer.writeUIntBE + * @since v14.9.0, v12.19.0 + */ + writeUintBE(value: number, offset: number, byteLength: number): number; + /** + * Writes `byteLength` bytes of `value` to `buf` at the specified `offset`as little-endian. Supports up to 48 bits of accuracy. Behavior is undefined + * when `value` is anything other than a signed integer. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(6); + * + * buf.writeIntLE(0x1234567890ab, 0, 6); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.11.15 + * @param value Number to be written to `buf`. + * @param offset Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - byteLength`. + * @param byteLength Number of bytes to write. Must satisfy `0 < byteLength <= 6`. + * @return `offset` plus the number of bytes written. + */ + writeIntLE(value: number, offset: number, byteLength: number): number; + /** + * Writes `byteLength` bytes of `value` to `buf` at the specified `offset`as big-endian. Supports up to 48 bits of accuracy. Behavior is undefined when`value` is anything other than a + * signed integer. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(6); + * + * buf.writeIntBE(0x1234567890ab, 0, 6); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.11.15 + * @param value Number to be written to `buf`. + * @param offset Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - byteLength`. + * @param byteLength Number of bytes to write. Must satisfy `0 < byteLength <= 6`. + * @return `offset` plus the number of bytes written. + */ + writeIntBE(value: number, offset: number, byteLength: number): number; + /** + * Reads an unsigned, big-endian 64-bit integer from `buf` at the specified`offset`. + * + * This function is also available under the `readBigUint64BE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff]); + * + * console.log(buf.readBigUInt64BE(0)); + * // Prints: 4294967295n + * ``` + * @since v12.0.0, v10.20.0 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy: `0 <= offset <= buf.length - 8`. + */ + readBigUInt64BE(offset?: number): bigint; + /** + * @alias Buffer.readBigUInt64BE + * @since v14.10.0, v12.19.0 + */ + readBigUint64BE(offset?: number): bigint; + /** + * Reads an unsigned, little-endian 64-bit integer from `buf` at the specified`offset`. + * + * This function is also available under the `readBigUint64LE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff]); + * + * console.log(buf.readBigUInt64LE(0)); + * // Prints: 18446744069414584320n + * ``` + * @since v12.0.0, v10.20.0 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy: `0 <= offset <= buf.length - 8`. + */ + readBigUInt64LE(offset?: number): bigint; + /** + * @alias Buffer.readBigUInt64LE + * @since v14.10.0, v12.19.0 + */ + readBigUint64LE(offset?: number): bigint; + /** + * Reads a signed, big-endian 64-bit integer from `buf` at the specified `offset`. + * + * Integers read from a `Buffer` are interpreted as two's complement signed + * values. + * @since v12.0.0, v10.20.0 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy: `0 <= offset <= buf.length - 8`. + */ + readBigInt64BE(offset?: number): bigint; + /** + * Reads a signed, little-endian 64-bit integer from `buf` at the specified`offset`. + * + * Integers read from a `Buffer` are interpreted as two's complement signed + * values. + * @since v12.0.0, v10.20.0 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy: `0 <= offset <= buf.length - 8`. + */ + readBigInt64LE(offset?: number): bigint; + /** + * Reads `byteLength` number of bytes from `buf` at the specified `offset`and interprets the result as an unsigned, little-endian integer supporting + * up to 48 bits of accuracy. + * + * This function is also available under the `readUintLE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0x12, 0x34, 0x56, 0x78, 0x90, 0xab]); + * + * console.log(buf.readUIntLE(0, 6).toString(16)); + * // Prints: ab9078563412 + * ``` + * @since v0.11.15 + * @param offset Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - byteLength`. + * @param byteLength Number of bytes to read. Must satisfy `0 < byteLength <= 6`. + */ + readUIntLE(offset: number, byteLength: number): number; + /** + * @alias Buffer.readUIntLE + * @since v14.9.0, v12.19.0 + */ + readUintLE(offset: number, byteLength: number): number; + /** + * Reads `byteLength` number of bytes from `buf` at the specified `offset`and interprets the result as an unsigned big-endian integer supporting + * up to 48 bits of accuracy. + * + * This function is also available under the `readUintBE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0x12, 0x34, 0x56, 0x78, 0x90, 0xab]); + * + * console.log(buf.readUIntBE(0, 6).toString(16)); + * // Prints: 1234567890ab + * console.log(buf.readUIntBE(1, 6).toString(16)); + * // Throws ERR_OUT_OF_RANGE. + * ``` + * @since v0.11.15 + * @param offset Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - byteLength`. + * @param byteLength Number of bytes to read. Must satisfy `0 < byteLength <= 6`. + */ + readUIntBE(offset: number, byteLength: number): number; + /** + * @alias Buffer.readUIntBE + * @since v14.9.0, v12.19.0 + */ + readUintBE(offset: number, byteLength: number): number; + /** + * Reads `byteLength` number of bytes from `buf` at the specified `offset`and interprets the result as a little-endian, two's complement signed value + * supporting up to 48 bits of accuracy. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0x12, 0x34, 0x56, 0x78, 0x90, 0xab]); + * + * console.log(buf.readIntLE(0, 6).toString(16)); + * // Prints: -546f87a9cbee + * ``` + * @since v0.11.15 + * @param offset Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - byteLength`. + * @param byteLength Number of bytes to read. Must satisfy `0 < byteLength <= 6`. + */ + readIntLE(offset: number, byteLength: number): number; + /** + * Reads `byteLength` number of bytes from `buf` at the specified `offset`and interprets the result as a big-endian, two's complement signed value + * supporting up to 48 bits of accuracy. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0x12, 0x34, 0x56, 0x78, 0x90, 0xab]); + * + * console.log(buf.readIntBE(0, 6).toString(16)); + * // Prints: 1234567890ab + * console.log(buf.readIntBE(1, 6).toString(16)); + * // Throws ERR_OUT_OF_RANGE. + * console.log(buf.readIntBE(1, 0).toString(16)); + * // Throws ERR_OUT_OF_RANGE. + * ``` + * @since v0.11.15 + * @param offset Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - byteLength`. + * @param byteLength Number of bytes to read. Must satisfy `0 < byteLength <= 6`. + */ + readIntBE(offset: number, byteLength: number): number; + /** + * Reads an unsigned 8-bit integer from `buf` at the specified `offset`. + * + * This function is also available under the `readUint8` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([1, -2]); + * + * console.log(buf.readUInt8(0)); + * // Prints: 1 + * console.log(buf.readUInt8(1)); + * // Prints: 254 + * console.log(buf.readUInt8(2)); + * // Throws ERR_OUT_OF_RANGE. + * ``` + * @since v0.5.0 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 1`. + */ + readUInt8(offset?: number): number; + /** + * @alias Buffer.readUInt8 + * @since v14.9.0, v12.19.0 + */ + readUint8(offset?: number): number; + /** + * Reads an unsigned, little-endian 16-bit integer from `buf` at the specified`offset`. + * + * This function is also available under the `readUint16LE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0x12, 0x34, 0x56]); + * + * console.log(buf.readUInt16LE(0).toString(16)); + * // Prints: 3412 + * console.log(buf.readUInt16LE(1).toString(16)); + * // Prints: 5634 + * console.log(buf.readUInt16LE(2).toString(16)); + * // Throws ERR_OUT_OF_RANGE. + * ``` + * @since v0.5.5 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 2`. + */ + readUInt16LE(offset?: number): number; + /** + * @alias Buffer.readUInt16LE + * @since v14.9.0, v12.19.0 + */ + readUint16LE(offset?: number): number; + /** + * Reads an unsigned, big-endian 16-bit integer from `buf` at the specified`offset`. + * + * This function is also available under the `readUint16BE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0x12, 0x34, 0x56]); + * + * console.log(buf.readUInt16BE(0).toString(16)); + * // Prints: 1234 + * console.log(buf.readUInt16BE(1).toString(16)); + * // Prints: 3456 + * ``` + * @since v0.5.5 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 2`. + */ + readUInt16BE(offset?: number): number; + /** + * @alias Buffer.readUInt16BE + * @since v14.9.0, v12.19.0 + */ + readUint16BE(offset?: number): number; + /** + * Reads an unsigned, little-endian 32-bit integer from `buf` at the specified`offset`. + * + * This function is also available under the `readUint32LE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0x12, 0x34, 0x56, 0x78]); + * + * console.log(buf.readUInt32LE(0).toString(16)); + * // Prints: 78563412 + * console.log(buf.readUInt32LE(1).toString(16)); + * // Throws ERR_OUT_OF_RANGE. + * ``` + * @since v0.5.5 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 4`. + */ + readUInt32LE(offset?: number): number; + /** + * @alias Buffer.readUInt32LE + * @since v14.9.0, v12.19.0 + */ + readUint32LE(offset?: number): number; + /** + * Reads an unsigned, big-endian 32-bit integer from `buf` at the specified`offset`. + * + * This function is also available under the `readUint32BE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0x12, 0x34, 0x56, 0x78]); + * + * console.log(buf.readUInt32BE(0).toString(16)); + * // Prints: 12345678 + * ``` + * @since v0.5.5 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 4`. + */ + readUInt32BE(offset?: number): number; + /** + * @alias Buffer.readUInt32BE + * @since v14.9.0, v12.19.0 + */ + readUint32BE(offset?: number): number; + /** + * Reads a signed 8-bit integer from `buf` at the specified `offset`. + * + * Integers read from a `Buffer` are interpreted as two's complement signed values. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([-1, 5]); + * + * console.log(buf.readInt8(0)); + * // Prints: -1 + * console.log(buf.readInt8(1)); + * // Prints: 5 + * console.log(buf.readInt8(2)); + * // Throws ERR_OUT_OF_RANGE. + * ``` + * @since v0.5.0 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 1`. + */ + readInt8(offset?: number): number; + /** + * Reads a signed, little-endian 16-bit integer from `buf` at the specified`offset`. + * + * Integers read from a `Buffer` are interpreted as two's complement signed values. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0, 5]); + * + * console.log(buf.readInt16LE(0)); + * // Prints: 1280 + * console.log(buf.readInt16LE(1)); + * // Throws ERR_OUT_OF_RANGE. + * ``` + * @since v0.5.5 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 2`. + */ + readInt16LE(offset?: number): number; + /** + * Reads a signed, big-endian 16-bit integer from `buf` at the specified `offset`. + * + * Integers read from a `Buffer` are interpreted as two's complement signed values. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0, 5]); + * + * console.log(buf.readInt16BE(0)); + * // Prints: 5 + * ``` + * @since v0.5.5 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 2`. + */ + readInt16BE(offset?: number): number; + /** + * Reads a signed, little-endian 32-bit integer from `buf` at the specified`offset`. + * + * Integers read from a `Buffer` are interpreted as two's complement signed values. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0, 0, 0, 5]); + * + * console.log(buf.readInt32LE(0)); + * // Prints: 83886080 + * console.log(buf.readInt32LE(1)); + * // Throws ERR_OUT_OF_RANGE. + * ``` + * @since v0.5.5 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 4`. + */ + readInt32LE(offset?: number): number; + /** + * Reads a signed, big-endian 32-bit integer from `buf` at the specified `offset`. + * + * Integers read from a `Buffer` are interpreted as two's complement signed values. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([0, 0, 0, 5]); + * + * console.log(buf.readInt32BE(0)); + * // Prints: 5 + * ``` + * @since v0.5.5 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 4`. + */ + readInt32BE(offset?: number): number; + /** + * Reads a 32-bit, little-endian float from `buf` at the specified `offset`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([1, 2, 3, 4]); + * + * console.log(buf.readFloatLE(0)); + * // Prints: 1.539989614439558e-36 + * console.log(buf.readFloatLE(1)); + * // Throws ERR_OUT_OF_RANGE. + * ``` + * @since v0.11.15 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 4`. + */ + readFloatLE(offset?: number): number; + /** + * Reads a 32-bit, big-endian float from `buf` at the specified `offset`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([1, 2, 3, 4]); + * + * console.log(buf.readFloatBE(0)); + * // Prints: 2.387939260590663e-38 + * ``` + * @since v0.11.15 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 4`. + */ + readFloatBE(offset?: number): number; + /** + * Reads a 64-bit, little-endian double from `buf` at the specified `offset`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([1, 2, 3, 4, 5, 6, 7, 8]); + * + * console.log(buf.readDoubleLE(0)); + * // Prints: 5.447603722011605e-270 + * console.log(buf.readDoubleLE(1)); + * // Throws ERR_OUT_OF_RANGE. + * ``` + * @since v0.11.15 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 8`. + */ + readDoubleLE(offset?: number): number; + /** + * Reads a 64-bit, big-endian double from `buf` at the specified `offset`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from([1, 2, 3, 4, 5, 6, 7, 8]); + * + * console.log(buf.readDoubleBE(0)); + * // Prints: 8.20788039913184e-304 + * ``` + * @since v0.11.15 + * @param [offset=0] Number of bytes to skip before starting to read. Must satisfy `0 <= offset <= buf.length - 8`. + */ + readDoubleBE(offset?: number): number; + reverse(): this; + /** + * Interprets `buf` as an array of unsigned 16-bit integers and swaps the + * byte order _in-place_. Throws `ERR_INVALID_BUFFER_SIZE` if `buf.length` is not a multiple of 2. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf1 = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8]); + * + * console.log(buf1); + * // Prints: + * + * buf1.swap16(); + * + * console.log(buf1); + * // Prints: + * + * const buf2 = Buffer.from([0x1, 0x2, 0x3]); + * + * buf2.swap16(); + * // Throws ERR_INVALID_BUFFER_SIZE. + * ``` + * + * One convenient use of `buf.swap16()` is to perform a fast in-place conversion + * between UTF-16 little-endian and UTF-16 big-endian: + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from('This is little-endian UTF-16', 'utf16le'); + * buf.swap16(); // Convert to big-endian UTF-16 text. + * ``` + * @since v5.10.0 + * @return A reference to `buf`. + */ + swap16(): Buffer; + /** + * Interprets `buf` as an array of unsigned 32-bit integers and swaps the + * byte order _in-place_. Throws `ERR_INVALID_BUFFER_SIZE` if `buf.length` is not a multiple of 4. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf1 = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8]); + * + * console.log(buf1); + * // Prints: + * + * buf1.swap32(); + * + * console.log(buf1); + * // Prints: + * + * const buf2 = Buffer.from([0x1, 0x2, 0x3]); + * + * buf2.swap32(); + * // Throws ERR_INVALID_BUFFER_SIZE. + * ``` + * @since v5.10.0 + * @return A reference to `buf`. + */ + swap32(): Buffer; + /** + * Interprets `buf` as an array of 64-bit numbers and swaps byte order _in-place_. + * Throws `ERR_INVALID_BUFFER_SIZE` if `buf.length` is not a multiple of 8. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf1 = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8]); + * + * console.log(buf1); + * // Prints: + * + * buf1.swap64(); + * + * console.log(buf1); + * // Prints: + * + * const buf2 = Buffer.from([0x1, 0x2, 0x3]); + * + * buf2.swap64(); + * // Throws ERR_INVALID_BUFFER_SIZE. + * ``` + * @since v6.3.0 + * @return A reference to `buf`. + */ + swap64(): Buffer; + /** + * Writes `value` to `buf` at the specified `offset`. `value` must be a + * valid unsigned 8-bit integer. Behavior is undefined when `value` is anything + * other than an unsigned 8-bit integer. + * + * This function is also available under the `writeUint8` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(4); + * + * buf.writeUInt8(0x3, 0); + * buf.writeUInt8(0x4, 1); + * buf.writeUInt8(0x23, 2); + * buf.writeUInt8(0x42, 3); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.5.0 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 1`. + * @return `offset` plus the number of bytes written. + */ + writeUInt8(value: number, offset?: number): number; + /** + * @alias Buffer.writeUInt8 + * @since v14.9.0, v12.19.0 + */ + writeUint8(value: number, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as little-endian. The `value`must be a valid unsigned 16-bit integer. Behavior is undefined when `value` is + * anything other than an unsigned 16-bit integer. + * + * This function is also available under the `writeUint16LE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(4); + * + * buf.writeUInt16LE(0xdead, 0); + * buf.writeUInt16LE(0xbeef, 2); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.5.5 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 2`. + * @return `offset` plus the number of bytes written. + */ + writeUInt16LE(value: number, offset?: number): number; + /** + * @alias Buffer.writeUInt16LE + * @since v14.9.0, v12.19.0 + */ + writeUint16LE(value: number, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as big-endian. The `value`must be a valid unsigned 16-bit integer. Behavior is undefined when `value`is anything other than an + * unsigned 16-bit integer. + * + * This function is also available under the `writeUint16BE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(4); + * + * buf.writeUInt16BE(0xdead, 0); + * buf.writeUInt16BE(0xbeef, 2); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.5.5 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 2`. + * @return `offset` plus the number of bytes written. + */ + writeUInt16BE(value: number, offset?: number): number; + /** + * @alias Buffer.writeUInt16BE + * @since v14.9.0, v12.19.0 + */ + writeUint16BE(value: number, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as little-endian. The `value`must be a valid unsigned 32-bit integer. Behavior is undefined when `value` is + * anything other than an unsigned 32-bit integer. + * + * This function is also available under the `writeUint32LE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(4); + * + * buf.writeUInt32LE(0xfeedface, 0); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.5.5 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 4`. + * @return `offset` plus the number of bytes written. + */ + writeUInt32LE(value: number, offset?: number): number; + /** + * @alias Buffer.writeUInt32LE + * @since v14.9.0, v12.19.0 + */ + writeUint32LE(value: number, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as big-endian. The `value`must be a valid unsigned 32-bit integer. Behavior is undefined when `value`is anything other than an + * unsigned 32-bit integer. + * + * This function is also available under the `writeUint32BE` alias. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(4); + * + * buf.writeUInt32BE(0xfeedface, 0); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.5.5 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 4`. + * @return `offset` plus the number of bytes written. + */ + writeUInt32BE(value: number, offset?: number): number; + /** + * @alias Buffer.writeUInt32BE + * @since v14.9.0, v12.19.0 + */ + writeUint32BE(value: number, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset`. `value` must be a valid + * signed 8-bit integer. Behavior is undefined when `value` is anything other than + * a signed 8-bit integer. + * + * `value` is interpreted and written as a two's complement signed integer. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(2); + * + * buf.writeInt8(2, 0); + * buf.writeInt8(-2, 1); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.5.0 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 1`. + * @return `offset` plus the number of bytes written. + */ + writeInt8(value: number, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as little-endian. The `value`must be a valid signed 16-bit integer. Behavior is undefined when `value` is + * anything other than a signed 16-bit integer. + * + * The `value` is interpreted and written as a two's complement signed integer. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(2); + * + * buf.writeInt16LE(0x0304, 0); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.5.5 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 2`. + * @return `offset` plus the number of bytes written. + */ + writeInt16LE(value: number, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as big-endian. The `value`must be a valid signed 16-bit integer. Behavior is undefined when `value` is + * anything other than a signed 16-bit integer. + * + * The `value` is interpreted and written as a two's complement signed integer. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(2); + * + * buf.writeInt16BE(0x0102, 0); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.5.5 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 2`. + * @return `offset` plus the number of bytes written. + */ + writeInt16BE(value: number, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as little-endian. The `value`must be a valid signed 32-bit integer. Behavior is undefined when `value` is + * anything other than a signed 32-bit integer. + * + * The `value` is interpreted and written as a two's complement signed integer. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(4); + * + * buf.writeInt32LE(0x05060708, 0); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.5.5 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 4`. + * @return `offset` plus the number of bytes written. + */ + writeInt32LE(value: number, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as big-endian. The `value`must be a valid signed 32-bit integer. Behavior is undefined when `value` is + * anything other than a signed 32-bit integer. + * + * The `value` is interpreted and written as a two's complement signed integer. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(4); + * + * buf.writeInt32BE(0x01020304, 0); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.5.5 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 4`. + * @return `offset` plus the number of bytes written. + */ + writeInt32BE(value: number, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as little-endian. Behavior is + * undefined when `value` is anything other than a JavaScript number. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(4); + * + * buf.writeFloatLE(0xcafebabe, 0); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.11.15 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 4`. + * @return `offset` plus the number of bytes written. + */ + writeFloatLE(value: number, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as big-endian. Behavior is + * undefined when `value` is anything other than a JavaScript number. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(4); + * + * buf.writeFloatBE(0xcafebabe, 0); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.11.15 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 4`. + * @return `offset` plus the number of bytes written. + */ + writeFloatBE(value: number, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as little-endian. The `value`must be a JavaScript number. Behavior is undefined when `value` is anything + * other than a JavaScript number. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(8); + * + * buf.writeDoubleLE(123.456, 0); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.11.15 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 8`. + * @return `offset` plus the number of bytes written. + */ + writeDoubleLE(value: number, offset?: number): number; + /** + * Writes `value` to `buf` at the specified `offset` as big-endian. The `value`must be a JavaScript number. Behavior is undefined when `value` is anything + * other than a JavaScript number. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(8); + * + * buf.writeDoubleBE(123.456, 0); + * + * console.log(buf); + * // Prints: + * ``` + * @since v0.11.15 + * @param value Number to be written to `buf`. + * @param [offset=0] Number of bytes to skip before starting to write. Must satisfy `0 <= offset <= buf.length - 8`. + * @return `offset` plus the number of bytes written. + */ + writeDoubleBE(value: number, offset?: number): number; + /** + * Fills `buf` with the specified `value`. If the `offset` and `end` are not given, + * the entire `buf` will be filled: + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * // Fill a `Buffer` with the ASCII character 'h'. + * + * const b = Buffer.allocUnsafe(50).fill('h'); + * + * console.log(b.toString()); + * // Prints: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh + * + * // Fill a buffer with empty string + * const c = Buffer.allocUnsafe(5).fill(''); + * + * console.log(c.fill('')); + * // Prints: + * ``` + * + * `value` is coerced to a `uint32` value if it is not a string, `Buffer`, or + * integer. If the resulting integer is greater than `255` (decimal), `buf` will be + * filled with `value & 255`. + * + * If the final write of a `fill()` operation falls on a multi-byte character, + * then only the bytes of that character that fit into `buf` are written: + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * // Fill a `Buffer` with character that takes up two bytes in UTF-8. + * + * console.log(Buffer.allocUnsafe(5).fill('\u0222')); + * // Prints: + * ``` + * + * If `value` contains invalid characters, it is truncated; if no valid + * fill data remains, an exception is thrown: + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.allocUnsafe(5); + * + * console.log(buf.fill('a')); + * // Prints: + * console.log(buf.fill('aazz', 'hex')); + * // Prints: + * console.log(buf.fill('zz', 'hex')); + * // Throws an exception. + * ``` + * @since v0.5.0 + * @param value The value with which to fill `buf`. Empty value (string, Uint8Array, Buffer) is coerced to `0`. + * @param [offset=0] Number of bytes to skip before starting to fill `buf`. + * @param [end=buf.length] Where to stop filling `buf` (not inclusive). + * @param [encoding='utf8'] The encoding for `value` if `value` is a string. + * @return A reference to `buf`. + */ + fill(value: string | Uint8Array | number, offset?: number, end?: number, encoding?: BufferEncoding): this; + /** + * If `value` is: + * + * * a string, `value` is interpreted according to the character encoding in`encoding`. + * * a `Buffer` or [`Uint8Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array), `value` will be used in its entirety. + * To compare a partial `Buffer`, use `buf.subarray`. + * * a number, `value` will be interpreted as an unsigned 8-bit integer + * value between `0` and `255`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from('this is a buffer'); + * + * console.log(buf.indexOf('this')); + * // Prints: 0 + * console.log(buf.indexOf('is')); + * // Prints: 2 + * console.log(buf.indexOf(Buffer.from('a buffer'))); + * // Prints: 8 + * console.log(buf.indexOf(97)); + * // Prints: 8 (97 is the decimal ASCII value for 'a') + * console.log(buf.indexOf(Buffer.from('a buffer example'))); + * // Prints: -1 + * console.log(buf.indexOf(Buffer.from('a buffer example').slice(0, 8))); + * // Prints: 8 + * + * const utf16Buffer = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'utf16le'); + * + * console.log(utf16Buffer.indexOf('\u03a3', 0, 'utf16le')); + * // Prints: 4 + * console.log(utf16Buffer.indexOf('\u03a3', -4, 'utf16le')); + * // Prints: 6 + * ``` + * + * If `value` is not a string, number, or `Buffer`, this method will throw a`TypeError`. If `value` is a number, it will be coerced to a valid byte value, + * an integer between 0 and 255. + * + * If `byteOffset` is not a number, it will be coerced to a number. If the result + * of coercion is `NaN` or `0`, then the entire buffer will be searched. This + * behavior matches [`String.prototype.indexOf()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf). + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const b = Buffer.from('abcdef'); + * + * // Passing a value that's a number, but not a valid byte. + * // Prints: 2, equivalent to searching for 99 or 'c'. + * console.log(b.indexOf(99.9)); + * console.log(b.indexOf(256 + 99)); + * + * // Passing a byteOffset that coerces to NaN or 0. + * // Prints: 1, searching the whole buffer. + * console.log(b.indexOf('b', undefined)); + * console.log(b.indexOf('b', {})); + * console.log(b.indexOf('b', null)); + * console.log(b.indexOf('b', [])); + * ``` + * + * If `value` is an empty string or empty `Buffer` and `byteOffset` is less + * than `buf.length`, `byteOffset` will be returned. If `value` is empty and`byteOffset` is at least `buf.length`, `buf.length` will be returned. + * @since v1.5.0 + * @param value What to search for. + * @param [byteOffset=0] Where to begin searching in `buf`. If negative, then offset is calculated from the end of `buf`. + * @param [encoding='utf8'] If `value` is a string, this is the encoding used to determine the binary representation of the string that will be searched for in `buf`. + * @return The index of the first occurrence of `value` in `buf`, or `-1` if `buf` does not contain `value`. + */ + indexOf(value: string | number | Uint8Array, byteOffset?: number, encoding?: BufferEncoding): number; + /** + * Identical to `buf.indexOf()`, except the last occurrence of `value` is found + * rather than the first occurrence. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from('this buffer is a buffer'); + * + * console.log(buf.lastIndexOf('this')); + * // Prints: 0 + * console.log(buf.lastIndexOf('buffer')); + * // Prints: 17 + * console.log(buf.lastIndexOf(Buffer.from('buffer'))); + * // Prints: 17 + * console.log(buf.lastIndexOf(97)); + * // Prints: 15 (97 is the decimal ASCII value for 'a') + * console.log(buf.lastIndexOf(Buffer.from('yolo'))); + * // Prints: -1 + * console.log(buf.lastIndexOf('buffer', 5)); + * // Prints: 5 + * console.log(buf.lastIndexOf('buffer', 4)); + * // Prints: -1 + * + * const utf16Buffer = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'utf16le'); + * + * console.log(utf16Buffer.lastIndexOf('\u03a3', undefined, 'utf16le')); + * // Prints: 6 + * console.log(utf16Buffer.lastIndexOf('\u03a3', -5, 'utf16le')); + * // Prints: 4 + * ``` + * + * If `value` is not a string, number, or `Buffer`, this method will throw a`TypeError`. If `value` is a number, it will be coerced to a valid byte value, + * an integer between 0 and 255. + * + * If `byteOffset` is not a number, it will be coerced to a number. Any arguments + * that coerce to `NaN`, like `{}` or `undefined`, will search the whole buffer. + * This behavior matches [`String.prototype.lastIndexOf()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/lastIndexOf). + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const b = Buffer.from('abcdef'); + * + * // Passing a value that's a number, but not a valid byte. + * // Prints: 2, equivalent to searching for 99 or 'c'. + * console.log(b.lastIndexOf(99.9)); + * console.log(b.lastIndexOf(256 + 99)); + * + * // Passing a byteOffset that coerces to NaN. + * // Prints: 1, searching the whole buffer. + * console.log(b.lastIndexOf('b', undefined)); + * console.log(b.lastIndexOf('b', {})); + * + * // Passing a byteOffset that coerces to 0. + * // Prints: -1, equivalent to passing 0. + * console.log(b.lastIndexOf('b', null)); + * console.log(b.lastIndexOf('b', [])); + * ``` + * + * If `value` is an empty string or empty `Buffer`, `byteOffset` will be returned. + * @since v6.0.0 + * @param value What to search for. + * @param [byteOffset=buf.length - 1] Where to begin searching in `buf`. If negative, then offset is calculated from the end of `buf`. + * @param [encoding='utf8'] If `value` is a string, this is the encoding used to determine the binary representation of the string that will be searched for in `buf`. + * @return The index of the last occurrence of `value` in `buf`, or `-1` if `buf` does not contain `value`. + */ + lastIndexOf(value: string | number | Uint8Array, byteOffset?: number, encoding?: BufferEncoding): number; + /** + * Creates and returns an [iterator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols) of `[index, byte]` pairs from the contents + * of `buf`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * // Log the entire contents of a `Buffer`. + * + * const buf = Buffer.from('buffer'); + * + * for (const pair of buf.entries()) { + * console.log(pair); + * } + * // Prints: + * // [0, 98] + * // [1, 117] + * // [2, 102] + * // [3, 102] + * // [4, 101] + * // [5, 114] + * ``` + * @since v1.1.0 + */ + entries(): IterableIterator<[number, number]>; + /** + * Equivalent to `buf.indexOf() !== -1`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from('this is a buffer'); + * + * console.log(buf.includes('this')); + * // Prints: true + * console.log(buf.includes('is')); + * // Prints: true + * console.log(buf.includes(Buffer.from('a buffer'))); + * // Prints: true + * console.log(buf.includes(97)); + * // Prints: true (97 is the decimal ASCII value for 'a') + * console.log(buf.includes(Buffer.from('a buffer example'))); + * // Prints: false + * console.log(buf.includes(Buffer.from('a buffer example').slice(0, 8))); + * // Prints: true + * console.log(buf.includes('this', 4)); + * // Prints: false + * ``` + * @since v5.3.0 + * @param value What to search for. + * @param [byteOffset=0] Where to begin searching in `buf`. If negative, then offset is calculated from the end of `buf`. + * @param [encoding='utf8'] If `value` is a string, this is its encoding. + * @return `true` if `value` was found in `buf`, `false` otherwise. + */ + includes(value: string | number | Buffer, byteOffset?: number, encoding?: BufferEncoding): boolean; + /** + * Creates and returns an [iterator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols) of `buf` keys (indices). + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from('buffer'); + * + * for (const key of buf.keys()) { + * console.log(key); + * } + * // Prints: + * // 0 + * // 1 + * // 2 + * // 3 + * // 4 + * // 5 + * ``` + * @since v1.1.0 + */ + keys(): IterableIterator; + /** + * Creates and returns an [iterator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols) for `buf` values (bytes). This function is + * called automatically when a `Buffer` is used in a `for..of` statement. + * + * ```js + * import { Buffer } from 'node:buffer'; + * + * const buf = Buffer.from('buffer'); + * + * for (const value of buf.values()) { + * console.log(value); + * } + * // Prints: + * // 98 + * // 117 + * // 102 + * // 102 + * // 101 + * // 114 + * + * for (const value of buf) { + * console.log(value); + * } + * // Prints: + * // 98 + * // 117 + * // 102 + * // 102 + * // 101 + * // 114 + * ``` + * @since v1.1.0 + */ + values(): IterableIterator; + } + var Buffer: BufferConstructor; + /** + * Decodes a string of Base64-encoded data into bytes, and encodes those bytes + * into a string using Latin-1 (ISO-8859-1). + * + * The `data` may be any JavaScript-value that can be coerced into a string. + * + * **This function is only provided for compatibility with legacy web platform APIs** + * **and should never be used in new code, because they use strings to represent** + * **binary data and predate the introduction of typed arrays in JavaScript.** + * **For code running using Node.js APIs, converting between base64-encoded strings** + * **and binary data should be performed using `Buffer.from(str, 'base64')` and`buf.toString('base64')`.** + * @since v15.13.0, v14.17.0 + * @legacy Use `Buffer.from(data, 'base64')` instead. + * @param data The Base64-encoded input string. + */ + function atob(data: string): string; + /** + * Decodes a string into bytes using Latin-1 (ISO-8859), and encodes those bytes + * into a string using Base64. + * + * The `data` may be any JavaScript-value that can be coerced into a string. + * + * **This function is only provided for compatibility with legacy web platform APIs** + * **and should never be used in new code, because they use strings to represent** + * **binary data and predate the introduction of typed arrays in JavaScript.** + * **For code running using Node.js APIs, converting between base64-encoded strings** + * **and binary data should be performed using `Buffer.from(str, 'base64')` and`buf.toString('base64')`.** + * @since v15.13.0, v14.17.0 + * @legacy Use `buf.toString('base64')` instead. + * @param data An ASCII (Latin1) string. + */ + function btoa(data: string): string; + interface Blob extends __Blob {} + /** + * `Blob` class is a global reference for `require('node:buffer').Blob` + * https://nodejs.org/api/buffer.html#class-blob + * @since v18.0.0 + */ + var Blob: typeof globalThis extends { + onmessage: any; + Blob: infer T; + } ? T + : typeof NodeBlob; + } +} +declare module "node:buffer" { + export * from "buffer"; +} diff --git a/task/node_modules/@types/node/ts4.8/child_process.d.ts b/task/node_modules/@types/node/ts4.8/child_process.d.ts new file mode 100644 index 0000000..a97532b --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/child_process.d.ts @@ -0,0 +1,1540 @@ +/** + * The `node:child_process` module provides the ability to spawn subprocesses in + * a manner that is similar, but not identical, to [`popen(3)`](http://man7.org/linux/man-pages/man3/popen.3.html). This capability + * is primarily provided by the {@link spawn} function: + * + * ```js + * const { spawn } = require('node:child_process'); + * const ls = spawn('ls', ['-lh', '/usr']); + * + * ls.stdout.on('data', (data) => { + * console.log(`stdout: ${data}`); + * }); + * + * ls.stderr.on('data', (data) => { + * console.error(`stderr: ${data}`); + * }); + * + * ls.on('close', (code) => { + * console.log(`child process exited with code ${code}`); + * }); + * ``` + * + * By default, pipes for `stdin`, `stdout`, and `stderr` are established between + * the parent Node.js process and the spawned subprocess. These pipes have + * limited (and platform-specific) capacity. If the subprocess writes to + * stdout in excess of that limit without the output being captured, the + * subprocess blocks waiting for the pipe buffer to accept more data. This is + * identical to the behavior of pipes in the shell. Use the `{ stdio: 'ignore' }`option if the output will not be consumed. + * + * The command lookup is performed using the `options.env.PATH` environment + * variable if `env` is in the `options` object. Otherwise, `process.env.PATH` is + * used. If `options.env` is set without `PATH`, lookup on Unix is performed + * on a default search path search of `/usr/bin:/bin` (see your operating system's + * manual for execvpe/execvp), on Windows the current processes environment + * variable `PATH` is used. + * + * On Windows, environment variables are case-insensitive. Node.js + * lexicographically sorts the `env` keys and uses the first one that + * case-insensitively matches. Only first (in lexicographic order) entry will be + * passed to the subprocess. This might lead to issues on Windows when passing + * objects to the `env` option that have multiple variants of the same key, such as`PATH` and `Path`. + * + * The {@link spawn} method spawns the child process asynchronously, + * without blocking the Node.js event loop. The {@link spawnSync} function provides equivalent functionality in a synchronous manner that blocks + * the event loop until the spawned process either exits or is terminated. + * + * For convenience, the `node:child_process` module provides a handful of + * synchronous and asynchronous alternatives to {@link spawn} and {@link spawnSync}. Each of these alternatives are implemented on + * top of {@link spawn} or {@link spawnSync}. + * + * * {@link exec}: spawns a shell and runs a command within that + * shell, passing the `stdout` and `stderr` to a callback function when + * complete. + * * {@link execFile}: similar to {@link exec} except + * that it spawns the command directly without first spawning a shell by + * default. + * * {@link fork}: spawns a new Node.js process and invokes a + * specified module with an IPC communication channel established that allows + * sending messages between parent and child. + * * {@link execSync}: a synchronous version of {@link exec} that will block the Node.js event loop. + * * {@link execFileSync}: a synchronous version of {@link execFile} that will block the Node.js event loop. + * + * For certain use cases, such as automating shell scripts, the `synchronous counterparts` may be more convenient. In many cases, however, + * the synchronous methods can have significant impact on performance due to + * stalling the event loop while spawned processes complete. + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/child_process.js) + */ +declare module "child_process" { + import { ObjectEncodingOptions } from "node:fs"; + import { Abortable, EventEmitter } from "node:events"; + import * as net from "node:net"; + import { Pipe, Readable, Stream, Writable } from "node:stream"; + import { URL } from "node:url"; + type Serializable = string | object | number | boolean | bigint; + type SendHandle = net.Socket | net.Server; + /** + * Instances of the `ChildProcess` represent spawned child processes. + * + * Instances of `ChildProcess` are not intended to be created directly. Rather, + * use the {@link spawn}, {@link exec},{@link execFile}, or {@link fork} methods to create + * instances of `ChildProcess`. + * @since v2.2.0 + */ + class ChildProcess extends EventEmitter { + /** + * A `Writable Stream` that represents the child process's `stdin`. + * + * If a child process waits to read all of its input, the child will not continue + * until this stream has been closed via `end()`. + * + * If the child was spawned with `stdio[0]` set to anything other than `'pipe'`, + * then this will be `null`. + * + * `subprocess.stdin` is an alias for `subprocess.stdio[0]`. Both properties will + * refer to the same value. + * + * The `subprocess.stdin` property can be `null` or `undefined`if the child process could not be successfully spawned. + * @since v0.1.90 + */ + stdin: Writable | null; + /** + * A `Readable Stream` that represents the child process's `stdout`. + * + * If the child was spawned with `stdio[1]` set to anything other than `'pipe'`, + * then this will be `null`. + * + * `subprocess.stdout` is an alias for `subprocess.stdio[1]`. Both properties will + * refer to the same value. + * + * ```js + * const { spawn } = require('node:child_process'); + * + * const subprocess = spawn('ls'); + * + * subprocess.stdout.on('data', (data) => { + * console.log(`Received chunk ${data}`); + * }); + * ``` + * + * The `subprocess.stdout` property can be `null` or `undefined`if the child process could not be successfully spawned. + * @since v0.1.90 + */ + stdout: Readable | null; + /** + * A `Readable Stream` that represents the child process's `stderr`. + * + * If the child was spawned with `stdio[2]` set to anything other than `'pipe'`, + * then this will be `null`. + * + * `subprocess.stderr` is an alias for `subprocess.stdio[2]`. Both properties will + * refer to the same value. + * + * The `subprocess.stderr` property can be `null` or `undefined`if the child process could not be successfully spawned. + * @since v0.1.90 + */ + stderr: Readable | null; + /** + * The `subprocess.channel` property is a reference to the child's IPC channel. If + * no IPC channel exists, this property is `undefined`. + * @since v7.1.0 + */ + readonly channel?: Pipe | null | undefined; + /** + * A sparse array of pipes to the child process, corresponding with positions in + * the `stdio` option passed to {@link spawn} that have been set + * to the value `'pipe'`. `subprocess.stdio[0]`, `subprocess.stdio[1]`, and`subprocess.stdio[2]` are also available as `subprocess.stdin`,`subprocess.stdout`, and `subprocess.stderr`, + * respectively. + * + * In the following example, only the child's fd `1` (stdout) is configured as a + * pipe, so only the parent's `subprocess.stdio[1]` is a stream, all other values + * in the array are `null`. + * + * ```js + * const assert = require('node:assert'); + * const fs = require('node:fs'); + * const child_process = require('node:child_process'); + * + * const subprocess = child_process.spawn('ls', { + * stdio: [ + * 0, // Use parent's stdin for child. + * 'pipe', // Pipe child's stdout to parent. + * fs.openSync('err.out', 'w'), // Direct child's stderr to a file. + * ], + * }); + * + * assert.strictEqual(subprocess.stdio[0], null); + * assert.strictEqual(subprocess.stdio[0], subprocess.stdin); + * + * assert(subprocess.stdout); + * assert.strictEqual(subprocess.stdio[1], subprocess.stdout); + * + * assert.strictEqual(subprocess.stdio[2], null); + * assert.strictEqual(subprocess.stdio[2], subprocess.stderr); + * ``` + * + * The `subprocess.stdio` property can be `undefined` if the child process could + * not be successfully spawned. + * @since v0.7.10 + */ + readonly stdio: [ + Writable | null, + // stdin + Readable | null, + // stdout + Readable | null, + // stderr + Readable | Writable | null | undefined, + // extra + Readable | Writable | null | undefined, // extra + ]; + /** + * The `subprocess.killed` property indicates whether the child process + * successfully received a signal from `subprocess.kill()`. The `killed` property + * does not indicate that the child process has been terminated. + * @since v0.5.10 + */ + readonly killed: boolean; + /** + * Returns the process identifier (PID) of the child process. If the child process + * fails to spawn due to errors, then the value is `undefined` and `error` is + * emitted. + * + * ```js + * const { spawn } = require('node:child_process'); + * const grep = spawn('grep', ['ssh']); + * + * console.log(`Spawned child pid: ${grep.pid}`); + * grep.stdin.end(); + * ``` + * @since v0.1.90 + */ + readonly pid?: number | undefined; + /** + * The `subprocess.connected` property indicates whether it is still possible to + * send and receive messages from a child process. When `subprocess.connected` is`false`, it is no longer possible to send or receive messages. + * @since v0.7.2 + */ + readonly connected: boolean; + /** + * The `subprocess.exitCode` property indicates the exit code of the child process. + * If the child process is still running, the field will be `null`. + */ + readonly exitCode: number | null; + /** + * The `subprocess.signalCode` property indicates the signal received by + * the child process if any, else `null`. + */ + readonly signalCode: NodeJS.Signals | null; + /** + * The `subprocess.spawnargs` property represents the full list of command-line + * arguments the child process was launched with. + */ + readonly spawnargs: string[]; + /** + * The `subprocess.spawnfile` property indicates the executable file name of + * the child process that is launched. + * + * For {@link fork}, its value will be equal to `process.execPath`. + * For {@link spawn}, its value will be the name of + * the executable file. + * For {@link exec}, its value will be the name of the shell + * in which the child process is launched. + */ + readonly spawnfile: string; + /** + * The `subprocess.kill()` method sends a signal to the child process. If no + * argument is given, the process will be sent the `'SIGTERM'` signal. See [`signal(7)`](http://man7.org/linux/man-pages/man7/signal.7.html) for a list of available signals. This function + * returns `true` if [`kill(2)`](http://man7.org/linux/man-pages/man2/kill.2.html) succeeds, and `false` otherwise. + * + * ```js + * const { spawn } = require('node:child_process'); + * const grep = spawn('grep', ['ssh']); + * + * grep.on('close', (code, signal) => { + * console.log( + * `child process terminated due to receipt of signal ${signal}`); + * }); + * + * // Send SIGHUP to process. + * grep.kill('SIGHUP'); + * ``` + * + * The `ChildProcess` object may emit an `'error'` event if the signal + * cannot be delivered. Sending a signal to a child process that has already exited + * is not an error but may have unforeseen consequences. Specifically, if the + * process identifier (PID) has been reassigned to another process, the signal will + * be delivered to that process instead which can have unexpected results. + * + * While the function is called `kill`, the signal delivered to the child process + * may not actually terminate the process. + * + * See [`kill(2)`](http://man7.org/linux/man-pages/man2/kill.2.html) for reference. + * + * On Windows, where POSIX signals do not exist, the `signal` argument will be + * ignored, and the process will be killed forcefully and abruptly (similar to`'SIGKILL'`). + * See `Signal Events` for more details. + * + * On Linux, child processes of child processes will not be terminated + * when attempting to kill their parent. This is likely to happen when running a + * new process in a shell or with the use of the `shell` option of `ChildProcess`: + * + * ```js + * 'use strict'; + * const { spawn } = require('node:child_process'); + * + * const subprocess = spawn( + * 'sh', + * [ + * '-c', + * `node -e "setInterval(() => { + * console.log(process.pid, 'is alive') + * }, 500);"`, + * ], { + * stdio: ['inherit', 'inherit', 'inherit'], + * }, + * ); + * + * setTimeout(() => { + * subprocess.kill(); // Does not terminate the Node.js process in the shell. + * }, 2000); + * ``` + * @since v0.1.90 + */ + kill(signal?: NodeJS.Signals | number): boolean; + /** + * Calls {@link ChildProcess.kill} with `'SIGTERM'`. + * @since v20.5.0 + */ + [Symbol.dispose](): void; + /** + * When an IPC channel has been established between the parent and child ( + * i.e. when using {@link fork}), the `subprocess.send()` method can + * be used to send messages to the child process. When the child process is a + * Node.js instance, these messages can be received via the `'message'` event. + * + * The message goes through serialization and parsing. The resulting + * message might not be the same as what is originally sent. + * + * For example, in the parent script: + * + * ```js + * const cp = require('node:child_process'); + * const n = cp.fork(`${__dirname}/sub.js`); + * + * n.on('message', (m) => { + * console.log('PARENT got message:', m); + * }); + * + * // Causes the child to print: CHILD got message: { hello: 'world' } + * n.send({ hello: 'world' }); + * ``` + * + * And then the child script, `'sub.js'` might look like this: + * + * ```js + * process.on('message', (m) => { + * console.log('CHILD got message:', m); + * }); + * + * // Causes the parent to print: PARENT got message: { foo: 'bar', baz: null } + * process.send({ foo: 'bar', baz: NaN }); + * ``` + * + * Child Node.js processes will have a `process.send()` method of their own + * that allows the child to send messages back to the parent. + * + * There is a special case when sending a `{cmd: 'NODE_foo'}` message. Messages + * containing a `NODE_` prefix in the `cmd` property are reserved for use within + * Node.js core and will not be emitted in the child's `'message'` event. Rather, such messages are emitted using the`'internalMessage'` event and are consumed internally by Node.js. + * Applications should avoid using such messages or listening for`'internalMessage'` events as it is subject to change without notice. + * + * The optional `sendHandle` argument that may be passed to `subprocess.send()` is + * for passing a TCP server or socket object to the child process. The child will + * receive the object as the second argument passed to the callback function + * registered on the `'message'` event. Any data that is received + * and buffered in the socket will not be sent to the child. + * + * The optional `callback` is a function that is invoked after the message is + * sent but before the child may have received it. The function is called with a + * single argument: `null` on success, or an `Error` object on failure. + * + * If no `callback` function is provided and the message cannot be sent, an`'error'` event will be emitted by the `ChildProcess` object. This can + * happen, for instance, when the child process has already exited. + * + * `subprocess.send()` will return `false` if the channel has closed or when the + * backlog of unsent messages exceeds a threshold that makes it unwise to send + * more. Otherwise, the method returns `true`. The `callback` function can be + * used to implement flow control. + * + * #### Example: sending a server object + * + * The `sendHandle` argument can be used, for instance, to pass the handle of + * a TCP server object to the child process as illustrated in the example below: + * + * ```js + * const subprocess = require('node:child_process').fork('subprocess.js'); + * + * // Open up the server object and send the handle. + * const server = require('node:net').createServer(); + * server.on('connection', (socket) => { + * socket.end('handled by parent'); + * }); + * server.listen(1337, () => { + * subprocess.send('server', server); + * }); + * ``` + * + * The child would then receive the server object as: + * + * ```js + * process.on('message', (m, server) => { + * if (m === 'server') { + * server.on('connection', (socket) => { + * socket.end('handled by child'); + * }); + * } + * }); + * ``` + * + * Once the server is now shared between the parent and child, some connections + * can be handled by the parent and some by the child. + * + * While the example above uses a server created using the `node:net` module,`node:dgram` module servers use exactly the same workflow with the exceptions of + * listening on a `'message'` event instead of `'connection'` and using`server.bind()` instead of `server.listen()`. This is, however, only + * supported on Unix platforms. + * + * #### Example: sending a socket object + * + * Similarly, the `sendHandler` argument can be used to pass the handle of a + * socket to the child process. The example below spawns two children that each + * handle connections with "normal" or "special" priority: + * + * ```js + * const { fork } = require('node:child_process'); + * const normal = fork('subprocess.js', ['normal']); + * const special = fork('subprocess.js', ['special']); + * + * // Open up the server and send sockets to child. Use pauseOnConnect to prevent + * // the sockets from being read before they are sent to the child process. + * const server = require('node:net').createServer({ pauseOnConnect: true }); + * server.on('connection', (socket) => { + * + * // If this is special priority... + * if (socket.remoteAddress === '74.125.127.100') { + * special.send('socket', socket); + * return; + * } + * // This is normal priority. + * normal.send('socket', socket); + * }); + * server.listen(1337); + * ``` + * + * The `subprocess.js` would receive the socket handle as the second argument + * passed to the event callback function: + * + * ```js + * process.on('message', (m, socket) => { + * if (m === 'socket') { + * if (socket) { + * // Check that the client socket exists. + * // It is possible for the socket to be closed between the time it is + * // sent and the time it is received in the child process. + * socket.end(`Request handled with ${process.argv[2]} priority`); + * } + * } + * }); + * ``` + * + * Do not use `.maxConnections` on a socket that has been passed to a subprocess. + * The parent cannot track when the socket is destroyed. + * + * Any `'message'` handlers in the subprocess should verify that `socket` exists, + * as the connection may have been closed during the time it takes to send the + * connection to the child. + * @since v0.5.9 + * @param options The `options` argument, if present, is an object used to parameterize the sending of certain types of handles. `options` supports the following properties: + */ + send(message: Serializable, callback?: (error: Error | null) => void): boolean; + send(message: Serializable, sendHandle?: SendHandle, callback?: (error: Error | null) => void): boolean; + send( + message: Serializable, + sendHandle?: SendHandle, + options?: MessageOptions, + callback?: (error: Error | null) => void, + ): boolean; + /** + * Closes the IPC channel between parent and child, allowing the child to exit + * gracefully once there are no other connections keeping it alive. After calling + * this method the `subprocess.connected` and `process.connected` properties in + * both the parent and child (respectively) will be set to `false`, and it will be + * no longer possible to pass messages between the processes. + * + * The `'disconnect'` event will be emitted when there are no messages in the + * process of being received. This will most often be triggered immediately after + * calling `subprocess.disconnect()`. + * + * When the child process is a Node.js instance (e.g. spawned using {@link fork}), the `process.disconnect()` method can be invoked + * within the child process to close the IPC channel as well. + * @since v0.7.2 + */ + disconnect(): void; + /** + * By default, the parent will wait for the detached child to exit. To prevent the + * parent from waiting for a given `subprocess` to exit, use the`subprocess.unref()` method. Doing so will cause the parent's event loop to not + * include the child in its reference count, allowing the parent to exit + * independently of the child, unless there is an established IPC channel between + * the child and the parent. + * + * ```js + * const { spawn } = require('node:child_process'); + * + * const subprocess = spawn(process.argv[0], ['child_program.js'], { + * detached: true, + * stdio: 'ignore', + * }); + * + * subprocess.unref(); + * ``` + * @since v0.7.10 + */ + unref(): void; + /** + * Calling `subprocess.ref()` after making a call to `subprocess.unref()` will + * restore the removed reference count for the child process, forcing the parent + * to wait for the child to exit before exiting itself. + * + * ```js + * const { spawn } = require('node:child_process'); + * + * const subprocess = spawn(process.argv[0], ['child_program.js'], { + * detached: true, + * stdio: 'ignore', + * }); + * + * subprocess.unref(); + * subprocess.ref(); + * ``` + * @since v0.7.10 + */ + ref(): void; + /** + * events.EventEmitter + * 1. close + * 2. disconnect + * 3. error + * 4. exit + * 5. message + * 6. spawn + */ + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "close", listener: (code: number | null, signal: NodeJS.Signals | null) => void): this; + addListener(event: "disconnect", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "exit", listener: (code: number | null, signal: NodeJS.Signals | null) => void): this; + addListener(event: "message", listener: (message: Serializable, sendHandle: SendHandle) => void): this; + addListener(event: "spawn", listener: () => void): this; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close", code: number | null, signal: NodeJS.Signals | null): boolean; + emit(event: "disconnect"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "exit", code: number | null, signal: NodeJS.Signals | null): boolean; + emit(event: "message", message: Serializable, sendHandle: SendHandle): boolean; + emit(event: "spawn", listener: () => void): boolean; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "close", listener: (code: number | null, signal: NodeJS.Signals | null) => void): this; + on(event: "disconnect", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "exit", listener: (code: number | null, signal: NodeJS.Signals | null) => void): this; + on(event: "message", listener: (message: Serializable, sendHandle: SendHandle) => void): this; + on(event: "spawn", listener: () => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "close", listener: (code: number | null, signal: NodeJS.Signals | null) => void): this; + once(event: "disconnect", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "exit", listener: (code: number | null, signal: NodeJS.Signals | null) => void): this; + once(event: "message", listener: (message: Serializable, sendHandle: SendHandle) => void): this; + once(event: "spawn", listener: () => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: (code: number | null, signal: NodeJS.Signals | null) => void): this; + prependListener(event: "disconnect", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "exit", listener: (code: number | null, signal: NodeJS.Signals | null) => void): this; + prependListener(event: "message", listener: (message: Serializable, sendHandle: SendHandle) => void): this; + prependListener(event: "spawn", listener: () => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener( + event: "close", + listener: (code: number | null, signal: NodeJS.Signals | null) => void, + ): this; + prependOnceListener(event: "disconnect", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener( + event: "exit", + listener: (code: number | null, signal: NodeJS.Signals | null) => void, + ): this; + prependOnceListener(event: "message", listener: (message: Serializable, sendHandle: SendHandle) => void): this; + prependOnceListener(event: "spawn", listener: () => void): this; + } + // return this object when stdio option is undefined or not specified + interface ChildProcessWithoutNullStreams extends ChildProcess { + stdin: Writable; + stdout: Readable; + stderr: Readable; + readonly stdio: [ + Writable, + Readable, + Readable, + // stderr + Readable | Writable | null | undefined, + // extra, no modification + Readable | Writable | null | undefined, // extra, no modification + ]; + } + // return this object when stdio option is a tuple of 3 + interface ChildProcessByStdio + extends ChildProcess + { + stdin: I; + stdout: O; + stderr: E; + readonly stdio: [ + I, + O, + E, + Readable | Writable | null | undefined, + // extra, no modification + Readable | Writable | null | undefined, // extra, no modification + ]; + } + interface MessageOptions { + keepOpen?: boolean | undefined; + } + type IOType = "overlapped" | "pipe" | "ignore" | "inherit"; + type StdioOptions = IOType | Array; + type SerializationType = "json" | "advanced"; + interface MessagingOptions extends Abortable { + /** + * Specify the kind of serialization used for sending messages between processes. + * @default 'json' + */ + serialization?: SerializationType | undefined; + /** + * The signal value to be used when the spawned process will be killed by the abort signal. + * @default 'SIGTERM' + */ + killSignal?: NodeJS.Signals | number | undefined; + /** + * In milliseconds the maximum amount of time the process is allowed to run. + */ + timeout?: number | undefined; + } + interface ProcessEnvOptions { + uid?: number | undefined; + gid?: number | undefined; + cwd?: string | URL | undefined; + env?: NodeJS.ProcessEnv | undefined; + } + interface CommonOptions extends ProcessEnvOptions { + /** + * @default false + */ + windowsHide?: boolean | undefined; + /** + * @default 0 + */ + timeout?: number | undefined; + } + interface CommonSpawnOptions extends CommonOptions, MessagingOptions, Abortable { + argv0?: string | undefined; + /** + * Can be set to 'pipe', 'inherit', 'overlapped', or 'ignore', or an array of these strings. + * If passed as an array, the first element is used for `stdin`, the second for + * `stdout`, and the third for `stderr`. A fourth element can be used to + * specify the `stdio` behavior beyond the standard streams. See + * {@link ChildProcess.stdio} for more information. + * + * @default 'pipe' + */ + stdio?: StdioOptions | undefined; + shell?: boolean | string | undefined; + windowsVerbatimArguments?: boolean | undefined; + } + interface SpawnOptions extends CommonSpawnOptions { + detached?: boolean | undefined; + } + interface SpawnOptionsWithoutStdio extends SpawnOptions { + stdio?: StdioPipeNamed | StdioPipe[] | undefined; + } + type StdioNull = "inherit" | "ignore" | Stream; + type StdioPipeNamed = "pipe" | "overlapped"; + type StdioPipe = undefined | null | StdioPipeNamed; + interface SpawnOptionsWithStdioTuple< + Stdin extends StdioNull | StdioPipe, + Stdout extends StdioNull | StdioPipe, + Stderr extends StdioNull | StdioPipe, + > extends SpawnOptions { + stdio: [Stdin, Stdout, Stderr]; + } + /** + * The `child_process.spawn()` method spawns a new process using the given`command`, with command-line arguments in `args`. If omitted, `args` defaults + * to an empty array. + * + * **If the `shell` option is enabled, do not pass unsanitized user input to this** + * **function. Any input containing shell metacharacters may be used to trigger** + * **arbitrary command execution.** + * + * A third argument may be used to specify additional options, with these defaults: + * + * ```js + * const defaults = { + * cwd: undefined, + * env: process.env, + * }; + * ``` + * + * Use `cwd` to specify the working directory from which the process is spawned. + * If not given, the default is to inherit the current working directory. If given, + * but the path does not exist, the child process emits an `ENOENT` error + * and exits immediately. `ENOENT` is also emitted when the command + * does not exist. + * + * Use `env` to specify environment variables that will be visible to the new + * process, the default is `process.env`. + * + * `undefined` values in `env` will be ignored. + * + * Example of running `ls -lh /usr`, capturing `stdout`, `stderr`, and the + * exit code: + * + * ```js + * const { spawn } = require('node:child_process'); + * const ls = spawn('ls', ['-lh', '/usr']); + * + * ls.stdout.on('data', (data) => { + * console.log(`stdout: ${data}`); + * }); + * + * ls.stderr.on('data', (data) => { + * console.error(`stderr: ${data}`); + * }); + * + * ls.on('close', (code) => { + * console.log(`child process exited with code ${code}`); + * }); + * ``` + * + * Example: A very elaborate way to run `ps ax | grep ssh` + * + * ```js + * const { spawn } = require('node:child_process'); + * const ps = spawn('ps', ['ax']); + * const grep = spawn('grep', ['ssh']); + * + * ps.stdout.on('data', (data) => { + * grep.stdin.write(data); + * }); + * + * ps.stderr.on('data', (data) => { + * console.error(`ps stderr: ${data}`); + * }); + * + * ps.on('close', (code) => { + * if (code !== 0) { + * console.log(`ps process exited with code ${code}`); + * } + * grep.stdin.end(); + * }); + * + * grep.stdout.on('data', (data) => { + * console.log(data.toString()); + * }); + * + * grep.stderr.on('data', (data) => { + * console.error(`grep stderr: ${data}`); + * }); + * + * grep.on('close', (code) => { + * if (code !== 0) { + * console.log(`grep process exited with code ${code}`); + * } + * }); + * ``` + * + * Example of checking for failed `spawn`: + * + * ```js + * const { spawn } = require('node:child_process'); + * const subprocess = spawn('bad_command'); + * + * subprocess.on('error', (err) => { + * console.error('Failed to start subprocess.'); + * }); + * ``` + * + * Certain platforms (macOS, Linux) will use the value of `argv[0]` for the process + * title while others (Windows, SunOS) will use `command`. + * + * Node.js overwrites `argv[0]` with `process.execPath` on startup, so`process.argv[0]` in a Node.js child process will not match the `argv0`parameter passed to `spawn` from the parent. Retrieve + * it with the`process.argv0` property instead. + * + * If the `signal` option is enabled, calling `.abort()` on the corresponding`AbortController` is similar to calling `.kill()` on the child process except + * the error passed to the callback will be an `AbortError`: + * + * ```js + * const { spawn } = require('node:child_process'); + * const controller = new AbortController(); + * const { signal } = controller; + * const grep = spawn('grep', ['ssh'], { signal }); + * grep.on('error', (err) => { + * // This will be called with err being an AbortError if the controller aborts + * }); + * controller.abort(); // Stops the child process + * ``` + * @since v0.1.90 + * @param command The command to run. + * @param args List of string arguments. + */ + function spawn(command: string, options?: SpawnOptionsWithoutStdio): ChildProcessWithoutNullStreams; + function spawn( + command: string, + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn(command: string, options: SpawnOptions): ChildProcess; + // overloads of spawn with 'args' + function spawn( + command: string, + args?: readonly string[], + options?: SpawnOptionsWithoutStdio, + ): ChildProcessWithoutNullStreams; + function spawn( + command: string, + args: readonly string[], + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + args: readonly string[], + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + args: readonly string[], + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + args: readonly string[], + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + args: readonly string[], + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + args: readonly string[], + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + args: readonly string[], + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn( + command: string, + args: readonly string[], + options: SpawnOptionsWithStdioTuple, + ): ChildProcessByStdio; + function spawn(command: string, args: readonly string[], options: SpawnOptions): ChildProcess; + interface ExecOptions extends CommonOptions { + shell?: string | undefined; + signal?: AbortSignal | undefined; + maxBuffer?: number | undefined; + killSignal?: NodeJS.Signals | number | undefined; + } + interface ExecOptionsWithStringEncoding extends ExecOptions { + encoding: BufferEncoding; + } + interface ExecOptionsWithBufferEncoding extends ExecOptions { + encoding: BufferEncoding | null; // specify `null`. + } + interface ExecException extends Error { + cmd?: string | undefined; + killed?: boolean | undefined; + code?: number | undefined; + signal?: NodeJS.Signals | undefined; + } + /** + * Spawns a shell then executes the `command` within that shell, buffering any + * generated output. The `command` string passed to the exec function is processed + * directly by the shell and special characters (vary based on [shell](https://en.wikipedia.org/wiki/List_of_command-line_interpreters)) + * need to be dealt with accordingly: + * + * ```js + * const { exec } = require('node:child_process'); + * + * exec('"/path/to/test file/test.sh" arg1 arg2'); + * // Double quotes are used so that the space in the path is not interpreted as + * // a delimiter of multiple arguments. + * + * exec('echo "The \\$HOME variable is $HOME"'); + * // The $HOME variable is escaped in the first instance, but not in the second. + * ``` + * + * **Never pass unsanitized user input to this function. Any input containing shell** + * **metacharacters may be used to trigger arbitrary command execution.** + * + * If a `callback` function is provided, it is called with the arguments`(error, stdout, stderr)`. On success, `error` will be `null`. On error,`error` will be an instance of `Error`. The + * `error.code` property will be + * the exit code of the process. By convention, any exit code other than `0`indicates an error. `error.signal` will be the signal that terminated the + * process. + * + * The `stdout` and `stderr` arguments passed to the callback will contain the + * stdout and stderr output of the child process. By default, Node.js will decode + * the output as UTF-8 and pass strings to the callback. The `encoding` option + * can be used to specify the character encoding used to decode the stdout and + * stderr output. If `encoding` is `'buffer'`, or an unrecognized character + * encoding, `Buffer` objects will be passed to the callback instead. + * + * ```js + * const { exec } = require('node:child_process'); + * exec('cat *.js missing_file | wc -l', (error, stdout, stderr) => { + * if (error) { + * console.error(`exec error: ${error}`); + * return; + * } + * console.log(`stdout: ${stdout}`); + * console.error(`stderr: ${stderr}`); + * }); + * ``` + * + * If `timeout` is greater than `0`, the parent will send the signal + * identified by the `killSignal` property (the default is `'SIGTERM'`) if the + * child runs longer than `timeout` milliseconds. + * + * Unlike the [`exec(3)`](http://man7.org/linux/man-pages/man3/exec.3.html) POSIX system call, `child_process.exec()` does not replace + * the existing process and uses a shell to execute the command. + * + * If this method is invoked as its `util.promisify()` ed version, it returns + * a `Promise` for an `Object` with `stdout` and `stderr` properties. The returned`ChildProcess` instance is attached to the `Promise` as a `child` property. In + * case of an error (including any error resulting in an exit code other than 0), a + * rejected promise is returned, with the same `error` object given in the + * callback, but with two additional properties `stdout` and `stderr`. + * + * ```js + * const util = require('node:util'); + * const exec = util.promisify(require('node:child_process').exec); + * + * async function lsExample() { + * const { stdout, stderr } = await exec('ls'); + * console.log('stdout:', stdout); + * console.error('stderr:', stderr); + * } + * lsExample(); + * ``` + * + * If the `signal` option is enabled, calling `.abort()` on the corresponding`AbortController` is similar to calling `.kill()` on the child process except + * the error passed to the callback will be an `AbortError`: + * + * ```js + * const { exec } = require('node:child_process'); + * const controller = new AbortController(); + * const { signal } = controller; + * const child = exec('grep ssh', { signal }, (error) => { + * console.error(error); // an AbortError + * }); + * controller.abort(); + * ``` + * @since v0.1.90 + * @param command The command to run, with space-separated arguments. + * @param callback called with the output when process terminates. + */ + function exec( + command: string, + callback?: (error: ExecException | null, stdout: string, stderr: string) => void, + ): ChildProcess; + // `options` with `"buffer"` or `null` for `encoding` means stdout/stderr are definitely `Buffer`. + function exec( + command: string, + options: { + encoding: "buffer" | null; + } & ExecOptions, + callback?: (error: ExecException | null, stdout: Buffer, stderr: Buffer) => void, + ): ChildProcess; + // `options` with well known `encoding` means stdout/stderr are definitely `string`. + function exec( + command: string, + options: { + encoding: BufferEncoding; + } & ExecOptions, + callback?: (error: ExecException | null, stdout: string, stderr: string) => void, + ): ChildProcess; + // `options` with an `encoding` whose type is `string` means stdout/stderr could either be `Buffer` or `string`. + // There is no guarantee the `encoding` is unknown as `string` is a superset of `BufferEncoding`. + function exec( + command: string, + options: { + encoding: BufferEncoding; + } & ExecOptions, + callback?: (error: ExecException | null, stdout: string | Buffer, stderr: string | Buffer) => void, + ): ChildProcess; + // `options` without an `encoding` means stdout/stderr are definitely `string`. + function exec( + command: string, + options: ExecOptions, + callback?: (error: ExecException | null, stdout: string, stderr: string) => void, + ): ChildProcess; + // fallback if nothing else matches. Worst case is always `string | Buffer`. + function exec( + command: string, + options: (ObjectEncodingOptions & ExecOptions) | undefined | null, + callback?: (error: ExecException | null, stdout: string | Buffer, stderr: string | Buffer) => void, + ): ChildProcess; + interface PromiseWithChild extends Promise { + child: ChildProcess; + } + namespace exec { + function __promisify__(command: string): PromiseWithChild<{ + stdout: string; + stderr: string; + }>; + function __promisify__( + command: string, + options: { + encoding: "buffer" | null; + } & ExecOptions, + ): PromiseWithChild<{ + stdout: Buffer; + stderr: Buffer; + }>; + function __promisify__( + command: string, + options: { + encoding: BufferEncoding; + } & ExecOptions, + ): PromiseWithChild<{ + stdout: string; + stderr: string; + }>; + function __promisify__( + command: string, + options: ExecOptions, + ): PromiseWithChild<{ + stdout: string; + stderr: string; + }>; + function __promisify__( + command: string, + options?: (ObjectEncodingOptions & ExecOptions) | null, + ): PromiseWithChild<{ + stdout: string | Buffer; + stderr: string | Buffer; + }>; + } + interface ExecFileOptions extends CommonOptions, Abortable { + maxBuffer?: number | undefined; + killSignal?: NodeJS.Signals | number | undefined; + windowsVerbatimArguments?: boolean | undefined; + shell?: boolean | string | undefined; + signal?: AbortSignal | undefined; + } + interface ExecFileOptionsWithStringEncoding extends ExecFileOptions { + encoding: BufferEncoding; + } + interface ExecFileOptionsWithBufferEncoding extends ExecFileOptions { + encoding: "buffer" | null; + } + interface ExecFileOptionsWithOtherEncoding extends ExecFileOptions { + encoding: BufferEncoding; + } + type ExecFileException = + & Omit + & Omit + & { code?: string | number | undefined | null }; + /** + * The `child_process.execFile()` function is similar to {@link exec} except that it does not spawn a shell by default. Rather, the specified + * executable `file` is spawned directly as a new process making it slightly more + * efficient than {@link exec}. + * + * The same options as {@link exec} are supported. Since a shell is + * not spawned, behaviors such as I/O redirection and file globbing are not + * supported. + * + * ```js + * const { execFile } = require('node:child_process'); + * const child = execFile('node', ['--version'], (error, stdout, stderr) => { + * if (error) { + * throw error; + * } + * console.log(stdout); + * }); + * ``` + * + * The `stdout` and `stderr` arguments passed to the callback will contain the + * stdout and stderr output of the child process. By default, Node.js will decode + * the output as UTF-8 and pass strings to the callback. The `encoding` option + * can be used to specify the character encoding used to decode the stdout and + * stderr output. If `encoding` is `'buffer'`, or an unrecognized character + * encoding, `Buffer` objects will be passed to the callback instead. + * + * If this method is invoked as its `util.promisify()` ed version, it returns + * a `Promise` for an `Object` with `stdout` and `stderr` properties. The returned`ChildProcess` instance is attached to the `Promise` as a `child` property. In + * case of an error (including any error resulting in an exit code other than 0), a + * rejected promise is returned, with the same `error` object given in the + * callback, but with two additional properties `stdout` and `stderr`. + * + * ```js + * const util = require('node:util'); + * const execFile = util.promisify(require('node:child_process').execFile); + * async function getVersion() { + * const { stdout } = await execFile('node', ['--version']); + * console.log(stdout); + * } + * getVersion(); + * ``` + * + * **If the `shell` option is enabled, do not pass unsanitized user input to this** + * **function. Any input containing shell metacharacters may be used to trigger** + * **arbitrary command execution.** + * + * If the `signal` option is enabled, calling `.abort()` on the corresponding`AbortController` is similar to calling `.kill()` on the child process except + * the error passed to the callback will be an `AbortError`: + * + * ```js + * const { execFile } = require('node:child_process'); + * const controller = new AbortController(); + * const { signal } = controller; + * const child = execFile('node', ['--version'], { signal }, (error) => { + * console.error(error); // an AbortError + * }); + * controller.abort(); + * ``` + * @since v0.1.91 + * @param file The name or path of the executable file to run. + * @param args List of string arguments. + * @param callback Called with the output when process terminates. + */ + function execFile(file: string): ChildProcess; + function execFile( + file: string, + options: (ObjectEncodingOptions & ExecFileOptions) | undefined | null, + ): ChildProcess; + function execFile(file: string, args?: readonly string[] | null): ChildProcess; + function execFile( + file: string, + args: readonly string[] | undefined | null, + options: (ObjectEncodingOptions & ExecFileOptions) | undefined | null, + ): ChildProcess; + // no `options` definitely means stdout/stderr are `string`. + function execFile( + file: string, + callback: (error: ExecFileException | null, stdout: string, stderr: string) => void, + ): ChildProcess; + function execFile( + file: string, + args: readonly string[] | undefined | null, + callback: (error: ExecFileException | null, stdout: string, stderr: string) => void, + ): ChildProcess; + // `options` with `"buffer"` or `null` for `encoding` means stdout/stderr are definitely `Buffer`. + function execFile( + file: string, + options: ExecFileOptionsWithBufferEncoding, + callback: (error: ExecFileException | null, stdout: Buffer, stderr: Buffer) => void, + ): ChildProcess; + function execFile( + file: string, + args: readonly string[] | undefined | null, + options: ExecFileOptionsWithBufferEncoding, + callback: (error: ExecFileException | null, stdout: Buffer, stderr: Buffer) => void, + ): ChildProcess; + // `options` with well known `encoding` means stdout/stderr are definitely `string`. + function execFile( + file: string, + options: ExecFileOptionsWithStringEncoding, + callback: (error: ExecFileException | null, stdout: string, stderr: string) => void, + ): ChildProcess; + function execFile( + file: string, + args: readonly string[] | undefined | null, + options: ExecFileOptionsWithStringEncoding, + callback: (error: ExecFileException | null, stdout: string, stderr: string) => void, + ): ChildProcess; + // `options` with an `encoding` whose type is `string` means stdout/stderr could either be `Buffer` or `string`. + // There is no guarantee the `encoding` is unknown as `string` is a superset of `BufferEncoding`. + function execFile( + file: string, + options: ExecFileOptionsWithOtherEncoding, + callback: (error: ExecFileException | null, stdout: string | Buffer, stderr: string | Buffer) => void, + ): ChildProcess; + function execFile( + file: string, + args: readonly string[] | undefined | null, + options: ExecFileOptionsWithOtherEncoding, + callback: (error: ExecFileException | null, stdout: string | Buffer, stderr: string | Buffer) => void, + ): ChildProcess; + // `options` without an `encoding` means stdout/stderr are definitely `string`. + function execFile( + file: string, + options: ExecFileOptions, + callback: (error: ExecFileException | null, stdout: string, stderr: string) => void, + ): ChildProcess; + function execFile( + file: string, + args: readonly string[] | undefined | null, + options: ExecFileOptions, + callback: (error: ExecFileException | null, stdout: string, stderr: string) => void, + ): ChildProcess; + // fallback if nothing else matches. Worst case is always `string | Buffer`. + function execFile( + file: string, + options: (ObjectEncodingOptions & ExecFileOptions) | undefined | null, + callback: + | ((error: ExecFileException | null, stdout: string | Buffer, stderr: string | Buffer) => void) + | undefined + | null, + ): ChildProcess; + function execFile( + file: string, + args: readonly string[] | undefined | null, + options: (ObjectEncodingOptions & ExecFileOptions) | undefined | null, + callback: + | ((error: ExecFileException | null, stdout: string | Buffer, stderr: string | Buffer) => void) + | undefined + | null, + ): ChildProcess; + namespace execFile { + function __promisify__(file: string): PromiseWithChild<{ + stdout: string; + stderr: string; + }>; + function __promisify__( + file: string, + args: readonly string[] | undefined | null, + ): PromiseWithChild<{ + stdout: string; + stderr: string; + }>; + function __promisify__( + file: string, + options: ExecFileOptionsWithBufferEncoding, + ): PromiseWithChild<{ + stdout: Buffer; + stderr: Buffer; + }>; + function __promisify__( + file: string, + args: readonly string[] | undefined | null, + options: ExecFileOptionsWithBufferEncoding, + ): PromiseWithChild<{ + stdout: Buffer; + stderr: Buffer; + }>; + function __promisify__( + file: string, + options: ExecFileOptionsWithStringEncoding, + ): PromiseWithChild<{ + stdout: string; + stderr: string; + }>; + function __promisify__( + file: string, + args: readonly string[] | undefined | null, + options: ExecFileOptionsWithStringEncoding, + ): PromiseWithChild<{ + stdout: string; + stderr: string; + }>; + function __promisify__( + file: string, + options: ExecFileOptionsWithOtherEncoding, + ): PromiseWithChild<{ + stdout: string | Buffer; + stderr: string | Buffer; + }>; + function __promisify__( + file: string, + args: readonly string[] | undefined | null, + options: ExecFileOptionsWithOtherEncoding, + ): PromiseWithChild<{ + stdout: string | Buffer; + stderr: string | Buffer; + }>; + function __promisify__( + file: string, + options: ExecFileOptions, + ): PromiseWithChild<{ + stdout: string; + stderr: string; + }>; + function __promisify__( + file: string, + args: readonly string[] | undefined | null, + options: ExecFileOptions, + ): PromiseWithChild<{ + stdout: string; + stderr: string; + }>; + function __promisify__( + file: string, + options: (ObjectEncodingOptions & ExecFileOptions) | undefined | null, + ): PromiseWithChild<{ + stdout: string | Buffer; + stderr: string | Buffer; + }>; + function __promisify__( + file: string, + args: readonly string[] | undefined | null, + options: (ObjectEncodingOptions & ExecFileOptions) | undefined | null, + ): PromiseWithChild<{ + stdout: string | Buffer; + stderr: string | Buffer; + }>; + } + interface ForkOptions extends ProcessEnvOptions, MessagingOptions, Abortable { + execPath?: string | undefined; + execArgv?: string[] | undefined; + silent?: boolean | undefined; + /** + * Can be set to 'pipe', 'inherit', 'overlapped', or 'ignore', or an array of these strings. + * If passed as an array, the first element is used for `stdin`, the second for + * `stdout`, and the third for `stderr`. A fourth element can be used to + * specify the `stdio` behavior beyond the standard streams. See + * {@link ChildProcess.stdio} for more information. + * + * @default 'pipe' + */ + stdio?: StdioOptions | undefined; + detached?: boolean | undefined; + windowsVerbatimArguments?: boolean | undefined; + } + /** + * The `child_process.fork()` method is a special case of {@link spawn} used specifically to spawn new Node.js processes. + * Like {@link spawn}, a `ChildProcess` object is returned. The + * returned `ChildProcess` will have an additional communication channel + * built-in that allows messages to be passed back and forth between the parent and + * child. See `subprocess.send()` for details. + * + * Keep in mind that spawned Node.js child processes are + * independent of the parent with exception of the IPC communication channel + * that is established between the two. Each process has its own memory, with + * their own V8 instances. Because of the additional resource allocations + * required, spawning a large number of child Node.js processes is not + * recommended. + * + * By default, `child_process.fork()` will spawn new Node.js instances using the `process.execPath` of the parent process. The `execPath` property in the`options` object allows for an alternative + * execution path to be used. + * + * Node.js processes launched with a custom `execPath` will communicate with the + * parent process using the file descriptor (fd) identified using the + * environment variable `NODE_CHANNEL_FD` on the child process. + * + * Unlike the [`fork(2)`](http://man7.org/linux/man-pages/man2/fork.2.html) POSIX system call, `child_process.fork()` does not clone the + * current process. + * + * The `shell` option available in {@link spawn} is not supported by`child_process.fork()` and will be ignored if set. + * + * If the `signal` option is enabled, calling `.abort()` on the corresponding`AbortController` is similar to calling `.kill()` on the child process except + * the error passed to the callback will be an `AbortError`: + * + * ```js + * if (process.argv[2] === 'child') { + * setTimeout(() => { + * console.log(`Hello from ${process.argv[2]}!`); + * }, 1_000); + * } else { + * const { fork } = require('node:child_process'); + * const controller = new AbortController(); + * const { signal } = controller; + * const child = fork(__filename, ['child'], { signal }); + * child.on('error', (err) => { + * // This will be called with err being an AbortError if the controller aborts + * }); + * controller.abort(); // Stops the child process + * } + * ``` + * @since v0.5.0 + * @param modulePath The module to run in the child. + * @param args List of string arguments. + */ + function fork(modulePath: string, options?: ForkOptions): ChildProcess; + function fork(modulePath: string, args?: readonly string[], options?: ForkOptions): ChildProcess; + interface SpawnSyncOptions extends CommonSpawnOptions { + input?: string | NodeJS.ArrayBufferView | undefined; + maxBuffer?: number | undefined; + encoding?: BufferEncoding | "buffer" | null | undefined; + } + interface SpawnSyncOptionsWithStringEncoding extends SpawnSyncOptions { + encoding: BufferEncoding; + } + interface SpawnSyncOptionsWithBufferEncoding extends SpawnSyncOptions { + encoding?: "buffer" | null | undefined; + } + interface SpawnSyncReturns { + pid: number; + output: Array; + stdout: T; + stderr: T; + status: number | null; + signal: NodeJS.Signals | null; + error?: Error | undefined; + } + /** + * The `child_process.spawnSync()` method is generally identical to {@link spawn} with the exception that the function will not return + * until the child process has fully closed. When a timeout has been encountered + * and `killSignal` is sent, the method won't return until the process has + * completely exited. If the process intercepts and handles the `SIGTERM` signal + * and doesn't exit, the parent process will wait until the child process has + * exited. + * + * **If the `shell` option is enabled, do not pass unsanitized user input to this** + * **function. Any input containing shell metacharacters may be used to trigger** + * **arbitrary command execution.** + * @since v0.11.12 + * @param command The command to run. + * @param args List of string arguments. + */ + function spawnSync(command: string): SpawnSyncReturns; + function spawnSync(command: string, options: SpawnSyncOptionsWithStringEncoding): SpawnSyncReturns; + function spawnSync(command: string, options: SpawnSyncOptionsWithBufferEncoding): SpawnSyncReturns; + function spawnSync(command: string, options?: SpawnSyncOptions): SpawnSyncReturns; + function spawnSync(command: string, args: readonly string[]): SpawnSyncReturns; + function spawnSync( + command: string, + args: readonly string[], + options: SpawnSyncOptionsWithStringEncoding, + ): SpawnSyncReturns; + function spawnSync( + command: string, + args: readonly string[], + options: SpawnSyncOptionsWithBufferEncoding, + ): SpawnSyncReturns; + function spawnSync( + command: string, + args?: readonly string[], + options?: SpawnSyncOptions, + ): SpawnSyncReturns; + interface CommonExecOptions extends CommonOptions { + input?: string | NodeJS.ArrayBufferView | undefined; + /** + * Can be set to 'pipe', 'inherit, or 'ignore', or an array of these strings. + * If passed as an array, the first element is used for `stdin`, the second for + * `stdout`, and the third for `stderr`. A fourth element can be used to + * specify the `stdio` behavior beyond the standard streams. See + * {@link ChildProcess.stdio} for more information. + * + * @default 'pipe' + */ + stdio?: StdioOptions | undefined; + killSignal?: NodeJS.Signals | number | undefined; + maxBuffer?: number | undefined; + encoding?: BufferEncoding | "buffer" | null | undefined; + } + interface ExecSyncOptions extends CommonExecOptions { + shell?: string | undefined; + } + interface ExecSyncOptionsWithStringEncoding extends ExecSyncOptions { + encoding: BufferEncoding; + } + interface ExecSyncOptionsWithBufferEncoding extends ExecSyncOptions { + encoding?: "buffer" | null | undefined; + } + /** + * The `child_process.execSync()` method is generally identical to {@link exec} with the exception that the method will not return + * until the child process has fully closed. When a timeout has been encountered + * and `killSignal` is sent, the method won't return until the process has + * completely exited. If the child process intercepts and handles the `SIGTERM`signal and doesn't exit, the parent process will wait until the child process + * has exited. + * + * If the process times out or has a non-zero exit code, this method will throw. + * The `Error` object will contain the entire result from {@link spawnSync}. + * + * **Never pass unsanitized user input to this function. Any input containing shell** + * **metacharacters may be used to trigger arbitrary command execution.** + * @since v0.11.12 + * @param command The command to run. + * @return The stdout from the command. + */ + function execSync(command: string): Buffer; + function execSync(command: string, options: ExecSyncOptionsWithStringEncoding): string; + function execSync(command: string, options: ExecSyncOptionsWithBufferEncoding): Buffer; + function execSync(command: string, options?: ExecSyncOptions): string | Buffer; + interface ExecFileSyncOptions extends CommonExecOptions { + shell?: boolean | string | undefined; + } + interface ExecFileSyncOptionsWithStringEncoding extends ExecFileSyncOptions { + encoding: BufferEncoding; + } + interface ExecFileSyncOptionsWithBufferEncoding extends ExecFileSyncOptions { + encoding?: "buffer" | null; // specify `null`. + } + /** + * The `child_process.execFileSync()` method is generally identical to {@link execFile} with the exception that the method will not + * return until the child process has fully closed. When a timeout has been + * encountered and `killSignal` is sent, the method won't return until the process + * has completely exited. + * + * If the child process intercepts and handles the `SIGTERM` signal and + * does not exit, the parent process will still wait until the child process has + * exited. + * + * If the process times out or has a non-zero exit code, this method will throw an `Error` that will include the full result of the underlying {@link spawnSync}. + * + * **If the `shell` option is enabled, do not pass unsanitized user input to this** + * **function. Any input containing shell metacharacters may be used to trigger** + * **arbitrary command execution.** + * @since v0.11.12 + * @param file The name or path of the executable file to run. + * @param args List of string arguments. + * @return The stdout from the command. + */ + function execFileSync(file: string): Buffer; + function execFileSync(file: string, options: ExecFileSyncOptionsWithStringEncoding): string; + function execFileSync(file: string, options: ExecFileSyncOptionsWithBufferEncoding): Buffer; + function execFileSync(file: string, options?: ExecFileSyncOptions): string | Buffer; + function execFileSync(file: string, args: readonly string[]): Buffer; + function execFileSync( + file: string, + args: readonly string[], + options: ExecFileSyncOptionsWithStringEncoding, + ): string; + function execFileSync( + file: string, + args: readonly string[], + options: ExecFileSyncOptionsWithBufferEncoding, + ): Buffer; + function execFileSync(file: string, args?: readonly string[], options?: ExecFileSyncOptions): string | Buffer; +} +declare module "node:child_process" { + export * from "child_process"; +} diff --git a/task/node_modules/@types/node/ts4.8/cluster.d.ts b/task/node_modules/@types/node/ts4.8/cluster.d.ts new file mode 100644 index 0000000..39cd56a --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/cluster.d.ts @@ -0,0 +1,432 @@ +/** + * Clusters of Node.js processes can be used to run multiple instances of Node.js + * that can distribute workloads among their application threads. When process + * isolation is not needed, use the `worker_threads` module instead, which + * allows running multiple application threads within a single Node.js instance. + * + * The cluster module allows easy creation of child processes that all share + * server ports. + * + * ```js + * import cluster from 'node:cluster'; + * import http from 'node:http'; + * import { availableParallelism } from 'node:os'; + * import process from 'node:process'; + * + * const numCPUs = availableParallelism(); + * + * if (cluster.isPrimary) { + * console.log(`Primary ${process.pid} is running`); + * + * // Fork workers. + * for (let i = 0; i < numCPUs; i++) { + * cluster.fork(); + * } + * + * cluster.on('exit', (worker, code, signal) => { + * console.log(`worker ${worker.process.pid} died`); + * }); + * } else { + * // Workers can share any TCP connection + * // In this case it is an HTTP server + * http.createServer((req, res) => { + * res.writeHead(200); + * res.end('hello world\n'); + * }).listen(8000); + * + * console.log(`Worker ${process.pid} started`); + * } + * ``` + * + * Running Node.js will now share port 8000 between the workers: + * + * ```console + * $ node server.js + * Primary 3596 is running + * Worker 4324 started + * Worker 4520 started + * Worker 6056 started + * Worker 5644 started + * ``` + * + * On Windows, it is not yet possible to set up a named pipe server in a worker. + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/cluster.js) + */ +declare module "cluster" { + import * as child from "node:child_process"; + import EventEmitter = require("node:events"); + import * as net from "node:net"; + type SerializationType = "json" | "advanced"; + export interface ClusterSettings { + execArgv?: string[] | undefined; // default: process.execArgv + exec?: string | undefined; + args?: string[] | undefined; + silent?: boolean | undefined; + stdio?: any[] | undefined; + uid?: number | undefined; + gid?: number | undefined; + inspectPort?: number | (() => number) | undefined; + serialization?: SerializationType | undefined; + cwd?: string | undefined; + windowsHide?: boolean | undefined; + } + export interface Address { + address: string; + port: number; + addressType: number | "udp4" | "udp6"; // 4, 6, -1, "udp4", "udp6" + } + /** + * A `Worker` object contains all public information and method about a worker. + * In the primary it can be obtained using `cluster.workers`. In a worker + * it can be obtained using `cluster.worker`. + * @since v0.7.0 + */ + export class Worker extends EventEmitter { + /** + * Each new worker is given its own unique id, this id is stored in the`id`. + * + * While a worker is alive, this is the key that indexes it in`cluster.workers`. + * @since v0.8.0 + */ + id: number; + /** + * All workers are created using `child_process.fork()`, the returned object + * from this function is stored as `.process`. In a worker, the global `process`is stored. + * + * See: `Child Process module`. + * + * Workers will call `process.exit(0)` if the `'disconnect'` event occurs + * on `process` and `.exitedAfterDisconnect` is not `true`. This protects against + * accidental disconnection. + * @since v0.7.0 + */ + process: child.ChildProcess; + /** + * Send a message to a worker or primary, optionally with a handle. + * + * In the primary, this sends a message to a specific worker. It is identical to `ChildProcess.send()`. + * + * In a worker, this sends a message to the primary. It is identical to`process.send()`. + * + * This example will echo back all messages from the primary: + * + * ```js + * if (cluster.isPrimary) { + * const worker = cluster.fork(); + * worker.send('hi there'); + * + * } else if (cluster.isWorker) { + * process.on('message', (msg) => { + * process.send(msg); + * }); + * } + * ``` + * @since v0.7.0 + * @param options The `options` argument, if present, is an object used to parameterize the sending of certain types of handles. `options` supports the following properties: + */ + send(message: child.Serializable, callback?: (error: Error | null) => void): boolean; + send( + message: child.Serializable, + sendHandle: child.SendHandle, + callback?: (error: Error | null) => void, + ): boolean; + send( + message: child.Serializable, + sendHandle: child.SendHandle, + options?: child.MessageOptions, + callback?: (error: Error | null) => void, + ): boolean; + /** + * This function will kill the worker. In the primary worker, it does this by + * disconnecting the `worker.process`, and once disconnected, killing with`signal`. In the worker, it does it by killing the process with `signal`. + * + * The `kill()` function kills the worker process without waiting for a graceful + * disconnect, it has the same behavior as `worker.process.kill()`. + * + * This method is aliased as `worker.destroy()` for backwards compatibility. + * + * In a worker, `process.kill()` exists, but it is not this function; + * it is `kill()`. + * @since v0.9.12 + * @param [signal='SIGTERM'] Name of the kill signal to send to the worker process. + */ + kill(signal?: string): void; + destroy(signal?: string): void; + /** + * In a worker, this function will close all servers, wait for the `'close'` event + * on those servers, and then disconnect the IPC channel. + * + * In the primary, an internal message is sent to the worker causing it to call`.disconnect()` on itself. + * + * Causes `.exitedAfterDisconnect` to be set. + * + * After a server is closed, it will no longer accept new connections, + * but connections may be accepted by any other listening worker. Existing + * connections will be allowed to close as usual. When no more connections exist, + * see `server.close()`, the IPC channel to the worker will close allowing it + * to die gracefully. + * + * The above applies _only_ to server connections, client connections are not + * automatically closed by workers, and disconnect does not wait for them to close + * before exiting. + * + * In a worker, `process.disconnect` exists, but it is not this function; + * it is `disconnect()`. + * + * Because long living server connections may block workers from disconnecting, it + * may be useful to send a message, so application specific actions may be taken to + * close them. It also may be useful to implement a timeout, killing a worker if + * the `'disconnect'` event has not been emitted after some time. + * + * ```js + * if (cluster.isPrimary) { + * const worker = cluster.fork(); + * let timeout; + * + * worker.on('listening', (address) => { + * worker.send('shutdown'); + * worker.disconnect(); + * timeout = setTimeout(() => { + * worker.kill(); + * }, 2000); + * }); + * + * worker.on('disconnect', () => { + * clearTimeout(timeout); + * }); + * + * } else if (cluster.isWorker) { + * const net = require('node:net'); + * const server = net.createServer((socket) => { + * // Connections never end + * }); + * + * server.listen(8000); + * + * process.on('message', (msg) => { + * if (msg === 'shutdown') { + * // Initiate graceful close of any connections to server + * } + * }); + * } + * ``` + * @since v0.7.7 + * @return A reference to `worker`. + */ + disconnect(): void; + /** + * This function returns `true` if the worker is connected to its primary via its + * IPC channel, `false` otherwise. A worker is connected to its primary after it + * has been created. It is disconnected after the `'disconnect'` event is emitted. + * @since v0.11.14 + */ + isConnected(): boolean; + /** + * This function returns `true` if the worker's process has terminated (either + * because of exiting or being signaled). Otherwise, it returns `false`. + * + * ```js + * import cluster from 'node:cluster'; + * import http from 'node:http'; + * import { availableParallelism } from 'node:os'; + * import process from 'node:process'; + * + * const numCPUs = availableParallelism(); + * + * if (cluster.isPrimary) { + * console.log(`Primary ${process.pid} is running`); + * + * // Fork workers. + * for (let i = 0; i < numCPUs; i++) { + * cluster.fork(); + * } + * + * cluster.on('fork', (worker) => { + * console.log('worker is dead:', worker.isDead()); + * }); + * + * cluster.on('exit', (worker, code, signal) => { + * console.log('worker is dead:', worker.isDead()); + * }); + * } else { + * // Workers can share any TCP connection. In this case, it is an HTTP server. + * http.createServer((req, res) => { + * res.writeHead(200); + * res.end(`Current process\n ${process.pid}`); + * process.kill(process.pid); + * }).listen(8000); + * } + * ``` + * @since v0.11.14 + */ + isDead(): boolean; + /** + * This property is `true` if the worker exited due to `.disconnect()`. + * If the worker exited any other way, it is `false`. If the + * worker has not exited, it is `undefined`. + * + * The boolean `worker.exitedAfterDisconnect` allows distinguishing between + * voluntary and accidental exit, the primary may choose not to respawn a worker + * based on this value. + * + * ```js + * cluster.on('exit', (worker, code, signal) => { + * if (worker.exitedAfterDisconnect === true) { + * console.log('Oh, it was just voluntary – no need to worry'); + * } + * }); + * + * // kill worker + * worker.kill(); + * ``` + * @since v6.0.0 + */ + exitedAfterDisconnect: boolean; + /** + * events.EventEmitter + * 1. disconnect + * 2. error + * 3. exit + * 4. listening + * 5. message + * 6. online + */ + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "disconnect", listener: () => void): this; + addListener(event: "error", listener: (error: Error) => void): this; + addListener(event: "exit", listener: (code: number, signal: string) => void): this; + addListener(event: "listening", listener: (address: Address) => void): this; + addListener(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + addListener(event: "online", listener: () => void): this; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "disconnect"): boolean; + emit(event: "error", error: Error): boolean; + emit(event: "exit", code: number, signal: string): boolean; + emit(event: "listening", address: Address): boolean; + emit(event: "message", message: any, handle: net.Socket | net.Server): boolean; + emit(event: "online"): boolean; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "disconnect", listener: () => void): this; + on(event: "error", listener: (error: Error) => void): this; + on(event: "exit", listener: (code: number, signal: string) => void): this; + on(event: "listening", listener: (address: Address) => void): this; + on(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + on(event: "online", listener: () => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "disconnect", listener: () => void): this; + once(event: "error", listener: (error: Error) => void): this; + once(event: "exit", listener: (code: number, signal: string) => void): this; + once(event: "listening", listener: (address: Address) => void): this; + once(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + once(event: "online", listener: () => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "disconnect", listener: () => void): this; + prependListener(event: "error", listener: (error: Error) => void): this; + prependListener(event: "exit", listener: (code: number, signal: string) => void): this; + prependListener(event: "listening", listener: (address: Address) => void): this; + prependListener(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + prependListener(event: "online", listener: () => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "disconnect", listener: () => void): this; + prependOnceListener(event: "error", listener: (error: Error) => void): this; + prependOnceListener(event: "exit", listener: (code: number, signal: string) => void): this; + prependOnceListener(event: "listening", listener: (address: Address) => void): this; + prependOnceListener(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + prependOnceListener(event: "online", listener: () => void): this; + } + export interface Cluster extends EventEmitter { + disconnect(callback?: () => void): void; + fork(env?: any): Worker; + /** @deprecated since v16.0.0 - use isPrimary. */ + readonly isMaster: boolean; + readonly isPrimary: boolean; + readonly isWorker: boolean; + schedulingPolicy: number; + readonly settings: ClusterSettings; + /** @deprecated since v16.0.0 - use setupPrimary. */ + setupMaster(settings?: ClusterSettings): void; + /** + * `setupPrimary` is used to change the default 'fork' behavior. Once called, the settings will be present in cluster.settings. + */ + setupPrimary(settings?: ClusterSettings): void; + readonly worker?: Worker | undefined; + readonly workers?: NodeJS.Dict | undefined; + readonly SCHED_NONE: number; + readonly SCHED_RR: number; + /** + * events.EventEmitter + * 1. disconnect + * 2. exit + * 3. fork + * 4. listening + * 5. message + * 6. online + * 7. setup + */ + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "disconnect", listener: (worker: Worker) => void): this; + addListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; + addListener(event: "fork", listener: (worker: Worker) => void): this; + addListener(event: "listening", listener: (worker: Worker, address: Address) => void): this; + addListener( + event: "message", + listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void, + ): this; // the handle is a net.Socket or net.Server object, or undefined. + addListener(event: "online", listener: (worker: Worker) => void): this; + addListener(event: "setup", listener: (settings: ClusterSettings) => void): this; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "disconnect", worker: Worker): boolean; + emit(event: "exit", worker: Worker, code: number, signal: string): boolean; + emit(event: "fork", worker: Worker): boolean; + emit(event: "listening", worker: Worker, address: Address): boolean; + emit(event: "message", worker: Worker, message: any, handle: net.Socket | net.Server): boolean; + emit(event: "online", worker: Worker): boolean; + emit(event: "setup", settings: ClusterSettings): boolean; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "disconnect", listener: (worker: Worker) => void): this; + on(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; + on(event: "fork", listener: (worker: Worker) => void): this; + on(event: "listening", listener: (worker: Worker, address: Address) => void): this; + on(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + on(event: "online", listener: (worker: Worker) => void): this; + on(event: "setup", listener: (settings: ClusterSettings) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "disconnect", listener: (worker: Worker) => void): this; + once(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; + once(event: "fork", listener: (worker: Worker) => void): this; + once(event: "listening", listener: (worker: Worker, address: Address) => void): this; + once(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + once(event: "online", listener: (worker: Worker) => void): this; + once(event: "setup", listener: (settings: ClusterSettings) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "disconnect", listener: (worker: Worker) => void): this; + prependListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; + prependListener(event: "fork", listener: (worker: Worker) => void): this; + prependListener(event: "listening", listener: (worker: Worker, address: Address) => void): this; + // the handle is a net.Socket or net.Server object, or undefined. + prependListener( + event: "message", + listener: (worker: Worker, message: any, handle?: net.Socket | net.Server) => void, + ): this; + prependListener(event: "online", listener: (worker: Worker) => void): this; + prependListener(event: "setup", listener: (settings: ClusterSettings) => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "disconnect", listener: (worker: Worker) => void): this; + prependOnceListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; + prependOnceListener(event: "fork", listener: (worker: Worker) => void): this; + prependOnceListener(event: "listening", listener: (worker: Worker, address: Address) => void): this; + // the handle is a net.Socket or net.Server object, or undefined. + prependOnceListener( + event: "message", + listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void, + ): this; + prependOnceListener(event: "online", listener: (worker: Worker) => void): this; + prependOnceListener(event: "setup", listener: (settings: ClusterSettings) => void): this; + } + const cluster: Cluster; + export default cluster; +} +declare module "node:cluster" { + export * from "cluster"; + export { default as default } from "cluster"; +} diff --git a/task/node_modules/@types/node/ts4.8/console.d.ts b/task/node_modules/@types/node/ts4.8/console.d.ts new file mode 100644 index 0000000..bcc3450 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/console.d.ts @@ -0,0 +1,415 @@ +/** + * The `node:console` module provides a simple debugging console that is similar to + * the JavaScript console mechanism provided by web browsers. + * + * The module exports two specific components: + * + * * A `Console` class with methods such as `console.log()`, `console.error()`, and`console.warn()` that can be used to write to any Node.js stream. + * * A global `console` instance configured to write to `process.stdout` and `process.stderr`. The global `console` can be used without calling`require('node:console')`. + * + * _**Warning**_: The global console object's methods are neither consistently + * synchronous like the browser APIs they resemble, nor are they consistently + * asynchronous like all other Node.js streams. See the `note on process I/O` for + * more information. + * + * Example using the global `console`: + * + * ```js + * console.log('hello world'); + * // Prints: hello world, to stdout + * console.log('hello %s', 'world'); + * // Prints: hello world, to stdout + * console.error(new Error('Whoops, something bad happened')); + * // Prints error message and stack trace to stderr: + * // Error: Whoops, something bad happened + * // at [eval]:5:15 + * // at Script.runInThisContext (node:vm:132:18) + * // at Object.runInThisContext (node:vm:309:38) + * // at node:internal/process/execution:77:19 + * // at [eval]-wrapper:6:22 + * // at evalScript (node:internal/process/execution:76:60) + * // at node:internal/main/eval_string:23:3 + * + * const name = 'Will Robinson'; + * console.warn(`Danger ${name}! Danger!`); + * // Prints: Danger Will Robinson! Danger!, to stderr + * ``` + * + * Example using the `Console` class: + * + * ```js + * const out = getStreamSomehow(); + * const err = getStreamSomehow(); + * const myConsole = new console.Console(out, err); + * + * myConsole.log('hello world'); + * // Prints: hello world, to out + * myConsole.log('hello %s', 'world'); + * // Prints: hello world, to out + * myConsole.error(new Error('Whoops, something bad happened')); + * // Prints: [Error: Whoops, something bad happened], to err + * + * const name = 'Will Robinson'; + * myConsole.warn(`Danger ${name}! Danger!`); + * // Prints: Danger Will Robinson! Danger!, to err + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/console.js) + */ +declare module "console" { + import console = require("node:console"); + export = console; +} +declare module "node:console" { + import { InspectOptions } from "node:util"; + global { + // This needs to be global to avoid TS2403 in case lib.dom.d.ts is present in the same build + interface Console { + Console: console.ConsoleConstructor; + /** + * `console.assert()` writes a message if `value` is [falsy](https://developer.mozilla.org/en-US/docs/Glossary/Falsy) or omitted. It only + * writes a message and does not otherwise affect execution. The output always + * starts with `"Assertion failed"`. If provided, `message` is formatted using `util.format()`. + * + * If `value` is [truthy](https://developer.mozilla.org/en-US/docs/Glossary/Truthy), nothing happens. + * + * ```js + * console.assert(true, 'does nothing'); + * + * console.assert(false, 'Whoops %s work', 'didn\'t'); + * // Assertion failed: Whoops didn't work + * + * console.assert(); + * // Assertion failed + * ``` + * @since v0.1.101 + * @param value The value tested for being truthy. + * @param message All arguments besides `value` are used as error message. + */ + assert(value: any, message?: string, ...optionalParams: any[]): void; + /** + * When `stdout` is a TTY, calling `console.clear()` will attempt to clear the + * TTY. When `stdout` is not a TTY, this method does nothing. + * + * The specific operation of `console.clear()` can vary across operating systems + * and terminal types. For most Linux operating systems, `console.clear()`operates similarly to the `clear` shell command. On Windows, `console.clear()`will clear only the output in the + * current terminal viewport for the Node.js + * binary. + * @since v8.3.0 + */ + clear(): void; + /** + * Maintains an internal counter specific to `label` and outputs to `stdout` the + * number of times `console.count()` has been called with the given `label`. + * + * ```js + * > console.count() + * default: 1 + * undefined + * > console.count('default') + * default: 2 + * undefined + * > console.count('abc') + * abc: 1 + * undefined + * > console.count('xyz') + * xyz: 1 + * undefined + * > console.count('abc') + * abc: 2 + * undefined + * > console.count() + * default: 3 + * undefined + * > + * ``` + * @since v8.3.0 + * @param [label='default'] The display label for the counter. + */ + count(label?: string): void; + /** + * Resets the internal counter specific to `label`. + * + * ```js + * > console.count('abc'); + * abc: 1 + * undefined + * > console.countReset('abc'); + * undefined + * > console.count('abc'); + * abc: 1 + * undefined + * > + * ``` + * @since v8.3.0 + * @param [label='default'] The display label for the counter. + */ + countReset(label?: string): void; + /** + * The `console.debug()` function is an alias for {@link log}. + * @since v8.0.0 + */ + debug(message?: any, ...optionalParams: any[]): void; + /** + * Uses `util.inspect()` on `obj` and prints the resulting string to `stdout`. + * This function bypasses any custom `inspect()` function defined on `obj`. + * @since v0.1.101 + */ + dir(obj: any, options?: InspectOptions): void; + /** + * This method calls `console.log()` passing it the arguments received. + * This method does not produce any XML formatting. + * @since v8.0.0 + */ + dirxml(...data: any[]): void; + /** + * Prints to `stderr` with newline. Multiple arguments can be passed, with the + * first used as the primary message and all additional used as substitution + * values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html) (the arguments are all passed to `util.format()`). + * + * ```js + * const code = 5; + * console.error('error #%d', code); + * // Prints: error #5, to stderr + * console.error('error', code); + * // Prints: error 5, to stderr + * ``` + * + * If formatting elements (e.g. `%d`) are not found in the first string then `util.inspect()` is called on each argument and the resulting string + * values are concatenated. See `util.format()` for more information. + * @since v0.1.100 + */ + error(message?: any, ...optionalParams: any[]): void; + /** + * Increases indentation of subsequent lines by spaces for `groupIndentation`length. + * + * If one or more `label`s are provided, those are printed first without the + * additional indentation. + * @since v8.5.0 + */ + group(...label: any[]): void; + /** + * An alias for {@link group}. + * @since v8.5.0 + */ + groupCollapsed(...label: any[]): void; + /** + * Decreases indentation of subsequent lines by spaces for `groupIndentation`length. + * @since v8.5.0 + */ + groupEnd(): void; + /** + * The `console.info()` function is an alias for {@link log}. + * @since v0.1.100 + */ + info(message?: any, ...optionalParams: any[]): void; + /** + * Prints to `stdout` with newline. Multiple arguments can be passed, with the + * first used as the primary message and all additional used as substitution + * values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html) (the arguments are all passed to `util.format()`). + * + * ```js + * const count = 5; + * console.log('count: %d', count); + * // Prints: count: 5, to stdout + * console.log('count:', count); + * // Prints: count: 5, to stdout + * ``` + * + * See `util.format()` for more information. + * @since v0.1.100 + */ + log(message?: any, ...optionalParams: any[]): void; + /** + * Try to construct a table with the columns of the properties of `tabularData`(or use `properties`) and rows of `tabularData` and log it. Falls back to just + * logging the argument if it can't be parsed as tabular. + * + * ```js + * // These can't be parsed as tabular data + * console.table(Symbol()); + * // Symbol() + * + * console.table(undefined); + * // undefined + * + * console.table([{ a: 1, b: 'Y' }, { a: 'Z', b: 2 }]); + * // ┌─────────┬─────┬─────┐ + * // │ (index) │ a │ b │ + * // ├─────────┼─────┼─────┤ + * // │ 0 │ 1 │ 'Y' │ + * // │ 1 │ 'Z' │ 2 │ + * // └─────────┴─────┴─────┘ + * + * console.table([{ a: 1, b: 'Y' }, { a: 'Z', b: 2 }], ['a']); + * // ┌─────────┬─────┐ + * // │ (index) │ a │ + * // ├─────────┼─────┤ + * // │ 0 │ 1 │ + * // │ 1 │ 'Z' │ + * // └─────────┴─────┘ + * ``` + * @since v10.0.0 + * @param properties Alternate properties for constructing the table. + */ + table(tabularData: any, properties?: readonly string[]): void; + /** + * Starts a timer that can be used to compute the duration of an operation. Timers + * are identified by a unique `label`. Use the same `label` when calling {@link timeEnd} to stop the timer and output the elapsed time in + * suitable time units to `stdout`. For example, if the elapsed + * time is 3869ms, `console.timeEnd()` displays "3.869s". + * @since v0.1.104 + * @param [label='default'] + */ + time(label?: string): void; + /** + * Stops a timer that was previously started by calling {@link time} and + * prints the result to `stdout`: + * + * ```js + * console.time('bunch-of-stuff'); + * // Do a bunch of stuff. + * console.timeEnd('bunch-of-stuff'); + * // Prints: bunch-of-stuff: 225.438ms + * ``` + * @since v0.1.104 + * @param [label='default'] + */ + timeEnd(label?: string): void; + /** + * For a timer that was previously started by calling {@link time}, prints + * the elapsed time and other `data` arguments to `stdout`: + * + * ```js + * console.time('process'); + * const value = expensiveProcess1(); // Returns 42 + * console.timeLog('process', value); + * // Prints "process: 365.227ms 42". + * doExpensiveProcess2(value); + * console.timeEnd('process'); + * ``` + * @since v10.7.0 + * @param [label='default'] + */ + timeLog(label?: string, ...data: any[]): void; + /** + * Prints to `stderr` the string `'Trace: '`, followed by the `util.format()` formatted message and stack trace to the current position in the code. + * + * ```js + * console.trace('Show me'); + * // Prints: (stack trace will vary based on where trace is called) + * // Trace: Show me + * // at repl:2:9 + * // at REPLServer.defaultEval (repl.js:248:27) + * // at bound (domain.js:287:14) + * // at REPLServer.runBound [as eval] (domain.js:300:12) + * // at REPLServer. (repl.js:412:12) + * // at emitOne (events.js:82:20) + * // at REPLServer.emit (events.js:169:7) + * // at REPLServer.Interface._onLine (readline.js:210:10) + * // at REPLServer.Interface._line (readline.js:549:8) + * // at REPLServer.Interface._ttyWrite (readline.js:826:14) + * ``` + * @since v0.1.104 + */ + trace(message?: any, ...optionalParams: any[]): void; + /** + * The `console.warn()` function is an alias for {@link error}. + * @since v0.1.100 + */ + warn(message?: any, ...optionalParams: any[]): void; + // --- Inspector mode only --- + /** + * This method does not display anything unless used in the inspector. + * Starts a JavaScript CPU profile with an optional label. + */ + profile(label?: string): void; + /** + * This method does not display anything unless used in the inspector. + * Stops the current JavaScript CPU profiling session if one has been started and prints the report to the Profiles panel of the inspector. + */ + profileEnd(label?: string): void; + /** + * This method does not display anything unless used in the inspector. + * Adds an event with the label `label` to the Timeline panel of the inspector. + */ + timeStamp(label?: string): void; + } + /** + * The `console` module provides a simple debugging console that is similar to the + * JavaScript console mechanism provided by web browsers. + * + * The module exports two specific components: + * + * * A `Console` class with methods such as `console.log()`, `console.error()` and`console.warn()` that can be used to write to any Node.js stream. + * * A global `console` instance configured to write to `process.stdout` and `process.stderr`. The global `console` can be used without calling`require('console')`. + * + * _**Warning**_: The global console object's methods are neither consistently + * synchronous like the browser APIs they resemble, nor are they consistently + * asynchronous like all other Node.js streams. See the `note on process I/O` for + * more information. + * + * Example using the global `console`: + * + * ```js + * console.log('hello world'); + * // Prints: hello world, to stdout + * console.log('hello %s', 'world'); + * // Prints: hello world, to stdout + * console.error(new Error('Whoops, something bad happened')); + * // Prints error message and stack trace to stderr: + * // Error: Whoops, something bad happened + * // at [eval]:5:15 + * // at Script.runInThisContext (node:vm:132:18) + * // at Object.runInThisContext (node:vm:309:38) + * // at node:internal/process/execution:77:19 + * // at [eval]-wrapper:6:22 + * // at evalScript (node:internal/process/execution:76:60) + * // at node:internal/main/eval_string:23:3 + * + * const name = 'Will Robinson'; + * console.warn(`Danger ${name}! Danger!`); + * // Prints: Danger Will Robinson! Danger!, to stderr + * ``` + * + * Example using the `Console` class: + * + * ```js + * const out = getStreamSomehow(); + * const err = getStreamSomehow(); + * const myConsole = new console.Console(out, err); + * + * myConsole.log('hello world'); + * // Prints: hello world, to out + * myConsole.log('hello %s', 'world'); + * // Prints: hello world, to out + * myConsole.error(new Error('Whoops, something bad happened')); + * // Prints: [Error: Whoops, something bad happened], to err + * + * const name = 'Will Robinson'; + * myConsole.warn(`Danger ${name}! Danger!`); + * // Prints: Danger Will Robinson! Danger!, to err + * ``` + * @see [source](https://github.com/nodejs/node/blob/v16.4.2/lib/console.js) + */ + namespace console { + interface ConsoleConstructorOptions { + stdout: NodeJS.WritableStream; + stderr?: NodeJS.WritableStream | undefined; + ignoreErrors?: boolean | undefined; + colorMode?: boolean | "auto" | undefined; + inspectOptions?: InspectOptions | undefined; + /** + * Set group indentation + * @default 2 + */ + groupIndentation?: number | undefined; + } + interface ConsoleConstructor { + prototype: Console; + new(stdout: NodeJS.WritableStream, stderr?: NodeJS.WritableStream, ignoreErrors?: boolean): Console; + new(options: ConsoleConstructorOptions): Console; + } + } + var console: Console; + } + export = globalThis.console; +} diff --git a/task/node_modules/@types/node/ts4.8/constants.d.ts b/task/node_modules/@types/node/ts4.8/constants.d.ts new file mode 100644 index 0000000..c3ac2b8 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/constants.d.ts @@ -0,0 +1,19 @@ +/** @deprecated since v6.3.0 - use constants property exposed by the relevant module instead. */ +declare module "constants" { + import { constants as osConstants, SignalConstants } from "node:os"; + import { constants as cryptoConstants } from "node:crypto"; + import { constants as fsConstants } from "node:fs"; + + const exp: + & typeof osConstants.errno + & typeof osConstants.priority + & SignalConstants + & typeof cryptoConstants + & typeof fsConstants; + export = exp; +} + +declare module "node:constants" { + import constants = require("constants"); + export = constants; +} diff --git a/task/node_modules/@types/node/ts4.8/crypto.d.ts b/task/node_modules/@types/node/ts4.8/crypto.d.ts new file mode 100644 index 0000000..a540d91 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/crypto.d.ts @@ -0,0 +1,4455 @@ +/** + * The `node:crypto` module provides cryptographic functionality that includes a + * set of wrappers for OpenSSL's hash, HMAC, cipher, decipher, sign, and verify + * functions. + * + * ```js + * const { createHmac } = await import('node:crypto'); + * + * const secret = 'abcdefg'; + * const hash = createHmac('sha256', secret) + * .update('I love cupcakes') + * .digest('hex'); + * console.log(hash); + * // Prints: + * // c0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658e + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/crypto.js) + */ +declare module "crypto" { + import * as stream from "node:stream"; + import { PeerCertificate } from "node:tls"; + /** + * SPKAC is a Certificate Signing Request mechanism originally implemented by + * Netscape and was specified formally as part of HTML5's `keygen` element. + * + * `` is deprecated since [HTML 5.2](https://www.w3.org/TR/html52/changes.html#features-removed) and new projects + * should not use this element anymore. + * + * The `node:crypto` module provides the `Certificate` class for working with SPKAC + * data. The most common usage is handling output generated by the HTML5`` element. Node.js uses [OpenSSL's SPKAC + * implementation](https://www.openssl.org/docs/man3.0/man1/openssl-spkac.html) internally. + * @since v0.11.8 + */ + class Certificate { + /** + * ```js + * const { Certificate } = await import('node:crypto'); + * const spkac = getSpkacSomehow(); + * const challenge = Certificate.exportChallenge(spkac); + * console.log(challenge.toString('utf8')); + * // Prints: the challenge as a UTF8 string + * ``` + * @since v9.0.0 + * @param encoding The `encoding` of the `spkac` string. + * @return The challenge component of the `spkac` data structure, which includes a public key and a challenge. + */ + static exportChallenge(spkac: BinaryLike): Buffer; + /** + * ```js + * const { Certificate } = await import('node:crypto'); + * const spkac = getSpkacSomehow(); + * const publicKey = Certificate.exportPublicKey(spkac); + * console.log(publicKey); + * // Prints: the public key as + * ``` + * @since v9.0.0 + * @param encoding The `encoding` of the `spkac` string. + * @return The public key component of the `spkac` data structure, which includes a public key and a challenge. + */ + static exportPublicKey(spkac: BinaryLike, encoding?: string): Buffer; + /** + * ```js + * import { Buffer } from 'node:buffer'; + * const { Certificate } = await import('node:crypto'); + * + * const spkac = getSpkacSomehow(); + * console.log(Certificate.verifySpkac(Buffer.from(spkac))); + * // Prints: true or false + * ``` + * @since v9.0.0 + * @param encoding The `encoding` of the `spkac` string. + * @return `true` if the given `spkac` data structure is valid, `false` otherwise. + */ + static verifySpkac(spkac: NodeJS.ArrayBufferView): boolean; + /** + * @deprecated + * @param spkac + * @returns The challenge component of the `spkac` data structure, + * which includes a public key and a challenge. + */ + exportChallenge(spkac: BinaryLike): Buffer; + /** + * @deprecated + * @param spkac + * @param encoding The encoding of the spkac string. + * @returns The public key component of the `spkac` data structure, + * which includes a public key and a challenge. + */ + exportPublicKey(spkac: BinaryLike, encoding?: string): Buffer; + /** + * @deprecated + * @param spkac + * @returns `true` if the given `spkac` data structure is valid, + * `false` otherwise. + */ + verifySpkac(spkac: NodeJS.ArrayBufferView): boolean; + } + namespace constants { + // https://nodejs.org/dist/latest-v20.x/docs/api/crypto.html#crypto-constants + const OPENSSL_VERSION_NUMBER: number; + /** Applies multiple bug workarounds within OpenSSL. See https://www.openssl.org/docs/man1.0.2/ssl/SSL_CTX_set_options.html for detail. */ + const SSL_OP_ALL: number; + /** Allows legacy insecure renegotiation between OpenSSL and unpatched clients or servers. See https://www.openssl.org/docs/man1.0.2/ssl/SSL_CTX_set_options.html. */ + const SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION: number; + /** Attempts to use the server's preferences instead of the client's when selecting a cipher. See https://www.openssl.org/docs/man1.0.2/ssl/SSL_CTX_set_options.html. */ + const SSL_OP_CIPHER_SERVER_PREFERENCE: number; + /** Instructs OpenSSL to use Cisco's "speshul" version of DTLS_BAD_VER. */ + const SSL_OP_CISCO_ANYCONNECT: number; + /** Instructs OpenSSL to turn on cookie exchange. */ + const SSL_OP_COOKIE_EXCHANGE: number; + /** Instructs OpenSSL to add server-hello extension from an early version of the cryptopro draft. */ + const SSL_OP_CRYPTOPRO_TLSEXT_BUG: number; + /** Instructs OpenSSL to disable a SSL 3.0/TLS 1.0 vulnerability workaround added in OpenSSL 0.9.6d. */ + const SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS: number; + /** Allows initial connection to servers that do not support RI. */ + const SSL_OP_LEGACY_SERVER_CONNECT: number; + /** Instructs OpenSSL to disable support for SSL/TLS compression. */ + const SSL_OP_NO_COMPRESSION: number; + const SSL_OP_NO_QUERY_MTU: number; + /** Instructs OpenSSL to always start a new session when performing renegotiation. */ + const SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION: number; + const SSL_OP_NO_SSLv2: number; + const SSL_OP_NO_SSLv3: number; + const SSL_OP_NO_TICKET: number; + const SSL_OP_NO_TLSv1: number; + const SSL_OP_NO_TLSv1_1: number; + const SSL_OP_NO_TLSv1_2: number; + /** Instructs OpenSSL to disable version rollback attack detection. */ + const SSL_OP_TLS_ROLLBACK_BUG: number; + const ENGINE_METHOD_RSA: number; + const ENGINE_METHOD_DSA: number; + const ENGINE_METHOD_DH: number; + const ENGINE_METHOD_RAND: number; + const ENGINE_METHOD_EC: number; + const ENGINE_METHOD_CIPHERS: number; + const ENGINE_METHOD_DIGESTS: number; + const ENGINE_METHOD_PKEY_METHS: number; + const ENGINE_METHOD_PKEY_ASN1_METHS: number; + const ENGINE_METHOD_ALL: number; + const ENGINE_METHOD_NONE: number; + const DH_CHECK_P_NOT_SAFE_PRIME: number; + const DH_CHECK_P_NOT_PRIME: number; + const DH_UNABLE_TO_CHECK_GENERATOR: number; + const DH_NOT_SUITABLE_GENERATOR: number; + const RSA_PKCS1_PADDING: number; + const RSA_SSLV23_PADDING: number; + const RSA_NO_PADDING: number; + const RSA_PKCS1_OAEP_PADDING: number; + const RSA_X931_PADDING: number; + const RSA_PKCS1_PSS_PADDING: number; + /** Sets the salt length for RSA_PKCS1_PSS_PADDING to the digest size when signing or verifying. */ + const RSA_PSS_SALTLEN_DIGEST: number; + /** Sets the salt length for RSA_PKCS1_PSS_PADDING to the maximum permissible value when signing data. */ + const RSA_PSS_SALTLEN_MAX_SIGN: number; + /** Causes the salt length for RSA_PKCS1_PSS_PADDING to be determined automatically when verifying a signature. */ + const RSA_PSS_SALTLEN_AUTO: number; + const POINT_CONVERSION_COMPRESSED: number; + const POINT_CONVERSION_UNCOMPRESSED: number; + const POINT_CONVERSION_HYBRID: number; + /** Specifies the built-in default cipher list used by Node.js (colon-separated values). */ + const defaultCoreCipherList: string; + /** Specifies the active default cipher list used by the current Node.js process (colon-separated values). */ + const defaultCipherList: string; + } + interface HashOptions extends stream.TransformOptions { + /** + * For XOF hash functions such as `shake256`, the + * outputLength option can be used to specify the desired output length in bytes. + */ + outputLength?: number | undefined; + } + /** @deprecated since v10.0.0 */ + const fips: boolean; + /** + * Creates and returns a `Hash` object that can be used to generate hash digests + * using the given `algorithm`. Optional `options` argument controls stream + * behavior. For XOF hash functions such as `'shake256'`, the `outputLength` option + * can be used to specify the desired output length in bytes. + * + * The `algorithm` is dependent on the available algorithms supported by the + * version of OpenSSL on the platform. Examples are `'sha256'`, `'sha512'`, etc. + * On recent releases of OpenSSL, `openssl list -digest-algorithms` will + * display the available digest algorithms. + * + * Example: generating the sha256 sum of a file + * + * ```js + * import { + * createReadStream, + * } from 'node:fs'; + * import { argv } from 'node:process'; + * const { + * createHash, + * } = await import('node:crypto'); + * + * const filename = argv[2]; + * + * const hash = createHash('sha256'); + * + * const input = createReadStream(filename); + * input.on('readable', () => { + * // Only one element is going to be produced by the + * // hash stream. + * const data = input.read(); + * if (data) + * hash.update(data); + * else { + * console.log(`${hash.digest('hex')} ${filename}`); + * } + * }); + * ``` + * @since v0.1.92 + * @param options `stream.transform` options + */ + function createHash(algorithm: string, options?: HashOptions): Hash; + /** + * Creates and returns an `Hmac` object that uses the given `algorithm` and `key`. + * Optional `options` argument controls stream behavior. + * + * The `algorithm` is dependent on the available algorithms supported by the + * version of OpenSSL on the platform. Examples are `'sha256'`, `'sha512'`, etc. + * On recent releases of OpenSSL, `openssl list -digest-algorithms` will + * display the available digest algorithms. + * + * The `key` is the HMAC key used to generate the cryptographic HMAC hash. If it is + * a `KeyObject`, its type must be `secret`. If it is a string, please consider `caveats when using strings as inputs to cryptographic APIs`. If it was + * obtained from a cryptographically secure source of entropy, such as {@link randomBytes} or {@link generateKey}, its length should not + * exceed the block size of `algorithm` (e.g., 512 bits for SHA-256). + * + * Example: generating the sha256 HMAC of a file + * + * ```js + * import { + * createReadStream, + * } from 'node:fs'; + * import { argv } from 'node:process'; + * const { + * createHmac, + * } = await import('node:crypto'); + * + * const filename = argv[2]; + * + * const hmac = createHmac('sha256', 'a secret'); + * + * const input = createReadStream(filename); + * input.on('readable', () => { + * // Only one element is going to be produced by the + * // hash stream. + * const data = input.read(); + * if (data) + * hmac.update(data); + * else { + * console.log(`${hmac.digest('hex')} ${filename}`); + * } + * }); + * ``` + * @since v0.1.94 + * @param options `stream.transform` options + */ + function createHmac(algorithm: string, key: BinaryLike | KeyObject, options?: stream.TransformOptions): Hmac; + // https://nodejs.org/api/buffer.html#buffer_buffers_and_character_encodings + type BinaryToTextEncoding = "base64" | "base64url" | "hex" | "binary"; + type CharacterEncoding = "utf8" | "utf-8" | "utf16le" | "utf-16le" | "latin1"; + type LegacyCharacterEncoding = "ascii" | "binary" | "ucs2" | "ucs-2"; + type Encoding = BinaryToTextEncoding | CharacterEncoding | LegacyCharacterEncoding; + type ECDHKeyFormat = "compressed" | "uncompressed" | "hybrid"; + /** + * The `Hash` class is a utility for creating hash digests of data. It can be + * used in one of two ways: + * + * * As a `stream` that is both readable and writable, where data is written + * to produce a computed hash digest on the readable side, or + * * Using the `hash.update()` and `hash.digest()` methods to produce the + * computed hash. + * + * The {@link createHash} method is used to create `Hash` instances. `Hash`objects are not to be created directly using the `new` keyword. + * + * Example: Using `Hash` objects as streams: + * + * ```js + * const { + * createHash, + * } = await import('node:crypto'); + * + * const hash = createHash('sha256'); + * + * hash.on('readable', () => { + * // Only one element is going to be produced by the + * // hash stream. + * const data = hash.read(); + * if (data) { + * console.log(data.toString('hex')); + * // Prints: + * // 6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50 + * } + * }); + * + * hash.write('some data to hash'); + * hash.end(); + * ``` + * + * Example: Using `Hash` and piped streams: + * + * ```js + * import { createReadStream } from 'node:fs'; + * import { stdout } from 'node:process'; + * const { createHash } = await import('node:crypto'); + * + * const hash = createHash('sha256'); + * + * const input = createReadStream('test.js'); + * input.pipe(hash).setEncoding('hex').pipe(stdout); + * ``` + * + * Example: Using the `hash.update()` and `hash.digest()` methods: + * + * ```js + * const { + * createHash, + * } = await import('node:crypto'); + * + * const hash = createHash('sha256'); + * + * hash.update('some data to hash'); + * console.log(hash.digest('hex')); + * // Prints: + * // 6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50 + * ``` + * @since v0.1.92 + */ + class Hash extends stream.Transform { + private constructor(); + /** + * Creates a new `Hash` object that contains a deep copy of the internal state + * of the current `Hash` object. + * + * The optional `options` argument controls stream behavior. For XOF hash + * functions such as `'shake256'`, the `outputLength` option can be used to + * specify the desired output length in bytes. + * + * An error is thrown when an attempt is made to copy the `Hash` object after + * its `hash.digest()` method has been called. + * + * ```js + * // Calculate a rolling hash. + * const { + * createHash, + * } = await import('node:crypto'); + * + * const hash = createHash('sha256'); + * + * hash.update('one'); + * console.log(hash.copy().digest('hex')); + * + * hash.update('two'); + * console.log(hash.copy().digest('hex')); + * + * hash.update('three'); + * console.log(hash.copy().digest('hex')); + * + * // Etc. + * ``` + * @since v13.1.0 + * @param options `stream.transform` options + */ + copy(options?: stream.TransformOptions): Hash; + /** + * Updates the hash content with the given `data`, the encoding of which + * is given in `inputEncoding`. + * If `encoding` is not provided, and the `data` is a string, an + * encoding of `'utf8'` is enforced. If `data` is a `Buffer`, `TypedArray`, or`DataView`, then `inputEncoding` is ignored. + * + * This can be called many times with new data as it is streamed. + * @since v0.1.92 + * @param inputEncoding The `encoding` of the `data` string. + */ + update(data: BinaryLike): Hash; + update(data: string, inputEncoding: Encoding): Hash; + /** + * Calculates the digest of all of the data passed to be hashed (using the `hash.update()` method). + * If `encoding` is provided a string will be returned; otherwise + * a `Buffer` is returned. + * + * The `Hash` object can not be used again after `hash.digest()` method has been + * called. Multiple calls will cause an error to be thrown. + * @since v0.1.92 + * @param encoding The `encoding` of the return value. + */ + digest(): Buffer; + digest(encoding: BinaryToTextEncoding): string; + } + /** + * The `Hmac` class is a utility for creating cryptographic HMAC digests. It can + * be used in one of two ways: + * + * * As a `stream` that is both readable and writable, where data is written + * to produce a computed HMAC digest on the readable side, or + * * Using the `hmac.update()` and `hmac.digest()` methods to produce the + * computed HMAC digest. + * + * The {@link createHmac} method is used to create `Hmac` instances. `Hmac`objects are not to be created directly using the `new` keyword. + * + * Example: Using `Hmac` objects as streams: + * + * ```js + * const { + * createHmac, + * } = await import('node:crypto'); + * + * const hmac = createHmac('sha256', 'a secret'); + * + * hmac.on('readable', () => { + * // Only one element is going to be produced by the + * // hash stream. + * const data = hmac.read(); + * if (data) { + * console.log(data.toString('hex')); + * // Prints: + * // 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e + * } + * }); + * + * hmac.write('some data to hash'); + * hmac.end(); + * ``` + * + * Example: Using `Hmac` and piped streams: + * + * ```js + * import { createReadStream } from 'node:fs'; + * import { stdout } from 'node:process'; + * const { + * createHmac, + * } = await import('node:crypto'); + * + * const hmac = createHmac('sha256', 'a secret'); + * + * const input = createReadStream('test.js'); + * input.pipe(hmac).pipe(stdout); + * ``` + * + * Example: Using the `hmac.update()` and `hmac.digest()` methods: + * + * ```js + * const { + * createHmac, + * } = await import('node:crypto'); + * + * const hmac = createHmac('sha256', 'a secret'); + * + * hmac.update('some data to hash'); + * console.log(hmac.digest('hex')); + * // Prints: + * // 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e + * ``` + * @since v0.1.94 + */ + class Hmac extends stream.Transform { + private constructor(); + /** + * Updates the `Hmac` content with the given `data`, the encoding of which + * is given in `inputEncoding`. + * If `encoding` is not provided, and the `data` is a string, an + * encoding of `'utf8'` is enforced. If `data` is a `Buffer`, `TypedArray`, or`DataView`, then `inputEncoding` is ignored. + * + * This can be called many times with new data as it is streamed. + * @since v0.1.94 + * @param inputEncoding The `encoding` of the `data` string. + */ + update(data: BinaryLike): Hmac; + update(data: string, inputEncoding: Encoding): Hmac; + /** + * Calculates the HMAC digest of all of the data passed using `hmac.update()`. + * If `encoding` is + * provided a string is returned; otherwise a `Buffer` is returned; + * + * The `Hmac` object can not be used again after `hmac.digest()` has been + * called. Multiple calls to `hmac.digest()` will result in an error being thrown. + * @since v0.1.94 + * @param encoding The `encoding` of the return value. + */ + digest(): Buffer; + digest(encoding: BinaryToTextEncoding): string; + } + type KeyObjectType = "secret" | "public" | "private"; + interface KeyExportOptions { + type: "pkcs1" | "spki" | "pkcs8" | "sec1"; + format: T; + cipher?: string | undefined; + passphrase?: string | Buffer | undefined; + } + interface JwkKeyExportOptions { + format: "jwk"; + } + interface JsonWebKey { + crv?: string | undefined; + d?: string | undefined; + dp?: string | undefined; + dq?: string | undefined; + e?: string | undefined; + k?: string | undefined; + kty?: string | undefined; + n?: string | undefined; + p?: string | undefined; + q?: string | undefined; + qi?: string | undefined; + x?: string | undefined; + y?: string | undefined; + [key: string]: unknown; + } + interface AsymmetricKeyDetails { + /** + * Key size in bits (RSA, DSA). + */ + modulusLength?: number | undefined; + /** + * Public exponent (RSA). + */ + publicExponent?: bigint | undefined; + /** + * Name of the message digest (RSA-PSS). + */ + hashAlgorithm?: string | undefined; + /** + * Name of the message digest used by MGF1 (RSA-PSS). + */ + mgf1HashAlgorithm?: string | undefined; + /** + * Minimal salt length in bytes (RSA-PSS). + */ + saltLength?: number | undefined; + /** + * Size of q in bits (DSA). + */ + divisorLength?: number | undefined; + /** + * Name of the curve (EC). + */ + namedCurve?: string | undefined; + } + /** + * Node.js uses a `KeyObject` class to represent a symmetric or asymmetric key, + * and each kind of key exposes different functions. The {@link createSecretKey}, {@link createPublicKey} and {@link createPrivateKey} methods are used to create `KeyObject`instances. `KeyObject` + * objects are not to be created directly using the `new`keyword. + * + * Most applications should consider using the new `KeyObject` API instead of + * passing keys as strings or `Buffer`s due to improved security features. + * + * `KeyObject` instances can be passed to other threads via `postMessage()`. + * The receiver obtains a cloned `KeyObject`, and the `KeyObject` does not need to + * be listed in the `transferList` argument. + * @since v11.6.0 + */ + class KeyObject { + private constructor(); + /** + * Example: Converting a `CryptoKey` instance to a `KeyObject`: + * + * ```js + * const { KeyObject } = await import('node:crypto'); + * const { subtle } = globalThis.crypto; + * + * const key = await subtle.generateKey({ + * name: 'HMAC', + * hash: 'SHA-256', + * length: 256, + * }, true, ['sign', 'verify']); + * + * const keyObject = KeyObject.from(key); + * console.log(keyObject.symmetricKeySize); + * // Prints: 32 (symmetric key size in bytes) + * ``` + * @since v15.0.0 + */ + static from(key: webcrypto.CryptoKey): KeyObject; + /** + * For asymmetric keys, this property represents the type of the key. Supported key + * types are: + * + * * `'rsa'` (OID 1.2.840.113549.1.1.1) + * * `'rsa-pss'` (OID 1.2.840.113549.1.1.10) + * * `'dsa'` (OID 1.2.840.10040.4.1) + * * `'ec'` (OID 1.2.840.10045.2.1) + * * `'x25519'` (OID 1.3.101.110) + * * `'x448'` (OID 1.3.101.111) + * * `'ed25519'` (OID 1.3.101.112) + * * `'ed448'` (OID 1.3.101.113) + * * `'dh'` (OID 1.2.840.113549.1.3.1) + * + * This property is `undefined` for unrecognized `KeyObject` types and symmetric + * keys. + * @since v11.6.0 + */ + asymmetricKeyType?: KeyType | undefined; + /** + * For asymmetric keys, this property represents the size of the embedded key in + * bytes. This property is `undefined` for symmetric keys. + */ + asymmetricKeySize?: number | undefined; + /** + * This property exists only on asymmetric keys. Depending on the type of the key, + * this object contains information about the key. None of the information obtained + * through this property can be used to uniquely identify a key or to compromise + * the security of the key. + * + * For RSA-PSS keys, if the key material contains a `RSASSA-PSS-params` sequence, + * the `hashAlgorithm`, `mgf1HashAlgorithm`, and `saltLength` properties will be + * set. + * + * Other key details might be exposed via this API using additional attributes. + * @since v15.7.0 + */ + asymmetricKeyDetails?: AsymmetricKeyDetails | undefined; + /** + * For symmetric keys, the following encoding options can be used: + * + * For public keys, the following encoding options can be used: + * + * For private keys, the following encoding options can be used: + * + * The result type depends on the selected encoding format, when PEM the + * result is a string, when DER it will be a buffer containing the data + * encoded as DER, when [JWK](https://tools.ietf.org/html/rfc7517) it will be an object. + * + * When [JWK](https://tools.ietf.org/html/rfc7517) encoding format was selected, all other encoding options are + * ignored. + * + * PKCS#1, SEC1, and PKCS#8 type keys can be encrypted by using a combination of + * the `cipher` and `format` options. The PKCS#8 `type` can be used with any`format` to encrypt any key algorithm (RSA, EC, or DH) by specifying a`cipher`. PKCS#1 and SEC1 can only be + * encrypted by specifying a `cipher`when the PEM `format` is used. For maximum compatibility, use PKCS#8 for + * encrypted private keys. Since PKCS#8 defines its own + * encryption mechanism, PEM-level encryption is not supported when encrypting + * a PKCS#8 key. See [RFC 5208](https://www.rfc-editor.org/rfc/rfc5208.txt) for PKCS#8 encryption and [RFC 1421](https://www.rfc-editor.org/rfc/rfc1421.txt) for + * PKCS#1 and SEC1 encryption. + * @since v11.6.0 + */ + export(options: KeyExportOptions<"pem">): string | Buffer; + export(options?: KeyExportOptions<"der">): Buffer; + export(options?: JwkKeyExportOptions): JsonWebKey; + /** + * For secret keys, this property represents the size of the key in bytes. This + * property is `undefined` for asymmetric keys. + * @since v11.6.0 + */ + symmetricKeySize?: number | undefined; + /** + * Depending on the type of this `KeyObject`, this property is either`'secret'` for secret (symmetric) keys, `'public'` for public (asymmetric) keys + * or `'private'` for private (asymmetric) keys. + * @since v11.6.0 + */ + type: KeyObjectType; + } + type CipherCCMTypes = "aes-128-ccm" | "aes-192-ccm" | "aes-256-ccm" | "chacha20-poly1305"; + type CipherGCMTypes = "aes-128-gcm" | "aes-192-gcm" | "aes-256-gcm"; + type CipherOCBTypes = "aes-128-ocb" | "aes-192-ocb" | "aes-256-ocb"; + type BinaryLike = string | NodeJS.ArrayBufferView; + type CipherKey = BinaryLike | KeyObject; + interface CipherCCMOptions extends stream.TransformOptions { + authTagLength: number; + } + interface CipherGCMOptions extends stream.TransformOptions { + authTagLength?: number | undefined; + } + interface CipherOCBOptions extends stream.TransformOptions { + authTagLength: number; + } + /** + * Creates and returns a `Cipher` object that uses the given `algorithm` and`password`. + * + * The `options` argument controls stream behavior and is optional except when a + * cipher in CCM or OCB mode (e.g. `'aes-128-ccm'`) is used. In that case, the`authTagLength` option is required and specifies the length of the + * authentication tag in bytes, see `CCM mode`. In GCM mode, the `authTagLength`option is not required but can be used to set the length of the authentication + * tag that will be returned by `getAuthTag()` and defaults to 16 bytes. + * For `chacha20-poly1305`, the `authTagLength` option defaults to 16 bytes. + * + * The `algorithm` is dependent on OpenSSL, examples are `'aes192'`, etc. On + * recent OpenSSL releases, `openssl list -cipher-algorithms` will + * display the available cipher algorithms. + * + * The `password` is used to derive the cipher key and initialization vector (IV). + * The value must be either a `'latin1'` encoded string, a `Buffer`, a`TypedArray`, or a `DataView`. + * + * **This function is semantically insecure for all** + * **supported ciphers and fatally flawed for ciphers in counter mode (such as CTR,** + * **GCM, or CCM).** + * + * The implementation of `crypto.createCipher()` derives keys using the OpenSSL + * function [`EVP_BytesToKey`](https://www.openssl.org/docs/man3.0/man3/EVP_BytesToKey.html) with the digest algorithm set to MD5, one + * iteration, and no salt. The lack of salt allows dictionary attacks as the same + * password always creates the same key. The low iteration count and + * non-cryptographically secure hash algorithm allow passwords to be tested very + * rapidly. + * + * In line with OpenSSL's recommendation to use a more modern algorithm instead of [`EVP_BytesToKey`](https://www.openssl.org/docs/man3.0/man3/EVP_BytesToKey.html) it is recommended that + * developers derive a key and IV on + * their own using {@link scrypt} and to use {@link createCipheriv} to create the `Cipher` object. Users should not use ciphers with counter mode + * (e.g. CTR, GCM, or CCM) in `crypto.createCipher()`. A warning is emitted when + * they are used in order to avoid the risk of IV reuse that causes + * vulnerabilities. For the case when IV is reused in GCM, see [Nonce-Disrespecting Adversaries](https://github.com/nonce-disrespect/nonce-disrespect) for details. + * @since v0.1.94 + * @deprecated Since v10.0.0 - Use {@link createCipheriv} instead. + * @param options `stream.transform` options + */ + function createCipher(algorithm: CipherCCMTypes, password: BinaryLike, options: CipherCCMOptions): CipherCCM; + /** @deprecated since v10.0.0 use `createCipheriv()` */ + function createCipher(algorithm: CipherGCMTypes, password: BinaryLike, options?: CipherGCMOptions): CipherGCM; + /** @deprecated since v10.0.0 use `createCipheriv()` */ + function createCipher(algorithm: string, password: BinaryLike, options?: stream.TransformOptions): Cipher; + /** + * Creates and returns a `Cipher` object, with the given `algorithm`, `key` and + * initialization vector (`iv`). + * + * The `options` argument controls stream behavior and is optional except when a + * cipher in CCM or OCB mode (e.g. `'aes-128-ccm'`) is used. In that case, the`authTagLength` option is required and specifies the length of the + * authentication tag in bytes, see `CCM mode`. In GCM mode, the `authTagLength`option is not required but can be used to set the length of the authentication + * tag that will be returned by `getAuthTag()` and defaults to 16 bytes. + * For `chacha20-poly1305`, the `authTagLength` option defaults to 16 bytes. + * + * The `algorithm` is dependent on OpenSSL, examples are `'aes192'`, etc. On + * recent OpenSSL releases, `openssl list -cipher-algorithms` will + * display the available cipher algorithms. + * + * The `key` is the raw key used by the `algorithm` and `iv` is an [initialization vector](https://en.wikipedia.org/wiki/Initialization_vector). Both arguments must be `'utf8'` encoded + * strings,`Buffers`, `TypedArray`, or `DataView`s. The `key` may optionally be + * a `KeyObject` of type `secret`. If the cipher does not need + * an initialization vector, `iv` may be `null`. + * + * When passing strings for `key` or `iv`, please consider `caveats when using strings as inputs to cryptographic APIs`. + * + * Initialization vectors should be unpredictable and unique; ideally, they will be + * cryptographically random. They do not have to be secret: IVs are typically just + * added to ciphertext messages unencrypted. It may sound contradictory that + * something has to be unpredictable and unique, but does not have to be secret; + * remember that an attacker must not be able to predict ahead of time what a + * given IV will be. + * @since v0.1.94 + * @param options `stream.transform` options + */ + function createCipheriv( + algorithm: CipherCCMTypes, + key: CipherKey, + iv: BinaryLike, + options: CipherCCMOptions, + ): CipherCCM; + function createCipheriv( + algorithm: CipherOCBTypes, + key: CipherKey, + iv: BinaryLike, + options: CipherOCBOptions, + ): CipherOCB; + function createCipheriv( + algorithm: CipherGCMTypes, + key: CipherKey, + iv: BinaryLike, + options?: CipherGCMOptions, + ): CipherGCM; + function createCipheriv( + algorithm: string, + key: CipherKey, + iv: BinaryLike | null, + options?: stream.TransformOptions, + ): Cipher; + /** + * Instances of the `Cipher` class are used to encrypt data. The class can be + * used in one of two ways: + * + * * As a `stream` that is both readable and writable, where plain unencrypted + * data is written to produce encrypted data on the readable side, or + * * Using the `cipher.update()` and `cipher.final()` methods to produce + * the encrypted data. + * + * The {@link createCipher} or {@link createCipheriv} methods are + * used to create `Cipher` instances. `Cipher` objects are not to be created + * directly using the `new` keyword. + * + * Example: Using `Cipher` objects as streams: + * + * ```js + * const { + * scrypt, + * randomFill, + * createCipheriv, + * } = await import('node:crypto'); + * + * const algorithm = 'aes-192-cbc'; + * const password = 'Password used to generate key'; + * + * // First, we'll generate the key. The key length is dependent on the algorithm. + * // In this case for aes192, it is 24 bytes (192 bits). + * scrypt(password, 'salt', 24, (err, key) => { + * if (err) throw err; + * // Then, we'll generate a random initialization vector + * randomFill(new Uint8Array(16), (err, iv) => { + * if (err) throw err; + * + * // Once we have the key and iv, we can create and use the cipher... + * const cipher = createCipheriv(algorithm, key, iv); + * + * let encrypted = ''; + * cipher.setEncoding('hex'); + * + * cipher.on('data', (chunk) => encrypted += chunk); + * cipher.on('end', () => console.log(encrypted)); + * + * cipher.write('some clear text data'); + * cipher.end(); + * }); + * }); + * ``` + * + * Example: Using `Cipher` and piped streams: + * + * ```js + * import { + * createReadStream, + * createWriteStream, + * } from 'node:fs'; + * + * import { + * pipeline, + * } from 'node:stream'; + * + * const { + * scrypt, + * randomFill, + * createCipheriv, + * } = await import('node:crypto'); + * + * const algorithm = 'aes-192-cbc'; + * const password = 'Password used to generate key'; + * + * // First, we'll generate the key. The key length is dependent on the algorithm. + * // In this case for aes192, it is 24 bytes (192 bits). + * scrypt(password, 'salt', 24, (err, key) => { + * if (err) throw err; + * // Then, we'll generate a random initialization vector + * randomFill(new Uint8Array(16), (err, iv) => { + * if (err) throw err; + * + * const cipher = createCipheriv(algorithm, key, iv); + * + * const input = createReadStream('test.js'); + * const output = createWriteStream('test.enc'); + * + * pipeline(input, cipher, output, (err) => { + * if (err) throw err; + * }); + * }); + * }); + * ``` + * + * Example: Using the `cipher.update()` and `cipher.final()` methods: + * + * ```js + * const { + * scrypt, + * randomFill, + * createCipheriv, + * } = await import('node:crypto'); + * + * const algorithm = 'aes-192-cbc'; + * const password = 'Password used to generate key'; + * + * // First, we'll generate the key. The key length is dependent on the algorithm. + * // In this case for aes192, it is 24 bytes (192 bits). + * scrypt(password, 'salt', 24, (err, key) => { + * if (err) throw err; + * // Then, we'll generate a random initialization vector + * randomFill(new Uint8Array(16), (err, iv) => { + * if (err) throw err; + * + * const cipher = createCipheriv(algorithm, key, iv); + * + * let encrypted = cipher.update('some clear text data', 'utf8', 'hex'); + * encrypted += cipher.final('hex'); + * console.log(encrypted); + * }); + * }); + * ``` + * @since v0.1.94 + */ + class Cipher extends stream.Transform { + private constructor(); + /** + * Updates the cipher with `data`. If the `inputEncoding` argument is given, + * the `data`argument is a string using the specified encoding. If the `inputEncoding`argument is not given, `data` must be a `Buffer`, `TypedArray`, or`DataView`. If `data` is a `Buffer`, + * `TypedArray`, or `DataView`, then`inputEncoding` is ignored. + * + * The `outputEncoding` specifies the output format of the enciphered + * data. If the `outputEncoding`is specified, a string using the specified encoding is returned. If no`outputEncoding` is provided, a `Buffer` is returned. + * + * The `cipher.update()` method can be called multiple times with new data until `cipher.final()` is called. Calling `cipher.update()` after `cipher.final()` will result in an error being + * thrown. + * @since v0.1.94 + * @param inputEncoding The `encoding` of the data. + * @param outputEncoding The `encoding` of the return value. + */ + update(data: BinaryLike): Buffer; + update(data: string, inputEncoding: Encoding): Buffer; + update(data: NodeJS.ArrayBufferView, inputEncoding: undefined, outputEncoding: Encoding): string; + update(data: string, inputEncoding: Encoding | undefined, outputEncoding: Encoding): string; + /** + * Once the `cipher.final()` method has been called, the `Cipher` object can no + * longer be used to encrypt data. Attempts to call `cipher.final()` more than + * once will result in an error being thrown. + * @since v0.1.94 + * @param outputEncoding The `encoding` of the return value. + * @return Any remaining enciphered contents. If `outputEncoding` is specified, a string is returned. If an `outputEncoding` is not provided, a {@link Buffer} is returned. + */ + final(): Buffer; + final(outputEncoding: BufferEncoding): string; + /** + * When using block encryption algorithms, the `Cipher` class will automatically + * add padding to the input data to the appropriate block size. To disable the + * default padding call `cipher.setAutoPadding(false)`. + * + * When `autoPadding` is `false`, the length of the entire input data must be a + * multiple of the cipher's block size or `cipher.final()` will throw an error. + * Disabling automatic padding is useful for non-standard padding, for instance + * using `0x0` instead of PKCS padding. + * + * The `cipher.setAutoPadding()` method must be called before `cipher.final()`. + * @since v0.7.1 + * @param [autoPadding=true] + * @return for method chaining. + */ + setAutoPadding(autoPadding?: boolean): this; + } + interface CipherCCM extends Cipher { + setAAD( + buffer: NodeJS.ArrayBufferView, + options: { + plaintextLength: number; + }, + ): this; + getAuthTag(): Buffer; + } + interface CipherGCM extends Cipher { + setAAD( + buffer: NodeJS.ArrayBufferView, + options?: { + plaintextLength: number; + }, + ): this; + getAuthTag(): Buffer; + } + interface CipherOCB extends Cipher { + setAAD( + buffer: NodeJS.ArrayBufferView, + options?: { + plaintextLength: number; + }, + ): this; + getAuthTag(): Buffer; + } + /** + * Creates and returns a `Decipher` object that uses the given `algorithm` and`password` (key). + * + * The `options` argument controls stream behavior and is optional except when a + * cipher in CCM or OCB mode (e.g. `'aes-128-ccm'`) is used. In that case, the`authTagLength` option is required and specifies the length of the + * authentication tag in bytes, see `CCM mode`. + * For `chacha20-poly1305`, the `authTagLength` option defaults to 16 bytes. + * + * **This function is semantically insecure for all** + * **supported ciphers and fatally flawed for ciphers in counter mode (such as CTR,** + * **GCM, or CCM).** + * + * The implementation of `crypto.createDecipher()` derives keys using the OpenSSL + * function [`EVP_BytesToKey`](https://www.openssl.org/docs/man3.0/man3/EVP_BytesToKey.html) with the digest algorithm set to MD5, one + * iteration, and no salt. The lack of salt allows dictionary attacks as the same + * password always creates the same key. The low iteration count and + * non-cryptographically secure hash algorithm allow passwords to be tested very + * rapidly. + * + * In line with OpenSSL's recommendation to use a more modern algorithm instead of [`EVP_BytesToKey`](https://www.openssl.org/docs/man3.0/man3/EVP_BytesToKey.html) it is recommended that + * developers derive a key and IV on + * their own using {@link scrypt} and to use {@link createDecipheriv} to create the `Decipher` object. + * @since v0.1.94 + * @deprecated Since v10.0.0 - Use {@link createDecipheriv} instead. + * @param options `stream.transform` options + */ + function createDecipher(algorithm: CipherCCMTypes, password: BinaryLike, options: CipherCCMOptions): DecipherCCM; + /** @deprecated since v10.0.0 use `createDecipheriv()` */ + function createDecipher(algorithm: CipherGCMTypes, password: BinaryLike, options?: CipherGCMOptions): DecipherGCM; + /** @deprecated since v10.0.0 use `createDecipheriv()` */ + function createDecipher(algorithm: string, password: BinaryLike, options?: stream.TransformOptions): Decipher; + /** + * Creates and returns a `Decipher` object that uses the given `algorithm`, `key`and initialization vector (`iv`). + * + * The `options` argument controls stream behavior and is optional except when a + * cipher in CCM or OCB mode (e.g. `'aes-128-ccm'`) is used. In that case, the`authTagLength` option is required and specifies the length of the + * authentication tag in bytes, see `CCM mode`. In GCM mode, the `authTagLength`option is not required but can be used to restrict accepted authentication tags + * to those with the specified length. + * For `chacha20-poly1305`, the `authTagLength` option defaults to 16 bytes. + * + * The `algorithm` is dependent on OpenSSL, examples are `'aes192'`, etc. On + * recent OpenSSL releases, `openssl list -cipher-algorithms` will + * display the available cipher algorithms. + * + * The `key` is the raw key used by the `algorithm` and `iv` is an [initialization vector](https://en.wikipedia.org/wiki/Initialization_vector). Both arguments must be `'utf8'` encoded + * strings,`Buffers`, `TypedArray`, or `DataView`s. The `key` may optionally be + * a `KeyObject` of type `secret`. If the cipher does not need + * an initialization vector, `iv` may be `null`. + * + * When passing strings for `key` or `iv`, please consider `caveats when using strings as inputs to cryptographic APIs`. + * + * Initialization vectors should be unpredictable and unique; ideally, they will be + * cryptographically random. They do not have to be secret: IVs are typically just + * added to ciphertext messages unencrypted. It may sound contradictory that + * something has to be unpredictable and unique, but does not have to be secret; + * remember that an attacker must not be able to predict ahead of time what a given + * IV will be. + * @since v0.1.94 + * @param options `stream.transform` options + */ + function createDecipheriv( + algorithm: CipherCCMTypes, + key: CipherKey, + iv: BinaryLike, + options: CipherCCMOptions, + ): DecipherCCM; + function createDecipheriv( + algorithm: CipherOCBTypes, + key: CipherKey, + iv: BinaryLike, + options: CipherOCBOptions, + ): DecipherOCB; + function createDecipheriv( + algorithm: CipherGCMTypes, + key: CipherKey, + iv: BinaryLike, + options?: CipherGCMOptions, + ): DecipherGCM; + function createDecipheriv( + algorithm: string, + key: CipherKey, + iv: BinaryLike | null, + options?: stream.TransformOptions, + ): Decipher; + /** + * Instances of the `Decipher` class are used to decrypt data. The class can be + * used in one of two ways: + * + * * As a `stream` that is both readable and writable, where plain encrypted + * data is written to produce unencrypted data on the readable side, or + * * Using the `decipher.update()` and `decipher.final()` methods to + * produce the unencrypted data. + * + * The {@link createDecipher} or {@link createDecipheriv} methods are + * used to create `Decipher` instances. `Decipher` objects are not to be created + * directly using the `new` keyword. + * + * Example: Using `Decipher` objects as streams: + * + * ```js + * import { Buffer } from 'node:buffer'; + * const { + * scryptSync, + * createDecipheriv, + * } = await import('node:crypto'); + * + * const algorithm = 'aes-192-cbc'; + * const password = 'Password used to generate key'; + * // Key length is dependent on the algorithm. In this case for aes192, it is + * // 24 bytes (192 bits). + * // Use the async `crypto.scrypt()` instead. + * const key = scryptSync(password, 'salt', 24); + * // The IV is usually passed along with the ciphertext. + * const iv = Buffer.alloc(16, 0); // Initialization vector. + * + * const decipher = createDecipheriv(algorithm, key, iv); + * + * let decrypted = ''; + * decipher.on('readable', () => { + * let chunk; + * while (null !== (chunk = decipher.read())) { + * decrypted += chunk.toString('utf8'); + * } + * }); + * decipher.on('end', () => { + * console.log(decrypted); + * // Prints: some clear text data + * }); + * + * // Encrypted with same algorithm, key and iv. + * const encrypted = + * 'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa'; + * decipher.write(encrypted, 'hex'); + * decipher.end(); + * ``` + * + * Example: Using `Decipher` and piped streams: + * + * ```js + * import { + * createReadStream, + * createWriteStream, + * } from 'node:fs'; + * import { Buffer } from 'node:buffer'; + * const { + * scryptSync, + * createDecipheriv, + * } = await import('node:crypto'); + * + * const algorithm = 'aes-192-cbc'; + * const password = 'Password used to generate key'; + * // Use the async `crypto.scrypt()` instead. + * const key = scryptSync(password, 'salt', 24); + * // The IV is usually passed along with the ciphertext. + * const iv = Buffer.alloc(16, 0); // Initialization vector. + * + * const decipher = createDecipheriv(algorithm, key, iv); + * + * const input = createReadStream('test.enc'); + * const output = createWriteStream('test.js'); + * + * input.pipe(decipher).pipe(output); + * ``` + * + * Example: Using the `decipher.update()` and `decipher.final()` methods: + * + * ```js + * import { Buffer } from 'node:buffer'; + * const { + * scryptSync, + * createDecipheriv, + * } = await import('node:crypto'); + * + * const algorithm = 'aes-192-cbc'; + * const password = 'Password used to generate key'; + * // Use the async `crypto.scrypt()` instead. + * const key = scryptSync(password, 'salt', 24); + * // The IV is usually passed along with the ciphertext. + * const iv = Buffer.alloc(16, 0); // Initialization vector. + * + * const decipher = createDecipheriv(algorithm, key, iv); + * + * // Encrypted using same algorithm, key and iv. + * const encrypted = + * 'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa'; + * let decrypted = decipher.update(encrypted, 'hex', 'utf8'); + * decrypted += decipher.final('utf8'); + * console.log(decrypted); + * // Prints: some clear text data + * ``` + * @since v0.1.94 + */ + class Decipher extends stream.Transform { + private constructor(); + /** + * Updates the decipher with `data`. If the `inputEncoding` argument is given, + * the `data`argument is a string using the specified encoding. If the `inputEncoding`argument is not given, `data` must be a `Buffer`. If `data` is a `Buffer` then `inputEncoding` is + * ignored. + * + * The `outputEncoding` specifies the output format of the enciphered + * data. If the `outputEncoding`is specified, a string using the specified encoding is returned. If no`outputEncoding` is provided, a `Buffer` is returned. + * + * The `decipher.update()` method can be called multiple times with new data until `decipher.final()` is called. Calling `decipher.update()` after `decipher.final()` will result in an error + * being thrown. + * @since v0.1.94 + * @param inputEncoding The `encoding` of the `data` string. + * @param outputEncoding The `encoding` of the return value. + */ + update(data: NodeJS.ArrayBufferView): Buffer; + update(data: string, inputEncoding: Encoding): Buffer; + update(data: NodeJS.ArrayBufferView, inputEncoding: undefined, outputEncoding: Encoding): string; + update(data: string, inputEncoding: Encoding | undefined, outputEncoding: Encoding): string; + /** + * Once the `decipher.final()` method has been called, the `Decipher` object can + * no longer be used to decrypt data. Attempts to call `decipher.final()` more + * than once will result in an error being thrown. + * @since v0.1.94 + * @param outputEncoding The `encoding` of the return value. + * @return Any remaining deciphered contents. If `outputEncoding` is specified, a string is returned. If an `outputEncoding` is not provided, a {@link Buffer} is returned. + */ + final(): Buffer; + final(outputEncoding: BufferEncoding): string; + /** + * When data has been encrypted without standard block padding, calling`decipher.setAutoPadding(false)` will disable automatic padding to prevent `decipher.final()` from checking for and + * removing padding. + * + * Turning auto padding off will only work if the input data's length is a + * multiple of the ciphers block size. + * + * The `decipher.setAutoPadding()` method must be called before `decipher.final()`. + * @since v0.7.1 + * @param [autoPadding=true] + * @return for method chaining. + */ + setAutoPadding(auto_padding?: boolean): this; + } + interface DecipherCCM extends Decipher { + setAuthTag(buffer: NodeJS.ArrayBufferView): this; + setAAD( + buffer: NodeJS.ArrayBufferView, + options: { + plaintextLength: number; + }, + ): this; + } + interface DecipherGCM extends Decipher { + setAuthTag(buffer: NodeJS.ArrayBufferView): this; + setAAD( + buffer: NodeJS.ArrayBufferView, + options?: { + plaintextLength: number; + }, + ): this; + } + interface DecipherOCB extends Decipher { + setAuthTag(buffer: NodeJS.ArrayBufferView): this; + setAAD( + buffer: NodeJS.ArrayBufferView, + options?: { + plaintextLength: number; + }, + ): this; + } + interface PrivateKeyInput { + key: string | Buffer; + format?: KeyFormat | undefined; + type?: "pkcs1" | "pkcs8" | "sec1" | undefined; + passphrase?: string | Buffer | undefined; + encoding?: string | undefined; + } + interface PublicKeyInput { + key: string | Buffer; + format?: KeyFormat | undefined; + type?: "pkcs1" | "spki" | undefined; + encoding?: string | undefined; + } + /** + * Asynchronously generates a new random secret key of the given `length`. The`type` will determine which validations will be performed on the `length`. + * + * ```js + * const { + * generateKey, + * } = await import('node:crypto'); + * + * generateKey('hmac', { length: 512 }, (err, key) => { + * if (err) throw err; + * console.log(key.export().toString('hex')); // 46e..........620 + * }); + * ``` + * + * The size of a generated HMAC key should not exceed the block size of the + * underlying hash function. See {@link createHmac} for more information. + * @since v15.0.0 + * @param type The intended use of the generated secret key. Currently accepted values are `'hmac'` and `'aes'`. + */ + function generateKey( + type: "hmac" | "aes", + options: { + length: number; + }, + callback: (err: Error | null, key: KeyObject) => void, + ): void; + /** + * Synchronously generates a new random secret key of the given `length`. The`type` will determine which validations will be performed on the `length`. + * + * ```js + * const { + * generateKeySync, + * } = await import('node:crypto'); + * + * const key = generateKeySync('hmac', { length: 512 }); + * console.log(key.export().toString('hex')); // e89..........41e + * ``` + * + * The size of a generated HMAC key should not exceed the block size of the + * underlying hash function. See {@link createHmac} for more information. + * @since v15.0.0 + * @param type The intended use of the generated secret key. Currently accepted values are `'hmac'` and `'aes'`. + */ + function generateKeySync( + type: "hmac" | "aes", + options: { + length: number; + }, + ): KeyObject; + interface JsonWebKeyInput { + key: JsonWebKey; + format: "jwk"; + } + /** + * Creates and returns a new key object containing a private key. If `key` is a + * string or `Buffer`, `format` is assumed to be `'pem'`; otherwise, `key`must be an object with the properties described above. + * + * If the private key is encrypted, a `passphrase` must be specified. The length + * of the passphrase is limited to 1024 bytes. + * @since v11.6.0 + */ + function createPrivateKey(key: PrivateKeyInput | string | Buffer | JsonWebKeyInput): KeyObject; + /** + * Creates and returns a new key object containing a public key. If `key` is a + * string or `Buffer`, `format` is assumed to be `'pem'`; if `key` is a `KeyObject`with type `'private'`, the public key is derived from the given private key; + * otherwise, `key` must be an object with the properties described above. + * + * If the format is `'pem'`, the `'key'` may also be an X.509 certificate. + * + * Because public keys can be derived from private keys, a private key may be + * passed instead of a public key. In that case, this function behaves as if {@link createPrivateKey} had been called, except that the type of the + * returned `KeyObject` will be `'public'` and that the private key cannot be + * extracted from the returned `KeyObject`. Similarly, if a `KeyObject` with type`'private'` is given, a new `KeyObject` with type `'public'` will be returned + * and it will be impossible to extract the private key from the returned object. + * @since v11.6.0 + */ + function createPublicKey(key: PublicKeyInput | string | Buffer | KeyObject | JsonWebKeyInput): KeyObject; + /** + * Creates and returns a new key object containing a secret key for symmetric + * encryption or `Hmac`. + * @since v11.6.0 + * @param encoding The string encoding when `key` is a string. + */ + function createSecretKey(key: NodeJS.ArrayBufferView): KeyObject; + function createSecretKey(key: string, encoding: BufferEncoding): KeyObject; + /** + * Creates and returns a `Sign` object that uses the given `algorithm`. Use {@link getHashes} to obtain the names of the available digest algorithms. + * Optional `options` argument controls the `stream.Writable` behavior. + * + * In some cases, a `Sign` instance can be created using the name of a signature + * algorithm, such as `'RSA-SHA256'`, instead of a digest algorithm. This will use + * the corresponding digest algorithm. This does not work for all signature + * algorithms, such as `'ecdsa-with-SHA256'`, so it is best to always use digest + * algorithm names. + * @since v0.1.92 + * @param options `stream.Writable` options + */ + function createSign(algorithm: string, options?: stream.WritableOptions): Sign; + type DSAEncoding = "der" | "ieee-p1363"; + interface SigningOptions { + /** + * @see crypto.constants.RSA_PKCS1_PADDING + */ + padding?: number | undefined; + saltLength?: number | undefined; + dsaEncoding?: DSAEncoding | undefined; + } + interface SignPrivateKeyInput extends PrivateKeyInput, SigningOptions {} + interface SignKeyObjectInput extends SigningOptions { + key: KeyObject; + } + interface VerifyPublicKeyInput extends PublicKeyInput, SigningOptions {} + interface VerifyKeyObjectInput extends SigningOptions { + key: KeyObject; + } + interface VerifyJsonWebKeyInput extends JsonWebKeyInput, SigningOptions {} + type KeyLike = string | Buffer | KeyObject; + /** + * The `Sign` class is a utility for generating signatures. It can be used in one + * of two ways: + * + * * As a writable `stream`, where data to be signed is written and the `sign.sign()` method is used to generate and return the signature, or + * * Using the `sign.update()` and `sign.sign()` methods to produce the + * signature. + * + * The {@link createSign} method is used to create `Sign` instances. The + * argument is the string name of the hash function to use. `Sign` objects are not + * to be created directly using the `new` keyword. + * + * Example: Using `Sign` and `Verify` objects as streams: + * + * ```js + * const { + * generateKeyPairSync, + * createSign, + * createVerify, + * } = await import('node:crypto'); + * + * const { privateKey, publicKey } = generateKeyPairSync('ec', { + * namedCurve: 'sect239k1', + * }); + * + * const sign = createSign('SHA256'); + * sign.write('some data to sign'); + * sign.end(); + * const signature = sign.sign(privateKey, 'hex'); + * + * const verify = createVerify('SHA256'); + * verify.write('some data to sign'); + * verify.end(); + * console.log(verify.verify(publicKey, signature, 'hex')); + * // Prints: true + * ``` + * + * Example: Using the `sign.update()` and `verify.update()` methods: + * + * ```js + * const { + * generateKeyPairSync, + * createSign, + * createVerify, + * } = await import('node:crypto'); + * + * const { privateKey, publicKey } = generateKeyPairSync('rsa', { + * modulusLength: 2048, + * }); + * + * const sign = createSign('SHA256'); + * sign.update('some data to sign'); + * sign.end(); + * const signature = sign.sign(privateKey); + * + * const verify = createVerify('SHA256'); + * verify.update('some data to sign'); + * verify.end(); + * console.log(verify.verify(publicKey, signature)); + * // Prints: true + * ``` + * @since v0.1.92 + */ + class Sign extends stream.Writable { + private constructor(); + /** + * Updates the `Sign` content with the given `data`, the encoding of which + * is given in `inputEncoding`. + * If `encoding` is not provided, and the `data` is a string, an + * encoding of `'utf8'` is enforced. If `data` is a `Buffer`, `TypedArray`, or`DataView`, then `inputEncoding` is ignored. + * + * This can be called many times with new data as it is streamed. + * @since v0.1.92 + * @param inputEncoding The `encoding` of the `data` string. + */ + update(data: BinaryLike): this; + update(data: string, inputEncoding: Encoding): this; + /** + * Calculates the signature on all the data passed through using either `sign.update()` or `sign.write()`. + * + * If `privateKey` is not a `KeyObject`, this function behaves as if`privateKey` had been passed to {@link createPrivateKey}. If it is an + * object, the following additional properties can be passed: + * + * If `outputEncoding` is provided a string is returned; otherwise a `Buffer` is returned. + * + * The `Sign` object can not be again used after `sign.sign()` method has been + * called. Multiple calls to `sign.sign()` will result in an error being thrown. + * @since v0.1.92 + */ + sign(privateKey: KeyLike | SignKeyObjectInput | SignPrivateKeyInput): Buffer; + sign( + privateKey: KeyLike | SignKeyObjectInput | SignPrivateKeyInput, + outputFormat: BinaryToTextEncoding, + ): string; + } + /** + * Creates and returns a `Verify` object that uses the given algorithm. + * Use {@link getHashes} to obtain an array of names of the available + * signing algorithms. Optional `options` argument controls the`stream.Writable` behavior. + * + * In some cases, a `Verify` instance can be created using the name of a signature + * algorithm, such as `'RSA-SHA256'`, instead of a digest algorithm. This will use + * the corresponding digest algorithm. This does not work for all signature + * algorithms, such as `'ecdsa-with-SHA256'`, so it is best to always use digest + * algorithm names. + * @since v0.1.92 + * @param options `stream.Writable` options + */ + function createVerify(algorithm: string, options?: stream.WritableOptions): Verify; + /** + * The `Verify` class is a utility for verifying signatures. It can be used in one + * of two ways: + * + * * As a writable `stream` where written data is used to validate against the + * supplied signature, or + * * Using the `verify.update()` and `verify.verify()` methods to verify + * the signature. + * + * The {@link createVerify} method is used to create `Verify` instances.`Verify` objects are not to be created directly using the `new` keyword. + * + * See `Sign` for examples. + * @since v0.1.92 + */ + class Verify extends stream.Writable { + private constructor(); + /** + * Updates the `Verify` content with the given `data`, the encoding of which + * is given in `inputEncoding`. + * If `inputEncoding` is not provided, and the `data` is a string, an + * encoding of `'utf8'` is enforced. If `data` is a `Buffer`, `TypedArray`, or`DataView`, then `inputEncoding` is ignored. + * + * This can be called many times with new data as it is streamed. + * @since v0.1.92 + * @param inputEncoding The `encoding` of the `data` string. + */ + update(data: BinaryLike): Verify; + update(data: string, inputEncoding: Encoding): Verify; + /** + * Verifies the provided data using the given `object` and `signature`. + * + * If `object` is not a `KeyObject`, this function behaves as if`object` had been passed to {@link createPublicKey}. If it is an + * object, the following additional properties can be passed: + * + * The `signature` argument is the previously calculated signature for the data, in + * the `signatureEncoding`. + * If a `signatureEncoding` is specified, the `signature` is expected to be a + * string; otherwise `signature` is expected to be a `Buffer`,`TypedArray`, or `DataView`. + * + * The `verify` object can not be used again after `verify.verify()` has been + * called. Multiple calls to `verify.verify()` will result in an error being + * thrown. + * + * Because public keys can be derived from private keys, a private key may + * be passed instead of a public key. + * @since v0.1.92 + */ + verify( + object: KeyLike | VerifyKeyObjectInput | VerifyPublicKeyInput | VerifyJsonWebKeyInput, + signature: NodeJS.ArrayBufferView, + ): boolean; + verify( + object: KeyLike | VerifyKeyObjectInput | VerifyPublicKeyInput | VerifyJsonWebKeyInput, + signature: string, + signature_format?: BinaryToTextEncoding, + ): boolean; + } + /** + * Creates a `DiffieHellman` key exchange object using the supplied `prime` and an + * optional specific `generator`. + * + * The `generator` argument can be a number, string, or `Buffer`. If`generator` is not specified, the value `2` is used. + * + * If `primeEncoding` is specified, `prime` is expected to be a string; otherwise + * a `Buffer`, `TypedArray`, or `DataView` is expected. + * + * If `generatorEncoding` is specified, `generator` is expected to be a string; + * otherwise a number, `Buffer`, `TypedArray`, or `DataView` is expected. + * @since v0.11.12 + * @param primeEncoding The `encoding` of the `prime` string. + * @param [generator=2] + * @param generatorEncoding The `encoding` of the `generator` string. + */ + function createDiffieHellman(primeLength: number, generator?: number): DiffieHellman; + function createDiffieHellman( + prime: ArrayBuffer | NodeJS.ArrayBufferView, + generator?: number | ArrayBuffer | NodeJS.ArrayBufferView, + ): DiffieHellman; + function createDiffieHellman( + prime: ArrayBuffer | NodeJS.ArrayBufferView, + generator: string, + generatorEncoding: BinaryToTextEncoding, + ): DiffieHellman; + function createDiffieHellman( + prime: string, + primeEncoding: BinaryToTextEncoding, + generator?: number | ArrayBuffer | NodeJS.ArrayBufferView, + ): DiffieHellman; + function createDiffieHellman( + prime: string, + primeEncoding: BinaryToTextEncoding, + generator: string, + generatorEncoding: BinaryToTextEncoding, + ): DiffieHellman; + /** + * The `DiffieHellman` class is a utility for creating Diffie-Hellman key + * exchanges. + * + * Instances of the `DiffieHellman` class can be created using the {@link createDiffieHellman} function. + * + * ```js + * import assert from 'node:assert'; + * + * const { + * createDiffieHellman, + * } = await import('node:crypto'); + * + * // Generate Alice's keys... + * const alice = createDiffieHellman(2048); + * const aliceKey = alice.generateKeys(); + * + * // Generate Bob's keys... + * const bob = createDiffieHellman(alice.getPrime(), alice.getGenerator()); + * const bobKey = bob.generateKeys(); + * + * // Exchange and generate the secret... + * const aliceSecret = alice.computeSecret(bobKey); + * const bobSecret = bob.computeSecret(aliceKey); + * + * // OK + * assert.strictEqual(aliceSecret.toString('hex'), bobSecret.toString('hex')); + * ``` + * @since v0.5.0 + */ + class DiffieHellman { + private constructor(); + /** + * Generates private and public Diffie-Hellman key values unless they have been + * generated or computed already, and returns + * the public key in the specified `encoding`. This key should be + * transferred to the other party. + * If `encoding` is provided a string is returned; otherwise a `Buffer` is returned. + * + * This function is a thin wrapper around [`DH_generate_key()`](https://www.openssl.org/docs/man3.0/man3/DH_generate_key.html). In particular, + * once a private key has been generated or set, calling this function only updates + * the public key but does not generate a new private key. + * @since v0.5.0 + * @param encoding The `encoding` of the return value. + */ + generateKeys(): Buffer; + generateKeys(encoding: BinaryToTextEncoding): string; + /** + * Computes the shared secret using `otherPublicKey` as the other + * party's public key and returns the computed shared secret. The supplied + * key is interpreted using the specified `inputEncoding`, and secret is + * encoded using specified `outputEncoding`. + * If the `inputEncoding` is not + * provided, `otherPublicKey` is expected to be a `Buffer`,`TypedArray`, or `DataView`. + * + * If `outputEncoding` is given a string is returned; otherwise, a `Buffer` is returned. + * @since v0.5.0 + * @param inputEncoding The `encoding` of an `otherPublicKey` string. + * @param outputEncoding The `encoding` of the return value. + */ + computeSecret(otherPublicKey: NodeJS.ArrayBufferView, inputEncoding?: null, outputEncoding?: null): Buffer; + computeSecret(otherPublicKey: string, inputEncoding: BinaryToTextEncoding, outputEncoding?: null): Buffer; + computeSecret( + otherPublicKey: NodeJS.ArrayBufferView, + inputEncoding: null, + outputEncoding: BinaryToTextEncoding, + ): string; + computeSecret( + otherPublicKey: string, + inputEncoding: BinaryToTextEncoding, + outputEncoding: BinaryToTextEncoding, + ): string; + /** + * Returns the Diffie-Hellman prime in the specified `encoding`. + * If `encoding` is provided a string is + * returned; otherwise a `Buffer` is returned. + * @since v0.5.0 + * @param encoding The `encoding` of the return value. + */ + getPrime(): Buffer; + getPrime(encoding: BinaryToTextEncoding): string; + /** + * Returns the Diffie-Hellman generator in the specified `encoding`. + * If `encoding` is provided a string is + * returned; otherwise a `Buffer` is returned. + * @since v0.5.0 + * @param encoding The `encoding` of the return value. + */ + getGenerator(): Buffer; + getGenerator(encoding: BinaryToTextEncoding): string; + /** + * Returns the Diffie-Hellman public key in the specified `encoding`. + * If `encoding` is provided a + * string is returned; otherwise a `Buffer` is returned. + * @since v0.5.0 + * @param encoding The `encoding` of the return value. + */ + getPublicKey(): Buffer; + getPublicKey(encoding: BinaryToTextEncoding): string; + /** + * Returns the Diffie-Hellman private key in the specified `encoding`. + * If `encoding` is provided a + * string is returned; otherwise a `Buffer` is returned. + * @since v0.5.0 + * @param encoding The `encoding` of the return value. + */ + getPrivateKey(): Buffer; + getPrivateKey(encoding: BinaryToTextEncoding): string; + /** + * Sets the Diffie-Hellman public key. If the `encoding` argument is provided,`publicKey` is expected + * to be a string. If no `encoding` is provided, `publicKey` is expected + * to be a `Buffer`, `TypedArray`, or `DataView`. + * @since v0.5.0 + * @param encoding The `encoding` of the `publicKey` string. + */ + setPublicKey(publicKey: NodeJS.ArrayBufferView): void; + setPublicKey(publicKey: string, encoding: BufferEncoding): void; + /** + * Sets the Diffie-Hellman private key. If the `encoding` argument is provided,`privateKey` is expected + * to be a string. If no `encoding` is provided, `privateKey` is expected + * to be a `Buffer`, `TypedArray`, or `DataView`. + * + * This function does not automatically compute the associated public key. Either `diffieHellman.setPublicKey()` or `diffieHellman.generateKeys()` can be + * used to manually provide the public key or to automatically derive it. + * @since v0.5.0 + * @param encoding The `encoding` of the `privateKey` string. + */ + setPrivateKey(privateKey: NodeJS.ArrayBufferView): void; + setPrivateKey(privateKey: string, encoding: BufferEncoding): void; + /** + * A bit field containing any warnings and/or errors resulting from a check + * performed during initialization of the `DiffieHellman` object. + * + * The following values are valid for this property (as defined in `node:constants` module): + * + * * `DH_CHECK_P_NOT_SAFE_PRIME` + * * `DH_CHECK_P_NOT_PRIME` + * * `DH_UNABLE_TO_CHECK_GENERATOR` + * * `DH_NOT_SUITABLE_GENERATOR` + * @since v0.11.12 + */ + verifyError: number; + } + /** + * The `DiffieHellmanGroup` class takes a well-known modp group as its argument. + * It works the same as `DiffieHellman`, except that it does not allow changing its keys after creation. + * In other words, it does not implement `setPublicKey()` or `setPrivateKey()` methods. + * + * ```js + * const { createDiffieHellmanGroup } = await import('node:crypto'); + * const dh = createDiffieHellmanGroup('modp1'); + * ``` + * The name (e.g. `'modp1'`) is taken from [RFC 2412](https://www.rfc-editor.org/rfc/rfc2412.txt) (modp1 and 2) and [RFC 3526](https://www.rfc-editor.org/rfc/rfc3526.txt): + * ```bash + * $ perl -ne 'print "$1\n" if /"(modp\d+)"/' src/node_crypto_groups.h + * modp1 # 768 bits + * modp2 # 1024 bits + * modp5 # 1536 bits + * modp14 # 2048 bits + * modp15 # etc. + * modp16 + * modp17 + * modp18 + * ``` + * @since v0.7.5 + */ + const DiffieHellmanGroup: DiffieHellmanGroupConstructor; + interface DiffieHellmanGroupConstructor { + new(name: string): DiffieHellmanGroup; + (name: string): DiffieHellmanGroup; + readonly prototype: DiffieHellmanGroup; + } + type DiffieHellmanGroup = Omit; + /** + * Creates a predefined `DiffieHellmanGroup` key exchange object. The + * supported groups are listed in the documentation for `DiffieHellmanGroup`. + * + * The returned object mimics the interface of objects created by {@link createDiffieHellman}, but will not allow changing + * the keys (with `diffieHellman.setPublicKey()`, for example). The + * advantage of using this method is that the parties do not have to + * generate nor exchange a group modulus beforehand, saving both processor + * and communication time. + * + * Example (obtaining a shared secret): + * + * ```js + * const { + * getDiffieHellman, + * } = await import('node:crypto'); + * const alice = getDiffieHellman('modp14'); + * const bob = getDiffieHellman('modp14'); + * + * alice.generateKeys(); + * bob.generateKeys(); + * + * const aliceSecret = alice.computeSecret(bob.getPublicKey(), null, 'hex'); + * const bobSecret = bob.computeSecret(alice.getPublicKey(), null, 'hex'); + * + * // aliceSecret and bobSecret should be the same + * console.log(aliceSecret === bobSecret); + * ``` + * @since v0.7.5 + */ + function getDiffieHellman(groupName: string): DiffieHellmanGroup; + /** + * An alias for {@link getDiffieHellman} + * @since v0.9.3 + */ + function createDiffieHellmanGroup(name: string): DiffieHellmanGroup; + /** + * Provides an asynchronous Password-Based Key Derivation Function 2 (PBKDF2) + * implementation. A selected HMAC digest algorithm specified by `digest` is + * applied to derive a key of the requested byte length (`keylen`) from the`password`, `salt` and `iterations`. + * + * The supplied `callback` function is called with two arguments: `err` and`derivedKey`. If an error occurs while deriving the key, `err` will be set; + * otherwise `err` will be `null`. By default, the successfully generated`derivedKey` will be passed to the callback as a `Buffer`. An error will be + * thrown if any of the input arguments specify invalid values or types. + * + * The `iterations` argument must be a number set as high as possible. The + * higher the number of iterations, the more secure the derived key will be, + * but will take a longer amount of time to complete. + * + * The `salt` should be as unique as possible. It is recommended that a salt is + * random and at least 16 bytes long. See [NIST SP 800-132](https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf) for details. + * + * When passing strings for `password` or `salt`, please consider `caveats when using strings as inputs to cryptographic APIs`. + * + * ```js + * const { + * pbkdf2, + * } = await import('node:crypto'); + * + * pbkdf2('secret', 'salt', 100000, 64, 'sha512', (err, derivedKey) => { + * if (err) throw err; + * console.log(derivedKey.toString('hex')); // '3745e48...08d59ae' + * }); + * ``` + * + * An array of supported digest functions can be retrieved using {@link getHashes}. + * + * This API uses libuv's threadpool, which can have surprising and + * negative performance implications for some applications; see the `UV_THREADPOOL_SIZE` documentation for more information. + * @since v0.5.5 + */ + function pbkdf2( + password: BinaryLike, + salt: BinaryLike, + iterations: number, + keylen: number, + digest: string, + callback: (err: Error | null, derivedKey: Buffer) => void, + ): void; + /** + * Provides a synchronous Password-Based Key Derivation Function 2 (PBKDF2) + * implementation. A selected HMAC digest algorithm specified by `digest` is + * applied to derive a key of the requested byte length (`keylen`) from the`password`, `salt` and `iterations`. + * + * If an error occurs an `Error` will be thrown, otherwise the derived key will be + * returned as a `Buffer`. + * + * The `iterations` argument must be a number set as high as possible. The + * higher the number of iterations, the more secure the derived key will be, + * but will take a longer amount of time to complete. + * + * The `salt` should be as unique as possible. It is recommended that a salt is + * random and at least 16 bytes long. See [NIST SP 800-132](https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf) for details. + * + * When passing strings for `password` or `salt`, please consider `caveats when using strings as inputs to cryptographic APIs`. + * + * ```js + * const { + * pbkdf2Sync, + * } = await import('node:crypto'); + * + * const key = pbkdf2Sync('secret', 'salt', 100000, 64, 'sha512'); + * console.log(key.toString('hex')); // '3745e48...08d59ae' + * ``` + * + * An array of supported digest functions can be retrieved using {@link getHashes}. + * @since v0.9.3 + */ + function pbkdf2Sync( + password: BinaryLike, + salt: BinaryLike, + iterations: number, + keylen: number, + digest: string, + ): Buffer; + /** + * Generates cryptographically strong pseudorandom data. The `size` argument + * is a number indicating the number of bytes to generate. + * + * If a `callback` function is provided, the bytes are generated asynchronously + * and the `callback` function is invoked with two arguments: `err` and `buf`. + * If an error occurs, `err` will be an `Error` object; otherwise it is `null`. The`buf` argument is a `Buffer` containing the generated bytes. + * + * ```js + * // Asynchronous + * const { + * randomBytes, + * } = await import('node:crypto'); + * + * randomBytes(256, (err, buf) => { + * if (err) throw err; + * console.log(`${buf.length} bytes of random data: ${buf.toString('hex')}`); + * }); + * ``` + * + * If the `callback` function is not provided, the random bytes are generated + * synchronously and returned as a `Buffer`. An error will be thrown if + * there is a problem generating the bytes. + * + * ```js + * // Synchronous + * const { + * randomBytes, + * } = await import('node:crypto'); + * + * const buf = randomBytes(256); + * console.log( + * `${buf.length} bytes of random data: ${buf.toString('hex')}`); + * ``` + * + * The `crypto.randomBytes()` method will not complete until there is + * sufficient entropy available. + * This should normally never take longer than a few milliseconds. The only time + * when generating the random bytes may conceivably block for a longer period of + * time is right after boot, when the whole system is still low on entropy. + * + * This API uses libuv's threadpool, which can have surprising and + * negative performance implications for some applications; see the `UV_THREADPOOL_SIZE` documentation for more information. + * + * The asynchronous version of `crypto.randomBytes()` is carried out in a single + * threadpool request. To minimize threadpool task length variation, partition + * large `randomBytes` requests when doing so as part of fulfilling a client + * request. + * @since v0.5.8 + * @param size The number of bytes to generate. The `size` must not be larger than `2**31 - 1`. + * @return if the `callback` function is not provided. + */ + function randomBytes(size: number): Buffer; + function randomBytes(size: number, callback: (err: Error | null, buf: Buffer) => void): void; + function pseudoRandomBytes(size: number): Buffer; + function pseudoRandomBytes(size: number, callback: (err: Error | null, buf: Buffer) => void): void; + /** + * Return a random integer `n` such that `min <= n < max`. This + * implementation avoids [modulo bias](https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#Modulo_bias). + * + * The range (`max - min`) must be less than 248. `min` and `max` must + * be [safe integers](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isSafeInteger). + * + * If the `callback` function is not provided, the random integer is + * generated synchronously. + * + * ```js + * // Asynchronous + * const { + * randomInt, + * } = await import('node:crypto'); + * + * randomInt(3, (err, n) => { + * if (err) throw err; + * console.log(`Random number chosen from (0, 1, 2): ${n}`); + * }); + * ``` + * + * ```js + * // Synchronous + * const { + * randomInt, + * } = await import('node:crypto'); + * + * const n = randomInt(3); + * console.log(`Random number chosen from (0, 1, 2): ${n}`); + * ``` + * + * ```js + * // With `min` argument + * const { + * randomInt, + * } = await import('node:crypto'); + * + * const n = randomInt(1, 7); + * console.log(`The dice rolled: ${n}`); + * ``` + * @since v14.10.0, v12.19.0 + * @param [min=0] Start of random range (inclusive). + * @param max End of random range (exclusive). + * @param callback `function(err, n) {}`. + */ + function randomInt(max: number): number; + function randomInt(min: number, max: number): number; + function randomInt(max: number, callback: (err: Error | null, value: number) => void): void; + function randomInt(min: number, max: number, callback: (err: Error | null, value: number) => void): void; + /** + * Synchronous version of {@link randomFill}. + * + * ```js + * import { Buffer } from 'node:buffer'; + * const { randomFillSync } = await import('node:crypto'); + * + * const buf = Buffer.alloc(10); + * console.log(randomFillSync(buf).toString('hex')); + * + * randomFillSync(buf, 5); + * console.log(buf.toString('hex')); + * + * // The above is equivalent to the following: + * randomFillSync(buf, 5, 5); + * console.log(buf.toString('hex')); + * ``` + * + * Any `ArrayBuffer`, `TypedArray` or `DataView` instance may be passed as`buffer`. + * + * ```js + * import { Buffer } from 'node:buffer'; + * const { randomFillSync } = await import('node:crypto'); + * + * const a = new Uint32Array(10); + * console.log(Buffer.from(randomFillSync(a).buffer, + * a.byteOffset, a.byteLength).toString('hex')); + * + * const b = new DataView(new ArrayBuffer(10)); + * console.log(Buffer.from(randomFillSync(b).buffer, + * b.byteOffset, b.byteLength).toString('hex')); + * + * const c = new ArrayBuffer(10); + * console.log(Buffer.from(randomFillSync(c)).toString('hex')); + * ``` + * @since v7.10.0, v6.13.0 + * @param buffer Must be supplied. The size of the provided `buffer` must not be larger than `2**31 - 1`. + * @param [offset=0] + * @param [size=buffer.length - offset] + * @return The object passed as `buffer` argument. + */ + function randomFillSync(buffer: T, offset?: number, size?: number): T; + /** + * This function is similar to {@link randomBytes} but requires the first + * argument to be a `Buffer` that will be filled. It also + * requires that a callback is passed in. + * + * If the `callback` function is not provided, an error will be thrown. + * + * ```js + * import { Buffer } from 'node:buffer'; + * const { randomFill } = await import('node:crypto'); + * + * const buf = Buffer.alloc(10); + * randomFill(buf, (err, buf) => { + * if (err) throw err; + * console.log(buf.toString('hex')); + * }); + * + * randomFill(buf, 5, (err, buf) => { + * if (err) throw err; + * console.log(buf.toString('hex')); + * }); + * + * // The above is equivalent to the following: + * randomFill(buf, 5, 5, (err, buf) => { + * if (err) throw err; + * console.log(buf.toString('hex')); + * }); + * ``` + * + * Any `ArrayBuffer`, `TypedArray`, or `DataView` instance may be passed as`buffer`. + * + * While this includes instances of `Float32Array` and `Float64Array`, this + * function should not be used to generate random floating-point numbers. The + * result may contain `+Infinity`, `-Infinity`, and `NaN`, and even if the array + * contains finite numbers only, they are not drawn from a uniform random + * distribution and have no meaningful lower or upper bounds. + * + * ```js + * import { Buffer } from 'node:buffer'; + * const { randomFill } = await import('node:crypto'); + * + * const a = new Uint32Array(10); + * randomFill(a, (err, buf) => { + * if (err) throw err; + * console.log(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength) + * .toString('hex')); + * }); + * + * const b = new DataView(new ArrayBuffer(10)); + * randomFill(b, (err, buf) => { + * if (err) throw err; + * console.log(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength) + * .toString('hex')); + * }); + * + * const c = new ArrayBuffer(10); + * randomFill(c, (err, buf) => { + * if (err) throw err; + * console.log(Buffer.from(buf).toString('hex')); + * }); + * ``` + * + * This API uses libuv's threadpool, which can have surprising and + * negative performance implications for some applications; see the `UV_THREADPOOL_SIZE` documentation for more information. + * + * The asynchronous version of `crypto.randomFill()` is carried out in a single + * threadpool request. To minimize threadpool task length variation, partition + * large `randomFill` requests when doing so as part of fulfilling a client + * request. + * @since v7.10.0, v6.13.0 + * @param buffer Must be supplied. The size of the provided `buffer` must not be larger than `2**31 - 1`. + * @param [offset=0] + * @param [size=buffer.length - offset] + * @param callback `function(err, buf) {}`. + */ + function randomFill( + buffer: T, + callback: (err: Error | null, buf: T) => void, + ): void; + function randomFill( + buffer: T, + offset: number, + callback: (err: Error | null, buf: T) => void, + ): void; + function randomFill( + buffer: T, + offset: number, + size: number, + callback: (err: Error | null, buf: T) => void, + ): void; + interface ScryptOptions { + cost?: number | undefined; + blockSize?: number | undefined; + parallelization?: number | undefined; + N?: number | undefined; + r?: number | undefined; + p?: number | undefined; + maxmem?: number | undefined; + } + /** + * Provides an asynchronous [scrypt](https://en.wikipedia.org/wiki/Scrypt) implementation. Scrypt is a password-based + * key derivation function that is designed to be expensive computationally and + * memory-wise in order to make brute-force attacks unrewarding. + * + * The `salt` should be as unique as possible. It is recommended that a salt is + * random and at least 16 bytes long. See [NIST SP 800-132](https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf) for details. + * + * When passing strings for `password` or `salt`, please consider `caveats when using strings as inputs to cryptographic APIs`. + * + * The `callback` function is called with two arguments: `err` and `derivedKey`.`err` is an exception object when key derivation fails, otherwise `err` is`null`. `derivedKey` is passed to the + * callback as a `Buffer`. + * + * An exception is thrown when any of the input arguments specify invalid values + * or types. + * + * ```js + * const { + * scrypt, + * } = await import('node:crypto'); + * + * // Using the factory defaults. + * scrypt('password', 'salt', 64, (err, derivedKey) => { + * if (err) throw err; + * console.log(derivedKey.toString('hex')); // '3745e48...08d59ae' + * }); + * // Using a custom N parameter. Must be a power of two. + * scrypt('password', 'salt', 64, { N: 1024 }, (err, derivedKey) => { + * if (err) throw err; + * console.log(derivedKey.toString('hex')); // '3745e48...aa39b34' + * }); + * ``` + * @since v10.5.0 + */ + function scrypt( + password: BinaryLike, + salt: BinaryLike, + keylen: number, + callback: (err: Error | null, derivedKey: Buffer) => void, + ): void; + function scrypt( + password: BinaryLike, + salt: BinaryLike, + keylen: number, + options: ScryptOptions, + callback: (err: Error | null, derivedKey: Buffer) => void, + ): void; + /** + * Provides a synchronous [scrypt](https://en.wikipedia.org/wiki/Scrypt) implementation. Scrypt is a password-based + * key derivation function that is designed to be expensive computationally and + * memory-wise in order to make brute-force attacks unrewarding. + * + * The `salt` should be as unique as possible. It is recommended that a salt is + * random and at least 16 bytes long. See [NIST SP 800-132](https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf) for details. + * + * When passing strings for `password` or `salt`, please consider `caveats when using strings as inputs to cryptographic APIs`. + * + * An exception is thrown when key derivation fails, otherwise the derived key is + * returned as a `Buffer`. + * + * An exception is thrown when any of the input arguments specify invalid values + * or types. + * + * ```js + * const { + * scryptSync, + * } = await import('node:crypto'); + * // Using the factory defaults. + * + * const key1 = scryptSync('password', 'salt', 64); + * console.log(key1.toString('hex')); // '3745e48...08d59ae' + * // Using a custom N parameter. Must be a power of two. + * const key2 = scryptSync('password', 'salt', 64, { N: 1024 }); + * console.log(key2.toString('hex')); // '3745e48...aa39b34' + * ``` + * @since v10.5.0 + */ + function scryptSync(password: BinaryLike, salt: BinaryLike, keylen: number, options?: ScryptOptions): Buffer; + interface RsaPublicKey { + key: KeyLike; + padding?: number | undefined; + } + interface RsaPrivateKey { + key: KeyLike; + passphrase?: string | undefined; + /** + * @default 'sha1' + */ + oaepHash?: string | undefined; + oaepLabel?: NodeJS.TypedArray | undefined; + padding?: number | undefined; + } + /** + * Encrypts the content of `buffer` with `key` and returns a new `Buffer` with encrypted content. The returned data can be decrypted using + * the corresponding private key, for example using {@link privateDecrypt}. + * + * If `key` is not a `KeyObject`, this function behaves as if`key` had been passed to {@link createPublicKey}. If it is an + * object, the `padding` property can be passed. Otherwise, this function uses`RSA_PKCS1_OAEP_PADDING`. + * + * Because RSA public keys can be derived from private keys, a private key may + * be passed instead of a public key. + * @since v0.11.14 + */ + function publicEncrypt(key: RsaPublicKey | RsaPrivateKey | KeyLike, buffer: NodeJS.ArrayBufferView): Buffer; + /** + * Decrypts `buffer` with `key`.`buffer` was previously encrypted using + * the corresponding private key, for example using {@link privateEncrypt}. + * + * If `key` is not a `KeyObject`, this function behaves as if`key` had been passed to {@link createPublicKey}. If it is an + * object, the `padding` property can be passed. Otherwise, this function uses`RSA_PKCS1_PADDING`. + * + * Because RSA public keys can be derived from private keys, a private key may + * be passed instead of a public key. + * @since v1.1.0 + */ + function publicDecrypt(key: RsaPublicKey | RsaPrivateKey | KeyLike, buffer: NodeJS.ArrayBufferView): Buffer; + /** + * Decrypts `buffer` with `privateKey`. `buffer` was previously encrypted using + * the corresponding public key, for example using {@link publicEncrypt}. + * + * If `privateKey` is not a `KeyObject`, this function behaves as if`privateKey` had been passed to {@link createPrivateKey}. If it is an + * object, the `padding` property can be passed. Otherwise, this function uses`RSA_PKCS1_OAEP_PADDING`. + * @since v0.11.14 + */ + function privateDecrypt(privateKey: RsaPrivateKey | KeyLike, buffer: NodeJS.ArrayBufferView): Buffer; + /** + * Encrypts `buffer` with `privateKey`. The returned data can be decrypted using + * the corresponding public key, for example using {@link publicDecrypt}. + * + * If `privateKey` is not a `KeyObject`, this function behaves as if`privateKey` had been passed to {@link createPrivateKey}. If it is an + * object, the `padding` property can be passed. Otherwise, this function uses`RSA_PKCS1_PADDING`. + * @since v1.1.0 + */ + function privateEncrypt(privateKey: RsaPrivateKey | KeyLike, buffer: NodeJS.ArrayBufferView): Buffer; + /** + * ```js + * const { + * getCiphers, + * } = await import('node:crypto'); + * + * console.log(getCiphers()); // ['aes-128-cbc', 'aes-128-ccm', ...] + * ``` + * @since v0.9.3 + * @return An array with the names of the supported cipher algorithms. + */ + function getCiphers(): string[]; + /** + * ```js + * const { + * getCurves, + * } = await import('node:crypto'); + * + * console.log(getCurves()); // ['Oakley-EC2N-3', 'Oakley-EC2N-4', ...] + * ``` + * @since v2.3.0 + * @return An array with the names of the supported elliptic curves. + */ + function getCurves(): string[]; + /** + * @since v10.0.0 + * @return `1` if and only if a FIPS compliant crypto provider is currently in use, `0` otherwise. A future semver-major release may change the return type of this API to a {boolean}. + */ + function getFips(): 1 | 0; + /** + * Enables the FIPS compliant crypto provider in a FIPS-enabled Node.js build. + * Throws an error if FIPS mode is not available. + * @since v10.0.0 + * @param bool `true` to enable FIPS mode. + */ + function setFips(bool: boolean): void; + /** + * ```js + * const { + * getHashes, + * } = await import('node:crypto'); + * + * console.log(getHashes()); // ['DSA', 'DSA-SHA', 'DSA-SHA1', ...] + * ``` + * @since v0.9.3 + * @return An array of the names of the supported hash algorithms, such as `'RSA-SHA256'`. Hash algorithms are also called "digest" algorithms. + */ + function getHashes(): string[]; + /** + * The `ECDH` class is a utility for creating Elliptic Curve Diffie-Hellman (ECDH) + * key exchanges. + * + * Instances of the `ECDH` class can be created using the {@link createECDH} function. + * + * ```js + * import assert from 'node:assert'; + * + * const { + * createECDH, + * } = await import('node:crypto'); + * + * // Generate Alice's keys... + * const alice = createECDH('secp521r1'); + * const aliceKey = alice.generateKeys(); + * + * // Generate Bob's keys... + * const bob = createECDH('secp521r1'); + * const bobKey = bob.generateKeys(); + * + * // Exchange and generate the secret... + * const aliceSecret = alice.computeSecret(bobKey); + * const bobSecret = bob.computeSecret(aliceKey); + * + * assert.strictEqual(aliceSecret.toString('hex'), bobSecret.toString('hex')); + * // OK + * ``` + * @since v0.11.14 + */ + class ECDH { + private constructor(); + /** + * Converts the EC Diffie-Hellman public key specified by `key` and `curve` to the + * format specified by `format`. The `format` argument specifies point encoding + * and can be `'compressed'`, `'uncompressed'` or `'hybrid'`. The supplied key is + * interpreted using the specified `inputEncoding`, and the returned key is encoded + * using the specified `outputEncoding`. + * + * Use {@link getCurves} to obtain a list of available curve names. + * On recent OpenSSL releases, `openssl ecparam -list_curves` will also display + * the name and description of each available elliptic curve. + * + * If `format` is not specified the point will be returned in `'uncompressed'`format. + * + * If the `inputEncoding` is not provided, `key` is expected to be a `Buffer`,`TypedArray`, or `DataView`. + * + * Example (uncompressing a key): + * + * ```js + * const { + * createECDH, + * ECDH, + * } = await import('node:crypto'); + * + * const ecdh = createECDH('secp256k1'); + * ecdh.generateKeys(); + * + * const compressedKey = ecdh.getPublicKey('hex', 'compressed'); + * + * const uncompressedKey = ECDH.convertKey(compressedKey, + * 'secp256k1', + * 'hex', + * 'hex', + * 'uncompressed'); + * + * // The converted key and the uncompressed public key should be the same + * console.log(uncompressedKey === ecdh.getPublicKey('hex')); + * ``` + * @since v10.0.0 + * @param inputEncoding The `encoding` of the `key` string. + * @param outputEncoding The `encoding` of the return value. + * @param [format='uncompressed'] + */ + static convertKey( + key: BinaryLike, + curve: string, + inputEncoding?: BinaryToTextEncoding, + outputEncoding?: "latin1" | "hex" | "base64" | "base64url", + format?: "uncompressed" | "compressed" | "hybrid", + ): Buffer | string; + /** + * Generates private and public EC Diffie-Hellman key values, and returns + * the public key in the specified `format` and `encoding`. This key should be + * transferred to the other party. + * + * The `format` argument specifies point encoding and can be `'compressed'` or`'uncompressed'`. If `format` is not specified, the point will be returned in`'uncompressed'` format. + * + * If `encoding` is provided a string is returned; otherwise a `Buffer` is returned. + * @since v0.11.14 + * @param encoding The `encoding` of the return value. + * @param [format='uncompressed'] + */ + generateKeys(): Buffer; + generateKeys(encoding: BinaryToTextEncoding, format?: ECDHKeyFormat): string; + /** + * Computes the shared secret using `otherPublicKey` as the other + * party's public key and returns the computed shared secret. The supplied + * key is interpreted using specified `inputEncoding`, and the returned secret + * is encoded using the specified `outputEncoding`. + * If the `inputEncoding` is not + * provided, `otherPublicKey` is expected to be a `Buffer`, `TypedArray`, or`DataView`. + * + * If `outputEncoding` is given a string will be returned; otherwise a `Buffer` is returned. + * + * `ecdh.computeSecret` will throw an`ERR_CRYPTO_ECDH_INVALID_PUBLIC_KEY` error when `otherPublicKey`lies outside of the elliptic curve. Since `otherPublicKey` is + * usually supplied from a remote user over an insecure network, + * be sure to handle this exception accordingly. + * @since v0.11.14 + * @param inputEncoding The `encoding` of the `otherPublicKey` string. + * @param outputEncoding The `encoding` of the return value. + */ + computeSecret(otherPublicKey: NodeJS.ArrayBufferView): Buffer; + computeSecret(otherPublicKey: string, inputEncoding: BinaryToTextEncoding): Buffer; + computeSecret(otherPublicKey: NodeJS.ArrayBufferView, outputEncoding: BinaryToTextEncoding): string; + computeSecret( + otherPublicKey: string, + inputEncoding: BinaryToTextEncoding, + outputEncoding: BinaryToTextEncoding, + ): string; + /** + * If `encoding` is specified, a string is returned; otherwise a `Buffer` is + * returned. + * @since v0.11.14 + * @param encoding The `encoding` of the return value. + * @return The EC Diffie-Hellman in the specified `encoding`. + */ + getPrivateKey(): Buffer; + getPrivateKey(encoding: BinaryToTextEncoding): string; + /** + * The `format` argument specifies point encoding and can be `'compressed'` or`'uncompressed'`. If `format` is not specified the point will be returned in`'uncompressed'` format. + * + * If `encoding` is specified, a string is returned; otherwise a `Buffer` is + * returned. + * @since v0.11.14 + * @param encoding The `encoding` of the return value. + * @param [format='uncompressed'] + * @return The EC Diffie-Hellman public key in the specified `encoding` and `format`. + */ + getPublicKey(encoding?: null, format?: ECDHKeyFormat): Buffer; + getPublicKey(encoding: BinaryToTextEncoding, format?: ECDHKeyFormat): string; + /** + * Sets the EC Diffie-Hellman private key. + * If `encoding` is provided, `privateKey` is expected + * to be a string; otherwise `privateKey` is expected to be a `Buffer`,`TypedArray`, or `DataView`. + * + * If `privateKey` is not valid for the curve specified when the `ECDH` object was + * created, an error is thrown. Upon setting the private key, the associated + * public point (key) is also generated and set in the `ECDH` object. + * @since v0.11.14 + * @param encoding The `encoding` of the `privateKey` string. + */ + setPrivateKey(privateKey: NodeJS.ArrayBufferView): void; + setPrivateKey(privateKey: string, encoding: BinaryToTextEncoding): void; + } + /** + * Creates an Elliptic Curve Diffie-Hellman (`ECDH`) key exchange object using a + * predefined curve specified by the `curveName` string. Use {@link getCurves} to obtain a list of available curve names. On recent + * OpenSSL releases, `openssl ecparam -list_curves` will also display the name + * and description of each available elliptic curve. + * @since v0.11.14 + */ + function createECDH(curveName: string): ECDH; + /** + * This function compares the underlying bytes that represent the given`ArrayBuffer`, `TypedArray`, or `DataView` instances using a constant-time + * algorithm. + * + * This function does not leak timing information that + * would allow an attacker to guess one of the values. This is suitable for + * comparing HMAC digests or secret values like authentication cookies or [capability urls](https://www.w3.org/TR/capability-urls/). + * + * `a` and `b` must both be `Buffer`s, `TypedArray`s, or `DataView`s, and they + * must have the same byte length. An error is thrown if `a` and `b` have + * different byte lengths. + * + * If at least one of `a` and `b` is a `TypedArray` with more than one byte per + * entry, such as `Uint16Array`, the result will be computed using the platform + * byte order. + * + * **When both of the inputs are `Float32Array`s or`Float64Array`s, this function might return unexpected results due to IEEE 754** + * **encoding of floating-point numbers. In particular, neither `x === y` nor`Object.is(x, y)` implies that the byte representations of two floating-point** + * **numbers `x` and `y` are equal.** + * + * Use of `crypto.timingSafeEqual` does not guarantee that the _surrounding_ code + * is timing-safe. Care should be taken to ensure that the surrounding code does + * not introduce timing vulnerabilities. + * @since v6.6.0 + */ + function timingSafeEqual(a: NodeJS.ArrayBufferView, b: NodeJS.ArrayBufferView): boolean; + type KeyType = "rsa" | "rsa-pss" | "dsa" | "ec" | "ed25519" | "ed448" | "x25519" | "x448"; + type KeyFormat = "pem" | "der" | "jwk"; + interface BasePrivateKeyEncodingOptions { + format: T; + cipher?: string | undefined; + passphrase?: string | undefined; + } + interface KeyPairKeyObjectResult { + publicKey: KeyObject; + privateKey: KeyObject; + } + interface ED25519KeyPairKeyObjectOptions {} + interface ED448KeyPairKeyObjectOptions {} + interface X25519KeyPairKeyObjectOptions {} + interface X448KeyPairKeyObjectOptions {} + interface ECKeyPairKeyObjectOptions { + /** + * Name of the curve to use + */ + namedCurve: string; + } + interface RSAKeyPairKeyObjectOptions { + /** + * Key size in bits + */ + modulusLength: number; + /** + * Public exponent + * @default 0x10001 + */ + publicExponent?: number | undefined; + } + interface RSAPSSKeyPairKeyObjectOptions { + /** + * Key size in bits + */ + modulusLength: number; + /** + * Public exponent + * @default 0x10001 + */ + publicExponent?: number | undefined; + /** + * Name of the message digest + */ + hashAlgorithm?: string; + /** + * Name of the message digest used by MGF1 + */ + mgf1HashAlgorithm?: string; + /** + * Minimal salt length in bytes + */ + saltLength?: string; + } + interface DSAKeyPairKeyObjectOptions { + /** + * Key size in bits + */ + modulusLength: number; + /** + * Size of q in bits + */ + divisorLength: number; + } + interface RSAKeyPairOptions { + /** + * Key size in bits + */ + modulusLength: number; + /** + * Public exponent + * @default 0x10001 + */ + publicExponent?: number | undefined; + publicKeyEncoding: { + type: "pkcs1" | "spki"; + format: PubF; + }; + privateKeyEncoding: BasePrivateKeyEncodingOptions & { + type: "pkcs1" | "pkcs8"; + }; + } + interface RSAPSSKeyPairOptions { + /** + * Key size in bits + */ + modulusLength: number; + /** + * Public exponent + * @default 0x10001 + */ + publicExponent?: number | undefined; + /** + * Name of the message digest + */ + hashAlgorithm?: string; + /** + * Name of the message digest used by MGF1 + */ + mgf1HashAlgorithm?: string; + /** + * Minimal salt length in bytes + */ + saltLength?: string; + publicKeyEncoding: { + type: "spki"; + format: PubF; + }; + privateKeyEncoding: BasePrivateKeyEncodingOptions & { + type: "pkcs8"; + }; + } + interface DSAKeyPairOptions { + /** + * Key size in bits + */ + modulusLength: number; + /** + * Size of q in bits + */ + divisorLength: number; + publicKeyEncoding: { + type: "spki"; + format: PubF; + }; + privateKeyEncoding: BasePrivateKeyEncodingOptions & { + type: "pkcs8"; + }; + } + interface ECKeyPairOptions { + /** + * Name of the curve to use. + */ + namedCurve: string; + publicKeyEncoding: { + type: "pkcs1" | "spki"; + format: PubF; + }; + privateKeyEncoding: BasePrivateKeyEncodingOptions & { + type: "sec1" | "pkcs8"; + }; + } + interface ED25519KeyPairOptions { + publicKeyEncoding: { + type: "spki"; + format: PubF; + }; + privateKeyEncoding: BasePrivateKeyEncodingOptions & { + type: "pkcs8"; + }; + } + interface ED448KeyPairOptions { + publicKeyEncoding: { + type: "spki"; + format: PubF; + }; + privateKeyEncoding: BasePrivateKeyEncodingOptions & { + type: "pkcs8"; + }; + } + interface X25519KeyPairOptions { + publicKeyEncoding: { + type: "spki"; + format: PubF; + }; + privateKeyEncoding: BasePrivateKeyEncodingOptions & { + type: "pkcs8"; + }; + } + interface X448KeyPairOptions { + publicKeyEncoding: { + type: "spki"; + format: PubF; + }; + privateKeyEncoding: BasePrivateKeyEncodingOptions & { + type: "pkcs8"; + }; + } + interface KeyPairSyncResult { + publicKey: T1; + privateKey: T2; + } + /** + * Generates a new asymmetric key pair of the given `type`. RSA, RSA-PSS, DSA, EC, + * Ed25519, Ed448, X25519, X448, and DH are currently supported. + * + * If a `publicKeyEncoding` or `privateKeyEncoding` was specified, this function + * behaves as if `keyObject.export()` had been called on its result. Otherwise, + * the respective part of the key is returned as a `KeyObject`. + * + * When encoding public keys, it is recommended to use `'spki'`. When encoding + * private keys, it is recommended to use `'pkcs8'` with a strong passphrase, + * and to keep the passphrase confidential. + * + * ```js + * const { + * generateKeyPairSync, + * } = await import('node:crypto'); + * + * const { + * publicKey, + * privateKey, + * } = generateKeyPairSync('rsa', { + * modulusLength: 4096, + * publicKeyEncoding: { + * type: 'spki', + * format: 'pem', + * }, + * privateKeyEncoding: { + * type: 'pkcs8', + * format: 'pem', + * cipher: 'aes-256-cbc', + * passphrase: 'top secret', + * }, + * }); + * ``` + * + * The return value `{ publicKey, privateKey }` represents the generated key pair. + * When PEM encoding was selected, the respective key will be a string, otherwise + * it will be a buffer containing the data encoded as DER. + * @since v10.12.0 + * @param type Must be `'rsa'`, `'rsa-pss'`, `'dsa'`, `'ec'`, `'ed25519'`, `'ed448'`, `'x25519'`, `'x448'`, or `'dh'`. + */ + function generateKeyPairSync( + type: "rsa", + options: RSAKeyPairOptions<"pem", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "rsa", + options: RSAKeyPairOptions<"pem", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "rsa", + options: RSAKeyPairOptions<"der", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "rsa", + options: RSAKeyPairOptions<"der", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync(type: "rsa", options: RSAKeyPairKeyObjectOptions): KeyPairKeyObjectResult; + function generateKeyPairSync( + type: "rsa-pss", + options: RSAPSSKeyPairOptions<"pem", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "rsa-pss", + options: RSAPSSKeyPairOptions<"pem", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "rsa-pss", + options: RSAPSSKeyPairOptions<"der", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "rsa-pss", + options: RSAPSSKeyPairOptions<"der", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync(type: "rsa-pss", options: RSAPSSKeyPairKeyObjectOptions): KeyPairKeyObjectResult; + function generateKeyPairSync( + type: "dsa", + options: DSAKeyPairOptions<"pem", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "dsa", + options: DSAKeyPairOptions<"pem", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "dsa", + options: DSAKeyPairOptions<"der", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "dsa", + options: DSAKeyPairOptions<"der", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync(type: "dsa", options: DSAKeyPairKeyObjectOptions): KeyPairKeyObjectResult; + function generateKeyPairSync( + type: "ec", + options: ECKeyPairOptions<"pem", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "ec", + options: ECKeyPairOptions<"pem", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "ec", + options: ECKeyPairOptions<"der", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "ec", + options: ECKeyPairOptions<"der", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync(type: "ec", options: ECKeyPairKeyObjectOptions): KeyPairKeyObjectResult; + function generateKeyPairSync( + type: "ed25519", + options: ED25519KeyPairOptions<"pem", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "ed25519", + options: ED25519KeyPairOptions<"pem", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "ed25519", + options: ED25519KeyPairOptions<"der", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "ed25519", + options: ED25519KeyPairOptions<"der", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync(type: "ed25519", options?: ED25519KeyPairKeyObjectOptions): KeyPairKeyObjectResult; + function generateKeyPairSync( + type: "ed448", + options: ED448KeyPairOptions<"pem", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "ed448", + options: ED448KeyPairOptions<"pem", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "ed448", + options: ED448KeyPairOptions<"der", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "ed448", + options: ED448KeyPairOptions<"der", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync(type: "ed448", options?: ED448KeyPairKeyObjectOptions): KeyPairKeyObjectResult; + function generateKeyPairSync( + type: "x25519", + options: X25519KeyPairOptions<"pem", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "x25519", + options: X25519KeyPairOptions<"pem", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "x25519", + options: X25519KeyPairOptions<"der", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "x25519", + options: X25519KeyPairOptions<"der", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync(type: "x25519", options?: X25519KeyPairKeyObjectOptions): KeyPairKeyObjectResult; + function generateKeyPairSync( + type: "x448", + options: X448KeyPairOptions<"pem", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "x448", + options: X448KeyPairOptions<"pem", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "x448", + options: X448KeyPairOptions<"der", "pem">, + ): KeyPairSyncResult; + function generateKeyPairSync( + type: "x448", + options: X448KeyPairOptions<"der", "der">, + ): KeyPairSyncResult; + function generateKeyPairSync(type: "x448", options?: X448KeyPairKeyObjectOptions): KeyPairKeyObjectResult; + /** + * Generates a new asymmetric key pair of the given `type`. RSA, RSA-PSS, DSA, EC, + * Ed25519, Ed448, X25519, X448, and DH are currently supported. + * + * If a `publicKeyEncoding` or `privateKeyEncoding` was specified, this function + * behaves as if `keyObject.export()` had been called on its result. Otherwise, + * the respective part of the key is returned as a `KeyObject`. + * + * It is recommended to encode public keys as `'spki'` and private keys as`'pkcs8'` with encryption for long-term storage: + * + * ```js + * const { + * generateKeyPair, + * } = await import('node:crypto'); + * + * generateKeyPair('rsa', { + * modulusLength: 4096, + * publicKeyEncoding: { + * type: 'spki', + * format: 'pem', + * }, + * privateKeyEncoding: { + * type: 'pkcs8', + * format: 'pem', + * cipher: 'aes-256-cbc', + * passphrase: 'top secret', + * }, + * }, (err, publicKey, privateKey) => { + * // Handle errors and use the generated key pair. + * }); + * ``` + * + * On completion, `callback` will be called with `err` set to `undefined` and`publicKey` / `privateKey` representing the generated key pair. + * + * If this method is invoked as its `util.promisify()` ed version, it returns + * a `Promise` for an `Object` with `publicKey` and `privateKey` properties. + * @since v10.12.0 + * @param type Must be `'rsa'`, `'rsa-pss'`, `'dsa'`, `'ec'`, `'ed25519'`, `'ed448'`, `'x25519'`, `'x448'`, or `'dh'`. + */ + function generateKeyPair( + type: "rsa", + options: RSAKeyPairOptions<"pem", "pem">, + callback: (err: Error | null, publicKey: string, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "rsa", + options: RSAKeyPairOptions<"pem", "der">, + callback: (err: Error | null, publicKey: string, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "rsa", + options: RSAKeyPairOptions<"der", "pem">, + callback: (err: Error | null, publicKey: Buffer, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "rsa", + options: RSAKeyPairOptions<"der", "der">, + callback: (err: Error | null, publicKey: Buffer, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "rsa", + options: RSAKeyPairKeyObjectOptions, + callback: (err: Error | null, publicKey: KeyObject, privateKey: KeyObject) => void, + ): void; + function generateKeyPair( + type: "rsa-pss", + options: RSAPSSKeyPairOptions<"pem", "pem">, + callback: (err: Error | null, publicKey: string, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "rsa-pss", + options: RSAPSSKeyPairOptions<"pem", "der">, + callback: (err: Error | null, publicKey: string, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "rsa-pss", + options: RSAPSSKeyPairOptions<"der", "pem">, + callback: (err: Error | null, publicKey: Buffer, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "rsa-pss", + options: RSAPSSKeyPairOptions<"der", "der">, + callback: (err: Error | null, publicKey: Buffer, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "rsa-pss", + options: RSAPSSKeyPairKeyObjectOptions, + callback: (err: Error | null, publicKey: KeyObject, privateKey: KeyObject) => void, + ): void; + function generateKeyPair( + type: "dsa", + options: DSAKeyPairOptions<"pem", "pem">, + callback: (err: Error | null, publicKey: string, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "dsa", + options: DSAKeyPairOptions<"pem", "der">, + callback: (err: Error | null, publicKey: string, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "dsa", + options: DSAKeyPairOptions<"der", "pem">, + callback: (err: Error | null, publicKey: Buffer, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "dsa", + options: DSAKeyPairOptions<"der", "der">, + callback: (err: Error | null, publicKey: Buffer, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "dsa", + options: DSAKeyPairKeyObjectOptions, + callback: (err: Error | null, publicKey: KeyObject, privateKey: KeyObject) => void, + ): void; + function generateKeyPair( + type: "ec", + options: ECKeyPairOptions<"pem", "pem">, + callback: (err: Error | null, publicKey: string, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "ec", + options: ECKeyPairOptions<"pem", "der">, + callback: (err: Error | null, publicKey: string, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "ec", + options: ECKeyPairOptions<"der", "pem">, + callback: (err: Error | null, publicKey: Buffer, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "ec", + options: ECKeyPairOptions<"der", "der">, + callback: (err: Error | null, publicKey: Buffer, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "ec", + options: ECKeyPairKeyObjectOptions, + callback: (err: Error | null, publicKey: KeyObject, privateKey: KeyObject) => void, + ): void; + function generateKeyPair( + type: "ed25519", + options: ED25519KeyPairOptions<"pem", "pem">, + callback: (err: Error | null, publicKey: string, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "ed25519", + options: ED25519KeyPairOptions<"pem", "der">, + callback: (err: Error | null, publicKey: string, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "ed25519", + options: ED25519KeyPairOptions<"der", "pem">, + callback: (err: Error | null, publicKey: Buffer, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "ed25519", + options: ED25519KeyPairOptions<"der", "der">, + callback: (err: Error | null, publicKey: Buffer, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "ed25519", + options: ED25519KeyPairKeyObjectOptions | undefined, + callback: (err: Error | null, publicKey: KeyObject, privateKey: KeyObject) => void, + ): void; + function generateKeyPair( + type: "ed448", + options: ED448KeyPairOptions<"pem", "pem">, + callback: (err: Error | null, publicKey: string, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "ed448", + options: ED448KeyPairOptions<"pem", "der">, + callback: (err: Error | null, publicKey: string, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "ed448", + options: ED448KeyPairOptions<"der", "pem">, + callback: (err: Error | null, publicKey: Buffer, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "ed448", + options: ED448KeyPairOptions<"der", "der">, + callback: (err: Error | null, publicKey: Buffer, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "ed448", + options: ED448KeyPairKeyObjectOptions | undefined, + callback: (err: Error | null, publicKey: KeyObject, privateKey: KeyObject) => void, + ): void; + function generateKeyPair( + type: "x25519", + options: X25519KeyPairOptions<"pem", "pem">, + callback: (err: Error | null, publicKey: string, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "x25519", + options: X25519KeyPairOptions<"pem", "der">, + callback: (err: Error | null, publicKey: string, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "x25519", + options: X25519KeyPairOptions<"der", "pem">, + callback: (err: Error | null, publicKey: Buffer, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "x25519", + options: X25519KeyPairOptions<"der", "der">, + callback: (err: Error | null, publicKey: Buffer, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "x25519", + options: X25519KeyPairKeyObjectOptions | undefined, + callback: (err: Error | null, publicKey: KeyObject, privateKey: KeyObject) => void, + ): void; + function generateKeyPair( + type: "x448", + options: X448KeyPairOptions<"pem", "pem">, + callback: (err: Error | null, publicKey: string, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "x448", + options: X448KeyPairOptions<"pem", "der">, + callback: (err: Error | null, publicKey: string, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "x448", + options: X448KeyPairOptions<"der", "pem">, + callback: (err: Error | null, publicKey: Buffer, privateKey: string) => void, + ): void; + function generateKeyPair( + type: "x448", + options: X448KeyPairOptions<"der", "der">, + callback: (err: Error | null, publicKey: Buffer, privateKey: Buffer) => void, + ): void; + function generateKeyPair( + type: "x448", + options: X448KeyPairKeyObjectOptions | undefined, + callback: (err: Error | null, publicKey: KeyObject, privateKey: KeyObject) => void, + ): void; + namespace generateKeyPair { + function __promisify__( + type: "rsa", + options: RSAKeyPairOptions<"pem", "pem">, + ): Promise<{ + publicKey: string; + privateKey: string; + }>; + function __promisify__( + type: "rsa", + options: RSAKeyPairOptions<"pem", "der">, + ): Promise<{ + publicKey: string; + privateKey: Buffer; + }>; + function __promisify__( + type: "rsa", + options: RSAKeyPairOptions<"der", "pem">, + ): Promise<{ + publicKey: Buffer; + privateKey: string; + }>; + function __promisify__( + type: "rsa", + options: RSAKeyPairOptions<"der", "der">, + ): Promise<{ + publicKey: Buffer; + privateKey: Buffer; + }>; + function __promisify__(type: "rsa", options: RSAKeyPairKeyObjectOptions): Promise; + function __promisify__( + type: "rsa-pss", + options: RSAPSSKeyPairOptions<"pem", "pem">, + ): Promise<{ + publicKey: string; + privateKey: string; + }>; + function __promisify__( + type: "rsa-pss", + options: RSAPSSKeyPairOptions<"pem", "der">, + ): Promise<{ + publicKey: string; + privateKey: Buffer; + }>; + function __promisify__( + type: "rsa-pss", + options: RSAPSSKeyPairOptions<"der", "pem">, + ): Promise<{ + publicKey: Buffer; + privateKey: string; + }>; + function __promisify__( + type: "rsa-pss", + options: RSAPSSKeyPairOptions<"der", "der">, + ): Promise<{ + publicKey: Buffer; + privateKey: Buffer; + }>; + function __promisify__( + type: "rsa-pss", + options: RSAPSSKeyPairKeyObjectOptions, + ): Promise; + function __promisify__( + type: "dsa", + options: DSAKeyPairOptions<"pem", "pem">, + ): Promise<{ + publicKey: string; + privateKey: string; + }>; + function __promisify__( + type: "dsa", + options: DSAKeyPairOptions<"pem", "der">, + ): Promise<{ + publicKey: string; + privateKey: Buffer; + }>; + function __promisify__( + type: "dsa", + options: DSAKeyPairOptions<"der", "pem">, + ): Promise<{ + publicKey: Buffer; + privateKey: string; + }>; + function __promisify__( + type: "dsa", + options: DSAKeyPairOptions<"der", "der">, + ): Promise<{ + publicKey: Buffer; + privateKey: Buffer; + }>; + function __promisify__(type: "dsa", options: DSAKeyPairKeyObjectOptions): Promise; + function __promisify__( + type: "ec", + options: ECKeyPairOptions<"pem", "pem">, + ): Promise<{ + publicKey: string; + privateKey: string; + }>; + function __promisify__( + type: "ec", + options: ECKeyPairOptions<"pem", "der">, + ): Promise<{ + publicKey: string; + privateKey: Buffer; + }>; + function __promisify__( + type: "ec", + options: ECKeyPairOptions<"der", "pem">, + ): Promise<{ + publicKey: Buffer; + privateKey: string; + }>; + function __promisify__( + type: "ec", + options: ECKeyPairOptions<"der", "der">, + ): Promise<{ + publicKey: Buffer; + privateKey: Buffer; + }>; + function __promisify__(type: "ec", options: ECKeyPairKeyObjectOptions): Promise; + function __promisify__( + type: "ed25519", + options: ED25519KeyPairOptions<"pem", "pem">, + ): Promise<{ + publicKey: string; + privateKey: string; + }>; + function __promisify__( + type: "ed25519", + options: ED25519KeyPairOptions<"pem", "der">, + ): Promise<{ + publicKey: string; + privateKey: Buffer; + }>; + function __promisify__( + type: "ed25519", + options: ED25519KeyPairOptions<"der", "pem">, + ): Promise<{ + publicKey: Buffer; + privateKey: string; + }>; + function __promisify__( + type: "ed25519", + options: ED25519KeyPairOptions<"der", "der">, + ): Promise<{ + publicKey: Buffer; + privateKey: Buffer; + }>; + function __promisify__( + type: "ed25519", + options?: ED25519KeyPairKeyObjectOptions, + ): Promise; + function __promisify__( + type: "ed448", + options: ED448KeyPairOptions<"pem", "pem">, + ): Promise<{ + publicKey: string; + privateKey: string; + }>; + function __promisify__( + type: "ed448", + options: ED448KeyPairOptions<"pem", "der">, + ): Promise<{ + publicKey: string; + privateKey: Buffer; + }>; + function __promisify__( + type: "ed448", + options: ED448KeyPairOptions<"der", "pem">, + ): Promise<{ + publicKey: Buffer; + privateKey: string; + }>; + function __promisify__( + type: "ed448", + options: ED448KeyPairOptions<"der", "der">, + ): Promise<{ + publicKey: Buffer; + privateKey: Buffer; + }>; + function __promisify__(type: "ed448", options?: ED448KeyPairKeyObjectOptions): Promise; + function __promisify__( + type: "x25519", + options: X25519KeyPairOptions<"pem", "pem">, + ): Promise<{ + publicKey: string; + privateKey: string; + }>; + function __promisify__( + type: "x25519", + options: X25519KeyPairOptions<"pem", "der">, + ): Promise<{ + publicKey: string; + privateKey: Buffer; + }>; + function __promisify__( + type: "x25519", + options: X25519KeyPairOptions<"der", "pem">, + ): Promise<{ + publicKey: Buffer; + privateKey: string; + }>; + function __promisify__( + type: "x25519", + options: X25519KeyPairOptions<"der", "der">, + ): Promise<{ + publicKey: Buffer; + privateKey: Buffer; + }>; + function __promisify__( + type: "x25519", + options?: X25519KeyPairKeyObjectOptions, + ): Promise; + function __promisify__( + type: "x448", + options: X448KeyPairOptions<"pem", "pem">, + ): Promise<{ + publicKey: string; + privateKey: string; + }>; + function __promisify__( + type: "x448", + options: X448KeyPairOptions<"pem", "der">, + ): Promise<{ + publicKey: string; + privateKey: Buffer; + }>; + function __promisify__( + type: "x448", + options: X448KeyPairOptions<"der", "pem">, + ): Promise<{ + publicKey: Buffer; + privateKey: string; + }>; + function __promisify__( + type: "x448", + options: X448KeyPairOptions<"der", "der">, + ): Promise<{ + publicKey: Buffer; + privateKey: Buffer; + }>; + function __promisify__(type: "x448", options?: X448KeyPairKeyObjectOptions): Promise; + } + /** + * Calculates and returns the signature for `data` using the given private key and + * algorithm. If `algorithm` is `null` or `undefined`, then the algorithm is + * dependent upon the key type (especially Ed25519 and Ed448). + * + * If `key` is not a `KeyObject`, this function behaves as if `key` had been + * passed to {@link createPrivateKey}. If it is an object, the following + * additional properties can be passed: + * + * If the `callback` function is provided this function uses libuv's threadpool. + * @since v12.0.0 + */ + function sign( + algorithm: string | null | undefined, + data: NodeJS.ArrayBufferView, + key: KeyLike | SignKeyObjectInput | SignPrivateKeyInput, + ): Buffer; + function sign( + algorithm: string | null | undefined, + data: NodeJS.ArrayBufferView, + key: KeyLike | SignKeyObjectInput | SignPrivateKeyInput, + callback: (error: Error | null, data: Buffer) => void, + ): void; + /** + * Verifies the given signature for `data` using the given key and algorithm. If`algorithm` is `null` or `undefined`, then the algorithm is dependent upon the + * key type (especially Ed25519 and Ed448). + * + * If `key` is not a `KeyObject`, this function behaves as if `key` had been + * passed to {@link createPublicKey}. If it is an object, the following + * additional properties can be passed: + * + * The `signature` argument is the previously calculated signature for the `data`. + * + * Because public keys can be derived from private keys, a private key or a public + * key may be passed for `key`. + * + * If the `callback` function is provided this function uses libuv's threadpool. + * @since v12.0.0 + */ + function verify( + algorithm: string | null | undefined, + data: NodeJS.ArrayBufferView, + key: KeyLike | VerifyKeyObjectInput | VerifyPublicKeyInput | VerifyJsonWebKeyInput, + signature: NodeJS.ArrayBufferView, + ): boolean; + function verify( + algorithm: string | null | undefined, + data: NodeJS.ArrayBufferView, + key: KeyLike | VerifyKeyObjectInput | VerifyPublicKeyInput | VerifyJsonWebKeyInput, + signature: NodeJS.ArrayBufferView, + callback: (error: Error | null, result: boolean) => void, + ): void; + /** + * Computes the Diffie-Hellman secret based on a `privateKey` and a `publicKey`. + * Both keys must have the same `asymmetricKeyType`, which must be one of `'dh'`(for Diffie-Hellman), `'ec'` (for ECDH), `'x448'`, or `'x25519'` (for ECDH-ES). + * @since v13.9.0, v12.17.0 + */ + function diffieHellman(options: { privateKey: KeyObject; publicKey: KeyObject }): Buffer; + type CipherMode = "cbc" | "ccm" | "cfb" | "ctr" | "ecb" | "gcm" | "ocb" | "ofb" | "stream" | "wrap" | "xts"; + interface CipherInfoOptions { + /** + * A test key length. + */ + keyLength?: number | undefined; + /** + * A test IV length. + */ + ivLength?: number | undefined; + } + interface CipherInfo { + /** + * The name of the cipher. + */ + name: string; + /** + * The nid of the cipher. + */ + nid: number; + /** + * The block size of the cipher in bytes. + * This property is omitted when mode is 'stream'. + */ + blockSize?: number | undefined; + /** + * The expected or default initialization vector length in bytes. + * This property is omitted if the cipher does not use an initialization vector. + */ + ivLength?: number | undefined; + /** + * The expected or default key length in bytes. + */ + keyLength: number; + /** + * The cipher mode. + */ + mode: CipherMode; + } + /** + * Returns information about a given cipher. + * + * Some ciphers accept variable length keys and initialization vectors. By default, + * the `crypto.getCipherInfo()` method will return the default values for these + * ciphers. To test if a given key length or iv length is acceptable for given + * cipher, use the `keyLength` and `ivLength` options. If the given values are + * unacceptable, `undefined` will be returned. + * @since v15.0.0 + * @param nameOrNid The name or nid of the cipher to query. + */ + function getCipherInfo(nameOrNid: string | number, options?: CipherInfoOptions): CipherInfo | undefined; + /** + * HKDF is a simple key derivation function defined in RFC 5869\. The given `ikm`,`salt` and `info` are used with the `digest` to derive a key of `keylen` bytes. + * + * The supplied `callback` function is called with two arguments: `err` and`derivedKey`. If an errors occurs while deriving the key, `err` will be set; + * otherwise `err` will be `null`. The successfully generated `derivedKey` will + * be passed to the callback as an [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer). An error will be thrown if any + * of the input arguments specify invalid values or types. + * + * ```js + * import { Buffer } from 'node:buffer'; + * const { + * hkdf, + * } = await import('node:crypto'); + * + * hkdf('sha512', 'key', 'salt', 'info', 64, (err, derivedKey) => { + * if (err) throw err; + * console.log(Buffer.from(derivedKey).toString('hex')); // '24156e2...5391653' + * }); + * ``` + * @since v15.0.0 + * @param digest The digest algorithm to use. + * @param ikm The input keying material. Must be provided but can be zero-length. + * @param salt The salt value. Must be provided but can be zero-length. + * @param info Additional info value. Must be provided but can be zero-length, and cannot be more than 1024 bytes. + * @param keylen The length of the key to generate. Must be greater than 0. The maximum allowable value is `255` times the number of bytes produced by the selected digest function (e.g. `sha512` + * generates 64-byte hashes, making the maximum HKDF output 16320 bytes). + */ + function hkdf( + digest: string, + irm: BinaryLike | KeyObject, + salt: BinaryLike, + info: BinaryLike, + keylen: number, + callback: (err: Error | null, derivedKey: ArrayBuffer) => void, + ): void; + /** + * Provides a synchronous HKDF key derivation function as defined in RFC 5869\. The + * given `ikm`, `salt` and `info` are used with the `digest` to derive a key of`keylen` bytes. + * + * The successfully generated `derivedKey` will be returned as an [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer). + * + * An error will be thrown if any of the input arguments specify invalid values or + * types, or if the derived key cannot be generated. + * + * ```js + * import { Buffer } from 'node:buffer'; + * const { + * hkdfSync, + * } = await import('node:crypto'); + * + * const derivedKey = hkdfSync('sha512', 'key', 'salt', 'info', 64); + * console.log(Buffer.from(derivedKey).toString('hex')); // '24156e2...5391653' + * ``` + * @since v15.0.0 + * @param digest The digest algorithm to use. + * @param ikm The input keying material. Must be provided but can be zero-length. + * @param salt The salt value. Must be provided but can be zero-length. + * @param info Additional info value. Must be provided but can be zero-length, and cannot be more than 1024 bytes. + * @param keylen The length of the key to generate. Must be greater than 0. The maximum allowable value is `255` times the number of bytes produced by the selected digest function (e.g. `sha512` + * generates 64-byte hashes, making the maximum HKDF output 16320 bytes). + */ + function hkdfSync( + digest: string, + ikm: BinaryLike | KeyObject, + salt: BinaryLike, + info: BinaryLike, + keylen: number, + ): ArrayBuffer; + interface SecureHeapUsage { + /** + * The total allocated secure heap size as specified using the `--secure-heap=n` command-line flag. + */ + total: number; + /** + * The minimum allocation from the secure heap as specified using the `--secure-heap-min` command-line flag. + */ + min: number; + /** + * The total number of bytes currently allocated from the secure heap. + */ + used: number; + /** + * The calculated ratio of `used` to `total` allocated bytes. + */ + utilization: number; + } + /** + * @since v15.6.0 + */ + function secureHeapUsed(): SecureHeapUsage; + interface RandomUUIDOptions { + /** + * By default, to improve performance, + * Node.js will pre-emptively generate and persistently cache enough + * random data to generate up to 128 random UUIDs. To generate a UUID + * without using the cache, set `disableEntropyCache` to `true`. + * + * @default `false` + */ + disableEntropyCache?: boolean | undefined; + } + /** + * Generates a random [RFC 4122](https://www.rfc-editor.org/rfc/rfc4122.txt) version 4 UUID. The UUID is generated using a + * cryptographic pseudorandom number generator. + * @since v15.6.0, v14.17.0 + */ + function randomUUID(options?: RandomUUIDOptions): string; + interface X509CheckOptions { + /** + * @default 'always' + */ + subject?: "always" | "default" | "never"; + /** + * @default true + */ + wildcards?: boolean; + /** + * @default true + */ + partialWildcards?: boolean; + /** + * @default false + */ + multiLabelWildcards?: boolean; + /** + * @default false + */ + singleLabelSubdomains?: boolean; + } + /** + * Encapsulates an X509 certificate and provides read-only access to + * its information. + * + * ```js + * const { X509Certificate } = await import('node:crypto'); + * + * const x509 = new X509Certificate('{... pem encoded cert ...}'); + * + * console.log(x509.subject); + * ``` + * @since v15.6.0 + */ + class X509Certificate { + /** + * Will be \`true\` if this is a Certificate Authority (CA) certificate. + * @since v15.6.0 + */ + readonly ca: boolean; + /** + * The SHA-1 fingerprint of this certificate. + * + * Because SHA-1 is cryptographically broken and because the security of SHA-1 is + * significantly worse than that of algorithms that are commonly used to sign + * certificates, consider using `x509.fingerprint256` instead. + * @since v15.6.0 + */ + readonly fingerprint: string; + /** + * The SHA-256 fingerprint of this certificate. + * @since v15.6.0 + */ + readonly fingerprint256: string; + /** + * The SHA-512 fingerprint of this certificate. + * + * Because computing the SHA-256 fingerprint is usually faster and because it is + * only half the size of the SHA-512 fingerprint, `x509.fingerprint256` may be + * a better choice. While SHA-512 presumably provides a higher level of security in + * general, the security of SHA-256 matches that of most algorithms that are + * commonly used to sign certificates. + * @since v17.2.0, v16.14.0 + */ + readonly fingerprint512: string; + /** + * The complete subject of this certificate. + * @since v15.6.0 + */ + readonly subject: string; + /** + * The subject alternative name specified for this certificate. + * + * This is a comma-separated list of subject alternative names. Each entry begins + * with a string identifying the kind of the subject alternative name followed by + * a colon and the value associated with the entry. + * + * Earlier versions of Node.js incorrectly assumed that it is safe to split this + * property at the two-character sequence `', '` (see [CVE-2021-44532](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-44532)). However, + * both malicious and legitimate certificates can contain subject alternative names + * that include this sequence when represented as a string. + * + * After the prefix denoting the type of the entry, the remainder of each entry + * might be enclosed in quotes to indicate that the value is a JSON string literal. + * For backward compatibility, Node.js only uses JSON string literals within this + * property when necessary to avoid ambiguity. Third-party code should be prepared + * to handle both possible entry formats. + * @since v15.6.0 + */ + readonly subjectAltName: string | undefined; + /** + * A textual representation of the certificate's authority information access + * extension. + * + * This is a line feed separated list of access descriptions. Each line begins with + * the access method and the kind of the access location, followed by a colon and + * the value associated with the access location. + * + * After the prefix denoting the access method and the kind of the access location, + * the remainder of each line might be enclosed in quotes to indicate that the + * value is a JSON string literal. For backward compatibility, Node.js only uses + * JSON string literals within this property when necessary to avoid ambiguity. + * Third-party code should be prepared to handle both possible entry formats. + * @since v15.6.0 + */ + readonly infoAccess: string | undefined; + /** + * An array detailing the key usages for this certificate. + * @since v15.6.0 + */ + readonly keyUsage: string[]; + /** + * The issuer identification included in this certificate. + * @since v15.6.0 + */ + readonly issuer: string; + /** + * The issuer certificate or `undefined` if the issuer certificate is not + * available. + * @since v15.9.0 + */ + readonly issuerCertificate?: X509Certificate | undefined; + /** + * The public key `KeyObject` for this certificate. + * @since v15.6.0 + */ + readonly publicKey: KeyObject; + /** + * A `Buffer` containing the DER encoding of this certificate. + * @since v15.6.0 + */ + readonly raw: Buffer; + /** + * The serial number of this certificate. + * + * Serial numbers are assigned by certificate authorities and do not uniquely + * identify certificates. Consider using `x509.fingerprint256` as a unique + * identifier instead. + * @since v15.6.0 + */ + readonly serialNumber: string; + /** + * The date/time from which this certificate is considered valid. + * @since v15.6.0 + */ + readonly validFrom: string; + /** + * The date/time until which this certificate is considered valid. + * @since v15.6.0 + */ + readonly validTo: string; + constructor(buffer: BinaryLike); + /** + * Checks whether the certificate matches the given email address. + * + * If the `'subject'` option is undefined or set to `'default'`, the certificate + * subject is only considered if the subject alternative name extension either does + * not exist or does not contain any email addresses. + * + * If the `'subject'` option is set to `'always'` and if the subject alternative + * name extension either does not exist or does not contain a matching email + * address, the certificate subject is considered. + * + * If the `'subject'` option is set to `'never'`, the certificate subject is never + * considered, even if the certificate contains no subject alternative names. + * @since v15.6.0 + * @return Returns `email` if the certificate matches, `undefined` if it does not. + */ + checkEmail(email: string, options?: Pick): string | undefined; + /** + * Checks whether the certificate matches the given host name. + * + * If the certificate matches the given host name, the matching subject name is + * returned. The returned name might be an exact match (e.g., `foo.example.com`) + * or it might contain wildcards (e.g., `*.example.com`). Because host name + * comparisons are case-insensitive, the returned subject name might also differ + * from the given `name` in capitalization. + * + * If the `'subject'` option is undefined or set to `'default'`, the certificate + * subject is only considered if the subject alternative name extension either does + * not exist or does not contain any DNS names. This behavior is consistent with [RFC 2818](https://www.rfc-editor.org/rfc/rfc2818.txt) ("HTTP Over TLS"). + * + * If the `'subject'` option is set to `'always'` and if the subject alternative + * name extension either does not exist or does not contain a matching DNS name, + * the certificate subject is considered. + * + * If the `'subject'` option is set to `'never'`, the certificate subject is never + * considered, even if the certificate contains no subject alternative names. + * @since v15.6.0 + * @return Returns a subject name that matches `name`, or `undefined` if no subject name matches `name`. + */ + checkHost(name: string, options?: X509CheckOptions): string | undefined; + /** + * Checks whether the certificate matches the given IP address (IPv4 or IPv6). + * + * Only [RFC 5280](https://www.rfc-editor.org/rfc/rfc5280.txt) `iPAddress` subject alternative names are considered, and they + * must match the given `ip` address exactly. Other subject alternative names as + * well as the subject field of the certificate are ignored. + * @since v15.6.0 + * @return Returns `ip` if the certificate matches, `undefined` if it does not. + */ + checkIP(ip: string): string | undefined; + /** + * Checks whether this certificate was issued by the given `otherCert`. + * @since v15.6.0 + */ + checkIssued(otherCert: X509Certificate): boolean; + /** + * Checks whether the public key for this certificate is consistent with + * the given private key. + * @since v15.6.0 + * @param privateKey A private key. + */ + checkPrivateKey(privateKey: KeyObject): boolean; + /** + * There is no standard JSON encoding for X509 certificates. The`toJSON()` method returns a string containing the PEM encoded + * certificate. + * @since v15.6.0 + */ + toJSON(): string; + /** + * Returns information about this certificate using the legacy `certificate object` encoding. + * @since v15.6.0 + */ + toLegacyObject(): PeerCertificate; + /** + * Returns the PEM-encoded certificate. + * @since v15.6.0 + */ + toString(): string; + /** + * Verifies that this certificate was signed by the given public key. + * Does not perform any other validation checks on the certificate. + * @since v15.6.0 + * @param publicKey A public key. + */ + verify(publicKey: KeyObject): boolean; + } + type LargeNumberLike = NodeJS.ArrayBufferView | SharedArrayBuffer | ArrayBuffer | bigint; + interface GeneratePrimeOptions { + add?: LargeNumberLike | undefined; + rem?: LargeNumberLike | undefined; + /** + * @default false + */ + safe?: boolean | undefined; + bigint?: boolean | undefined; + } + interface GeneratePrimeOptionsBigInt extends GeneratePrimeOptions { + bigint: true; + } + interface GeneratePrimeOptionsArrayBuffer extends GeneratePrimeOptions { + bigint?: false | undefined; + } + /** + * Generates a pseudorandom prime of `size` bits. + * + * If `options.safe` is `true`, the prime will be a safe prime -- that is,`(prime - 1) / 2` will also be a prime. + * + * The `options.add` and `options.rem` parameters can be used to enforce additional + * requirements, e.g., for Diffie-Hellman: + * + * * If `options.add` and `options.rem` are both set, the prime will satisfy the + * condition that `prime % add = rem`. + * * If only `options.add` is set and `options.safe` is not `true`, the prime will + * satisfy the condition that `prime % add = 1`. + * * If only `options.add` is set and `options.safe` is set to `true`, the prime + * will instead satisfy the condition that `prime % add = 3`. This is necessary + * because `prime % add = 1` for `options.add > 2` would contradict the condition + * enforced by `options.safe`. + * * `options.rem` is ignored if `options.add` is not given. + * + * Both `options.add` and `options.rem` must be encoded as big-endian sequences + * if given as an `ArrayBuffer`, `SharedArrayBuffer`, `TypedArray`, `Buffer`, or`DataView`. + * + * By default, the prime is encoded as a big-endian sequence of octets + * in an [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer). If the `bigint` option is `true`, then a + * [bigint](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt) is provided. + * @since v15.8.0 + * @param size The size (in bits) of the prime to generate. + */ + function generatePrime(size: number, callback: (err: Error | null, prime: ArrayBuffer) => void): void; + function generatePrime( + size: number, + options: GeneratePrimeOptionsBigInt, + callback: (err: Error | null, prime: bigint) => void, + ): void; + function generatePrime( + size: number, + options: GeneratePrimeOptionsArrayBuffer, + callback: (err: Error | null, prime: ArrayBuffer) => void, + ): void; + function generatePrime( + size: number, + options: GeneratePrimeOptions, + callback: (err: Error | null, prime: ArrayBuffer | bigint) => void, + ): void; + /** + * Generates a pseudorandom prime of `size` bits. + * + * If `options.safe` is `true`, the prime will be a safe prime -- that is,`(prime - 1) / 2` will also be a prime. + * + * The `options.add` and `options.rem` parameters can be used to enforce additional + * requirements, e.g., for Diffie-Hellman: + * + * * If `options.add` and `options.rem` are both set, the prime will satisfy the + * condition that `prime % add = rem`. + * * If only `options.add` is set and `options.safe` is not `true`, the prime will + * satisfy the condition that `prime % add = 1`. + * * If only `options.add` is set and `options.safe` is set to `true`, the prime + * will instead satisfy the condition that `prime % add = 3`. This is necessary + * because `prime % add = 1` for `options.add > 2` would contradict the condition + * enforced by `options.safe`. + * * `options.rem` is ignored if `options.add` is not given. + * + * Both `options.add` and `options.rem` must be encoded as big-endian sequences + * if given as an `ArrayBuffer`, `SharedArrayBuffer`, `TypedArray`, `Buffer`, or`DataView`. + * + * By default, the prime is encoded as a big-endian sequence of octets + * in an [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer). If the `bigint` option is `true`, then a + * [bigint](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt) is provided. + * @since v15.8.0 + * @param size The size (in bits) of the prime to generate. + */ + function generatePrimeSync(size: number): ArrayBuffer; + function generatePrimeSync(size: number, options: GeneratePrimeOptionsBigInt): bigint; + function generatePrimeSync(size: number, options: GeneratePrimeOptionsArrayBuffer): ArrayBuffer; + function generatePrimeSync(size: number, options: GeneratePrimeOptions): ArrayBuffer | bigint; + interface CheckPrimeOptions { + /** + * The number of Miller-Rabin probabilistic primality iterations to perform. + * When the value is 0 (zero), a number of checks is used that yields a false positive rate of at most `2**-64` for random input. + * Care must be used when selecting a number of checks. + * Refer to the OpenSSL documentation for the BN_is_prime_ex function nchecks options for more details. + * + * @default 0 + */ + checks?: number | undefined; + } + /** + * Checks the primality of the `candidate`. + * @since v15.8.0 + * @param candidate A possible prime encoded as a sequence of big endian octets of arbitrary length. + */ + function checkPrime(value: LargeNumberLike, callback: (err: Error | null, result: boolean) => void): void; + function checkPrime( + value: LargeNumberLike, + options: CheckPrimeOptions, + callback: (err: Error | null, result: boolean) => void, + ): void; + /** + * Checks the primality of the `candidate`. + * @since v15.8.0 + * @param candidate A possible prime encoded as a sequence of big endian octets of arbitrary length. + * @return `true` if the candidate is a prime with an error probability less than `0.25 ** options.checks`. + */ + function checkPrimeSync(candidate: LargeNumberLike, options?: CheckPrimeOptions): boolean; + /** + * Load and set the `engine` for some or all OpenSSL functions (selected by flags). + * + * `engine` could be either an id or a path to the engine's shared library. + * + * The optional `flags` argument uses `ENGINE_METHOD_ALL` by default. The `flags`is a bit field taking one of or a mix of the following flags (defined in`crypto.constants`): + * + * * `crypto.constants.ENGINE_METHOD_RSA` + * * `crypto.constants.ENGINE_METHOD_DSA` + * * `crypto.constants.ENGINE_METHOD_DH` + * * `crypto.constants.ENGINE_METHOD_RAND` + * * `crypto.constants.ENGINE_METHOD_EC` + * * `crypto.constants.ENGINE_METHOD_CIPHERS` + * * `crypto.constants.ENGINE_METHOD_DIGESTS` + * * `crypto.constants.ENGINE_METHOD_PKEY_METHS` + * * `crypto.constants.ENGINE_METHOD_PKEY_ASN1_METHS` + * * `crypto.constants.ENGINE_METHOD_ALL` + * * `crypto.constants.ENGINE_METHOD_NONE` + * @since v0.11.11 + * @param flags + */ + function setEngine(engine: string, flags?: number): void; + /** + * A convenient alias for {@link webcrypto.getRandomValues}. This + * implementation is not compliant with the Web Crypto spec, to write + * web-compatible code use {@link webcrypto.getRandomValues} instead. + * @since v17.4.0 + * @return Returns `typedArray`. + */ + function getRandomValues(typedArray: T): T; + /** + * A convenient alias for `crypto.webcrypto.subtle`. + * @since v17.4.0 + */ + const subtle: webcrypto.SubtleCrypto; + /** + * An implementation of the Web Crypto API standard. + * + * See the {@link https://nodejs.org/docs/latest/api/webcrypto.html Web Crypto API documentation} for details. + * @since v15.0.0 + */ + const webcrypto: webcrypto.Crypto; + namespace webcrypto { + type BufferSource = ArrayBufferView | ArrayBuffer; + type KeyFormat = "jwk" | "pkcs8" | "raw" | "spki"; + type KeyType = "private" | "public" | "secret"; + type KeyUsage = + | "decrypt" + | "deriveBits" + | "deriveKey" + | "encrypt" + | "sign" + | "unwrapKey" + | "verify" + | "wrapKey"; + type AlgorithmIdentifier = Algorithm | string; + type HashAlgorithmIdentifier = AlgorithmIdentifier; + type NamedCurve = string; + type BigInteger = Uint8Array; + interface AesCbcParams extends Algorithm { + iv: BufferSource; + } + interface AesCtrParams extends Algorithm { + counter: BufferSource; + length: number; + } + interface AesDerivedKeyParams extends Algorithm { + length: number; + } + interface AesGcmParams extends Algorithm { + additionalData?: BufferSource; + iv: BufferSource; + tagLength?: number; + } + interface AesKeyAlgorithm extends KeyAlgorithm { + length: number; + } + interface AesKeyGenParams extends Algorithm { + length: number; + } + interface Algorithm { + name: string; + } + interface EcKeyAlgorithm extends KeyAlgorithm { + namedCurve: NamedCurve; + } + interface EcKeyGenParams extends Algorithm { + namedCurve: NamedCurve; + } + interface EcKeyImportParams extends Algorithm { + namedCurve: NamedCurve; + } + interface EcdhKeyDeriveParams extends Algorithm { + public: CryptoKey; + } + interface EcdsaParams extends Algorithm { + hash: HashAlgorithmIdentifier; + } + interface Ed448Params extends Algorithm { + context?: BufferSource; + } + interface HkdfParams extends Algorithm { + hash: HashAlgorithmIdentifier; + info: BufferSource; + salt: BufferSource; + } + interface HmacImportParams extends Algorithm { + hash: HashAlgorithmIdentifier; + length?: number; + } + interface HmacKeyAlgorithm extends KeyAlgorithm { + hash: KeyAlgorithm; + length: number; + } + interface HmacKeyGenParams extends Algorithm { + hash: HashAlgorithmIdentifier; + length?: number; + } + interface JsonWebKey { + alg?: string; + crv?: string; + d?: string; + dp?: string; + dq?: string; + e?: string; + ext?: boolean; + k?: string; + key_ops?: string[]; + kty?: string; + n?: string; + oth?: RsaOtherPrimesInfo[]; + p?: string; + q?: string; + qi?: string; + use?: string; + x?: string; + y?: string; + } + interface KeyAlgorithm { + name: string; + } + interface Pbkdf2Params extends Algorithm { + hash: HashAlgorithmIdentifier; + iterations: number; + salt: BufferSource; + } + interface RsaHashedImportParams extends Algorithm { + hash: HashAlgorithmIdentifier; + } + interface RsaHashedKeyAlgorithm extends RsaKeyAlgorithm { + hash: KeyAlgorithm; + } + interface RsaHashedKeyGenParams extends RsaKeyGenParams { + hash: HashAlgorithmIdentifier; + } + interface RsaKeyAlgorithm extends KeyAlgorithm { + modulusLength: number; + publicExponent: BigInteger; + } + interface RsaKeyGenParams extends Algorithm { + modulusLength: number; + publicExponent: BigInteger; + } + interface RsaOaepParams extends Algorithm { + label?: BufferSource; + } + interface RsaOtherPrimesInfo { + d?: string; + r?: string; + t?: string; + } + interface RsaPssParams extends Algorithm { + saltLength: number; + } + /** + * Calling `require('node:crypto').webcrypto` returns an instance of the `Crypto` class. + * `Crypto` is a singleton that provides access to the remainder of the crypto API. + * @since v15.0.0 + */ + interface Crypto { + /** + * Provides access to the `SubtleCrypto` API. + * @since v15.0.0 + */ + readonly subtle: SubtleCrypto; + /** + * Generates cryptographically strong random values. + * The given `typedArray` is filled with random values, and a reference to `typedArray` is returned. + * + * The given `typedArray` must be an integer-based instance of {@link NodeJS.TypedArray}, i.e. `Float32Array` and `Float64Array` are not accepted. + * + * An error will be thrown if the given `typedArray` is larger than 65,536 bytes. + * @since v15.0.0 + */ + getRandomValues>(typedArray: T): T; + /** + * Generates a random {@link https://www.rfc-editor.org/rfc/rfc4122.txt RFC 4122} version 4 UUID. + * The UUID is generated using a cryptographic pseudorandom number generator. + * @since v16.7.0 + */ + randomUUID(): string; + CryptoKey: CryptoKeyConstructor; + } + // This constructor throws ILLEGAL_CONSTRUCTOR so it should not be newable. + interface CryptoKeyConstructor { + /** Illegal constructor */ + (_: { readonly _: unique symbol }): never; // Allows instanceof to work but not be callable by the user. + readonly length: 0; + readonly name: "CryptoKey"; + readonly prototype: CryptoKey; + } + /** + * @since v15.0.0 + */ + interface CryptoKey { + /** + * An object detailing the algorithm for which the key can be used along with additional algorithm-specific parameters. + * @since v15.0.0 + */ + readonly algorithm: KeyAlgorithm; + /** + * When `true`, the {@link CryptoKey} can be extracted using either `subtleCrypto.exportKey()` or `subtleCrypto.wrapKey()`. + * @since v15.0.0 + */ + readonly extractable: boolean; + /** + * A string identifying whether the key is a symmetric (`'secret'`) or asymmetric (`'private'` or `'public'`) key. + * @since v15.0.0 + */ + readonly type: KeyType; + /** + * An array of strings identifying the operations for which the key may be used. + * + * The possible usages are: + * - `'encrypt'` - The key may be used to encrypt data. + * - `'decrypt'` - The key may be used to decrypt data. + * - `'sign'` - The key may be used to generate digital signatures. + * - `'verify'` - The key may be used to verify digital signatures. + * - `'deriveKey'` - The key may be used to derive a new key. + * - `'deriveBits'` - The key may be used to derive bits. + * - `'wrapKey'` - The key may be used to wrap another key. + * - `'unwrapKey'` - The key may be used to unwrap another key. + * + * Valid key usages depend on the key algorithm (identified by `cryptokey.algorithm.name`). + * @since v15.0.0 + */ + readonly usages: KeyUsage[]; + } + /** + * The `CryptoKeyPair` is a simple dictionary object with `publicKey` and `privateKey` properties, representing an asymmetric key pair. + * @since v15.0.0 + */ + interface CryptoKeyPair { + /** + * A {@link CryptoKey} whose type will be `'private'`. + * @since v15.0.0 + */ + privateKey: CryptoKey; + /** + * A {@link CryptoKey} whose type will be `'public'`. + * @since v15.0.0 + */ + publicKey: CryptoKey; + } + /** + * @since v15.0.0 + */ + interface SubtleCrypto { + /** + * Using the method and parameters specified in `algorithm` and the keying material provided by `key`, + * `subtle.decrypt()` attempts to decipher the provided `data`. If successful, + * the returned promise will be resolved with an `` containing the plaintext result. + * + * The algorithms currently supported include: + * + * - `'RSA-OAEP'` + * - `'AES-CTR'` + * - `'AES-CBC'` + * - `'AES-GCM'` + * @since v15.0.0 + */ + decrypt( + algorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, + key: CryptoKey, + data: BufferSource, + ): Promise; + /** + * Using the method and parameters specified in `algorithm` and the keying material provided by `baseKey`, + * `subtle.deriveBits()` attempts to generate `length` bits. + * The Node.js implementation requires that when `length` is a number it must be multiple of `8`. + * When `length` is `null` the maximum number of bits for a given algorithm is generated. This is allowed + * for the `'ECDH'`, `'X25519'`, and `'X448'` algorithms. + * If successful, the returned promise will be resolved with an `` containing the generated data. + * + * The algorithms currently supported include: + * + * - `'ECDH'` + * - `'X25519'` + * - `'X448'` + * - `'HKDF'` + * - `'PBKDF2'` + * @since v15.0.0 + */ + deriveBits(algorithm: EcdhKeyDeriveParams, baseKey: CryptoKey, length: number | null): Promise; + deriveBits( + algorithm: AlgorithmIdentifier | HkdfParams | Pbkdf2Params, + baseKey: CryptoKey, + length: number, + ): Promise; + /** + * Using the method and parameters specified in `algorithm`, and the keying material provided by `baseKey`, + * `subtle.deriveKey()` attempts to generate a new ` based on the method and parameters in `derivedKeyAlgorithm`. + * + * Calling `subtle.deriveKey()` is equivalent to calling `subtle.deriveBits()` to generate raw keying material, + * then passing the result into the `subtle.importKey()` method using the `deriveKeyAlgorithm`, `extractable`, and `keyUsages` parameters as input. + * + * The algorithms currently supported include: + * + * - `'ECDH'` + * - `'X25519'` + * - `'X448'` + * - `'HKDF'` + * - `'PBKDF2'` + * @param keyUsages See {@link https://nodejs.org/docs/latest/api/webcrypto.html#cryptokeyusages Key usages}. + * @since v15.0.0 + */ + deriveKey( + algorithm: AlgorithmIdentifier | EcdhKeyDeriveParams | HkdfParams | Pbkdf2Params, + baseKey: CryptoKey, + derivedKeyAlgorithm: + | AlgorithmIdentifier + | AesDerivedKeyParams + | HmacImportParams + | HkdfParams + | Pbkdf2Params, + extractable: boolean, + keyUsages: readonly KeyUsage[], + ): Promise; + /** + * Using the method identified by `algorithm`, `subtle.digest()` attempts to generate a digest of `data`. + * If successful, the returned promise is resolved with an `` containing the computed digest. + * + * If `algorithm` is provided as a ``, it must be one of: + * + * - `'SHA-1'` + * - `'SHA-256'` + * - `'SHA-384'` + * - `'SHA-512'` + * + * If `algorithm` is provided as an ``, it must have a `name` property whose value is one of the above. + * @since v15.0.0 + */ + digest(algorithm: AlgorithmIdentifier, data: BufferSource): Promise; + /** + * Using the method and parameters specified by `algorithm` and the keying material provided by `key`, + * `subtle.encrypt()` attempts to encipher `data`. If successful, + * the returned promise is resolved with an `` containing the encrypted result. + * + * The algorithms currently supported include: + * + * - `'RSA-OAEP'` + * - `'AES-CTR'` + * - `'AES-CBC'` + * - `'AES-GCM'` + * @since v15.0.0 + */ + encrypt( + algorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, + key: CryptoKey, + data: BufferSource, + ): Promise; + /** + * Exports the given key into the specified format, if supported. + * + * If the `` is not extractable, the returned promise will reject. + * + * When `format` is either `'pkcs8'` or `'spki'` and the export is successful, + * the returned promise will be resolved with an `` containing the exported key data. + * + * When `format` is `'jwk'` and the export is successful, the returned promise will be resolved with a + * JavaScript object conforming to the {@link https://tools.ietf.org/html/rfc7517 JSON Web Key} specification. + * @param format Must be one of `'raw'`, `'pkcs8'`, `'spki'`, or `'jwk'`. + * @returns `` containing ``. + * @since v15.0.0 + */ + exportKey(format: "jwk", key: CryptoKey): Promise; + exportKey(format: Exclude, key: CryptoKey): Promise; + /** + * Using the method and parameters provided in `algorithm`, + * `subtle.generateKey()` attempts to generate new keying material. + * Depending the method used, the method may generate either a single `` or a ``. + * + * The `` (public and private key) generating algorithms supported include: + * + * - `'RSASSA-PKCS1-v1_5'` + * - `'RSA-PSS'` + * - `'RSA-OAEP'` + * - `'ECDSA'` + * - `'Ed25519'` + * - `'Ed448'` + * - `'ECDH'` + * - `'X25519'` + * - `'X448'` + * The `` (secret key) generating algorithms supported include: + * + * - `'HMAC'` + * - `'AES-CTR'` + * - `'AES-CBC'` + * - `'AES-GCM'` + * - `'AES-KW'` + * @param keyUsages See {@link https://nodejs.org/docs/latest/api/webcrypto.html#cryptokeyusages Key usages}. + * @since v15.0.0 + */ + generateKey( + algorithm: RsaHashedKeyGenParams | EcKeyGenParams, + extractable: boolean, + keyUsages: readonly KeyUsage[], + ): Promise; + generateKey( + algorithm: AesKeyGenParams | HmacKeyGenParams | Pbkdf2Params, + extractable: boolean, + keyUsages: readonly KeyUsage[], + ): Promise; + generateKey( + algorithm: AlgorithmIdentifier, + extractable: boolean, + keyUsages: KeyUsage[], + ): Promise; + /** + * The `subtle.importKey()` method attempts to interpret the provided `keyData` as the given `format` + * to create a `` instance using the provided `algorithm`, `extractable`, and `keyUsages` arguments. + * If the import is successful, the returned promise will be resolved with the created ``. + * + * If importing a `'PBKDF2'` key, `extractable` must be `false`. + * @param format Must be one of `'raw'`, `'pkcs8'`, `'spki'`, or `'jwk'`. + * @param keyUsages See {@link https://nodejs.org/docs/latest/api/webcrypto.html#cryptokeyusages Key usages}. + * @since v15.0.0 + */ + importKey( + format: "jwk", + keyData: JsonWebKey, + algorithm: + | AlgorithmIdentifier + | RsaHashedImportParams + | EcKeyImportParams + | HmacImportParams + | AesKeyAlgorithm, + extractable: boolean, + keyUsages: readonly KeyUsage[], + ): Promise; + importKey( + format: Exclude, + keyData: BufferSource, + algorithm: + | AlgorithmIdentifier + | RsaHashedImportParams + | EcKeyImportParams + | HmacImportParams + | AesKeyAlgorithm, + extractable: boolean, + keyUsages: KeyUsage[], + ): Promise; + /** + * Using the method and parameters given by `algorithm` and the keying material provided by `key`, + * `subtle.sign()` attempts to generate a cryptographic signature of `data`. If successful, + * the returned promise is resolved with an `` containing the generated signature. + * + * The algorithms currently supported include: + * + * - `'RSASSA-PKCS1-v1_5'` + * - `'RSA-PSS'` + * - `'ECDSA'` + * - `'Ed25519'` + * - `'Ed448'` + * - `'HMAC'` + * @since v15.0.0 + */ + sign( + algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams | Ed448Params, + key: CryptoKey, + data: BufferSource, + ): Promise; + /** + * In cryptography, "wrapping a key" refers to exporting and then encrypting the keying material. + * The `subtle.unwrapKey()` method attempts to decrypt a wrapped key and create a `` instance. + * It is equivalent to calling `subtle.decrypt()` first on the encrypted key data (using the `wrappedKey`, `unwrapAlgo`, and `unwrappingKey` arguments as input) + * then passing the results in to the `subtle.importKey()` method using the `unwrappedKeyAlgo`, `extractable`, and `keyUsages` arguments as inputs. + * If successful, the returned promise is resolved with a `` object. + * + * The wrapping algorithms currently supported include: + * + * - `'RSA-OAEP'` + * - `'AES-CTR'` + * - `'AES-CBC'` + * - `'AES-GCM'` + * - `'AES-KW'` + * + * The unwrapped key algorithms supported include: + * + * - `'RSASSA-PKCS1-v1_5'` + * - `'RSA-PSS'` + * - `'RSA-OAEP'` + * - `'ECDSA'` + * - `'Ed25519'` + * - `'Ed448'` + * - `'ECDH'` + * - `'X25519'` + * - `'X448'` + * - `'HMAC'` + * - `'AES-CTR'` + * - `'AES-CBC'` + * - `'AES-GCM'` + * - `'AES-KW'` + * @param format Must be one of `'raw'`, `'pkcs8'`, `'spki'`, or `'jwk'`. + * @param keyUsages See {@link https://nodejs.org/docs/latest/api/webcrypto.html#cryptokeyusages Key usages}. + * @since v15.0.0 + */ + unwrapKey( + format: KeyFormat, + wrappedKey: BufferSource, + unwrappingKey: CryptoKey, + unwrapAlgorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, + unwrappedKeyAlgorithm: + | AlgorithmIdentifier + | RsaHashedImportParams + | EcKeyImportParams + | HmacImportParams + | AesKeyAlgorithm, + extractable: boolean, + keyUsages: KeyUsage[], + ): Promise; + /** + * Using the method and parameters given in `algorithm` and the keying material provided by `key`, + * `subtle.verify()` attempts to verify that `signature` is a valid cryptographic signature of `data`. + * The returned promise is resolved with either `true` or `false`. + * + * The algorithms currently supported include: + * + * - `'RSASSA-PKCS1-v1_5'` + * - `'RSA-PSS'` + * - `'ECDSA'` + * - `'Ed25519'` + * - `'Ed448'` + * - `'HMAC'` + * @since v15.0.0 + */ + verify( + algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams | Ed448Params, + key: CryptoKey, + signature: BufferSource, + data: BufferSource, + ): Promise; + /** + * In cryptography, "wrapping a key" refers to exporting and then encrypting the keying material. + * The `subtle.wrapKey()` method exports the keying material into the format identified by `format`, + * then encrypts it using the method and parameters specified by `wrapAlgo` and the keying material provided by `wrappingKey`. + * It is the equivalent to calling `subtle.exportKey()` using `format` and `key` as the arguments, + * then passing the result to the `subtle.encrypt()` method using `wrappingKey` and `wrapAlgo` as inputs. + * If successful, the returned promise will be resolved with an `` containing the encrypted key data. + * + * The wrapping algorithms currently supported include: + * + * - `'RSA-OAEP'` + * - `'AES-CTR'` + * - `'AES-CBC'` + * - `'AES-GCM'` + * - `'AES-KW'` + * @param format Must be one of `'raw'`, `'pkcs8'`, `'spki'`, or `'jwk'`. + * @since v15.0.0 + */ + wrapKey( + format: KeyFormat, + key: CryptoKey, + wrappingKey: CryptoKey, + wrapAlgorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, + ): Promise; + } + } +} +declare module "node:crypto" { + export * from "crypto"; +} diff --git a/task/node_modules/@types/node/ts4.8/dgram.d.ts b/task/node_modules/@types/node/ts4.8/dgram.d.ts new file mode 100644 index 0000000..692e547 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/dgram.d.ts @@ -0,0 +1,586 @@ +/** + * The `node:dgram` module provides an implementation of UDP datagram sockets. + * + * ```js + * import dgram from 'node:dgram'; + * + * const server = dgram.createSocket('udp4'); + * + * server.on('error', (err) => { + * console.error(`server error:\n${err.stack}`); + * server.close(); + * }); + * + * server.on('message', (msg, rinfo) => { + * console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`); + * }); + * + * server.on('listening', () => { + * const address = server.address(); + * console.log(`server listening ${address.address}:${address.port}`); + * }); + * + * server.bind(41234); + * // Prints: server listening 0.0.0.0:41234 + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/dgram.js) + */ +declare module "dgram" { + import { AddressInfo } from "node:net"; + import * as dns from "node:dns"; + import { Abortable, EventEmitter } from "node:events"; + interface RemoteInfo { + address: string; + family: "IPv4" | "IPv6"; + port: number; + size: number; + } + interface BindOptions { + port?: number | undefined; + address?: string | undefined; + exclusive?: boolean | undefined; + fd?: number | undefined; + } + type SocketType = "udp4" | "udp6"; + interface SocketOptions extends Abortable { + type: SocketType; + reuseAddr?: boolean | undefined; + /** + * @default false + */ + ipv6Only?: boolean | undefined; + recvBufferSize?: number | undefined; + sendBufferSize?: number | undefined; + lookup?: + | (( + hostname: string, + options: dns.LookupOneOptions, + callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void, + ) => void) + | undefined; + } + /** + * Creates a `dgram.Socket` object. Once the socket is created, calling `socket.bind()` will instruct the socket to begin listening for datagram + * messages. When `address` and `port` are not passed to `socket.bind()` the + * method will bind the socket to the "all interfaces" address on a random port + * (it does the right thing for both `udp4` and `udp6` sockets). The bound address + * and port can be retrieved using `socket.address().address` and `socket.address().port`. + * + * If the `signal` option is enabled, calling `.abort()` on the corresponding`AbortController` is similar to calling `.close()` on the socket: + * + * ```js + * const controller = new AbortController(); + * const { signal } = controller; + * const server = dgram.createSocket({ type: 'udp4', signal }); + * server.on('message', (msg, rinfo) => { + * console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`); + * }); + * // Later, when you want to close the server. + * controller.abort(); + * ``` + * @since v0.11.13 + * @param options Available options are: + * @param callback Attached as a listener for `'message'` events. Optional. + */ + function createSocket(type: SocketType, callback?: (msg: Buffer, rinfo: RemoteInfo) => void): Socket; + function createSocket(options: SocketOptions, callback?: (msg: Buffer, rinfo: RemoteInfo) => void): Socket; + /** + * Encapsulates the datagram functionality. + * + * New instances of `dgram.Socket` are created using {@link createSocket}. + * The `new` keyword is not to be used to create `dgram.Socket` instances. + * @since v0.1.99 + */ + class Socket extends EventEmitter { + /** + * Tells the kernel to join a multicast group at the given `multicastAddress` and`multicastInterface` using the `IP_ADD_MEMBERSHIP` socket option. If the`multicastInterface` argument is not + * specified, the operating system will choose + * one interface and will add membership to it. To add membership to every + * available interface, call `addMembership` multiple times, once per interface. + * + * When called on an unbound socket, this method will implicitly bind to a random + * port, listening on all interfaces. + * + * When sharing a UDP socket across multiple `cluster` workers, the`socket.addMembership()` function must be called only once or an`EADDRINUSE` error will occur: + * + * ```js + * import cluster from 'node:cluster'; + * import dgram from 'node:dgram'; + * + * if (cluster.isPrimary) { + * cluster.fork(); // Works ok. + * cluster.fork(); // Fails with EADDRINUSE. + * } else { + * const s = dgram.createSocket('udp4'); + * s.bind(1234, () => { + * s.addMembership('224.0.0.114'); + * }); + * } + * ``` + * @since v0.6.9 + */ + addMembership(multicastAddress: string, multicastInterface?: string): void; + /** + * Returns an object containing the address information for a socket. + * For UDP sockets, this object will contain `address`, `family`, and `port`properties. + * + * This method throws `EBADF` if called on an unbound socket. + * @since v0.1.99 + */ + address(): AddressInfo; + /** + * For UDP sockets, causes the `dgram.Socket` to listen for datagram + * messages on a named `port` and optional `address`. If `port` is not + * specified or is `0`, the operating system will attempt to bind to a + * random port. If `address` is not specified, the operating system will + * attempt to listen on all addresses. Once binding is complete, a`'listening'` event is emitted and the optional `callback` function is + * called. + * + * Specifying both a `'listening'` event listener and passing a`callback` to the `socket.bind()` method is not harmful but not very + * useful. + * + * A bound datagram socket keeps the Node.js process running to receive + * datagram messages. + * + * If binding fails, an `'error'` event is generated. In rare case (e.g. + * attempting to bind with a closed socket), an `Error` may be thrown. + * + * Example of a UDP server listening on port 41234: + * + * ```js + * import dgram from 'node:dgram'; + * + * const server = dgram.createSocket('udp4'); + * + * server.on('error', (err) => { + * console.error(`server error:\n${err.stack}`); + * server.close(); + * }); + * + * server.on('message', (msg, rinfo) => { + * console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`); + * }); + * + * server.on('listening', () => { + * const address = server.address(); + * console.log(`server listening ${address.address}:${address.port}`); + * }); + * + * server.bind(41234); + * // Prints: server listening 0.0.0.0:41234 + * ``` + * @since v0.1.99 + * @param callback with no parameters. Called when binding is complete. + */ + bind(port?: number, address?: string, callback?: () => void): this; + bind(port?: number, callback?: () => void): this; + bind(callback?: () => void): this; + bind(options: BindOptions, callback?: () => void): this; + /** + * Close the underlying socket and stop listening for data on it. If a callback is + * provided, it is added as a listener for the `'close'` event. + * @since v0.1.99 + * @param callback Called when the socket has been closed. + */ + close(callback?: () => void): this; + /** + * Associates the `dgram.Socket` to a remote address and port. Every + * message sent by this handle is automatically sent to that destination. Also, + * the socket will only receive messages from that remote peer. + * Trying to call `connect()` on an already connected socket will result + * in an `ERR_SOCKET_DGRAM_IS_CONNECTED` exception. If `address` is not + * provided, `'127.0.0.1'` (for `udp4` sockets) or `'::1'` (for `udp6` sockets) + * will be used by default. Once the connection is complete, a `'connect'` event + * is emitted and the optional `callback` function is called. In case of failure, + * the `callback` is called or, failing this, an `'error'` event is emitted. + * @since v12.0.0 + * @param callback Called when the connection is completed or on error. + */ + connect(port: number, address?: string, callback?: () => void): void; + connect(port: number, callback: () => void): void; + /** + * A synchronous function that disassociates a connected `dgram.Socket` from + * its remote address. Trying to call `disconnect()` on an unbound or already + * disconnected socket will result in an `ERR_SOCKET_DGRAM_NOT_CONNECTED` exception. + * @since v12.0.0 + */ + disconnect(): void; + /** + * Instructs the kernel to leave a multicast group at `multicastAddress` using the`IP_DROP_MEMBERSHIP` socket option. This method is automatically called by the + * kernel when the socket is closed or the process terminates, so most apps will + * never have reason to call this. + * + * If `multicastInterface` is not specified, the operating system will attempt to + * drop membership on all valid interfaces. + * @since v0.6.9 + */ + dropMembership(multicastAddress: string, multicastInterface?: string): void; + /** + * This method throws `ERR_SOCKET_BUFFER_SIZE` if called on an unbound socket. + * @since v8.7.0 + * @return the `SO_RCVBUF` socket receive buffer size in bytes. + */ + getRecvBufferSize(): number; + /** + * This method throws `ERR_SOCKET_BUFFER_SIZE` if called on an unbound socket. + * @since v8.7.0 + * @return the `SO_SNDBUF` socket send buffer size in bytes. + */ + getSendBufferSize(): number; + /** + * By default, binding a socket will cause it to block the Node.js process from + * exiting as long as the socket is open. The `socket.unref()` method can be used + * to exclude the socket from the reference counting that keeps the Node.js + * process active. The `socket.ref()` method adds the socket back to the reference + * counting and restores the default behavior. + * + * Calling `socket.ref()` multiples times will have no additional effect. + * + * The `socket.ref()` method returns a reference to the socket so calls can be + * chained. + * @since v0.9.1 + */ + ref(): this; + /** + * Returns an object containing the `address`, `family`, and `port` of the remote + * endpoint. This method throws an `ERR_SOCKET_DGRAM_NOT_CONNECTED` exception + * if the socket is not connected. + * @since v12.0.0 + */ + remoteAddress(): AddressInfo; + /** + * Broadcasts a datagram on the socket. + * For connectionless sockets, the destination `port` and `address` must be + * specified. Connected sockets, on the other hand, will use their associated + * remote endpoint, so the `port` and `address` arguments must not be set. + * + * The `msg` argument contains the message to be sent. + * Depending on its type, different behavior can apply. If `msg` is a `Buffer`, + * any `TypedArray` or a `DataView`, + * the `offset` and `length` specify the offset within the `Buffer` where the + * message begins and the number of bytes in the message, respectively. + * If `msg` is a `String`, then it is automatically converted to a `Buffer`with `'utf8'` encoding. With messages that + * contain multi-byte characters, `offset` and `length` will be calculated with + * respect to `byte length` and not the character position. + * If `msg` is an array, `offset` and `length` must not be specified. + * + * The `address` argument is a string. If the value of `address` is a host name, + * DNS will be used to resolve the address of the host. If `address` is not + * provided or otherwise nullish, `'127.0.0.1'` (for `udp4` sockets) or `'::1'`(for `udp6` sockets) will be used by default. + * + * If the socket has not been previously bound with a call to `bind`, the socket + * is assigned a random port number and is bound to the "all interfaces" address + * (`'0.0.0.0'` for `udp4` sockets, `'::0'` for `udp6` sockets.) + * + * An optional `callback` function may be specified to as a way of reporting + * DNS errors or for determining when it is safe to reuse the `buf` object. + * DNS lookups delay the time to send for at least one tick of the + * Node.js event loop. + * + * The only way to know for sure that the datagram has been sent is by using a`callback`. If an error occurs and a `callback` is given, the error will be + * passed as the first argument to the `callback`. If a `callback` is not given, + * the error is emitted as an `'error'` event on the `socket` object. + * + * Offset and length are optional but both _must_ be set if either are used. + * They are supported only when the first argument is a `Buffer`, a `TypedArray`, + * or a `DataView`. + * + * This method throws `ERR_SOCKET_BAD_PORT` if called on an unbound socket. + * + * Example of sending a UDP packet to a port on `localhost`; + * + * ```js + * import dgram from 'node:dgram'; + * import { Buffer } from 'node:buffer'; + * + * const message = Buffer.from('Some bytes'); + * const client = dgram.createSocket('udp4'); + * client.send(message, 41234, 'localhost', (err) => { + * client.close(); + * }); + * ``` + * + * Example of sending a UDP packet composed of multiple buffers to a port on`127.0.0.1`; + * + * ```js + * import dgram from 'node:dgram'; + * import { Buffer } from 'node:buffer'; + * + * const buf1 = Buffer.from('Some '); + * const buf2 = Buffer.from('bytes'); + * const client = dgram.createSocket('udp4'); + * client.send([buf1, buf2], 41234, (err) => { + * client.close(); + * }); + * ``` + * + * Sending multiple buffers might be faster or slower depending on the + * application and operating system. Run benchmarks to + * determine the optimal strategy on a case-by-case basis. Generally speaking, + * however, sending multiple buffers is faster. + * + * Example of sending a UDP packet using a socket connected to a port on`localhost`: + * + * ```js + * import dgram from 'node:dgram'; + * import { Buffer } from 'node:buffer'; + * + * const message = Buffer.from('Some bytes'); + * const client = dgram.createSocket('udp4'); + * client.connect(41234, 'localhost', (err) => { + * client.send(message, (err) => { + * client.close(); + * }); + * }); + * ``` + * @since v0.1.99 + * @param msg Message to be sent. + * @param offset Offset in the buffer where the message starts. + * @param length Number of bytes in the message. + * @param port Destination port. + * @param address Destination host name or IP address. + * @param callback Called when the message has been sent. + */ + send( + msg: string | Uint8Array | readonly any[], + port?: number, + address?: string, + callback?: (error: Error | null, bytes: number) => void, + ): void; + send( + msg: string | Uint8Array | readonly any[], + port?: number, + callback?: (error: Error | null, bytes: number) => void, + ): void; + send( + msg: string | Uint8Array | readonly any[], + callback?: (error: Error | null, bytes: number) => void, + ): void; + send( + msg: string | Uint8Array, + offset: number, + length: number, + port?: number, + address?: string, + callback?: (error: Error | null, bytes: number) => void, + ): void; + send( + msg: string | Uint8Array, + offset: number, + length: number, + port?: number, + callback?: (error: Error | null, bytes: number) => void, + ): void; + send( + msg: string | Uint8Array, + offset: number, + length: number, + callback?: (error: Error | null, bytes: number) => void, + ): void; + /** + * Sets or clears the `SO_BROADCAST` socket option. When set to `true`, UDP + * packets may be sent to a local interface's broadcast address. + * + * This method throws `EBADF` if called on an unbound socket. + * @since v0.6.9 + */ + setBroadcast(flag: boolean): void; + /** + * _All references to scope in this section are referring to [IPv6 Zone Indices](https://en.wikipedia.org/wiki/IPv6_address#Scoped_literal_IPv6_addresses), which are defined by [RFC + * 4007](https://tools.ietf.org/html/rfc4007). In string form, an IP_ + * _with a scope index is written as `'IP%scope'` where scope is an interface name_ + * _or interface number._ + * + * Sets the default outgoing multicast interface of the socket to a chosen + * interface or back to system interface selection. The `multicastInterface` must + * be a valid string representation of an IP from the socket's family. + * + * For IPv4 sockets, this should be the IP configured for the desired physical + * interface. All packets sent to multicast on the socket will be sent on the + * interface determined by the most recent successful use of this call. + * + * For IPv6 sockets, `multicastInterface` should include a scope to indicate the + * interface as in the examples that follow. In IPv6, individual `send` calls can + * also use explicit scope in addresses, so only packets sent to a multicast + * address without specifying an explicit scope are affected by the most recent + * successful use of this call. + * + * This method throws `EBADF` if called on an unbound socket. + * + * #### Example: IPv6 outgoing multicast interface + * + * On most systems, where scope format uses the interface name: + * + * ```js + * const socket = dgram.createSocket('udp6'); + * + * socket.bind(1234, () => { + * socket.setMulticastInterface('::%eth1'); + * }); + * ``` + * + * On Windows, where scope format uses an interface number: + * + * ```js + * const socket = dgram.createSocket('udp6'); + * + * socket.bind(1234, () => { + * socket.setMulticastInterface('::%2'); + * }); + * ``` + * + * #### Example: IPv4 outgoing multicast interface + * + * All systems use an IP of the host on the desired physical interface: + * + * ```js + * const socket = dgram.createSocket('udp4'); + * + * socket.bind(1234, () => { + * socket.setMulticastInterface('10.0.0.2'); + * }); + * ``` + * @since v8.6.0 + */ + setMulticastInterface(multicastInterface: string): void; + /** + * Sets or clears the `IP_MULTICAST_LOOP` socket option. When set to `true`, + * multicast packets will also be received on the local interface. + * + * This method throws `EBADF` if called on an unbound socket. + * @since v0.3.8 + */ + setMulticastLoopback(flag: boolean): boolean; + /** + * Sets the `IP_MULTICAST_TTL` socket option. While TTL generally stands for + * "Time to Live", in this context it specifies the number of IP hops that a + * packet is allowed to travel through, specifically for multicast traffic. Each + * router or gateway that forwards a packet decrements the TTL. If the TTL is + * decremented to 0 by a router, it will not be forwarded. + * + * The `ttl` argument may be between 0 and 255\. The default on most systems is `1`. + * + * This method throws `EBADF` if called on an unbound socket. + * @since v0.3.8 + */ + setMulticastTTL(ttl: number): number; + /** + * Sets the `SO_RCVBUF` socket option. Sets the maximum socket receive buffer + * in bytes. + * + * This method throws `ERR_SOCKET_BUFFER_SIZE` if called on an unbound socket. + * @since v8.7.0 + */ + setRecvBufferSize(size: number): void; + /** + * Sets the `SO_SNDBUF` socket option. Sets the maximum socket send buffer + * in bytes. + * + * This method throws `ERR_SOCKET_BUFFER_SIZE` if called on an unbound socket. + * @since v8.7.0 + */ + setSendBufferSize(size: number): void; + /** + * Sets the `IP_TTL` socket option. While TTL generally stands for "Time to Live", + * in this context it specifies the number of IP hops that a packet is allowed to + * travel through. Each router or gateway that forwards a packet decrements the + * TTL. If the TTL is decremented to 0 by a router, it will not be forwarded. + * Changing TTL values is typically done for network probes or when multicasting. + * + * The `ttl` argument may be between 1 and 255\. The default on most systems + * is 64. + * + * This method throws `EBADF` if called on an unbound socket. + * @since v0.1.101 + */ + setTTL(ttl: number): number; + /** + * By default, binding a socket will cause it to block the Node.js process from + * exiting as long as the socket is open. The `socket.unref()` method can be used + * to exclude the socket from the reference counting that keeps the Node.js + * process active, allowing the process to exit even if the socket is still + * listening. + * + * Calling `socket.unref()` multiple times will have no additional effect. + * + * The `socket.unref()` method returns a reference to the socket so calls can be + * chained. + * @since v0.9.1 + */ + unref(): this; + /** + * Tells the kernel to join a source-specific multicast channel at the given`sourceAddress` and `groupAddress`, using the `multicastInterface` with the`IP_ADD_SOURCE_MEMBERSHIP` socket + * option. If the `multicastInterface` argument + * is not specified, the operating system will choose one interface and will add + * membership to it. To add membership to every available interface, call`socket.addSourceSpecificMembership()` multiple times, once per interface. + * + * When called on an unbound socket, this method will implicitly bind to a random + * port, listening on all interfaces. + * @since v13.1.0, v12.16.0 + */ + addSourceSpecificMembership(sourceAddress: string, groupAddress: string, multicastInterface?: string): void; + /** + * Instructs the kernel to leave a source-specific multicast channel at the given`sourceAddress` and `groupAddress` using the `IP_DROP_SOURCE_MEMBERSHIP`socket option. This method is + * automatically called by the kernel when the + * socket is closed or the process terminates, so most apps will never have + * reason to call this. + * + * If `multicastInterface` is not specified, the operating system will attempt to + * drop membership on all valid interfaces. + * @since v13.1.0, v12.16.0 + */ + dropSourceSpecificMembership(sourceAddress: string, groupAddress: string, multicastInterface?: string): void; + /** + * events.EventEmitter + * 1. close + * 2. connect + * 3. error + * 4. listening + * 5. message + */ + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "connect", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "listening", listener: () => void): this; + addListener(event: "message", listener: (msg: Buffer, rinfo: RemoteInfo) => void): this; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close"): boolean; + emit(event: "connect"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "listening"): boolean; + emit(event: "message", msg: Buffer, rinfo: RemoteInfo): boolean; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "close", listener: () => void): this; + on(event: "connect", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "listening", listener: () => void): this; + on(event: "message", listener: (msg: Buffer, rinfo: RemoteInfo) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "connect", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "listening", listener: () => void): this; + once(event: "message", listener: (msg: Buffer, rinfo: RemoteInfo) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "connect", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "listening", listener: () => void): this; + prependListener(event: "message", listener: (msg: Buffer, rinfo: RemoteInfo) => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "connect", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "listening", listener: () => void): this; + prependOnceListener(event: "message", listener: (msg: Buffer, rinfo: RemoteInfo) => void): this; + /** + * Calls `socket.close()` and returns a promise that fulfills when the socket has closed. + * @since v20.5.0 + */ + [Symbol.asyncDispose](): Promise; + } +} +declare module "node:dgram" { + export * from "dgram"; +} diff --git a/task/node_modules/@types/node/ts4.8/diagnostics_channel.d.ts b/task/node_modules/@types/node/ts4.8/diagnostics_channel.d.ts new file mode 100644 index 0000000..b02f591 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/diagnostics_channel.d.ts @@ -0,0 +1,191 @@ +/** + * The `node:diagnostics_channel` module provides an API to create named channels + * to report arbitrary message data for diagnostics purposes. + * + * It can be accessed using: + * + * ```js + * import diagnostics_channel from 'node:diagnostics_channel'; + * ``` + * + * It is intended that a module writer wanting to report diagnostics messages + * will create one or many top-level channels to report messages through. + * Channels may also be acquired at runtime but it is not encouraged + * due to the additional overhead of doing so. Channels may be exported for + * convenience, but as long as the name is known it can be acquired anywhere. + * + * If you intend for your module to produce diagnostics data for others to + * consume it is recommended that you include documentation of what named + * channels are used along with the shape of the message data. Channel names + * should generally include the module name to avoid collisions with data from + * other modules. + * @since v15.1.0, v14.17.0 + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/diagnostics_channel.js) + */ +declare module "diagnostics_channel" { + /** + * Check if there are active subscribers to the named channel. This is helpful if + * the message you want to send might be expensive to prepare. + * + * This API is optional but helpful when trying to publish messages from very + * performance-sensitive code. + * + * ```js + * import diagnostics_channel from 'node:diagnostics_channel'; + * + * if (diagnostics_channel.hasSubscribers('my-channel')) { + * // There are subscribers, prepare and publish message + * } + * ``` + * @since v15.1.0, v14.17.0 + * @param name The channel name + * @return If there are active subscribers + */ + function hasSubscribers(name: string | symbol): boolean; + /** + * This is the primary entry-point for anyone wanting to publish to a named + * channel. It produces a channel object which is optimized to reduce overhead at + * publish time as much as possible. + * + * ```js + * import diagnostics_channel from 'node:diagnostics_channel'; + * + * const channel = diagnostics_channel.channel('my-channel'); + * ``` + * @since v15.1.0, v14.17.0 + * @param name The channel name + * @return The named channel object + */ + function channel(name: string | symbol): Channel; + type ChannelListener = (message: unknown, name: string | symbol) => void; + /** + * Register a message handler to subscribe to this channel. This message handler + * will be run synchronously whenever a message is published to the channel. Any + * errors thrown in the message handler will trigger an `'uncaughtException'`. + * + * ```js + * import diagnostics_channel from 'node:diagnostics_channel'; + * + * diagnostics_channel.subscribe('my-channel', (message, name) => { + * // Received data + * }); + * ``` + * @since v18.7.0, v16.17.0 + * @param name The channel name + * @param onMessage The handler to receive channel messages + */ + function subscribe(name: string | symbol, onMessage: ChannelListener): void; + /** + * Remove a message handler previously registered to this channel with {@link subscribe}. + * + * ```js + * import diagnostics_channel from 'node:diagnostics_channel'; + * + * function onMessage(message, name) { + * // Received data + * } + * + * diagnostics_channel.subscribe('my-channel', onMessage); + * + * diagnostics_channel.unsubscribe('my-channel', onMessage); + * ``` + * @since v18.7.0, v16.17.0 + * @param name The channel name + * @param onMessage The previous subscribed handler to remove + * @return `true` if the handler was found, `false` otherwise. + */ + function unsubscribe(name: string | symbol, onMessage: ChannelListener): boolean; + /** + * The class `Channel` represents an individual named channel within the data + * pipeline. It is used to track subscribers and to publish messages when there + * are subscribers present. It exists as a separate object to avoid channel + * lookups at publish time, enabling very fast publish speeds and allowing + * for heavy use while incurring very minimal cost. Channels are created with {@link channel}, constructing a channel directly + * with `new Channel(name)` is not supported. + * @since v15.1.0, v14.17.0 + */ + class Channel { + readonly name: string | symbol; + /** + * Check if there are active subscribers to this channel. This is helpful if + * the message you want to send might be expensive to prepare. + * + * This API is optional but helpful when trying to publish messages from very + * performance-sensitive code. + * + * ```js + * import diagnostics_channel from 'node:diagnostics_channel'; + * + * const channel = diagnostics_channel.channel('my-channel'); + * + * if (channel.hasSubscribers) { + * // There are subscribers, prepare and publish message + * } + * ``` + * @since v15.1.0, v14.17.0 + */ + readonly hasSubscribers: boolean; + private constructor(name: string | symbol); + /** + * Publish a message to any subscribers to the channel. This will trigger + * message handlers synchronously so they will execute within the same context. + * + * ```js + * import diagnostics_channel from 'node:diagnostics_channel'; + * + * const channel = diagnostics_channel.channel('my-channel'); + * + * channel.publish({ + * some: 'message', + * }); + * ``` + * @since v15.1.0, v14.17.0 + * @param message The message to send to the channel subscribers + */ + publish(message: unknown): void; + /** + * Register a message handler to subscribe to this channel. This message handler + * will be run synchronously whenever a message is published to the channel. Any + * errors thrown in the message handler will trigger an `'uncaughtException'`. + * + * ```js + * import diagnostics_channel from 'node:diagnostics_channel'; + * + * const channel = diagnostics_channel.channel('my-channel'); + * + * channel.subscribe((message, name) => { + * // Received data + * }); + * ``` + * @since v15.1.0, v14.17.0 + * @deprecated Since v18.7.0,v16.17.0 - Use {@link subscribe(name, onMessage)} + * @param onMessage The handler to receive channel messages + */ + subscribe(onMessage: ChannelListener): void; + /** + * Remove a message handler previously registered to this channel with `channel.subscribe(onMessage)`. + * + * ```js + * import diagnostics_channel from 'node:diagnostics_channel'; + * + * const channel = diagnostics_channel.channel('my-channel'); + * + * function onMessage(message, name) { + * // Received data + * } + * + * channel.subscribe(onMessage); + * + * channel.unsubscribe(onMessage); + * ``` + * @since v15.1.0, v14.17.0 + * @deprecated Since v18.7.0,v16.17.0 - Use {@link unsubscribe(name, onMessage)} + * @param onMessage The previous subscribed handler to remove + * @return `true` if the handler was found, `false` otherwise. + */ + unsubscribe(onMessage: ChannelListener): void; + } +} +declare module "node:diagnostics_channel" { + export * from "diagnostics_channel"; +} diff --git a/task/node_modules/@types/node/ts4.8/dns.d.ts b/task/node_modules/@types/node/ts4.8/dns.d.ts new file mode 100644 index 0000000..380cf7d --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/dns.d.ts @@ -0,0 +1,809 @@ +/** + * The `node:dns` module enables name resolution. For example, use it to look up IP + * addresses of host names. + * + * Although named for the [Domain Name System (DNS)](https://en.wikipedia.org/wiki/Domain_Name_System), it does not always use the + * DNS protocol for lookups. {@link lookup} uses the operating system + * facilities to perform name resolution. It may not need to perform any network + * communication. To perform name resolution the way other applications on the same + * system do, use {@link lookup}. + * + * ```js + * const dns = require('node:dns'); + * + * dns.lookup('example.org', (err, address, family) => { + * console.log('address: %j family: IPv%s', address, family); + * }); + * // address: "93.184.216.34" family: IPv4 + * ``` + * + * All other functions in the `node:dns` module connect to an actual DNS server to + * perform name resolution. They will always use the network to perform DNS + * queries. These functions do not use the same set of configuration files used by {@link lookup} (e.g. `/etc/hosts`). Use these functions to always perform + * DNS queries, bypassing other name-resolution facilities. + * + * ```js + * const dns = require('node:dns'); + * + * dns.resolve4('archive.org', (err, addresses) => { + * if (err) throw err; + * + * console.log(`addresses: ${JSON.stringify(addresses)}`); + * + * addresses.forEach((a) => { + * dns.reverse(a, (err, hostnames) => { + * if (err) { + * throw err; + * } + * console.log(`reverse for ${a}: ${JSON.stringify(hostnames)}`); + * }); + * }); + * }); + * ``` + * + * See the `Implementation considerations section` for more information. + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/dns.js) + */ +declare module "dns" { + import * as dnsPromises from "node:dns/promises"; + // Supported getaddrinfo flags. + export const ADDRCONFIG: number; + export const V4MAPPED: number; + /** + * If `dns.V4MAPPED` is specified, return resolved IPv6 addresses as + * well as IPv4 mapped IPv6 addresses. + */ + export const ALL: number; + export interface LookupOptions { + family?: number | undefined; + hints?: number | undefined; + all?: boolean | undefined; + /** + * @default true + */ + verbatim?: boolean | undefined; + } + export interface LookupOneOptions extends LookupOptions { + all?: false | undefined; + } + export interface LookupAllOptions extends LookupOptions { + all: true; + } + export interface LookupAddress { + address: string; + family: number; + } + /** + * Resolves a host name (e.g. `'nodejs.org'`) into the first found A (IPv4) or + * AAAA (IPv6) record. All `option` properties are optional. If `options` is an + * integer, then it must be `4` or `6` – if `options` is `0` or not provided, then + * IPv4 and IPv6 addresses are both returned if found. + * + * With the `all` option set to `true`, the arguments for `callback` change to`(err, addresses)`, with `addresses` being an array of objects with the + * properties `address` and `family`. + * + * On error, `err` is an `Error` object, where `err.code` is the error code. + * Keep in mind that `err.code` will be set to `'ENOTFOUND'` not only when + * the host name does not exist but also when the lookup fails in other ways + * such as no available file descriptors. + * + * `dns.lookup()` does not necessarily have anything to do with the DNS protocol. + * The implementation uses an operating system facility that can associate names + * with addresses and vice versa. This implementation can have subtle but + * important consequences on the behavior of any Node.js program. Please take some + * time to consult the `Implementation considerations section` before using`dns.lookup()`. + * + * Example usage: + * + * ```js + * const dns = require('node:dns'); + * const options = { + * family: 6, + * hints: dns.ADDRCONFIG | dns.V4MAPPED, + * }; + * dns.lookup('example.com', options, (err, address, family) => + * console.log('address: %j family: IPv%s', address, family)); + * // address: "2606:2800:220:1:248:1893:25c8:1946" family: IPv6 + * + * // When options.all is true, the result will be an Array. + * options.all = true; + * dns.lookup('example.com', options, (err, addresses) => + * console.log('addresses: %j', addresses)); + * // addresses: [{"address":"2606:2800:220:1:248:1893:25c8:1946","family":6}] + * ``` + * + * If this method is invoked as its `util.promisify()` ed version, and `all`is not set to `true`, it returns a `Promise` for an `Object` with `address` and`family` properties. + * @since v0.1.90 + */ + export function lookup( + hostname: string, + family: number, + callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void, + ): void; + export function lookup( + hostname: string, + options: LookupOneOptions, + callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void, + ): void; + export function lookup( + hostname: string, + options: LookupAllOptions, + callback: (err: NodeJS.ErrnoException | null, addresses: LookupAddress[]) => void, + ): void; + export function lookup( + hostname: string, + options: LookupOptions, + callback: (err: NodeJS.ErrnoException | null, address: string | LookupAddress[], family: number) => void, + ): void; + export function lookup( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void, + ): void; + export namespace lookup { + function __promisify__(hostname: string, options: LookupAllOptions): Promise; + function __promisify__(hostname: string, options?: LookupOneOptions | number): Promise; + function __promisify__(hostname: string, options: LookupOptions): Promise; + } + /** + * Resolves the given `address` and `port` into a host name and service using + * the operating system's underlying `getnameinfo` implementation. + * + * If `address` is not a valid IP address, a `TypeError` will be thrown. + * The `port` will be coerced to a number. If it is not a legal port, a `TypeError`will be thrown. + * + * On an error, `err` is an `Error` object, where `err.code` is the error code. + * + * ```js + * const dns = require('node:dns'); + * dns.lookupService('127.0.0.1', 22, (err, hostname, service) => { + * console.log(hostname, service); + * // Prints: localhost ssh + * }); + * ``` + * + * If this method is invoked as its `util.promisify()` ed version, it returns a`Promise` for an `Object` with `hostname` and `service` properties. + * @since v0.11.14 + */ + export function lookupService( + address: string, + port: number, + callback: (err: NodeJS.ErrnoException | null, hostname: string, service: string) => void, + ): void; + export namespace lookupService { + function __promisify__( + address: string, + port: number, + ): Promise<{ + hostname: string; + service: string; + }>; + } + export interface ResolveOptions { + ttl: boolean; + } + export interface ResolveWithTtlOptions extends ResolveOptions { + ttl: true; + } + export interface RecordWithTtl { + address: string; + ttl: number; + } + /** @deprecated Use `AnyARecord` or `AnyAaaaRecord` instead. */ + export type AnyRecordWithTtl = AnyARecord | AnyAaaaRecord; + export interface AnyARecord extends RecordWithTtl { + type: "A"; + } + export interface AnyAaaaRecord extends RecordWithTtl { + type: "AAAA"; + } + export interface CaaRecord { + critical: number; + issue?: string | undefined; + issuewild?: string | undefined; + iodef?: string | undefined; + contactemail?: string | undefined; + contactphone?: string | undefined; + } + export interface MxRecord { + priority: number; + exchange: string; + } + export interface AnyMxRecord extends MxRecord { + type: "MX"; + } + export interface NaptrRecord { + flags: string; + service: string; + regexp: string; + replacement: string; + order: number; + preference: number; + } + export interface AnyNaptrRecord extends NaptrRecord { + type: "NAPTR"; + } + export interface SoaRecord { + nsname: string; + hostmaster: string; + serial: number; + refresh: number; + retry: number; + expire: number; + minttl: number; + } + export interface AnySoaRecord extends SoaRecord { + type: "SOA"; + } + export interface SrvRecord { + priority: number; + weight: number; + port: number; + name: string; + } + export interface AnySrvRecord extends SrvRecord { + type: "SRV"; + } + export interface AnyTxtRecord { + type: "TXT"; + entries: string[]; + } + export interface AnyNsRecord { + type: "NS"; + value: string; + } + export interface AnyPtrRecord { + type: "PTR"; + value: string; + } + export interface AnyCnameRecord { + type: "CNAME"; + value: string; + } + export type AnyRecord = + | AnyARecord + | AnyAaaaRecord + | AnyCnameRecord + | AnyMxRecord + | AnyNaptrRecord + | AnyNsRecord + | AnyPtrRecord + | AnySoaRecord + | AnySrvRecord + | AnyTxtRecord; + /** + * Uses the DNS protocol to resolve a host name (e.g. `'nodejs.org'`) into an array + * of the resource records. The `callback` function has arguments`(err, records)`. When successful, `records` will be an array of resource + * records. The type and structure of individual results varies based on `rrtype`: + * + * + * + * On error, `err` is an `Error` object, where `err.code` is one of the `DNS error codes`. + * @since v0.1.27 + * @param hostname Host name to resolve. + * @param [rrtype='A'] Resource record type. + */ + export function resolve( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, addresses: string[]) => void, + ): void; + export function resolve( + hostname: string, + rrtype: "A", + callback: (err: NodeJS.ErrnoException | null, addresses: string[]) => void, + ): void; + export function resolve( + hostname: string, + rrtype: "AAAA", + callback: (err: NodeJS.ErrnoException | null, addresses: string[]) => void, + ): void; + export function resolve( + hostname: string, + rrtype: "ANY", + callback: (err: NodeJS.ErrnoException | null, addresses: AnyRecord[]) => void, + ): void; + export function resolve( + hostname: string, + rrtype: "CNAME", + callback: (err: NodeJS.ErrnoException | null, addresses: string[]) => void, + ): void; + export function resolve( + hostname: string, + rrtype: "MX", + callback: (err: NodeJS.ErrnoException | null, addresses: MxRecord[]) => void, + ): void; + export function resolve( + hostname: string, + rrtype: "NAPTR", + callback: (err: NodeJS.ErrnoException | null, addresses: NaptrRecord[]) => void, + ): void; + export function resolve( + hostname: string, + rrtype: "NS", + callback: (err: NodeJS.ErrnoException | null, addresses: string[]) => void, + ): void; + export function resolve( + hostname: string, + rrtype: "PTR", + callback: (err: NodeJS.ErrnoException | null, addresses: string[]) => void, + ): void; + export function resolve( + hostname: string, + rrtype: "SOA", + callback: (err: NodeJS.ErrnoException | null, addresses: SoaRecord) => void, + ): void; + export function resolve( + hostname: string, + rrtype: "SRV", + callback: (err: NodeJS.ErrnoException | null, addresses: SrvRecord[]) => void, + ): void; + export function resolve( + hostname: string, + rrtype: "TXT", + callback: (err: NodeJS.ErrnoException | null, addresses: string[][]) => void, + ): void; + export function resolve( + hostname: string, + rrtype: string, + callback: ( + err: NodeJS.ErrnoException | null, + addresses: string[] | MxRecord[] | NaptrRecord[] | SoaRecord | SrvRecord[] | string[][] | AnyRecord[], + ) => void, + ): void; + export namespace resolve { + function __promisify__(hostname: string, rrtype?: "A" | "AAAA" | "CNAME" | "NS" | "PTR"): Promise; + function __promisify__(hostname: string, rrtype: "ANY"): Promise; + function __promisify__(hostname: string, rrtype: "MX"): Promise; + function __promisify__(hostname: string, rrtype: "NAPTR"): Promise; + function __promisify__(hostname: string, rrtype: "SOA"): Promise; + function __promisify__(hostname: string, rrtype: "SRV"): Promise; + function __promisify__(hostname: string, rrtype: "TXT"): Promise; + function __promisify__( + hostname: string, + rrtype: string, + ): Promise; + } + /** + * Uses the DNS protocol to resolve a IPv4 addresses (`A` records) for the`hostname`. The `addresses` argument passed to the `callback` function + * will contain an array of IPv4 addresses (e.g.`['74.125.79.104', '74.125.79.105', '74.125.79.106']`). + * @since v0.1.16 + * @param hostname Host name to resolve. + */ + export function resolve4( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, addresses: string[]) => void, + ): void; + export function resolve4( + hostname: string, + options: ResolveWithTtlOptions, + callback: (err: NodeJS.ErrnoException | null, addresses: RecordWithTtl[]) => void, + ): void; + export function resolve4( + hostname: string, + options: ResolveOptions, + callback: (err: NodeJS.ErrnoException | null, addresses: string[] | RecordWithTtl[]) => void, + ): void; + export namespace resolve4 { + function __promisify__(hostname: string): Promise; + function __promisify__(hostname: string, options: ResolveWithTtlOptions): Promise; + function __promisify__(hostname: string, options?: ResolveOptions): Promise; + } + /** + * Uses the DNS protocol to resolve IPv6 addresses (`AAAA` records) for the`hostname`. The `addresses` argument passed to the `callback` function + * will contain an array of IPv6 addresses. + * @since v0.1.16 + * @param hostname Host name to resolve. + */ + export function resolve6( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, addresses: string[]) => void, + ): void; + export function resolve6( + hostname: string, + options: ResolveWithTtlOptions, + callback: (err: NodeJS.ErrnoException | null, addresses: RecordWithTtl[]) => void, + ): void; + export function resolve6( + hostname: string, + options: ResolveOptions, + callback: (err: NodeJS.ErrnoException | null, addresses: string[] | RecordWithTtl[]) => void, + ): void; + export namespace resolve6 { + function __promisify__(hostname: string): Promise; + function __promisify__(hostname: string, options: ResolveWithTtlOptions): Promise; + function __promisify__(hostname: string, options?: ResolveOptions): Promise; + } + /** + * Uses the DNS protocol to resolve `CNAME` records for the `hostname`. The`addresses` argument passed to the `callback` function + * will contain an array of canonical name records available for the `hostname`(e.g. `['bar.example.com']`). + * @since v0.3.2 + */ + export function resolveCname( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, addresses: string[]) => void, + ): void; + export namespace resolveCname { + function __promisify__(hostname: string): Promise; + } + /** + * Uses the DNS protocol to resolve `CAA` records for the `hostname`. The`addresses` argument passed to the `callback` function + * will contain an array of certification authority authorization records + * available for the `hostname` (e.g. `[{critical: 0, iodef: 'mailto:pki@example.com'}, {critical: 128, issue: 'pki.example.com'}]`). + * @since v15.0.0, v14.17.0 + */ + export function resolveCaa( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, records: CaaRecord[]) => void, + ): void; + export namespace resolveCaa { + function __promisify__(hostname: string): Promise; + } + /** + * Uses the DNS protocol to resolve mail exchange records (`MX` records) for the`hostname`. The `addresses` argument passed to the `callback` function will + * contain an array of objects containing both a `priority` and `exchange`property (e.g. `[{priority: 10, exchange: 'mx.example.com'}, ...]`). + * @since v0.1.27 + */ + export function resolveMx( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, addresses: MxRecord[]) => void, + ): void; + export namespace resolveMx { + function __promisify__(hostname: string): Promise; + } + /** + * Uses the DNS protocol to resolve regular expression-based records (`NAPTR`records) for the `hostname`. The `addresses` argument passed to the `callback`function will contain an array of + * objects with the following properties: + * + * * `flags` + * * `service` + * * `regexp` + * * `replacement` + * * `order` + * * `preference` + * + * ```js + * { + * flags: 's', + * service: 'SIP+D2U', + * regexp: '', + * replacement: '_sip._udp.example.com', + * order: 30, + * preference: 100 + * } + * ``` + * @since v0.9.12 + */ + export function resolveNaptr( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, addresses: NaptrRecord[]) => void, + ): void; + export namespace resolveNaptr { + function __promisify__(hostname: string): Promise; + } + /** + * Uses the DNS protocol to resolve name server records (`NS` records) for the`hostname`. The `addresses` argument passed to the `callback` function will + * contain an array of name server records available for `hostname`(e.g. `['ns1.example.com', 'ns2.example.com']`). + * @since v0.1.90 + */ + export function resolveNs( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, addresses: string[]) => void, + ): void; + export namespace resolveNs { + function __promisify__(hostname: string): Promise; + } + /** + * Uses the DNS protocol to resolve pointer records (`PTR` records) for the`hostname`. The `addresses` argument passed to the `callback` function will + * be an array of strings containing the reply records. + * @since v6.0.0 + */ + export function resolvePtr( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, addresses: string[]) => void, + ): void; + export namespace resolvePtr { + function __promisify__(hostname: string): Promise; + } + /** + * Uses the DNS protocol to resolve a start of authority record (`SOA` record) for + * the `hostname`. The `address` argument passed to the `callback` function will + * be an object with the following properties: + * + * * `nsname` + * * `hostmaster` + * * `serial` + * * `refresh` + * * `retry` + * * `expire` + * * `minttl` + * + * ```js + * { + * nsname: 'ns.example.com', + * hostmaster: 'root.example.com', + * serial: 2013101809, + * refresh: 10000, + * retry: 2400, + * expire: 604800, + * minttl: 3600 + * } + * ``` + * @since v0.11.10 + */ + export function resolveSoa( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, address: SoaRecord) => void, + ): void; + export namespace resolveSoa { + function __promisify__(hostname: string): Promise; + } + /** + * Uses the DNS protocol to resolve service records (`SRV` records) for the`hostname`. The `addresses` argument passed to the `callback` function will + * be an array of objects with the following properties: + * + * * `priority` + * * `weight` + * * `port` + * * `name` + * + * ```js + * { + * priority: 10, + * weight: 5, + * port: 21223, + * name: 'service.example.com' + * } + * ``` + * @since v0.1.27 + */ + export function resolveSrv( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, addresses: SrvRecord[]) => void, + ): void; + export namespace resolveSrv { + function __promisify__(hostname: string): Promise; + } + /** + * Uses the DNS protocol to resolve text queries (`TXT` records) for the`hostname`. The `records` argument passed to the `callback` function is a + * two-dimensional array of the text records available for `hostname` (e.g.`[ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]`). Each sub-array contains TXT chunks of + * one record. Depending on the use case, these could be either joined together or + * treated separately. + * @since v0.1.27 + */ + export function resolveTxt( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, addresses: string[][]) => void, + ): void; + export namespace resolveTxt { + function __promisify__(hostname: string): Promise; + } + /** + * Uses the DNS protocol to resolve all records (also known as `ANY` or `*` query). + * The `ret` argument passed to the `callback` function will be an array containing + * various types of records. Each object has a property `type` that indicates the + * type of the current record. And depending on the `type`, additional properties + * will be present on the object: + * + * + * + * Here is an example of the `ret` object passed to the callback: + * + * ```js + * [ { type: 'A', address: '127.0.0.1', ttl: 299 }, + * { type: 'CNAME', value: 'example.com' }, + * { type: 'MX', exchange: 'alt4.aspmx.l.example.com', priority: 50 }, + * { type: 'NS', value: 'ns1.example.com' }, + * { type: 'TXT', entries: [ 'v=spf1 include:_spf.example.com ~all' ] }, + * { type: 'SOA', + * nsname: 'ns1.example.com', + * hostmaster: 'admin.example.com', + * serial: 156696742, + * refresh: 900, + * retry: 900, + * expire: 1800, + * minttl: 60 } ] + * ``` + * + * DNS server operators may choose not to respond to `ANY`queries. It may be better to call individual methods like {@link resolve4},{@link resolveMx}, and so on. For more details, see [RFC + * 8482](https://tools.ietf.org/html/rfc8482). + */ + export function resolveAny( + hostname: string, + callback: (err: NodeJS.ErrnoException | null, addresses: AnyRecord[]) => void, + ): void; + export namespace resolveAny { + function __promisify__(hostname: string): Promise; + } + /** + * Performs a reverse DNS query that resolves an IPv4 or IPv6 address to an + * array of host names. + * + * On error, `err` is an `Error` object, where `err.code` is + * one of the `DNS error codes`. + * @since v0.1.16 + */ + export function reverse( + ip: string, + callback: (err: NodeJS.ErrnoException | null, hostnames: string[]) => void, + ): void; + /** + * Get the default value for `verbatim` in {@link lookup} and `dnsPromises.lookup()`. The value could be: + * + * * `ipv4first`: for `verbatim` defaulting to `false`. + * * `verbatim`: for `verbatim` defaulting to `true`. + * @since v20.1.0 + */ + export function getDefaultResultOrder(): "ipv4first" | "verbatim"; + /** + * Sets the IP address and port of servers to be used when performing DNS + * resolution. The `servers` argument is an array of [RFC 5952](https://tools.ietf.org/html/rfc5952#section-6) formatted + * addresses. If the port is the IANA default DNS port (53) it can be omitted. + * + * ```js + * dns.setServers([ + * '4.4.4.4', + * '[2001:4860:4860::8888]', + * '4.4.4.4:1053', + * '[2001:4860:4860::8888]:1053', + * ]); + * ``` + * + * An error will be thrown if an invalid address is provided. + * + * The `dns.setServers()` method must not be called while a DNS query is in + * progress. + * + * The {@link setServers} method affects only {@link resolve},`dns.resolve*()` and {@link reverse} (and specifically _not_ {@link lookup}). + * + * This method works much like [resolve.conf](https://man7.org/linux/man-pages/man5/resolv.conf.5.html). + * That is, if attempting to resolve with the first server provided results in a`NOTFOUND` error, the `resolve()` method will _not_ attempt to resolve with + * subsequent servers provided. Fallback DNS servers will only be used if the + * earlier ones time out or result in some other error. + * @since v0.11.3 + * @param servers array of `RFC 5952` formatted addresses + */ + export function setServers(servers: readonly string[]): void; + /** + * Returns an array of IP address strings, formatted according to [RFC 5952](https://tools.ietf.org/html/rfc5952#section-6), + * that are currently configured for DNS resolution. A string will include a port + * section if a custom port is used. + * + * ```js + * [ + * '4.4.4.4', + * '2001:4860:4860::8888', + * '4.4.4.4:1053', + * '[2001:4860:4860::8888]:1053', + * ] + * ``` + * @since v0.11.3 + */ + export function getServers(): string[]; + /** + * Set the default value of `verbatim` in {@link lookup} and `dnsPromises.lookup()`. The value could be: + * + * * `ipv4first`: sets default `verbatim` `false`. + * * `verbatim`: sets default `verbatim` `true`. + * + * The default is `verbatim` and {@link setDefaultResultOrder} have higher + * priority than `--dns-result-order`. When using `worker threads`,{@link setDefaultResultOrder} from the main thread won't affect the default + * dns orders in workers. + * @since v16.4.0, v14.18.0 + * @param order must be `'ipv4first'` or `'verbatim'`. + */ + export function setDefaultResultOrder(order: "ipv4first" | "verbatim"): void; + // Error codes + export const NODATA: string; + export const FORMERR: string; + export const SERVFAIL: string; + export const NOTFOUND: string; + export const NOTIMP: string; + export const REFUSED: string; + export const BADQUERY: string; + export const BADNAME: string; + export const BADFAMILY: string; + export const BADRESP: string; + export const CONNREFUSED: string; + export const TIMEOUT: string; + export const EOF: string; + export const FILE: string; + export const NOMEM: string; + export const DESTRUCTION: string; + export const BADSTR: string; + export const BADFLAGS: string; + export const NONAME: string; + export const BADHINTS: string; + export const NOTINITIALIZED: string; + export const LOADIPHLPAPI: string; + export const ADDRGETNETWORKPARAMS: string; + export const CANCELLED: string; + export interface ResolverOptions { + timeout?: number | undefined; + /** + * @default 4 + */ + tries?: number; + } + /** + * An independent resolver for DNS requests. + * + * Creating a new resolver uses the default server settings. Setting + * the servers used for a resolver using `resolver.setServers()` does not affect + * other resolvers: + * + * ```js + * const { Resolver } = require('node:dns'); + * const resolver = new Resolver(); + * resolver.setServers(['4.4.4.4']); + * + * // This request will use the server at 4.4.4.4, independent of global settings. + * resolver.resolve4('example.org', (err, addresses) => { + * // ... + * }); + * ``` + * + * The following methods from the `node:dns` module are available: + * + * * `resolver.getServers()` + * * `resolver.resolve()` + * * `resolver.resolve4()` + * * `resolver.resolve6()` + * * `resolver.resolveAny()` + * * `resolver.resolveCaa()` + * * `resolver.resolveCname()` + * * `resolver.resolveMx()` + * * `resolver.resolveNaptr()` + * * `resolver.resolveNs()` + * * `resolver.resolvePtr()` + * * `resolver.resolveSoa()` + * * `resolver.resolveSrv()` + * * `resolver.resolveTxt()` + * * `resolver.reverse()` + * * `resolver.setServers()` + * @since v8.3.0 + */ + export class Resolver { + constructor(options?: ResolverOptions); + /** + * Cancel all outstanding DNS queries made by this resolver. The corresponding + * callbacks will be called with an error with code `ECANCELLED`. + * @since v8.3.0 + */ + cancel(): void; + getServers: typeof getServers; + resolve: typeof resolve; + resolve4: typeof resolve4; + resolve6: typeof resolve6; + resolveAny: typeof resolveAny; + resolveCaa: typeof resolveCaa; + resolveCname: typeof resolveCname; + resolveMx: typeof resolveMx; + resolveNaptr: typeof resolveNaptr; + resolveNs: typeof resolveNs; + resolvePtr: typeof resolvePtr; + resolveSoa: typeof resolveSoa; + resolveSrv: typeof resolveSrv; + resolveTxt: typeof resolveTxt; + reverse: typeof reverse; + /** + * The resolver instance will send its requests from the specified IP address. + * This allows programs to specify outbound interfaces when used on multi-homed + * systems. + * + * If a v4 or v6 address is not specified, it is set to the default and the + * operating system will choose a local address automatically. + * + * The resolver will use the v4 local address when making requests to IPv4 DNS + * servers, and the v6 local address when making requests to IPv6 DNS servers. + * The `rrtype` of resolution requests has no impact on the local address used. + * @since v15.1.0, v14.17.0 + * @param [ipv4='0.0.0.0'] A string representation of an IPv4 address. + * @param [ipv6='::0'] A string representation of an IPv6 address. + */ + setLocalAddress(ipv4?: string, ipv6?: string): void; + setServers: typeof setServers; + } + export { dnsPromises as promises }; +} +declare module "node:dns" { + export * from "dns"; +} diff --git a/task/node_modules/@types/node/ts4.8/dns/promises.d.ts b/task/node_modules/@types/node/ts4.8/dns/promises.d.ts new file mode 100644 index 0000000..ef9b222 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/dns/promises.d.ts @@ -0,0 +1,425 @@ +/** + * The `dns.promises` API provides an alternative set of asynchronous DNS methods + * that return `Promise` objects rather than using callbacks. The API is accessible + * via `require('node:dns').promises` or `require('node:dns/promises')`. + * @since v10.6.0 + */ +declare module "dns/promises" { + import { + AnyRecord, + CaaRecord, + LookupAddress, + LookupAllOptions, + LookupOneOptions, + LookupOptions, + MxRecord, + NaptrRecord, + RecordWithTtl, + ResolveOptions, + ResolverOptions, + ResolveWithTtlOptions, + SoaRecord, + SrvRecord, + } from "node:dns"; + /** + * Returns an array of IP address strings, formatted according to [RFC 5952](https://tools.ietf.org/html/rfc5952#section-6), + * that are currently configured for DNS resolution. A string will include a port + * section if a custom port is used. + * + * ```js + * [ + * '4.4.4.4', + * '2001:4860:4860::8888', + * '4.4.4.4:1053', + * '[2001:4860:4860::8888]:1053', + * ] + * ``` + * @since v10.6.0 + */ + function getServers(): string[]; + /** + * Resolves a host name (e.g. `'nodejs.org'`) into the first found A (IPv4) or + * AAAA (IPv6) record. All `option` properties are optional. If `options` is an + * integer, then it must be `4` or `6` – if `options` is not provided, then IPv4 + * and IPv6 addresses are both returned if found. + * + * With the `all` option set to `true`, the `Promise` is resolved with `addresses`being an array of objects with the properties `address` and `family`. + * + * On error, the `Promise` is rejected with an `Error` object, where `err.code`is the error code. + * Keep in mind that `err.code` will be set to `'ENOTFOUND'` not only when + * the host name does not exist but also when the lookup fails in other ways + * such as no available file descriptors. + * + * `dnsPromises.lookup()` does not necessarily have anything to do with the DNS + * protocol. The implementation uses an operating system facility that can + * associate names with addresses and vice versa. This implementation can have + * subtle but important consequences on the behavior of any Node.js program. Please + * take some time to consult the `Implementation considerations section` before + * using `dnsPromises.lookup()`. + * + * Example usage: + * + * ```js + * const dns = require('node:dns'); + * const dnsPromises = dns.promises; + * const options = { + * family: 6, + * hints: dns.ADDRCONFIG | dns.V4MAPPED, + * }; + * + * dnsPromises.lookup('example.com', options).then((result) => { + * console.log('address: %j family: IPv%s', result.address, result.family); + * // address: "2606:2800:220:1:248:1893:25c8:1946" family: IPv6 + * }); + * + * // When options.all is true, the result will be an Array. + * options.all = true; + * dnsPromises.lookup('example.com', options).then((result) => { + * console.log('addresses: %j', result); + * // addresses: [{"address":"2606:2800:220:1:248:1893:25c8:1946","family":6}] + * }); + * ``` + * @since v10.6.0 + */ + function lookup(hostname: string, family: number): Promise; + function lookup(hostname: string, options: LookupOneOptions): Promise; + function lookup(hostname: string, options: LookupAllOptions): Promise; + function lookup(hostname: string, options: LookupOptions): Promise; + function lookup(hostname: string): Promise; + /** + * Resolves the given `address` and `port` into a host name and service using + * the operating system's underlying `getnameinfo` implementation. + * + * If `address` is not a valid IP address, a `TypeError` will be thrown. + * The `port` will be coerced to a number. If it is not a legal port, a `TypeError`will be thrown. + * + * On error, the `Promise` is rejected with an `Error` object, where `err.code`is the error code. + * + * ```js + * const dnsPromises = require('node:dns').promises; + * dnsPromises.lookupService('127.0.0.1', 22).then((result) => { + * console.log(result.hostname, result.service); + * // Prints: localhost ssh + * }); + * ``` + * @since v10.6.0 + */ + function lookupService( + address: string, + port: number, + ): Promise<{ + hostname: string; + service: string; + }>; + /** + * Uses the DNS protocol to resolve a host name (e.g. `'nodejs.org'`) into an array + * of the resource records. When successful, the `Promise` is resolved with an + * array of resource records. The type and structure of individual results vary + * based on `rrtype`: + * + * + * + * On error, the `Promise` is rejected with an `Error` object, where `err.code`is one of the `DNS error codes`. + * @since v10.6.0 + * @param hostname Host name to resolve. + * @param [rrtype='A'] Resource record type. + */ + function resolve(hostname: string): Promise; + function resolve(hostname: string, rrtype: "A"): Promise; + function resolve(hostname: string, rrtype: "AAAA"): Promise; + function resolve(hostname: string, rrtype: "ANY"): Promise; + function resolve(hostname: string, rrtype: "CAA"): Promise; + function resolve(hostname: string, rrtype: "CNAME"): Promise; + function resolve(hostname: string, rrtype: "MX"): Promise; + function resolve(hostname: string, rrtype: "NAPTR"): Promise; + function resolve(hostname: string, rrtype: "NS"): Promise; + function resolve(hostname: string, rrtype: "PTR"): Promise; + function resolve(hostname: string, rrtype: "SOA"): Promise; + function resolve(hostname: string, rrtype: "SRV"): Promise; + function resolve(hostname: string, rrtype: "TXT"): Promise; + function resolve( + hostname: string, + rrtype: string, + ): Promise; + /** + * Uses the DNS protocol to resolve IPv4 addresses (`A` records) for the`hostname`. On success, the `Promise` is resolved with an array of IPv4 + * addresses (e.g. `['74.125.79.104', '74.125.79.105', '74.125.79.106']`). + * @since v10.6.0 + * @param hostname Host name to resolve. + */ + function resolve4(hostname: string): Promise; + function resolve4(hostname: string, options: ResolveWithTtlOptions): Promise; + function resolve4(hostname: string, options: ResolveOptions): Promise; + /** + * Uses the DNS protocol to resolve IPv6 addresses (`AAAA` records) for the`hostname`. On success, the `Promise` is resolved with an array of IPv6 + * addresses. + * @since v10.6.0 + * @param hostname Host name to resolve. + */ + function resolve6(hostname: string): Promise; + function resolve6(hostname: string, options: ResolveWithTtlOptions): Promise; + function resolve6(hostname: string, options: ResolveOptions): Promise; + /** + * Uses the DNS protocol to resolve all records (also known as `ANY` or `*` query). + * On success, the `Promise` is resolved with an array containing various types of + * records. Each object has a property `type` that indicates the type of the + * current record. And depending on the `type`, additional properties will be + * present on the object: + * + * + * + * Here is an example of the result object: + * + * ```js + * [ { type: 'A', address: '127.0.0.1', ttl: 299 }, + * { type: 'CNAME', value: 'example.com' }, + * { type: 'MX', exchange: 'alt4.aspmx.l.example.com', priority: 50 }, + * { type: 'NS', value: 'ns1.example.com' }, + * { type: 'TXT', entries: [ 'v=spf1 include:_spf.example.com ~all' ] }, + * { type: 'SOA', + * nsname: 'ns1.example.com', + * hostmaster: 'admin.example.com', + * serial: 156696742, + * refresh: 900, + * retry: 900, + * expire: 1800, + * minttl: 60 } ] + * ``` + * @since v10.6.0 + */ + function resolveAny(hostname: string): Promise; + /** + * Uses the DNS protocol to resolve `CAA` records for the `hostname`. On success, + * the `Promise` is resolved with an array of objects containing available + * certification authority authorization records available for the `hostname`(e.g. `[{critical: 0, iodef: 'mailto:pki@example.com'},{critical: 128, issue: 'pki.example.com'}]`). + * @since v15.0.0, v14.17.0 + */ + function resolveCaa(hostname: string): Promise; + /** + * Uses the DNS protocol to resolve `CNAME` records for the `hostname`. On success, + * the `Promise` is resolved with an array of canonical name records available for + * the `hostname` (e.g. `['bar.example.com']`). + * @since v10.6.0 + */ + function resolveCname(hostname: string): Promise; + /** + * Uses the DNS protocol to resolve mail exchange records (`MX` records) for the`hostname`. On success, the `Promise` is resolved with an array of objects + * containing both a `priority` and `exchange` property (e.g.`[{priority: 10, exchange: 'mx.example.com'}, ...]`). + * @since v10.6.0 + */ + function resolveMx(hostname: string): Promise; + /** + * Uses the DNS protocol to resolve regular expression-based records (`NAPTR`records) for the `hostname`. On success, the `Promise` is resolved with an array + * of objects with the following properties: + * + * * `flags` + * * `service` + * * `regexp` + * * `replacement` + * * `order` + * * `preference` + * + * ```js + * { + * flags: 's', + * service: 'SIP+D2U', + * regexp: '', + * replacement: '_sip._udp.example.com', + * order: 30, + * preference: 100 + * } + * ``` + * @since v10.6.0 + */ + function resolveNaptr(hostname: string): Promise; + /** + * Uses the DNS protocol to resolve name server records (`NS` records) for the`hostname`. On success, the `Promise` is resolved with an array of name server + * records available for `hostname` (e.g.`['ns1.example.com', 'ns2.example.com']`). + * @since v10.6.0 + */ + function resolveNs(hostname: string): Promise; + /** + * Uses the DNS protocol to resolve pointer records (`PTR` records) for the`hostname`. On success, the `Promise` is resolved with an array of strings + * containing the reply records. + * @since v10.6.0 + */ + function resolvePtr(hostname: string): Promise; + /** + * Uses the DNS protocol to resolve a start of authority record (`SOA` record) for + * the `hostname`. On success, the `Promise` is resolved with an object with the + * following properties: + * + * * `nsname` + * * `hostmaster` + * * `serial` + * * `refresh` + * * `retry` + * * `expire` + * * `minttl` + * + * ```js + * { + * nsname: 'ns.example.com', + * hostmaster: 'root.example.com', + * serial: 2013101809, + * refresh: 10000, + * retry: 2400, + * expire: 604800, + * minttl: 3600 + * } + * ``` + * @since v10.6.0 + */ + function resolveSoa(hostname: string): Promise; + /** + * Uses the DNS protocol to resolve service records (`SRV` records) for the`hostname`. On success, the `Promise` is resolved with an array of objects with + * the following properties: + * + * * `priority` + * * `weight` + * * `port` + * * `name` + * + * ```js + * { + * priority: 10, + * weight: 5, + * port: 21223, + * name: 'service.example.com' + * } + * ``` + * @since v10.6.0 + */ + function resolveSrv(hostname: string): Promise; + /** + * Uses the DNS protocol to resolve text queries (`TXT` records) for the`hostname`. On success, the `Promise` is resolved with a two-dimensional array + * of the text records available for `hostname` (e.g.`[ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]`). Each sub-array contains TXT chunks of + * one record. Depending on the use case, these could be either joined together or + * treated separately. + * @since v10.6.0 + */ + function resolveTxt(hostname: string): Promise; + /** + * Performs a reverse DNS query that resolves an IPv4 or IPv6 address to an + * array of host names. + * + * On error, the `Promise` is rejected with an `Error` object, where `err.code`is one of the `DNS error codes`. + * @since v10.6.0 + */ + function reverse(ip: string): Promise; + /** + * Get the default value for `verbatim` in {@link lookup} and `dnsPromises.lookup()`. The value could be: + * + * * `ipv4first`: for `verbatim` defaulting to `false`. + * * `verbatim`: for `verbatim` defaulting to `true`. + * @since v20.1.0 + */ + function getDefaultResultOrder(): "ipv4first" | "verbatim"; + /** + * Sets the IP address and port of servers to be used when performing DNS + * resolution. The `servers` argument is an array of [RFC 5952](https://tools.ietf.org/html/rfc5952#section-6) formatted + * addresses. If the port is the IANA default DNS port (53) it can be omitted. + * + * ```js + * dnsPromises.setServers([ + * '4.4.4.4', + * '[2001:4860:4860::8888]', + * '4.4.4.4:1053', + * '[2001:4860:4860::8888]:1053', + * ]); + * ``` + * + * An error will be thrown if an invalid address is provided. + * + * The `dnsPromises.setServers()` method must not be called while a DNS query is in + * progress. + * + * This method works much like [resolve.conf](https://man7.org/linux/man-pages/man5/resolv.conf.5.html). + * That is, if attempting to resolve with the first server provided results in a`NOTFOUND` error, the `resolve()` method will _not_ attempt to resolve with + * subsequent servers provided. Fallback DNS servers will only be used if the + * earlier ones time out or result in some other error. + * @since v10.6.0 + * @param servers array of `RFC 5952` formatted addresses + */ + function setServers(servers: readonly string[]): void; + /** + * Set the default value of `verbatim` in `dns.lookup()` and `dnsPromises.lookup()`. The value could be: + * + * * `ipv4first`: sets default `verbatim` `false`. + * * `verbatim`: sets default `verbatim` `true`. + * + * The default is `verbatim` and `dnsPromises.setDefaultResultOrder()` have + * higher priority than `--dns-result-order`. When using `worker threads`,`dnsPromises.setDefaultResultOrder()` from the main thread won't affect the + * default dns orders in workers. + * @since v16.4.0, v14.18.0 + * @param order must be `'ipv4first'` or `'verbatim'`. + */ + function setDefaultResultOrder(order: "ipv4first" | "verbatim"): void; + /** + * An independent resolver for DNS requests. + * + * Creating a new resolver uses the default server settings. Setting + * the servers used for a resolver using `resolver.setServers()` does not affect + * other resolvers: + * + * ```js + * const { Resolver } = require('node:dns').promises; + * const resolver = new Resolver(); + * resolver.setServers(['4.4.4.4']); + * + * // This request will use the server at 4.4.4.4, independent of global settings. + * resolver.resolve4('example.org').then((addresses) => { + * // ... + * }); + * + * // Alternatively, the same code can be written using async-await style. + * (async function() { + * const addresses = await resolver.resolve4('example.org'); + * })(); + * ``` + * + * The following methods from the `dnsPromises` API are available: + * + * * `resolver.getServers()` + * * `resolver.resolve()` + * * `resolver.resolve4()` + * * `resolver.resolve6()` + * * `resolver.resolveAny()` + * * `resolver.resolveCaa()` + * * `resolver.resolveCname()` + * * `resolver.resolveMx()` + * * `resolver.resolveNaptr()` + * * `resolver.resolveNs()` + * * `resolver.resolvePtr()` + * * `resolver.resolveSoa()` + * * `resolver.resolveSrv()` + * * `resolver.resolveTxt()` + * * `resolver.reverse()` + * * `resolver.setServers()` + * @since v10.6.0 + */ + class Resolver { + constructor(options?: ResolverOptions); + cancel(): void; + getServers: typeof getServers; + resolve: typeof resolve; + resolve4: typeof resolve4; + resolve6: typeof resolve6; + resolveAny: typeof resolveAny; + resolveCaa: typeof resolveCaa; + resolveCname: typeof resolveCname; + resolveMx: typeof resolveMx; + resolveNaptr: typeof resolveNaptr; + resolveNs: typeof resolveNs; + resolvePtr: typeof resolvePtr; + resolveSoa: typeof resolveSoa; + resolveSrv: typeof resolveSrv; + resolveTxt: typeof resolveTxt; + reverse: typeof reverse; + setLocalAddress(ipv4?: string, ipv6?: string): void; + setServers: typeof setServers; + } +} +declare module "node:dns/promises" { + export * from "dns/promises"; +} diff --git a/task/node_modules/@types/node/ts4.8/dom-events.d.ts b/task/node_modules/@types/node/ts4.8/dom-events.d.ts new file mode 100644 index 0000000..147a7b6 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/dom-events.d.ts @@ -0,0 +1,122 @@ +export {}; // Don't export anything! + +//// DOM-like Events +// NB: The Event / EventTarget / EventListener implementations below were copied +// from lib.dom.d.ts, then edited to reflect Node's documentation at +// https://nodejs.org/api/events.html#class-eventtarget. +// Please read that link to understand important implementation differences. + +// This conditional type will be the existing global Event in a browser, or +// the copy below in a Node environment. +type __Event = typeof globalThis extends { onmessage: any; Event: any } ? {} + : { + /** This is not used in Node.js and is provided purely for completeness. */ + readonly bubbles: boolean; + /** Alias for event.stopPropagation(). This is not used in Node.js and is provided purely for completeness. */ + cancelBubble: () => void; + /** True if the event was created with the cancelable option */ + readonly cancelable: boolean; + /** This is not used in Node.js and is provided purely for completeness. */ + readonly composed: boolean; + /** Returns an array containing the current EventTarget as the only entry or empty if the event is not being dispatched. This is not used in Node.js and is provided purely for completeness. */ + composedPath(): [EventTarget?]; + /** Alias for event.target. */ + readonly currentTarget: EventTarget | null; + /** Is true if cancelable is true and event.preventDefault() has been called. */ + readonly defaultPrevented: boolean; + /** This is not used in Node.js and is provided purely for completeness. */ + readonly eventPhase: 0 | 2; + /** The `AbortSignal` "abort" event is emitted with `isTrusted` set to `true`. The value is `false` in all other cases. */ + readonly isTrusted: boolean; + /** Sets the `defaultPrevented` property to `true` if `cancelable` is `true`. */ + preventDefault(): void; + /** This is not used in Node.js and is provided purely for completeness. */ + returnValue: boolean; + /** Alias for event.target. */ + readonly srcElement: EventTarget | null; + /** Stops the invocation of event listeners after the current one completes. */ + stopImmediatePropagation(): void; + /** This is not used in Node.js and is provided purely for completeness. */ + stopPropagation(): void; + /** The `EventTarget` dispatching the event */ + readonly target: EventTarget | null; + /** The millisecond timestamp when the Event object was created. */ + readonly timeStamp: number; + /** Returns the type of event, e.g. "click", "hashchange", or "submit". */ + readonly type: string; + }; + +// See comment above explaining conditional type +type __EventTarget = typeof globalThis extends { onmessage: any; EventTarget: any } ? {} + : { + /** + * Adds a new handler for the `type` event. Any given `listener` is added only once per `type` and per `capture` option value. + * + * If the `once` option is true, the `listener` is removed after the next time a `type` event is dispatched. + * + * The `capture` option is not used by Node.js in any functional way other than tracking registered event listeners per the `EventTarget` specification. + * Specifically, the `capture` option is used as part of the key when registering a `listener`. + * Any individual `listener` may be added once with `capture = false`, and once with `capture = true`. + */ + addEventListener( + type: string, + listener: EventListener | EventListenerObject, + options?: AddEventListenerOptions | boolean, + ): void; + /** Dispatches a synthetic event event to target and returns true if either event's cancelable attribute value is false or its preventDefault() method was not invoked, and false otherwise. */ + dispatchEvent(event: Event): boolean; + /** Removes the event listener in target's event listener list with the same type, callback, and options. */ + removeEventListener( + type: string, + listener: EventListener | EventListenerObject, + options?: EventListenerOptions | boolean, + ): void; + }; + +interface EventInit { + bubbles?: boolean; + cancelable?: boolean; + composed?: boolean; +} + +interface EventListenerOptions { + /** Not directly used by Node.js. Added for API completeness. Default: `false`. */ + capture?: boolean; +} + +interface AddEventListenerOptions extends EventListenerOptions { + /** When `true`, the listener is automatically removed when it is first invoked. Default: `false`. */ + once?: boolean; + /** When `true`, serves as a hint that the listener will not call the `Event` object's `preventDefault()` method. Default: false. */ + passive?: boolean; +} + +interface EventListener { + (evt: Event): void; +} + +interface EventListenerObject { + handleEvent(object: Event): void; +} + +import {} from "events"; // Make this an ambient declaration +declare global { + /** An event which takes place in the DOM. */ + interface Event extends __Event {} + var Event: typeof globalThis extends { onmessage: any; Event: infer T } ? T + : { + prototype: __Event; + new(type: string, eventInitDict?: EventInit): __Event; + }; + + /** + * EventTarget is a DOM interface implemented by objects that can + * receive events and may have listeners for them. + */ + interface EventTarget extends __EventTarget {} + var EventTarget: typeof globalThis extends { onmessage: any; EventTarget: infer T } ? T + : { + prototype: __EventTarget; + new(): __EventTarget; + }; +} diff --git a/task/node_modules/@types/node/ts4.8/domain.d.ts b/task/node_modules/@types/node/ts4.8/domain.d.ts new file mode 100644 index 0000000..72f17bd --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/domain.d.ts @@ -0,0 +1,170 @@ +/** + * **This module is pending deprecation.** Once a replacement API has been + * finalized, this module will be fully deprecated. Most developers should + * **not** have cause to use this module. Users who absolutely must have + * the functionality that domains provide may rely on it for the time being + * but should expect to have to migrate to a different solution + * in the future. + * + * Domains provide a way to handle multiple different IO operations as a + * single group. If any of the event emitters or callbacks registered to a + * domain emit an `'error'` event, or throw an error, then the domain object + * will be notified, rather than losing the context of the error in the`process.on('uncaughtException')` handler, or causing the program to + * exit immediately with an error code. + * @deprecated Since v1.4.2 - Deprecated + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/domain.js) + */ +declare module "domain" { + import EventEmitter = require("node:events"); + /** + * The `Domain` class encapsulates the functionality of routing errors and + * uncaught exceptions to the active `Domain` object. + * + * To handle the errors that it catches, listen to its `'error'` event. + */ + class Domain extends EventEmitter { + /** + * An array of timers and event emitters that have been explicitly added + * to the domain. + */ + members: Array; + /** + * The `enter()` method is plumbing used by the `run()`, `bind()`, and`intercept()` methods to set the active domain. It sets `domain.active` and`process.domain` to the domain, and implicitly + * pushes the domain onto the domain + * stack managed by the domain module (see {@link exit} for details on the + * domain stack). The call to `enter()` delimits the beginning of a chain of + * asynchronous calls and I/O operations bound to a domain. + * + * Calling `enter()` changes only the active domain, and does not alter the domain + * itself. `enter()` and `exit()` can be called an arbitrary number of times on a + * single domain. + */ + enter(): void; + /** + * The `exit()` method exits the current domain, popping it off the domain stack. + * Any time execution is going to switch to the context of a different chain of + * asynchronous calls, it's important to ensure that the current domain is exited. + * The call to `exit()` delimits either the end of or an interruption to the chain + * of asynchronous calls and I/O operations bound to a domain. + * + * If there are multiple, nested domains bound to the current execution context,`exit()` will exit any domains nested within this domain. + * + * Calling `exit()` changes only the active domain, and does not alter the domain + * itself. `enter()` and `exit()` can be called an arbitrary number of times on a + * single domain. + */ + exit(): void; + /** + * Run the supplied function in the context of the domain, implicitly + * binding all event emitters, timers, and low-level requests that are + * created in that context. Optionally, arguments can be passed to + * the function. + * + * This is the most basic way to use a domain. + * + * ```js + * const domain = require('node:domain'); + * const fs = require('node:fs'); + * const d = domain.create(); + * d.on('error', (er) => { + * console.error('Caught error!', er); + * }); + * d.run(() => { + * process.nextTick(() => { + * setTimeout(() => { // Simulating some various async stuff + * fs.open('non-existent file', 'r', (er, fd) => { + * if (er) throw er; + * // proceed... + * }); + * }, 100); + * }); + * }); + * ``` + * + * In this example, the `d.on('error')` handler will be triggered, rather + * than crashing the program. + */ + run(fn: (...args: any[]) => T, ...args: any[]): T; + /** + * Explicitly adds an emitter to the domain. If any event handlers called by + * the emitter throw an error, or if the emitter emits an `'error'` event, it + * will be routed to the domain's `'error'` event, just like with implicit + * binding. + * + * This also works with timers that are returned from `setInterval()` and `setTimeout()`. If their callback function throws, it will be caught by + * the domain `'error'` handler. + * + * If the Timer or `EventEmitter` was already bound to a domain, it is removed + * from that one, and bound to this one instead. + * @param emitter emitter or timer to be added to the domain + */ + add(emitter: EventEmitter | NodeJS.Timer): void; + /** + * The opposite of {@link add}. Removes domain handling from the + * specified emitter. + * @param emitter emitter or timer to be removed from the domain + */ + remove(emitter: EventEmitter | NodeJS.Timer): void; + /** + * The returned function will be a wrapper around the supplied callback + * function. When the returned function is called, any errors that are + * thrown will be routed to the domain's `'error'` event. + * + * ```js + * const d = domain.create(); + * + * function readSomeFile(filename, cb) { + * fs.readFile(filename, 'utf8', d.bind((er, data) => { + * // If this throws, it will also be passed to the domain. + * return cb(er, data ? JSON.parse(data) : null); + * })); + * } + * + * d.on('error', (er) => { + * // An error occurred somewhere. If we throw it now, it will crash the program + * // with the normal line number and stack message. + * }); + * ``` + * @param callback The callback function + * @return The bound function + */ + bind(callback: T): T; + /** + * This method is almost identical to {@link bind}. However, in + * addition to catching thrown errors, it will also intercept `Error` objects sent as the first argument to the function. + * + * In this way, the common `if (err) return callback(err);` pattern can be replaced + * with a single error handler in a single place. + * + * ```js + * const d = domain.create(); + * + * function readSomeFile(filename, cb) { + * fs.readFile(filename, 'utf8', d.intercept((data) => { + * // Note, the first argument is never passed to the + * // callback since it is assumed to be the 'Error' argument + * // and thus intercepted by the domain. + * + * // If this throws, it will also be passed to the domain + * // so the error-handling logic can be moved to the 'error' + * // event on the domain instead of being repeated throughout + * // the program. + * return cb(null, JSON.parse(data)); + * })); + * } + * + * d.on('error', (er) => { + * // An error occurred somewhere. If we throw it now, it will crash the program + * // with the normal line number and stack message. + * }); + * ``` + * @param callback The callback function + * @return The intercepted function + */ + intercept(callback: T): T; + } + function create(): Domain; +} +declare module "node:domain" { + export * from "domain"; +} diff --git a/task/node_modules/@types/node/ts4.8/events.d.ts b/task/node_modules/@types/node/ts4.8/events.d.ts new file mode 100644 index 0000000..6ed47c5 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/events.d.ts @@ -0,0 +1,879 @@ +/** + * Much of the Node.js core API is built around an idiomatic asynchronous + * event-driven architecture in which certain kinds of objects (called "emitters") + * emit named events that cause `Function` objects ("listeners") to be called. + * + * For instance: a `net.Server` object emits an event each time a peer + * connects to it; a `fs.ReadStream` emits an event when the file is opened; + * a `stream` emits an event whenever data is available to be read. + * + * All objects that emit events are instances of the `EventEmitter` class. These + * objects expose an `eventEmitter.on()` function that allows one or more + * functions to be attached to named events emitted by the object. Typically, + * event names are camel-cased strings but any valid JavaScript property key + * can be used. + * + * When the `EventEmitter` object emits an event, all of the functions attached + * to that specific event are called _synchronously_. Any values returned by the + * called listeners are _ignored_ and discarded. + * + * The following example shows a simple `EventEmitter` instance with a single + * listener. The `eventEmitter.on()` method is used to register listeners, while + * the `eventEmitter.emit()` method is used to trigger the event. + * + * ```js + * import { EventEmitter } from 'node:events'; + * + * class MyEmitter extends EventEmitter {} + * + * const myEmitter = new MyEmitter(); + * myEmitter.on('event', () => { + * console.log('an event occurred!'); + * }); + * myEmitter.emit('event'); + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/events.js) + */ +declare module "events" { + import { AsyncResource, AsyncResourceOptions } from "node:async_hooks"; + // NOTE: This class is in the docs but is **not actually exported** by Node. + // If https://github.com/nodejs/node/issues/39903 gets resolved and Node + // actually starts exporting the class, uncomment below. + // import { EventListener, EventListenerObject } from '__dom-events'; + // /** The NodeEventTarget is a Node.js-specific extension to EventTarget that emulates a subset of the EventEmitter API. */ + // interface NodeEventTarget extends EventTarget { + // /** + // * Node.js-specific extension to the `EventTarget` class that emulates the equivalent `EventEmitter` API. + // * The only difference between `addListener()` and `addEventListener()` is that addListener() will return a reference to the EventTarget. + // */ + // addListener(type: string, listener: EventListener | EventListenerObject, options?: { once: boolean }): this; + // /** Node.js-specific extension to the `EventTarget` class that returns an array of event `type` names for which event listeners are registered. */ + // eventNames(): string[]; + // /** Node.js-specific extension to the `EventTarget` class that returns the number of event listeners registered for the `type`. */ + // listenerCount(type: string): number; + // /** Node.js-specific alias for `eventTarget.removeListener()`. */ + // off(type: string, listener: EventListener | EventListenerObject): this; + // /** Node.js-specific alias for `eventTarget.addListener()`. */ + // on(type: string, listener: EventListener | EventListenerObject, options?: { once: boolean }): this; + // /** Node.js-specific extension to the `EventTarget` class that adds a `once` listener for the given event `type`. This is equivalent to calling `on` with the `once` option set to `true`. */ + // once(type: string, listener: EventListener | EventListenerObject): this; + // /** + // * Node.js-specific extension to the `EventTarget` class. + // * If `type` is specified, removes all registered listeners for `type`, + // * otherwise removes all registered listeners. + // */ + // removeAllListeners(type: string): this; + // /** + // * Node.js-specific extension to the `EventTarget` class that removes the listener for the given `type`. + // * The only difference between `removeListener()` and `removeEventListener()` is that `removeListener()` will return a reference to the `EventTarget`. + // */ + // removeListener(type: string, listener: EventListener | EventListenerObject): this; + // } + interface EventEmitterOptions { + /** + * Enables automatic capturing of promise rejection. + */ + captureRejections?: boolean | undefined; + } + // Any EventTarget with a Node-style `once` function + interface _NodeEventTarget { + once(eventName: string | symbol, listener: (...args: any[]) => void): this; + } + // Any EventTarget with a DOM-style `addEventListener` + interface _DOMEventTarget { + addEventListener( + eventName: string, + listener: (...args: any[]) => void, + opts?: { + once: boolean; + }, + ): any; + } + interface StaticEventEmitterOptions { + signal?: AbortSignal | undefined; + } + interface EventEmitter extends NodeJS.EventEmitter {} + /** + * The `EventEmitter` class is defined and exposed by the `node:events` module: + * + * ```js + * import { EventEmitter } from 'node:events'; + * ``` + * + * All `EventEmitter`s emit the event `'newListener'` when new listeners are + * added and `'removeListener'` when existing listeners are removed. + * + * It supports the following option: + * @since v0.1.26 + */ + class EventEmitter { + constructor(options?: EventEmitterOptions); + + [EventEmitter.captureRejectionSymbol]?(error: Error, event: string, ...args: any[]): void; + + /** + * Creates a `Promise` that is fulfilled when the `EventEmitter` emits the given + * event or that is rejected if the `EventEmitter` emits `'error'` while waiting. + * The `Promise` will resolve with an array of all the arguments emitted to the + * given event. + * + * This method is intentionally generic and works with the web platform [EventTarget](https://dom.spec.whatwg.org/#interface-eventtarget) interface, which has no special`'error'` event + * semantics and does not listen to the `'error'` event. + * + * ```js + * import { once, EventEmitter } from 'node:events'; + * import process from 'node:process'; + * + * const ee = new EventEmitter(); + * + * process.nextTick(() => { + * ee.emit('myevent', 42); + * }); + * + * const [value] = await once(ee, 'myevent'); + * console.log(value); + * + * const err = new Error('kaboom'); + * process.nextTick(() => { + * ee.emit('error', err); + * }); + * + * try { + * await once(ee, 'myevent'); + * } catch (err) { + * console.error('error happened', err); + * } + * ``` + * + * The special handling of the `'error'` event is only used when `events.once()`is used to wait for another event. If `events.once()` is used to wait for the + * '`error'` event itself, then it is treated as any other kind of event without + * special handling: + * + * ```js + * import { EventEmitter, once } from 'node:events'; + * + * const ee = new EventEmitter(); + * + * once(ee, 'error') + * .then(([err]) => console.log('ok', err.message)) + * .catch((err) => console.error('error', err.message)); + * + * ee.emit('error', new Error('boom')); + * + * // Prints: ok boom + * ``` + * + * An `AbortSignal` can be used to cancel waiting for the event: + * + * ```js + * import { EventEmitter, once } from 'node:events'; + * + * const ee = new EventEmitter(); + * const ac = new AbortController(); + * + * async function foo(emitter, event, signal) { + * try { + * await once(emitter, event, { signal }); + * console.log('event emitted!'); + * } catch (error) { + * if (error.name === 'AbortError') { + * console.error('Waiting for the event was canceled!'); + * } else { + * console.error('There was an error', error.message); + * } + * } + * } + * + * foo(ee, 'foo', ac.signal); + * ac.abort(); // Abort waiting for the event + * ee.emit('foo'); // Prints: Waiting for the event was canceled! + * ``` + * @since v11.13.0, v10.16.0 + */ + static once( + emitter: _NodeEventTarget, + eventName: string | symbol, + options?: StaticEventEmitterOptions, + ): Promise; + static once(emitter: _DOMEventTarget, eventName: string, options?: StaticEventEmitterOptions): Promise; + /** + * ```js + * import { on, EventEmitter } from 'node:events'; + * import process from 'node:process'; + * + * const ee = new EventEmitter(); + * + * // Emit later on + * process.nextTick(() => { + * ee.emit('foo', 'bar'); + * ee.emit('foo', 42); + * }); + * + * for await (const event of on(ee, 'foo')) { + * // The execution of this inner block is synchronous and it + * // processes one event at a time (even with await). Do not use + * // if concurrent execution is required. + * console.log(event); // prints ['bar'] [42] + * } + * // Unreachable here + * ``` + * + * Returns an `AsyncIterator` that iterates `eventName` events. It will throw + * if the `EventEmitter` emits `'error'`. It removes all listeners when + * exiting the loop. The `value` returned by each iteration is an array + * composed of the emitted event arguments. + * + * An `AbortSignal` can be used to cancel waiting on events: + * + * ```js + * import { on, EventEmitter } from 'node:events'; + * import process from 'node:process'; + * + * const ac = new AbortController(); + * + * (async () => { + * const ee = new EventEmitter(); + * + * // Emit later on + * process.nextTick(() => { + * ee.emit('foo', 'bar'); + * ee.emit('foo', 42); + * }); + * + * for await (const event of on(ee, 'foo', { signal: ac.signal })) { + * // The execution of this inner block is synchronous and it + * // processes one event at a time (even with await). Do not use + * // if concurrent execution is required. + * console.log(event); // prints ['bar'] [42] + * } + * // Unreachable here + * })(); + * + * process.nextTick(() => ac.abort()); + * ``` + * @since v13.6.0, v12.16.0 + * @param eventName The name of the event being listened for + * @return that iterates `eventName` events emitted by the `emitter` + */ + static on( + emitter: NodeJS.EventEmitter, + eventName: string, + options?: StaticEventEmitterOptions, + ): AsyncIterableIterator; + /** + * A class method that returns the number of listeners for the given `eventName`registered on the given `emitter`. + * + * ```js + * import { EventEmitter, listenerCount } from 'node:events'; + * + * const myEmitter = new EventEmitter(); + * myEmitter.on('event', () => {}); + * myEmitter.on('event', () => {}); + * console.log(listenerCount(myEmitter, 'event')); + * // Prints: 2 + * ``` + * @since v0.9.12 + * @deprecated Since v3.2.0 - Use `listenerCount` instead. + * @param emitter The emitter to query + * @param eventName The event name + */ + static listenerCount(emitter: NodeJS.EventEmitter, eventName: string | symbol): number; + /** + * Returns a copy of the array of listeners for the event named `eventName`. + * + * For `EventEmitter`s this behaves exactly the same as calling `.listeners` on + * the emitter. + * + * For `EventTarget`s this is the only way to get the event listeners for the + * event target. This is useful for debugging and diagnostic purposes. + * + * ```js + * import { getEventListeners, EventEmitter } from 'node:events'; + * + * { + * const ee = new EventEmitter(); + * const listener = () => console.log('Events are fun'); + * ee.on('foo', listener); + * console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ] + * } + * { + * const et = new EventTarget(); + * const listener = () => console.log('Events are fun'); + * et.addEventListener('foo', listener); + * console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ] + * } + * ``` + * @since v15.2.0, v14.17.0 + */ + static getEventListeners(emitter: _DOMEventTarget | NodeJS.EventEmitter, name: string | symbol): Function[]; + /** + * Returns the currently set max amount of listeners. + * + * For `EventEmitter`s this behaves exactly the same as calling `.getMaxListeners` on + * the emitter. + * + * For `EventTarget`s this is the only way to get the max event listeners for the + * event target. If the number of event handlers on a single EventTarget exceeds + * the max set, the EventTarget will print a warning. + * + * ```js + * import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events'; + * + * { + * const ee = new EventEmitter(); + * console.log(getMaxListeners(ee)); // 10 + * setMaxListeners(11, ee); + * console.log(getMaxListeners(ee)); // 11 + * } + * { + * const et = new EventTarget(); + * console.log(getMaxListeners(et)); // 10 + * setMaxListeners(11, et); + * console.log(getMaxListeners(et)); // 11 + * } + * ``` + * @since v19.9.0 + */ + static getMaxListeners(emitter: _DOMEventTarget | NodeJS.EventEmitter): number; + /** + * ```js + * import { setMaxListeners, EventEmitter } from 'node:events'; + * + * const target = new EventTarget(); + * const emitter = new EventEmitter(); + * + * setMaxListeners(5, target, emitter); + * ``` + * @since v15.4.0 + * @param n A non-negative number. The maximum number of listeners per `EventTarget` event. + * @param eventsTargets Zero or more {EventTarget} or {EventEmitter} instances. If none are specified, `n` is set as the default max for all newly created {EventTarget} and {EventEmitter} + * objects. + */ + static setMaxListeners(n?: number, ...eventTargets: Array<_DOMEventTarget | NodeJS.EventEmitter>): void; + /** + * Listens once to the `abort` event on the provided `signal`. + * + * Listening to the `abort` event on abort signals is unsafe and may + * lead to resource leaks since another third party with the signal can + * call `e.stopImmediatePropagation()`. Unfortunately Node.js cannot change + * this since it would violate the web standard. Additionally, the original + * API makes it easy to forget to remove listeners. + * + * This API allows safely using `AbortSignal`s in Node.js APIs by solving these + * two issues by listening to the event such that `stopImmediatePropagation` does + * not prevent the listener from running. + * + * Returns a disposable so that it may be unsubscribed from more easily. + * + * ```js + * import { addAbortListener } from 'node:events'; + * + * function example(signal) { + * let disposable; + * try { + * signal.addEventListener('abort', (e) => e.stopImmediatePropagation()); + * disposable = addAbortListener(signal, (e) => { + * // Do something when signal is aborted. + * }); + * } finally { + * disposable?.[Symbol.dispose](); + * } + * } + * ``` + * @since v20.5.0 + * @experimental + * @return Disposable that removes the `abort` listener. + */ + static addAbortListener(signal: AbortSignal, resource: (event: Event) => void): Disposable; + /** + * This symbol shall be used to install a listener for only monitoring `'error'`events. Listeners installed using this symbol are called before the regular`'error'` listeners are called. + * + * Installing a listener using this symbol does not change the behavior once an`'error'` event is emitted. Therefore, the process will still crash if no + * regular `'error'` listener is installed. + * @since v13.6.0, v12.17.0 + */ + static readonly errorMonitor: unique symbol; + /** + * Value: `Symbol.for('nodejs.rejection')` + * + * See how to write a custom `rejection handler`. + * @since v13.4.0, v12.16.0 + */ + static readonly captureRejectionSymbol: unique symbol; + /** + * Value: [boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) + * + * Change the default `captureRejections` option on all new `EventEmitter` objects. + * @since v13.4.0, v12.16.0 + */ + static captureRejections: boolean; + /** + * By default, a maximum of `10` listeners can be registered for any single + * event. This limit can be changed for individual `EventEmitter` instances + * using the `emitter.setMaxListeners(n)` method. To change the default + * for _all_`EventEmitter` instances, the `events.defaultMaxListeners`property can be used. If this value is not a positive number, a `RangeError`is thrown. + * + * Take caution when setting the `events.defaultMaxListeners` because the + * change affects _all_`EventEmitter` instances, including those created before + * the change is made. However, calling `emitter.setMaxListeners(n)` still has + * precedence over `events.defaultMaxListeners`. + * + * This is not a hard limit. The `EventEmitter` instance will allow + * more listeners to be added but will output a trace warning to stderr indicating + * that a "possible EventEmitter memory leak" has been detected. For any single`EventEmitter`, the `emitter.getMaxListeners()` and `emitter.setMaxListeners()`methods can be used to + * temporarily avoid this warning: + * + * ```js + * import { EventEmitter } from 'node:events'; + * const emitter = new EventEmitter(); + * emitter.setMaxListeners(emitter.getMaxListeners() + 1); + * emitter.once('event', () => { + * // do stuff + * emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0)); + * }); + * ``` + * + * The `--trace-warnings` command-line flag can be used to display the + * stack trace for such warnings. + * + * The emitted warning can be inspected with `process.on('warning')` and will + * have the additional `emitter`, `type`, and `count` properties, referring to + * the event emitter instance, the event's name and the number of attached + * listeners, respectively. + * Its `name` property is set to `'MaxListenersExceededWarning'`. + * @since v0.11.2 + */ + static defaultMaxListeners: number; + } + import internal = require("node:events"); + namespace EventEmitter { + // Should just be `export { EventEmitter }`, but that doesn't work in TypeScript 3.4 + export { internal as EventEmitter }; + export interface Abortable { + /** + * When provided the corresponding `AbortController` can be used to cancel an asynchronous action. + */ + signal?: AbortSignal | undefined; + } + + export interface EventEmitterReferencingAsyncResource extends AsyncResource { + readonly eventEmitter: EventEmitterAsyncResource; + } + + export interface EventEmitterAsyncResourceOptions extends AsyncResourceOptions, EventEmitterOptions { + /** + * The type of async event, this is required when instantiating `EventEmitterAsyncResource` + * directly rather than as a child class. + * @default new.target.name if instantiated as a child class. + */ + name?: string; + } + + /** + * Integrates `EventEmitter` with `AsyncResource` for `EventEmitter`s that + * require manual async tracking. Specifically, all events emitted by instances + * of `events.EventEmitterAsyncResource` will run within its `async context`. + * + * ```js + * import { EventEmitterAsyncResource, EventEmitter } from 'node:events'; + * import { notStrictEqual, strictEqual } from 'node:assert'; + * import { executionAsyncId, triggerAsyncId } from 'node:async_hooks'; + * + * // Async tracking tooling will identify this as 'Q'. + * const ee1 = new EventEmitterAsyncResource({ name: 'Q' }); + * + * // 'foo' listeners will run in the EventEmitters async context. + * ee1.on('foo', () => { + * strictEqual(executionAsyncId(), ee1.asyncId); + * strictEqual(triggerAsyncId(), ee1.triggerAsyncId); + * }); + * + * const ee2 = new EventEmitter(); + * + * // 'foo' listeners on ordinary EventEmitters that do not track async + * // context, however, run in the same async context as the emit(). + * ee2.on('foo', () => { + * notStrictEqual(executionAsyncId(), ee2.asyncId); + * notStrictEqual(triggerAsyncId(), ee2.triggerAsyncId); + * }); + * + * Promise.resolve().then(() => { + * ee1.emit('foo'); + * ee2.emit('foo'); + * }); + * ``` + * + * The `EventEmitterAsyncResource` class has the same methods and takes the + * same options as `EventEmitter` and `AsyncResource` themselves. + * @since v17.4.0, v16.14.0 + */ + export class EventEmitterAsyncResource extends EventEmitter { + /** + * @param options Only optional in child class. + */ + constructor(options?: EventEmitterAsyncResourceOptions); + /** + * Call all `destroy` hooks. This should only ever be called once. An error will + * be thrown if it is called more than once. This **must** be manually called. If + * the resource is left to be collected by the GC then the `destroy` hooks will + * never be called. + */ + emitDestroy(): void; + /** + * The unique `asyncId` assigned to the resource. + */ + readonly asyncId: number; + /** + * The same triggerAsyncId that is passed to the AsyncResource constructor. + */ + readonly triggerAsyncId: number; + /** + * The returned `AsyncResource` object has an additional `eventEmitter` property + * that provides a reference to this `EventEmitterAsyncResource`. + */ + readonly asyncResource: EventEmitterReferencingAsyncResource; + } + } + global { + namespace NodeJS { + interface EventEmitter { + [EventEmitter.captureRejectionSymbol]?(error: Error, event: string, ...args: any[]): void; + /** + * Alias for `emitter.on(eventName, listener)`. + * @since v0.1.26 + */ + addListener(eventName: string | symbol, listener: (...args: any[]) => void): this; + /** + * Adds the `listener` function to the end of the listeners array for the + * event named `eventName`. No checks are made to see if the `listener` has + * already been added. Multiple calls passing the same combination of `eventName`and `listener` will result in the `listener` being added, and called, multiple + * times. + * + * ```js + * server.on('connection', (stream) => { + * console.log('someone connected!'); + * }); + * ``` + * + * Returns a reference to the `EventEmitter`, so that calls can be chained. + * + * By default, event listeners are invoked in the order they are added. The`emitter.prependListener()` method can be used as an alternative to add the + * event listener to the beginning of the listeners array. + * + * ```js + * import { EventEmitter } from 'node:events'; + * const myEE = new EventEmitter(); + * myEE.on('foo', () => console.log('a')); + * myEE.prependListener('foo', () => console.log('b')); + * myEE.emit('foo'); + * // Prints: + * // b + * // a + * ``` + * @since v0.1.101 + * @param eventName The name of the event. + * @param listener The callback function + */ + on(eventName: string | symbol, listener: (...args: any[]) => void): this; + /** + * Adds a **one-time**`listener` function for the event named `eventName`. The + * next time `eventName` is triggered, this listener is removed and then invoked. + * + * ```js + * server.once('connection', (stream) => { + * console.log('Ah, we have our first user!'); + * }); + * ``` + * + * Returns a reference to the `EventEmitter`, so that calls can be chained. + * + * By default, event listeners are invoked in the order they are added. The`emitter.prependOnceListener()` method can be used as an alternative to add the + * event listener to the beginning of the listeners array. + * + * ```js + * import { EventEmitter } from 'node:events'; + * const myEE = new EventEmitter(); + * myEE.once('foo', () => console.log('a')); + * myEE.prependOnceListener('foo', () => console.log('b')); + * myEE.emit('foo'); + * // Prints: + * // b + * // a + * ``` + * @since v0.3.0 + * @param eventName The name of the event. + * @param listener The callback function + */ + once(eventName: string | symbol, listener: (...args: any[]) => void): this; + /** + * Removes the specified `listener` from the listener array for the event named`eventName`. + * + * ```js + * const callback = (stream) => { + * console.log('someone connected!'); + * }; + * server.on('connection', callback); + * // ... + * server.removeListener('connection', callback); + * ``` + * + * `removeListener()` will remove, at most, one instance of a listener from the + * listener array. If any single listener has been added multiple times to the + * listener array for the specified `eventName`, then `removeListener()` must be + * called multiple times to remove each instance. + * + * Once an event is emitted, all listeners attached to it at the + * time of emitting are called in order. This implies that any`removeListener()` or `removeAllListeners()` calls _after_ emitting and _before_ the last listener finishes execution + * will not remove them from`emit()` in progress. Subsequent events behave as expected. + * + * ```js + * import { EventEmitter } from 'node:events'; + * class MyEmitter extends EventEmitter {} + * const myEmitter = new MyEmitter(); + * + * const callbackA = () => { + * console.log('A'); + * myEmitter.removeListener('event', callbackB); + * }; + * + * const callbackB = () => { + * console.log('B'); + * }; + * + * myEmitter.on('event', callbackA); + * + * myEmitter.on('event', callbackB); + * + * // callbackA removes listener callbackB but it will still be called. + * // Internal listener array at time of emit [callbackA, callbackB] + * myEmitter.emit('event'); + * // Prints: + * // A + * // B + * + * // callbackB is now removed. + * // Internal listener array [callbackA] + * myEmitter.emit('event'); + * // Prints: + * // A + * ``` + * + * Because listeners are managed using an internal array, calling this will + * change the position indices of any listener registered _after_ the listener + * being removed. This will not impact the order in which listeners are called, + * but it means that any copies of the listener array as returned by + * the `emitter.listeners()` method will need to be recreated. + * + * When a single function has been added as a handler multiple times for a single + * event (as in the example below), `removeListener()` will remove the most + * recently added instance. In the example the `once('ping')`listener is removed: + * + * ```js + * import { EventEmitter } from 'node:events'; + * const ee = new EventEmitter(); + * + * function pong() { + * console.log('pong'); + * } + * + * ee.on('ping', pong); + * ee.once('ping', pong); + * ee.removeListener('ping', pong); + * + * ee.emit('ping'); + * ee.emit('ping'); + * ``` + * + * Returns a reference to the `EventEmitter`, so that calls can be chained. + * @since v0.1.26 + */ + removeListener(eventName: string | symbol, listener: (...args: any[]) => void): this; + /** + * Alias for `emitter.removeListener()`. + * @since v10.0.0 + */ + off(eventName: string | symbol, listener: (...args: any[]) => void): this; + /** + * Removes all listeners, or those of the specified `eventName`. + * + * It is bad practice to remove listeners added elsewhere in the code, + * particularly when the `EventEmitter` instance was created by some other + * component or module (e.g. sockets or file streams). + * + * Returns a reference to the `EventEmitter`, so that calls can be chained. + * @since v0.1.26 + */ + removeAllListeners(event?: string | symbol): this; + /** + * By default `EventEmitter`s will print a warning if more than `10` listeners are + * added for a particular event. This is a useful default that helps finding + * memory leaks. The `emitter.setMaxListeners()` method allows the limit to be + * modified for this specific `EventEmitter` instance. The value can be set to`Infinity` (or `0`) to indicate an unlimited number of listeners. + * + * Returns a reference to the `EventEmitter`, so that calls can be chained. + * @since v0.3.5 + */ + setMaxListeners(n: number): this; + /** + * Returns the current max listener value for the `EventEmitter` which is either + * set by `emitter.setMaxListeners(n)` or defaults to {@link defaultMaxListeners}. + * @since v1.0.0 + */ + getMaxListeners(): number; + /** + * Returns a copy of the array of listeners for the event named `eventName`. + * + * ```js + * server.on('connection', (stream) => { + * console.log('someone connected!'); + * }); + * console.log(util.inspect(server.listeners('connection'))); + * // Prints: [ [Function] ] + * ``` + * @since v0.1.26 + */ + listeners(eventName: string | symbol): Function[]; + /** + * Returns a copy of the array of listeners for the event named `eventName`, + * including any wrappers (such as those created by `.once()`). + * + * ```js + * import { EventEmitter } from 'node:events'; + * const emitter = new EventEmitter(); + * emitter.once('log', () => console.log('log once')); + * + * // Returns a new Array with a function `onceWrapper` which has a property + * // `listener` which contains the original listener bound above + * const listeners = emitter.rawListeners('log'); + * const logFnWrapper = listeners[0]; + * + * // Logs "log once" to the console and does not unbind the `once` event + * logFnWrapper.listener(); + * + * // Logs "log once" to the console and removes the listener + * logFnWrapper(); + * + * emitter.on('log', () => console.log('log persistently')); + * // Will return a new Array with a single function bound by `.on()` above + * const newListeners = emitter.rawListeners('log'); + * + * // Logs "log persistently" twice + * newListeners[0](); + * emitter.emit('log'); + * ``` + * @since v9.4.0 + */ + rawListeners(eventName: string | symbol): Function[]; + /** + * Synchronously calls each of the listeners registered for the event named`eventName`, in the order they were registered, passing the supplied arguments + * to each. + * + * Returns `true` if the event had listeners, `false` otherwise. + * + * ```js + * import { EventEmitter } from 'node:events'; + * const myEmitter = new EventEmitter(); + * + * // First listener + * myEmitter.on('event', function firstListener() { + * console.log('Helloooo! first listener'); + * }); + * // Second listener + * myEmitter.on('event', function secondListener(arg1, arg2) { + * console.log(`event with parameters ${arg1}, ${arg2} in second listener`); + * }); + * // Third listener + * myEmitter.on('event', function thirdListener(...args) { + * const parameters = args.join(', '); + * console.log(`event with parameters ${parameters} in third listener`); + * }); + * + * console.log(myEmitter.listeners('event')); + * + * myEmitter.emit('event', 1, 2, 3, 4, 5); + * + * // Prints: + * // [ + * // [Function: firstListener], + * // [Function: secondListener], + * // [Function: thirdListener] + * // ] + * // Helloooo! first listener + * // event with parameters 1, 2 in second listener + * // event with parameters 1, 2, 3, 4, 5 in third listener + * ``` + * @since v0.1.26 + */ + emit(eventName: string | symbol, ...args: any[]): boolean; + /** + * Returns the number of listeners listening for the event named `eventName`. + * If `listener` is provided, it will return how many times the listener is found + * in the list of the listeners of the event. + * @since v3.2.0 + * @param eventName The name of the event being listened for + * @param listener The event handler function + */ + listenerCount(eventName: string | symbol, listener?: Function): number; + /** + * Adds the `listener` function to the _beginning_ of the listeners array for the + * event named `eventName`. No checks are made to see if the `listener` has + * already been added. Multiple calls passing the same combination of `eventName`and `listener` will result in the `listener` being added, and called, multiple + * times. + * + * ```js + * server.prependListener('connection', (stream) => { + * console.log('someone connected!'); + * }); + * ``` + * + * Returns a reference to the `EventEmitter`, so that calls can be chained. + * @since v6.0.0 + * @param eventName The name of the event. + * @param listener The callback function + */ + prependListener(eventName: string | symbol, listener: (...args: any[]) => void): this; + /** + * Adds a **one-time**`listener` function for the event named `eventName` to the _beginning_ of the listeners array. The next time `eventName` is triggered, this + * listener is removed, and then invoked. + * + * ```js + * server.prependOnceListener('connection', (stream) => { + * console.log('Ah, we have our first user!'); + * }); + * ``` + * + * Returns a reference to the `EventEmitter`, so that calls can be chained. + * @since v6.0.0 + * @param eventName The name of the event. + * @param listener The callback function + */ + prependOnceListener(eventName: string | symbol, listener: (...args: any[]) => void): this; + /** + * Returns an array listing the events for which the emitter has registered + * listeners. The values in the array are strings or `Symbol`s. + * + * ```js + * import { EventEmitter } from 'node:events'; + * + * const myEE = new EventEmitter(); + * myEE.on('foo', () => {}); + * myEE.on('bar', () => {}); + * + * const sym = Symbol('symbol'); + * myEE.on(sym, () => {}); + * + * console.log(myEE.eventNames()); + * // Prints: [ 'foo', 'bar', Symbol(symbol) ] + * ``` + * @since v6.0.0 + */ + eventNames(): Array; + } + } + } + export = EventEmitter; +} +declare module "node:events" { + import events = require("events"); + export = events; +} diff --git a/task/node_modules/@types/node/ts4.8/fs.d.ts b/task/node_modules/@types/node/ts4.8/fs.d.ts new file mode 100644 index 0000000..f98453a --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/fs.d.ts @@ -0,0 +1,4291 @@ +/** + * The `node:fs` module enables interacting with the file system in a + * way modeled on standard POSIX functions. + * + * To use the promise-based APIs: + * + * ```js + * import * as fs from 'node:fs/promises'; + * ``` + * + * To use the callback and sync APIs: + * + * ```js + * import * as fs from 'node:fs'; + * ``` + * + * All file system operations have synchronous, callback, and promise-based + * forms, and are accessible using both CommonJS syntax and ES6 Modules (ESM). + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/fs.js) + */ +declare module "fs" { + import * as stream from "node:stream"; + import { Abortable, EventEmitter } from "node:events"; + import { URL } from "node:url"; + import * as promises from "node:fs/promises"; + export { promises }; + /** + * Valid types for path values in "fs". + */ + export type PathLike = string | Buffer | URL; + export type PathOrFileDescriptor = PathLike | number; + export type TimeLike = string | number | Date; + export type NoParamCallback = (err: NodeJS.ErrnoException | null) => void; + export type BufferEncodingOption = + | "buffer" + | { + encoding: "buffer"; + }; + export interface ObjectEncodingOptions { + encoding?: BufferEncoding | null | undefined; + } + export type EncodingOption = ObjectEncodingOptions | BufferEncoding | undefined | null; + export type OpenMode = number | string; + export type Mode = number | string; + export interface StatsBase { + isFile(): boolean; + isDirectory(): boolean; + isBlockDevice(): boolean; + isCharacterDevice(): boolean; + isSymbolicLink(): boolean; + isFIFO(): boolean; + isSocket(): boolean; + dev: T; + ino: T; + mode: T; + nlink: T; + uid: T; + gid: T; + rdev: T; + size: T; + blksize: T; + blocks: T; + atimeMs: T; + mtimeMs: T; + ctimeMs: T; + birthtimeMs: T; + atime: Date; + mtime: Date; + ctime: Date; + birthtime: Date; + } + export interface Stats extends StatsBase {} + /** + * A `fs.Stats` object provides information about a file. + * + * Objects returned from {@link stat}, {@link lstat}, {@link fstat}, and + * their synchronous counterparts are of this type. + * If `bigint` in the `options` passed to those methods is true, the numeric values + * will be `bigint` instead of `number`, and the object will contain additional + * nanosecond-precision properties suffixed with `Ns`. + * + * ```console + * Stats { + * dev: 2114, + * ino: 48064969, + * mode: 33188, + * nlink: 1, + * uid: 85, + * gid: 100, + * rdev: 0, + * size: 527, + * blksize: 4096, + * blocks: 8, + * atimeMs: 1318289051000.1, + * mtimeMs: 1318289051000.1, + * ctimeMs: 1318289051000.1, + * birthtimeMs: 1318289051000.1, + * atime: Mon, 10 Oct 2011 23:24:11 GMT, + * mtime: Mon, 10 Oct 2011 23:24:11 GMT, + * ctime: Mon, 10 Oct 2011 23:24:11 GMT, + * birthtime: Mon, 10 Oct 2011 23:24:11 GMT } + * ``` + * + * `bigint` version: + * + * ```console + * BigIntStats { + * dev: 2114n, + * ino: 48064969n, + * mode: 33188n, + * nlink: 1n, + * uid: 85n, + * gid: 100n, + * rdev: 0n, + * size: 527n, + * blksize: 4096n, + * blocks: 8n, + * atimeMs: 1318289051000n, + * mtimeMs: 1318289051000n, + * ctimeMs: 1318289051000n, + * birthtimeMs: 1318289051000n, + * atimeNs: 1318289051000000000n, + * mtimeNs: 1318289051000000000n, + * ctimeNs: 1318289051000000000n, + * birthtimeNs: 1318289051000000000n, + * atime: Mon, 10 Oct 2011 23:24:11 GMT, + * mtime: Mon, 10 Oct 2011 23:24:11 GMT, + * ctime: Mon, 10 Oct 2011 23:24:11 GMT, + * birthtime: Mon, 10 Oct 2011 23:24:11 GMT } + * ``` + * @since v0.1.21 + */ + export class Stats {} + export interface StatsFsBase { + /** Type of file system. */ + type: T; + /** Optimal transfer block size. */ + bsize: T; + /** Total data blocks in file system. */ + blocks: T; + /** Free blocks in file system. */ + bfree: T; + /** Available blocks for unprivileged users */ + bavail: T; + /** Total file nodes in file system. */ + files: T; + /** Free file nodes in file system. */ + ffree: T; + } + export interface StatsFs extends StatsFsBase {} + /** + * Provides information about a mounted file system. + * + * Objects returned from {@link statfs} and its synchronous counterpart are of + * this type. If `bigint` in the `options` passed to those methods is `true`, the + * numeric values will be `bigint` instead of `number`. + * + * ```console + * StatFs { + * type: 1397114950, + * bsize: 4096, + * blocks: 121938943, + * bfree: 61058895, + * bavail: 61058895, + * files: 999, + * ffree: 1000000 + * } + * ``` + * + * `bigint` version: + * + * ```console + * StatFs { + * type: 1397114950n, + * bsize: 4096n, + * blocks: 121938943n, + * bfree: 61058895n, + * bavail: 61058895n, + * files: 999n, + * ffree: 1000000n + * } + * ``` + * @since v19.6.0, v18.15.0 + */ + export class StatsFs {} + export interface BigIntStatsFs extends StatsFsBase {} + export interface StatFsOptions { + bigint?: boolean | undefined; + } + /** + * A representation of a directory entry, which can be a file or a subdirectory + * within the directory, as returned by reading from an `fs.Dir`. The + * directory entry is a combination of the file name and file type pairs. + * + * Additionally, when {@link readdir} or {@link readdirSync} is called with + * the `withFileTypes` option set to `true`, the resulting array is filled with `fs.Dirent` objects, rather than strings or `Buffer` s. + * @since v10.10.0 + */ + export class Dirent { + /** + * Returns `true` if the `fs.Dirent` object describes a regular file. + * @since v10.10.0 + */ + isFile(): boolean; + /** + * Returns `true` if the `fs.Dirent` object describes a file system + * directory. + * @since v10.10.0 + */ + isDirectory(): boolean; + /** + * Returns `true` if the `fs.Dirent` object describes a block device. + * @since v10.10.0 + */ + isBlockDevice(): boolean; + /** + * Returns `true` if the `fs.Dirent` object describes a character device. + * @since v10.10.0 + */ + isCharacterDevice(): boolean; + /** + * Returns `true` if the `fs.Dirent` object describes a symbolic link. + * @since v10.10.0 + */ + isSymbolicLink(): boolean; + /** + * Returns `true` if the `fs.Dirent` object describes a first-in-first-out + * (FIFO) pipe. + * @since v10.10.0 + */ + isFIFO(): boolean; + /** + * Returns `true` if the `fs.Dirent` object describes a socket. + * @since v10.10.0 + */ + isSocket(): boolean; + /** + * The file name that this `fs.Dirent` object refers to. The type of this + * value is determined by the `options.encoding` passed to {@link readdir} or {@link readdirSync}. + * @since v10.10.0 + */ + name: string; + /** + * The base path that this `fs.Dirent` object refers to. + * @since v20.1.0 + */ + path: string; + } + /** + * A class representing a directory stream. + * + * Created by {@link opendir}, {@link opendirSync}, or `fsPromises.opendir()`. + * + * ```js + * import { opendir } from 'node:fs/promises'; + * + * try { + * const dir = await opendir('./'); + * for await (const dirent of dir) + * console.log(dirent.name); + * } catch (err) { + * console.error(err); + * } + * ``` + * + * When using the async iterator, the `fs.Dir` object will be automatically + * closed after the iterator exits. + * @since v12.12.0 + */ + export class Dir implements AsyncIterable { + /** + * The read-only path of this directory as was provided to {@link opendir},{@link opendirSync}, or `fsPromises.opendir()`. + * @since v12.12.0 + */ + readonly path: string; + /** + * Asynchronously iterates over the directory via `readdir(3)` until all entries have been read. + */ + [Symbol.asyncIterator](): AsyncIterableIterator; + /** + * Asynchronously close the directory's underlying resource handle. + * Subsequent reads will result in errors. + * + * A promise is returned that will be resolved after the resource has been + * closed. + * @since v12.12.0 + */ + close(): Promise; + close(cb: NoParamCallback): void; + /** + * Synchronously close the directory's underlying resource handle. + * Subsequent reads will result in errors. + * @since v12.12.0 + */ + closeSync(): void; + /** + * Asynchronously read the next directory entry via [`readdir(3)`](http://man7.org/linux/man-pages/man3/readdir.3.html) as an `fs.Dirent`. + * + * A promise is returned that will be resolved with an `fs.Dirent`, or `null`if there are no more directory entries to read. + * + * Directory entries returned by this function are in no particular order as + * provided by the operating system's underlying directory mechanisms. + * Entries added or removed while iterating over the directory might not be + * included in the iteration results. + * @since v12.12.0 + * @return containing {fs.Dirent|null} + */ + read(): Promise; + read(cb: (err: NodeJS.ErrnoException | null, dirEnt: Dirent | null) => void): void; + /** + * Synchronously read the next directory entry as an `fs.Dirent`. See the + * POSIX [`readdir(3)`](http://man7.org/linux/man-pages/man3/readdir.3.html) documentation for more detail. + * + * If there are no more directory entries to read, `null` will be returned. + * + * Directory entries returned by this function are in no particular order as + * provided by the operating system's underlying directory mechanisms. + * Entries added or removed while iterating over the directory might not be + * included in the iteration results. + * @since v12.12.0 + */ + readSync(): Dirent | null; + } + /** + * Class: fs.StatWatcher + * @since v14.3.0, v12.20.0 + * Extends `EventEmitter` + * A successful call to {@link watchFile} method will return a new fs.StatWatcher object. + */ + export interface StatWatcher extends EventEmitter { + /** + * When called, requests that the Node.js event loop _not_ exit so long as the `fs.StatWatcher` is active. Calling `watcher.ref()` multiple times will have + * no effect. + * + * By default, all `fs.StatWatcher` objects are "ref'ed", making it normally + * unnecessary to call `watcher.ref()` unless `watcher.unref()` had been + * called previously. + * @since v14.3.0, v12.20.0 + */ + ref(): this; + /** + * When called, the active `fs.StatWatcher` object will not require the Node.js + * event loop to remain active. If there is no other activity keeping the + * event loop running, the process may exit before the `fs.StatWatcher` object's + * callback is invoked. Calling `watcher.unref()` multiple times will have + * no effect. + * @since v14.3.0, v12.20.0 + */ + unref(): this; + } + export interface FSWatcher extends EventEmitter { + /** + * Stop watching for changes on the given `fs.FSWatcher`. Once stopped, the `fs.FSWatcher` object is no longer usable. + * @since v0.5.8 + */ + close(): void; + /** + * events.EventEmitter + * 1. change + * 2. error + */ + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; + addListener(event: "error", listener: (error: Error) => void): this; + addListener(event: "close", listener: () => void): this; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; + on(event: "error", listener: (error: Error) => void): this; + on(event: "close", listener: () => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; + once(event: "error", listener: (error: Error) => void): this; + once(event: "close", listener: () => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; + prependListener(event: "error", listener: (error: Error) => void): this; + prependListener(event: "close", listener: () => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; + prependOnceListener(event: "error", listener: (error: Error) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + } + /** + * Instances of `fs.ReadStream` are created and returned using the {@link createReadStream} function. + * @since v0.1.93 + */ + export class ReadStream extends stream.Readable { + close(callback?: (err?: NodeJS.ErrnoException | null) => void): void; + /** + * The number of bytes that have been read so far. + * @since v6.4.0 + */ + bytesRead: number; + /** + * The path to the file the stream is reading from as specified in the first + * argument to `fs.createReadStream()`. If `path` is passed as a string, then`readStream.path` will be a string. If `path` is passed as a `Buffer`, then`readStream.path` will be a + * `Buffer`. If `fd` is specified, then`readStream.path` will be `undefined`. + * @since v0.1.93 + */ + path: string | Buffer; + /** + * This property is `true` if the underlying file has not been opened yet, + * i.e. before the `'ready'` event is emitted. + * @since v11.2.0, v10.16.0 + */ + pending: boolean; + /** + * events.EventEmitter + * 1. open + * 2. close + * 3. ready + */ + addListener(event: "close", listener: () => void): this; + addListener(event: "data", listener: (chunk: Buffer | string) => void): this; + addListener(event: "end", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "open", listener: (fd: number) => void): this; + addListener(event: "pause", listener: () => void): this; + addListener(event: "readable", listener: () => void): this; + addListener(event: "ready", listener: () => void): this; + addListener(event: "resume", listener: () => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + on(event: "close", listener: () => void): this; + on(event: "data", listener: (chunk: Buffer | string) => void): this; + on(event: "end", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "open", listener: (fd: number) => void): this; + on(event: "pause", listener: () => void): this; + on(event: "readable", listener: () => void): this; + on(event: "ready", listener: () => void): this; + on(event: "resume", listener: () => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "data", listener: (chunk: Buffer | string) => void): this; + once(event: "end", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "open", listener: (fd: number) => void): this; + once(event: "pause", listener: () => void): this; + once(event: "readable", listener: () => void): this; + once(event: "ready", listener: () => void): this; + once(event: "resume", listener: () => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "data", listener: (chunk: Buffer | string) => void): this; + prependListener(event: "end", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "open", listener: (fd: number) => void): this; + prependListener(event: "pause", listener: () => void): this; + prependListener(event: "readable", listener: () => void): this; + prependListener(event: "ready", listener: () => void): this; + prependListener(event: "resume", listener: () => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "data", listener: (chunk: Buffer | string) => void): this; + prependOnceListener(event: "end", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "open", listener: (fd: number) => void): this; + prependOnceListener(event: "pause", listener: () => void): this; + prependOnceListener(event: "readable", listener: () => void): this; + prependOnceListener(event: "ready", listener: () => void): this; + prependOnceListener(event: "resume", listener: () => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + /** + * * Extends `stream.Writable` + * + * Instances of `fs.WriteStream` are created and returned using the {@link createWriteStream} function. + * @since v0.1.93 + */ + export class WriteStream extends stream.Writable { + /** + * Closes `writeStream`. Optionally accepts a + * callback that will be executed once the `writeStream`is closed. + * @since v0.9.4 + */ + close(callback?: (err?: NodeJS.ErrnoException | null) => void): void; + /** + * The number of bytes written so far. Does not include data that is still queued + * for writing. + * @since v0.4.7 + */ + bytesWritten: number; + /** + * The path to the file the stream is writing to as specified in the first + * argument to {@link createWriteStream}. If `path` is passed as a string, then`writeStream.path` will be a string. If `path` is passed as a `Buffer`, then`writeStream.path` will be a + * `Buffer`. + * @since v0.1.93 + */ + path: string | Buffer; + /** + * This property is `true` if the underlying file has not been opened yet, + * i.e. before the `'ready'` event is emitted. + * @since v11.2.0 + */ + pending: boolean; + /** + * events.EventEmitter + * 1. open + * 2. close + * 3. ready + */ + addListener(event: "close", listener: () => void): this; + addListener(event: "drain", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "finish", listener: () => void): this; + addListener(event: "open", listener: (fd: number) => void): this; + addListener(event: "pipe", listener: (src: stream.Readable) => void): this; + addListener(event: "ready", listener: () => void): this; + addListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + on(event: "close", listener: () => void): this; + on(event: "drain", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "finish", listener: () => void): this; + on(event: "open", listener: (fd: number) => void): this; + on(event: "pipe", listener: (src: stream.Readable) => void): this; + on(event: "ready", listener: () => void): this; + on(event: "unpipe", listener: (src: stream.Readable) => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "drain", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "finish", listener: () => void): this; + once(event: "open", listener: (fd: number) => void): this; + once(event: "pipe", listener: (src: stream.Readable) => void): this; + once(event: "ready", listener: () => void): this; + once(event: "unpipe", listener: (src: stream.Readable) => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "drain", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "finish", listener: () => void): this; + prependListener(event: "open", listener: (fd: number) => void): this; + prependListener(event: "pipe", listener: (src: stream.Readable) => void): this; + prependListener(event: "ready", listener: () => void): this; + prependListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "drain", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "finish", listener: () => void): this; + prependOnceListener(event: "open", listener: (fd: number) => void): this; + prependOnceListener(event: "pipe", listener: (src: stream.Readable) => void): this; + prependOnceListener(event: "ready", listener: () => void): this; + prependOnceListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + /** + * Asynchronously rename file at `oldPath` to the pathname provided + * as `newPath`. In the case that `newPath` already exists, it will + * be overwritten. If there is a directory at `newPath`, an error will + * be raised instead. No arguments other than a possible exception are + * given to the completion callback. + * + * See also: [`rename(2)`](http://man7.org/linux/man-pages/man2/rename.2.html). + * + * ```js + * import { rename } from 'node:fs'; + * + * rename('oldFile.txt', 'newFile.txt', (err) => { + * if (err) throw err; + * console.log('Rename complete!'); + * }); + * ``` + * @since v0.0.2 + */ + export function rename(oldPath: PathLike, newPath: PathLike, callback: NoParamCallback): void; + export namespace rename { + /** + * Asynchronous rename(2) - Change the name or location of a file or directory. + * @param oldPath A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * @param newPath A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + */ + function __promisify__(oldPath: PathLike, newPath: PathLike): Promise; + } + /** + * Renames the file from `oldPath` to `newPath`. Returns `undefined`. + * + * See the POSIX [`rename(2)`](http://man7.org/linux/man-pages/man2/rename.2.html) documentation for more details. + * @since v0.1.21 + */ + export function renameSync(oldPath: PathLike, newPath: PathLike): void; + /** + * Truncates the file. No arguments other than a possible exception are + * given to the completion callback. A file descriptor can also be passed as the + * first argument. In this case, `fs.ftruncate()` is called. + * + * ```js + * import { truncate } from 'node:fs'; + * // Assuming that 'path/file.txt' is a regular file. + * truncate('path/file.txt', (err) => { + * if (err) throw err; + * console.log('path/file.txt was truncated'); + * }); + * ``` + * + * Passing a file descriptor is deprecated and may result in an error being thrown + * in the future. + * + * See the POSIX [`truncate(2)`](http://man7.org/linux/man-pages/man2/truncate.2.html) documentation for more details. + * @since v0.8.6 + * @param [len=0] + */ + export function truncate(path: PathLike, len: number | undefined | null, callback: NoParamCallback): void; + /** + * Asynchronous truncate(2) - Truncate a file to a specified length. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function truncate(path: PathLike, callback: NoParamCallback): void; + export namespace truncate { + /** + * Asynchronous truncate(2) - Truncate a file to a specified length. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param len If not specified, defaults to `0`. + */ + function __promisify__(path: PathLike, len?: number | null): Promise; + } + /** + * Truncates the file. Returns `undefined`. A file descriptor can also be + * passed as the first argument. In this case, `fs.ftruncateSync()` is called. + * + * Passing a file descriptor is deprecated and may result in an error being thrown + * in the future. + * @since v0.8.6 + * @param [len=0] + */ + export function truncateSync(path: PathLike, len?: number | null): void; + /** + * Truncates the file descriptor. No arguments other than a possible exception are + * given to the completion callback. + * + * See the POSIX [`ftruncate(2)`](http://man7.org/linux/man-pages/man2/ftruncate.2.html) documentation for more detail. + * + * If the file referred to by the file descriptor was larger than `len` bytes, only + * the first `len` bytes will be retained in the file. + * + * For example, the following program retains only the first four bytes of the + * file: + * + * ```js + * import { open, close, ftruncate } from 'node:fs'; + * + * function closeFd(fd) { + * close(fd, (err) => { + * if (err) throw err; + * }); + * } + * + * open('temp.txt', 'r+', (err, fd) => { + * if (err) throw err; + * + * try { + * ftruncate(fd, 4, (err) => { + * closeFd(fd); + * if (err) throw err; + * }); + * } catch (err) { + * closeFd(fd); + * if (err) throw err; + * } + * }); + * ``` + * + * If the file previously was shorter than `len` bytes, it is extended, and the + * extended part is filled with null bytes (`'\0'`): + * + * If `len` is negative then `0` will be used. + * @since v0.8.6 + * @param [len=0] + */ + export function ftruncate(fd: number, len: number | undefined | null, callback: NoParamCallback): void; + /** + * Asynchronous ftruncate(2) - Truncate a file to a specified length. + * @param fd A file descriptor. + */ + export function ftruncate(fd: number, callback: NoParamCallback): void; + export namespace ftruncate { + /** + * Asynchronous ftruncate(2) - Truncate a file to a specified length. + * @param fd A file descriptor. + * @param len If not specified, defaults to `0`. + */ + function __promisify__(fd: number, len?: number | null): Promise; + } + /** + * Truncates the file descriptor. Returns `undefined`. + * + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link ftruncate}. + * @since v0.8.6 + * @param [len=0] + */ + export function ftruncateSync(fd: number, len?: number | null): void; + /** + * Asynchronously changes owner and group of a file. No arguments other than a + * possible exception are given to the completion callback. + * + * See the POSIX [`chown(2)`](http://man7.org/linux/man-pages/man2/chown.2.html) documentation for more detail. + * @since v0.1.97 + */ + export function chown(path: PathLike, uid: number, gid: number, callback: NoParamCallback): void; + export namespace chown { + /** + * Asynchronous chown(2) - Change ownership of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + function __promisify__(path: PathLike, uid: number, gid: number): Promise; + } + /** + * Synchronously changes owner and group of a file. Returns `undefined`. + * This is the synchronous version of {@link chown}. + * + * See the POSIX [`chown(2)`](http://man7.org/linux/man-pages/man2/chown.2.html) documentation for more detail. + * @since v0.1.97 + */ + export function chownSync(path: PathLike, uid: number, gid: number): void; + /** + * Sets the owner of the file. No arguments other than a possible exception are + * given to the completion callback. + * + * See the POSIX [`fchown(2)`](http://man7.org/linux/man-pages/man2/fchown.2.html) documentation for more detail. + * @since v0.4.7 + */ + export function fchown(fd: number, uid: number, gid: number, callback: NoParamCallback): void; + export namespace fchown { + /** + * Asynchronous fchown(2) - Change ownership of a file. + * @param fd A file descriptor. + */ + function __promisify__(fd: number, uid: number, gid: number): Promise; + } + /** + * Sets the owner of the file. Returns `undefined`. + * + * See the POSIX [`fchown(2)`](http://man7.org/linux/man-pages/man2/fchown.2.html) documentation for more detail. + * @since v0.4.7 + * @param uid The file's new owner's user id. + * @param gid The file's new group's group id. + */ + export function fchownSync(fd: number, uid: number, gid: number): void; + /** + * Set the owner of the symbolic link. No arguments other than a possible + * exception are given to the completion callback. + * + * See the POSIX [`lchown(2)`](http://man7.org/linux/man-pages/man2/lchown.2.html) documentation for more detail. + */ + export function lchown(path: PathLike, uid: number, gid: number, callback: NoParamCallback): void; + export namespace lchown { + /** + * Asynchronous lchown(2) - Change ownership of a file. Does not dereference symbolic links. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + function __promisify__(path: PathLike, uid: number, gid: number): Promise; + } + /** + * Set the owner for the path. Returns `undefined`. + * + * See the POSIX [`lchown(2)`](http://man7.org/linux/man-pages/man2/lchown.2.html) documentation for more details. + * @param uid The file's new owner's user id. + * @param gid The file's new group's group id. + */ + export function lchownSync(path: PathLike, uid: number, gid: number): void; + /** + * Changes the access and modification times of a file in the same way as {@link utimes}, with the difference that if the path refers to a symbolic + * link, then the link is not dereferenced: instead, the timestamps of the + * symbolic link itself are changed. + * + * No arguments other than a possible exception are given to the completion + * callback. + * @since v14.5.0, v12.19.0 + */ + export function lutimes(path: PathLike, atime: TimeLike, mtime: TimeLike, callback: NoParamCallback): void; + export namespace lutimes { + /** + * Changes the access and modification times of a file in the same way as `fsPromises.utimes()`, + * with the difference that if the path refers to a symbolic link, then the link is not + * dereferenced: instead, the timestamps of the symbolic link itself are changed. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param atime The last access time. If a string is provided, it will be coerced to number. + * @param mtime The last modified time. If a string is provided, it will be coerced to number. + */ + function __promisify__(path: PathLike, atime: TimeLike, mtime: TimeLike): Promise; + } + /** + * Change the file system timestamps of the symbolic link referenced by `path`. + * Returns `undefined`, or throws an exception when parameters are incorrect or + * the operation fails. This is the synchronous version of {@link lutimes}. + * @since v14.5.0, v12.19.0 + */ + export function lutimesSync(path: PathLike, atime: TimeLike, mtime: TimeLike): void; + /** + * Asynchronously changes the permissions of a file. No arguments other than a + * possible exception are given to the completion callback. + * + * See the POSIX [`chmod(2)`](http://man7.org/linux/man-pages/man2/chmod.2.html) documentation for more detail. + * + * ```js + * import { chmod } from 'node:fs'; + * + * chmod('my_file.txt', 0o775, (err) => { + * if (err) throw err; + * console.log('The permissions for file "my_file.txt" have been changed!'); + * }); + * ``` + * @since v0.1.30 + */ + export function chmod(path: PathLike, mode: Mode, callback: NoParamCallback): void; + export namespace chmod { + /** + * Asynchronous chmod(2) - Change permissions of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param mode A file mode. If a string is passed, it is parsed as an octal integer. + */ + function __promisify__(path: PathLike, mode: Mode): Promise; + } + /** + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link chmod}. + * + * See the POSIX [`chmod(2)`](http://man7.org/linux/man-pages/man2/chmod.2.html) documentation for more detail. + * @since v0.6.7 + */ + export function chmodSync(path: PathLike, mode: Mode): void; + /** + * Sets the permissions on the file. No arguments other than a possible exception + * are given to the completion callback. + * + * See the POSIX [`fchmod(2)`](http://man7.org/linux/man-pages/man2/fchmod.2.html) documentation for more detail. + * @since v0.4.7 + */ + export function fchmod(fd: number, mode: Mode, callback: NoParamCallback): void; + export namespace fchmod { + /** + * Asynchronous fchmod(2) - Change permissions of a file. + * @param fd A file descriptor. + * @param mode A file mode. If a string is passed, it is parsed as an octal integer. + */ + function __promisify__(fd: number, mode: Mode): Promise; + } + /** + * Sets the permissions on the file. Returns `undefined`. + * + * See the POSIX [`fchmod(2)`](http://man7.org/linux/man-pages/man2/fchmod.2.html) documentation for more detail. + * @since v0.4.7 + */ + export function fchmodSync(fd: number, mode: Mode): void; + /** + * Changes the permissions on a symbolic link. No arguments other than a possible + * exception are given to the completion callback. + * + * This method is only implemented on macOS. + * + * See the POSIX [`lchmod(2)`](https://www.freebsd.org/cgi/man.cgi?query=lchmod&sektion=2) documentation for more detail. + * @deprecated Since v0.4.7 + */ + export function lchmod(path: PathLike, mode: Mode, callback: NoParamCallback): void; + /** @deprecated */ + export namespace lchmod { + /** + * Asynchronous lchmod(2) - Change permissions of a file. Does not dereference symbolic links. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param mode A file mode. If a string is passed, it is parsed as an octal integer. + */ + function __promisify__(path: PathLike, mode: Mode): Promise; + } + /** + * Changes the permissions on a symbolic link. Returns `undefined`. + * + * This method is only implemented on macOS. + * + * See the POSIX [`lchmod(2)`](https://www.freebsd.org/cgi/man.cgi?query=lchmod&sektion=2) documentation for more detail. + * @deprecated Since v0.4.7 + */ + export function lchmodSync(path: PathLike, mode: Mode): void; + /** + * Asynchronous [`stat(2)`](http://man7.org/linux/man-pages/man2/stat.2.html). The callback gets two arguments `(err, stats)` where`stats` is an `fs.Stats` object. + * + * In case of an error, the `err.code` will be one of `Common System Errors`. + * + * {@link stat} follows symbolic links. Use {@link lstat} to look at the + * links themselves. + * + * Using `fs.stat()` to check for the existence of a file before calling`fs.open()`, `fs.readFile()`, or `fs.writeFile()` is not recommended. + * Instead, user code should open/read/write the file directly and handle the + * error raised if the file is not available. + * + * To check if a file exists without manipulating it afterwards, {@link access} is recommended. + * + * For example, given the following directory structure: + * + * ```text + * - txtDir + * -- file.txt + * - app.js + * ``` + * + * The next program will check for the stats of the given paths: + * + * ```js + * import { stat } from 'node:fs'; + * + * const pathsToCheck = ['./txtDir', './txtDir/file.txt']; + * + * for (let i = 0; i < pathsToCheck.length; i++) { + * stat(pathsToCheck[i], (err, stats) => { + * console.log(stats.isDirectory()); + * console.log(stats); + * }); + * } + * ``` + * + * The resulting output will resemble: + * + * ```console + * true + * Stats { + * dev: 16777220, + * mode: 16877, + * nlink: 3, + * uid: 501, + * gid: 20, + * rdev: 0, + * blksize: 4096, + * ino: 14214262, + * size: 96, + * blocks: 0, + * atimeMs: 1561174653071.963, + * mtimeMs: 1561174614583.3518, + * ctimeMs: 1561174626623.5366, + * birthtimeMs: 1561174126937.2893, + * atime: 2019-06-22T03:37:33.072Z, + * mtime: 2019-06-22T03:36:54.583Z, + * ctime: 2019-06-22T03:37:06.624Z, + * birthtime: 2019-06-22T03:28:46.937Z + * } + * false + * Stats { + * dev: 16777220, + * mode: 33188, + * nlink: 1, + * uid: 501, + * gid: 20, + * rdev: 0, + * blksize: 4096, + * ino: 14214074, + * size: 8, + * blocks: 8, + * atimeMs: 1561174616618.8555, + * mtimeMs: 1561174614584, + * ctimeMs: 1561174614583.8145, + * birthtimeMs: 1561174007710.7478, + * atime: 2019-06-22T03:36:56.619Z, + * mtime: 2019-06-22T03:36:54.584Z, + * ctime: 2019-06-22T03:36:54.584Z, + * birthtime: 2019-06-22T03:26:47.711Z + * } + * ``` + * @since v0.0.2 + */ + export function stat(path: PathLike, callback: (err: NodeJS.ErrnoException | null, stats: Stats) => void): void; + export function stat( + path: PathLike, + options: + | (StatOptions & { + bigint?: false | undefined; + }) + | undefined, + callback: (err: NodeJS.ErrnoException | null, stats: Stats) => void, + ): void; + export function stat( + path: PathLike, + options: StatOptions & { + bigint: true; + }, + callback: (err: NodeJS.ErrnoException | null, stats: BigIntStats) => void, + ): void; + export function stat( + path: PathLike, + options: StatOptions | undefined, + callback: (err: NodeJS.ErrnoException | null, stats: Stats | BigIntStats) => void, + ): void; + export namespace stat { + /** + * Asynchronous stat(2) - Get file status. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + function __promisify__( + path: PathLike, + options?: StatOptions & { + bigint?: false | undefined; + }, + ): Promise; + function __promisify__( + path: PathLike, + options: StatOptions & { + bigint: true; + }, + ): Promise; + function __promisify__(path: PathLike, options?: StatOptions): Promise; + } + export interface StatSyncFn extends Function { + (path: PathLike, options?: undefined): Stats; + ( + path: PathLike, + options?: StatSyncOptions & { + bigint?: false | undefined; + throwIfNoEntry: false; + }, + ): Stats | undefined; + ( + path: PathLike, + options: StatSyncOptions & { + bigint: true; + throwIfNoEntry: false; + }, + ): BigIntStats | undefined; + ( + path: PathLike, + options?: StatSyncOptions & { + bigint?: false | undefined; + }, + ): Stats; + ( + path: PathLike, + options: StatSyncOptions & { + bigint: true; + }, + ): BigIntStats; + ( + path: PathLike, + options: StatSyncOptions & { + bigint: boolean; + throwIfNoEntry?: false | undefined; + }, + ): Stats | BigIntStats; + (path: PathLike, options?: StatSyncOptions): Stats | BigIntStats | undefined; + } + /** + * Synchronous stat(2) - Get file status. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export const statSync: StatSyncFn; + /** + * Invokes the callback with the `fs.Stats` for the file descriptor. + * + * See the POSIX [`fstat(2)`](http://man7.org/linux/man-pages/man2/fstat.2.html) documentation for more detail. + * @since v0.1.95 + */ + export function fstat(fd: number, callback: (err: NodeJS.ErrnoException | null, stats: Stats) => void): void; + export function fstat( + fd: number, + options: + | (StatOptions & { + bigint?: false | undefined; + }) + | undefined, + callback: (err: NodeJS.ErrnoException | null, stats: Stats) => void, + ): void; + export function fstat( + fd: number, + options: StatOptions & { + bigint: true; + }, + callback: (err: NodeJS.ErrnoException | null, stats: BigIntStats) => void, + ): void; + export function fstat( + fd: number, + options: StatOptions | undefined, + callback: (err: NodeJS.ErrnoException | null, stats: Stats | BigIntStats) => void, + ): void; + export namespace fstat { + /** + * Asynchronous fstat(2) - Get file status. + * @param fd A file descriptor. + */ + function __promisify__( + fd: number, + options?: StatOptions & { + bigint?: false | undefined; + }, + ): Promise; + function __promisify__( + fd: number, + options: StatOptions & { + bigint: true; + }, + ): Promise; + function __promisify__(fd: number, options?: StatOptions): Promise; + } + /** + * Retrieves the `fs.Stats` for the file descriptor. + * + * See the POSIX [`fstat(2)`](http://man7.org/linux/man-pages/man2/fstat.2.html) documentation for more detail. + * @since v0.1.95 + */ + export function fstatSync( + fd: number, + options?: StatOptions & { + bigint?: false | undefined; + }, + ): Stats; + export function fstatSync( + fd: number, + options: StatOptions & { + bigint: true; + }, + ): BigIntStats; + export function fstatSync(fd: number, options?: StatOptions): Stats | BigIntStats; + /** + * Retrieves the `fs.Stats` for the symbolic link referred to by the path. + * The callback gets two arguments `(err, stats)` where `stats` is a `fs.Stats` object. `lstat()` is identical to `stat()`, except that if `path` is a symbolic + * link, then the link itself is stat-ed, not the file that it refers to. + * + * See the POSIX [`lstat(2)`](http://man7.org/linux/man-pages/man2/lstat.2.html) documentation for more details. + * @since v0.1.30 + */ + export function lstat(path: PathLike, callback: (err: NodeJS.ErrnoException | null, stats: Stats) => void): void; + export function lstat( + path: PathLike, + options: + | (StatOptions & { + bigint?: false | undefined; + }) + | undefined, + callback: (err: NodeJS.ErrnoException | null, stats: Stats) => void, + ): void; + export function lstat( + path: PathLike, + options: StatOptions & { + bigint: true; + }, + callback: (err: NodeJS.ErrnoException | null, stats: BigIntStats) => void, + ): void; + export function lstat( + path: PathLike, + options: StatOptions | undefined, + callback: (err: NodeJS.ErrnoException | null, stats: Stats | BigIntStats) => void, + ): void; + export namespace lstat { + /** + * Asynchronous lstat(2) - Get file status. Does not dereference symbolic links. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + function __promisify__( + path: PathLike, + options?: StatOptions & { + bigint?: false | undefined; + }, + ): Promise; + function __promisify__( + path: PathLike, + options: StatOptions & { + bigint: true; + }, + ): Promise; + function __promisify__(path: PathLike, options?: StatOptions): Promise; + } + /** + * Asynchronous [`statfs(2)`](http://man7.org/linux/man-pages/man2/statfs.2.html). Returns information about the mounted file system which + * contains `path`. The callback gets two arguments `(err, stats)` where `stats`is an `fs.StatFs` object. + * + * In case of an error, the `err.code` will be one of `Common System Errors`. + * @since v19.6.0, v18.15.0 + * @param path A path to an existing file or directory on the file system to be queried. + */ + export function statfs(path: PathLike, callback: (err: NodeJS.ErrnoException | null, stats: StatsFs) => void): void; + export function statfs( + path: PathLike, + options: + | (StatFsOptions & { + bigint?: false | undefined; + }) + | undefined, + callback: (err: NodeJS.ErrnoException | null, stats: StatsFs) => void, + ): void; + export function statfs( + path: PathLike, + options: StatFsOptions & { + bigint: true; + }, + callback: (err: NodeJS.ErrnoException | null, stats: BigIntStatsFs) => void, + ): void; + export function statfs( + path: PathLike, + options: StatFsOptions | undefined, + callback: (err: NodeJS.ErrnoException | null, stats: StatsFs | BigIntStatsFs) => void, + ): void; + export namespace statfs { + /** + * Asynchronous statfs(2) - Returns information about the mounted file system which contains path. The callback gets two arguments (err, stats) where stats is an object. + * @param path A path to an existing file or directory on the file system to be queried. + */ + function __promisify__( + path: PathLike, + options?: StatFsOptions & { + bigint?: false | undefined; + }, + ): Promise; + function __promisify__( + path: PathLike, + options: StatFsOptions & { + bigint: true; + }, + ): Promise; + function __promisify__(path: PathLike, options?: StatFsOptions): Promise; + } + /** + * Synchronous [`statfs(2)`](http://man7.org/linux/man-pages/man2/statfs.2.html). Returns information about the mounted file system which + * contains `path`. + * + * In case of an error, the `err.code` will be one of `Common System Errors`. + * @since v19.6.0, v18.15.0 + * @param path A path to an existing file or directory on the file system to be queried. + */ + export function statfsSync( + path: PathLike, + options?: StatFsOptions & { + bigint?: false | undefined; + }, + ): StatsFs; + export function statfsSync( + path: PathLike, + options: StatFsOptions & { + bigint: true; + }, + ): BigIntStatsFs; + export function statfsSync(path: PathLike, options?: StatFsOptions): StatsFs | BigIntStatsFs; + /** + * Synchronous lstat(2) - Get file status. Does not dereference symbolic links. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export const lstatSync: StatSyncFn; + /** + * Creates a new link from the `existingPath` to the `newPath`. See the POSIX [`link(2)`](http://man7.org/linux/man-pages/man2/link.2.html) documentation for more detail. No arguments other than + * a possible + * exception are given to the completion callback. + * @since v0.1.31 + */ + export function link(existingPath: PathLike, newPath: PathLike, callback: NoParamCallback): void; + export namespace link { + /** + * Asynchronous link(2) - Create a new link (also known as a hard link) to an existing file. + * @param existingPath A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param newPath A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + function __promisify__(existingPath: PathLike, newPath: PathLike): Promise; + } + /** + * Creates a new link from the `existingPath` to the `newPath`. See the POSIX [`link(2)`](http://man7.org/linux/man-pages/man2/link.2.html) documentation for more detail. Returns `undefined`. + * @since v0.1.31 + */ + export function linkSync(existingPath: PathLike, newPath: PathLike): void; + /** + * Creates the link called `path` pointing to `target`. No arguments other than a + * possible exception are given to the completion callback. + * + * See the POSIX [`symlink(2)`](http://man7.org/linux/man-pages/man2/symlink.2.html) documentation for more details. + * + * The `type` argument is only available on Windows and ignored on other platforms. + * It can be set to `'dir'`, `'file'`, or `'junction'`. If the `type` argument is + * not a string, Node.js will autodetect `target` type and use `'file'` or `'dir'`. + * If the `target` does not exist, `'file'` will be used. Windows junction points + * require the destination path to be absolute. When using `'junction'`, the`target` argument will automatically be normalized to absolute path. Junction + * points on NTFS volumes can only point to directories. + * + * Relative targets are relative to the link's parent directory. + * + * ```js + * import { symlink } from 'node:fs'; + * + * symlink('./mew', './mewtwo', callback); + * ``` + * + * The above example creates a symbolic link `mewtwo` which points to `mew` in the + * same directory: + * + * ```bash + * $ tree . + * . + * ├── mew + * └── mewtwo -> ./mew + * ``` + * @since v0.1.31 + * @param [type='null'] + */ + export function symlink( + target: PathLike, + path: PathLike, + type: symlink.Type | undefined | null, + callback: NoParamCallback, + ): void; + /** + * Asynchronous symlink(2) - Create a new symbolic link to an existing file. + * @param target A path to an existing file. If a URL is provided, it must use the `file:` protocol. + * @param path A path to the new symlink. If a URL is provided, it must use the `file:` protocol. + */ + export function symlink(target: PathLike, path: PathLike, callback: NoParamCallback): void; + export namespace symlink { + /** + * Asynchronous symlink(2) - Create a new symbolic link to an existing file. + * @param target A path to an existing file. If a URL is provided, it must use the `file:` protocol. + * @param path A path to the new symlink. If a URL is provided, it must use the `file:` protocol. + * @param type May be set to `'dir'`, `'file'`, or `'junction'` (default is `'file'`) and is only available on Windows (ignored on other platforms). + * When using `'junction'`, the `target` argument will automatically be normalized to an absolute path. + */ + function __promisify__(target: PathLike, path: PathLike, type?: string | null): Promise; + type Type = "dir" | "file" | "junction"; + } + /** + * Returns `undefined`. + * + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link symlink}. + * @since v0.1.31 + * @param [type='null'] + */ + export function symlinkSync(target: PathLike, path: PathLike, type?: symlink.Type | null): void; + /** + * Reads the contents of the symbolic link referred to by `path`. The callback gets + * two arguments `(err, linkString)`. + * + * See the POSIX [`readlink(2)`](http://man7.org/linux/man-pages/man2/readlink.2.html) documentation for more details. + * + * The optional `options` argument can be a string specifying an encoding, or an + * object with an `encoding` property specifying the character encoding to use for + * the link path passed to the callback. If the `encoding` is set to `'buffer'`, + * the link path returned will be passed as a `Buffer` object. + * @since v0.1.31 + */ + export function readlink( + path: PathLike, + options: EncodingOption, + callback: (err: NodeJS.ErrnoException | null, linkString: string) => void, + ): void; + /** + * Asynchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readlink( + path: PathLike, + options: BufferEncodingOption, + callback: (err: NodeJS.ErrnoException | null, linkString: Buffer) => void, + ): void; + /** + * Asynchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readlink( + path: PathLike, + options: EncodingOption, + callback: (err: NodeJS.ErrnoException | null, linkString: string | Buffer) => void, + ): void; + /** + * Asynchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function readlink( + path: PathLike, + callback: (err: NodeJS.ErrnoException | null, linkString: string) => void, + ): void; + export namespace readlink { + /** + * Asynchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function __promisify__(path: PathLike, options?: EncodingOption): Promise; + /** + * Asynchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function __promisify__(path: PathLike, options: BufferEncodingOption): Promise; + /** + * Asynchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function __promisify__(path: PathLike, options?: EncodingOption): Promise; + } + /** + * Returns the symbolic link's string value. + * + * See the POSIX [`readlink(2)`](http://man7.org/linux/man-pages/man2/readlink.2.html) documentation for more details. + * + * The optional `options` argument can be a string specifying an encoding, or an + * object with an `encoding` property specifying the character encoding to use for + * the link path returned. If the `encoding` is set to `'buffer'`, + * the link path returned will be passed as a `Buffer` object. + * @since v0.1.31 + */ + export function readlinkSync(path: PathLike, options?: EncodingOption): string; + /** + * Synchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readlinkSync(path: PathLike, options: BufferEncodingOption): Buffer; + /** + * Synchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readlinkSync(path: PathLike, options?: EncodingOption): string | Buffer; + /** + * Asynchronously computes the canonical pathname by resolving `.`, `..`, and + * symbolic links. + * + * A canonical pathname is not necessarily unique. Hard links and bind mounts can + * expose a file system entity through many pathnames. + * + * This function behaves like [`realpath(3)`](http://man7.org/linux/man-pages/man3/realpath.3.html), with some exceptions: + * + * 1. No case conversion is performed on case-insensitive file systems. + * 2. The maximum number of symbolic links is platform-independent and generally + * (much) higher than what the native [`realpath(3)`](http://man7.org/linux/man-pages/man3/realpath.3.html) implementation supports. + * + * The `callback` gets two arguments `(err, resolvedPath)`. May use `process.cwd`to resolve relative paths. + * + * Only paths that can be converted to UTF8 strings are supported. + * + * The optional `options` argument can be a string specifying an encoding, or an + * object with an `encoding` property specifying the character encoding to use for + * the path passed to the callback. If the `encoding` is set to `'buffer'`, + * the path returned will be passed as a `Buffer` object. + * + * If `path` resolves to a socket or a pipe, the function will return a system + * dependent name for that object. + * @since v0.1.31 + */ + export function realpath( + path: PathLike, + options: EncodingOption, + callback: (err: NodeJS.ErrnoException | null, resolvedPath: string) => void, + ): void; + /** + * Asynchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function realpath( + path: PathLike, + options: BufferEncodingOption, + callback: (err: NodeJS.ErrnoException | null, resolvedPath: Buffer) => void, + ): void; + /** + * Asynchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function realpath( + path: PathLike, + options: EncodingOption, + callback: (err: NodeJS.ErrnoException | null, resolvedPath: string | Buffer) => void, + ): void; + /** + * Asynchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function realpath( + path: PathLike, + callback: (err: NodeJS.ErrnoException | null, resolvedPath: string) => void, + ): void; + export namespace realpath { + /** + * Asynchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function __promisify__(path: PathLike, options?: EncodingOption): Promise; + /** + * Asynchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function __promisify__(path: PathLike, options: BufferEncodingOption): Promise; + /** + * Asynchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function __promisify__(path: PathLike, options?: EncodingOption): Promise; + /** + * Asynchronous [`realpath(3)`](http://man7.org/linux/man-pages/man3/realpath.3.html). + * + * The `callback` gets two arguments `(err, resolvedPath)`. + * + * Only paths that can be converted to UTF8 strings are supported. + * + * The optional `options` argument can be a string specifying an encoding, or an + * object with an `encoding` property specifying the character encoding to use for + * the path passed to the callback. If the `encoding` is set to `'buffer'`, + * the path returned will be passed as a `Buffer` object. + * + * On Linux, when Node.js is linked against musl libc, the procfs file system must + * be mounted on `/proc` in order for this function to work. Glibc does not have + * this restriction. + * @since v9.2.0 + */ + function native( + path: PathLike, + options: EncodingOption, + callback: (err: NodeJS.ErrnoException | null, resolvedPath: string) => void, + ): void; + function native( + path: PathLike, + options: BufferEncodingOption, + callback: (err: NodeJS.ErrnoException | null, resolvedPath: Buffer) => void, + ): void; + function native( + path: PathLike, + options: EncodingOption, + callback: (err: NodeJS.ErrnoException | null, resolvedPath: string | Buffer) => void, + ): void; + function native( + path: PathLike, + callback: (err: NodeJS.ErrnoException | null, resolvedPath: string) => void, + ): void; + } + /** + * Returns the resolved pathname. + * + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link realpath}. + * @since v0.1.31 + */ + export function realpathSync(path: PathLike, options?: EncodingOption): string; + /** + * Synchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function realpathSync(path: PathLike, options: BufferEncodingOption): Buffer; + /** + * Synchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function realpathSync(path: PathLike, options?: EncodingOption): string | Buffer; + export namespace realpathSync { + function native(path: PathLike, options?: EncodingOption): string; + function native(path: PathLike, options: BufferEncodingOption): Buffer; + function native(path: PathLike, options?: EncodingOption): string | Buffer; + } + /** + * Asynchronously removes a file or symbolic link. No arguments other than a + * possible exception are given to the completion callback. + * + * ```js + * import { unlink } from 'node:fs'; + * // Assuming that 'path/file.txt' is a regular file. + * unlink('path/file.txt', (err) => { + * if (err) throw err; + * console.log('path/file.txt was deleted'); + * }); + * ``` + * + * `fs.unlink()` will not work on a directory, empty or otherwise. To remove a + * directory, use {@link rmdir}. + * + * See the POSIX [`unlink(2)`](http://man7.org/linux/man-pages/man2/unlink.2.html) documentation for more details. + * @since v0.0.2 + */ + export function unlink(path: PathLike, callback: NoParamCallback): void; + export namespace unlink { + /** + * Asynchronous unlink(2) - delete a name and possibly the file it refers to. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + function __promisify__(path: PathLike): Promise; + } + /** + * Synchronous [`unlink(2)`](http://man7.org/linux/man-pages/man2/unlink.2.html). Returns `undefined`. + * @since v0.1.21 + */ + export function unlinkSync(path: PathLike): void; + export interface RmDirOptions { + /** + * If an `EBUSY`, `EMFILE`, `ENFILE`, `ENOTEMPTY`, or + * `EPERM` error is encountered, Node.js will retry the operation with a linear + * backoff wait of `retryDelay` ms longer on each try. This option represents the + * number of retries. This option is ignored if the `recursive` option is not + * `true`. + * @default 0 + */ + maxRetries?: number | undefined; + /** + * @deprecated since v14.14.0 In future versions of Node.js and will trigger a warning + * `fs.rmdir(path, { recursive: true })` will throw if `path` does not exist or is a file. + * Use `fs.rm(path, { recursive: true, force: true })` instead. + * + * If `true`, perform a recursive directory removal. In + * recursive mode, operations are retried on failure. + * @default false + */ + recursive?: boolean | undefined; + /** + * The amount of time in milliseconds to wait between retries. + * This option is ignored if the `recursive` option is not `true`. + * @default 100 + */ + retryDelay?: number | undefined; + } + /** + * Asynchronous [`rmdir(2)`](http://man7.org/linux/man-pages/man2/rmdir.2.html). No arguments other than a possible exception are given + * to the completion callback. + * + * Using `fs.rmdir()` on a file (not a directory) results in an `ENOENT` error on + * Windows and an `ENOTDIR` error on POSIX. + * + * To get a behavior similar to the `rm -rf` Unix command, use {@link rm} with options `{ recursive: true, force: true }`. + * @since v0.0.2 + */ + export function rmdir(path: PathLike, callback: NoParamCallback): void; + export function rmdir(path: PathLike, options: RmDirOptions, callback: NoParamCallback): void; + export namespace rmdir { + /** + * Asynchronous rmdir(2) - delete a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + function __promisify__(path: PathLike, options?: RmDirOptions): Promise; + } + /** + * Synchronous [`rmdir(2)`](http://man7.org/linux/man-pages/man2/rmdir.2.html). Returns `undefined`. + * + * Using `fs.rmdirSync()` on a file (not a directory) results in an `ENOENT` error + * on Windows and an `ENOTDIR` error on POSIX. + * + * To get a behavior similar to the `rm -rf` Unix command, use {@link rmSync} with options `{ recursive: true, force: true }`. + * @since v0.1.21 + */ + export function rmdirSync(path: PathLike, options?: RmDirOptions): void; + export interface RmOptions { + /** + * When `true`, exceptions will be ignored if `path` does not exist. + * @default false + */ + force?: boolean | undefined; + /** + * If an `EBUSY`, `EMFILE`, `ENFILE`, `ENOTEMPTY`, or + * `EPERM` error is encountered, Node.js will retry the operation with a linear + * backoff wait of `retryDelay` ms longer on each try. This option represents the + * number of retries. This option is ignored if the `recursive` option is not + * `true`. + * @default 0 + */ + maxRetries?: number | undefined; + /** + * If `true`, perform a recursive directory removal. In + * recursive mode, operations are retried on failure. + * @default false + */ + recursive?: boolean | undefined; + /** + * The amount of time in milliseconds to wait between retries. + * This option is ignored if the `recursive` option is not `true`. + * @default 100 + */ + retryDelay?: number | undefined; + } + /** + * Asynchronously removes files and directories (modeled on the standard POSIX `rm`utility). No arguments other than a possible exception are given to the + * completion callback. + * @since v14.14.0 + */ + export function rm(path: PathLike, callback: NoParamCallback): void; + export function rm(path: PathLike, options: RmOptions, callback: NoParamCallback): void; + export namespace rm { + /** + * Asynchronously removes files and directories (modeled on the standard POSIX `rm` utility). + */ + function __promisify__(path: PathLike, options?: RmOptions): Promise; + } + /** + * Synchronously removes files and directories (modeled on the standard POSIX `rm`utility). Returns `undefined`. + * @since v14.14.0 + */ + export function rmSync(path: PathLike, options?: RmOptions): void; + export interface MakeDirectoryOptions { + /** + * Indicates whether parent folders should be created. + * If a folder was created, the path to the first created folder will be returned. + * @default false + */ + recursive?: boolean | undefined; + /** + * A file mode. If a string is passed, it is parsed as an octal integer. If not specified + * @default 0o777 + */ + mode?: Mode | undefined; + } + /** + * Asynchronously creates a directory. + * + * The callback is given a possible exception and, if `recursive` is `true`, the + * first directory path created, `(err[, path])`.`path` can still be `undefined` when `recursive` is `true`, if no directory was + * created (for instance, if it was previously created). + * + * The optional `options` argument can be an integer specifying `mode` (permission + * and sticky bits), or an object with a `mode` property and a `recursive`property indicating whether parent directories should be created. Calling`fs.mkdir()` when `path` is a directory that + * exists results in an error only + * when `recursive` is false. If `recursive` is false and the directory exists, + * an `EEXIST` error occurs. + * + * ```js + * import { mkdir } from 'node:fs'; + * + * // Create ./tmp/a/apple, regardless of whether ./tmp and ./tmp/a exist. + * mkdir('./tmp/a/apple', { recursive: true }, (err) => { + * if (err) throw err; + * }); + * ``` + * + * On Windows, using `fs.mkdir()` on the root directory even with recursion will + * result in an error: + * + * ```js + * import { mkdir } from 'node:fs'; + * + * mkdir('/', { recursive: true }, (err) => { + * // => [Error: EPERM: operation not permitted, mkdir 'C:\'] + * }); + * ``` + * + * See the POSIX [`mkdir(2)`](http://man7.org/linux/man-pages/man2/mkdir.2.html) documentation for more details. + * @since v0.1.8 + */ + export function mkdir( + path: PathLike, + options: MakeDirectoryOptions & { + recursive: true; + }, + callback: (err: NodeJS.ErrnoException | null, path?: string) => void, + ): void; + /** + * Asynchronous mkdir(2) - create a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options Either the file mode, or an object optionally specifying the file mode and whether parent folders + * should be created. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. + */ + export function mkdir( + path: PathLike, + options: + | Mode + | (MakeDirectoryOptions & { + recursive?: false | undefined; + }) + | null + | undefined, + callback: NoParamCallback, + ): void; + /** + * Asynchronous mkdir(2) - create a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options Either the file mode, or an object optionally specifying the file mode and whether parent folders + * should be created. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. + */ + export function mkdir( + path: PathLike, + options: Mode | MakeDirectoryOptions | null | undefined, + callback: (err: NodeJS.ErrnoException | null, path?: string) => void, + ): void; + /** + * Asynchronous mkdir(2) - create a directory with a mode of `0o777`. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function mkdir(path: PathLike, callback: NoParamCallback): void; + export namespace mkdir { + /** + * Asynchronous mkdir(2) - create a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options Either the file mode, or an object optionally specifying the file mode and whether parent folders + * should be created. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. + */ + function __promisify__( + path: PathLike, + options: MakeDirectoryOptions & { + recursive: true; + }, + ): Promise; + /** + * Asynchronous mkdir(2) - create a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options Either the file mode, or an object optionally specifying the file mode and whether parent folders + * should be created. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. + */ + function __promisify__( + path: PathLike, + options?: + | Mode + | (MakeDirectoryOptions & { + recursive?: false | undefined; + }) + | null, + ): Promise; + /** + * Asynchronous mkdir(2) - create a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options Either the file mode, or an object optionally specifying the file mode and whether parent folders + * should be created. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. + */ + function __promisify__( + path: PathLike, + options?: Mode | MakeDirectoryOptions | null, + ): Promise; + } + /** + * Synchronously creates a directory. Returns `undefined`, or if `recursive` is`true`, the first directory path created. + * This is the synchronous version of {@link mkdir}. + * + * See the POSIX [`mkdir(2)`](http://man7.org/linux/man-pages/man2/mkdir.2.html) documentation for more details. + * @since v0.1.21 + */ + export function mkdirSync( + path: PathLike, + options: MakeDirectoryOptions & { + recursive: true; + }, + ): string | undefined; + /** + * Synchronous mkdir(2) - create a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options Either the file mode, or an object optionally specifying the file mode and whether parent folders + * should be created. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. + */ + export function mkdirSync( + path: PathLike, + options?: + | Mode + | (MakeDirectoryOptions & { + recursive?: false | undefined; + }) + | null, + ): void; + /** + * Synchronous mkdir(2) - create a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options Either the file mode, or an object optionally specifying the file mode and whether parent folders + * should be created. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. + */ + export function mkdirSync(path: PathLike, options?: Mode | MakeDirectoryOptions | null): string | undefined; + /** + * Creates a unique temporary directory. + * + * Generates six random characters to be appended behind a required`prefix` to create a unique temporary directory. Due to platform + * inconsistencies, avoid trailing `X` characters in `prefix`. Some platforms, + * notably the BSDs, can return more than six random characters, and replace + * trailing `X` characters in `prefix` with random characters. + * + * The created directory path is passed as a string to the callback's second + * parameter. + * + * The optional `options` argument can be a string specifying an encoding, or an + * object with an `encoding` property specifying the character encoding to use. + * + * ```js + * import { mkdtemp } from 'node:fs'; + * import { join } from 'node:path'; + * import { tmpdir } from 'node:os'; + * + * mkdtemp(join(tmpdir(), 'foo-'), (err, directory) => { + * if (err) throw err; + * console.log(directory); + * // Prints: /tmp/foo-itXde2 or C:\Users\...\AppData\Local\Temp\foo-itXde2 + * }); + * ``` + * + * The `fs.mkdtemp()` method will append the six randomly selected characters + * directly to the `prefix` string. For instance, given a directory `/tmp`, if the + * intention is to create a temporary directory _within_`/tmp`, the `prefix`must end with a trailing platform-specific path separator + * (`require('node:path').sep`). + * + * ```js + * import { tmpdir } from 'node:os'; + * import { mkdtemp } from 'node:fs'; + * + * // The parent directory for the new temporary directory + * const tmpDir = tmpdir(); + * + * // This method is *INCORRECT*: + * mkdtemp(tmpDir, (err, directory) => { + * if (err) throw err; + * console.log(directory); + * // Will print something similar to `/tmpabc123`. + * // A new temporary directory is created at the file system root + * // rather than *within* the /tmp directory. + * }); + * + * // This method is *CORRECT*: + * import { sep } from 'node:path'; + * mkdtemp(`${tmpDir}${sep}`, (err, directory) => { + * if (err) throw err; + * console.log(directory); + * // Will print something similar to `/tmp/abc123`. + * // A new temporary directory is created within + * // the /tmp directory. + * }); + * ``` + * @since v5.10.0 + */ + export function mkdtemp( + prefix: string, + options: EncodingOption, + callback: (err: NodeJS.ErrnoException | null, folder: string) => void, + ): void; + /** + * Asynchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function mkdtemp( + prefix: string, + options: + | "buffer" + | { + encoding: "buffer"; + }, + callback: (err: NodeJS.ErrnoException | null, folder: Buffer) => void, + ): void; + /** + * Asynchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function mkdtemp( + prefix: string, + options: EncodingOption, + callback: (err: NodeJS.ErrnoException | null, folder: string | Buffer) => void, + ): void; + /** + * Asynchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + */ + export function mkdtemp( + prefix: string, + callback: (err: NodeJS.ErrnoException | null, folder: string) => void, + ): void; + export namespace mkdtemp { + /** + * Asynchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function __promisify__(prefix: string, options?: EncodingOption): Promise; + /** + * Asynchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function __promisify__(prefix: string, options: BufferEncodingOption): Promise; + /** + * Asynchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function __promisify__(prefix: string, options?: EncodingOption): Promise; + } + /** + * Returns the created directory path. + * + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link mkdtemp}. + * + * The optional `options` argument can be a string specifying an encoding, or an + * object with an `encoding` property specifying the character encoding to use. + * @since v5.10.0 + */ + export function mkdtempSync(prefix: string, options?: EncodingOption): string; + /** + * Synchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function mkdtempSync(prefix: string, options: BufferEncodingOption): Buffer; + /** + * Synchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function mkdtempSync(prefix: string, options?: EncodingOption): string | Buffer; + /** + * Reads the contents of a directory. The callback gets two arguments `(err, files)`where `files` is an array of the names of the files in the directory excluding`'.'` and `'..'`. + * + * See the POSIX [`readdir(3)`](http://man7.org/linux/man-pages/man3/readdir.3.html) documentation for more details. + * + * The optional `options` argument can be a string specifying an encoding, or an + * object with an `encoding` property specifying the character encoding to use for + * the filenames passed to the callback. If the `encoding` is set to `'buffer'`, + * the filenames returned will be passed as `Buffer` objects. + * + * If `options.withFileTypes` is set to `true`, the `files` array will contain `fs.Dirent` objects. + * @since v0.1.8 + */ + export function readdir( + path: PathLike, + options: + | { + encoding: BufferEncoding | null; + withFileTypes?: false | undefined; + recursive?: boolean | undefined; + } + | BufferEncoding + | undefined + | null, + callback: (err: NodeJS.ErrnoException | null, files: string[]) => void, + ): void; + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readdir( + path: PathLike, + options: + | { + encoding: "buffer"; + withFileTypes?: false | undefined; + recursive?: boolean | undefined; + } + | "buffer", + callback: (err: NodeJS.ErrnoException | null, files: Buffer[]) => void, + ): void; + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readdir( + path: PathLike, + options: + | (ObjectEncodingOptions & { + withFileTypes?: false | undefined; + recursive?: boolean | undefined; + }) + | BufferEncoding + | undefined + | null, + callback: (err: NodeJS.ErrnoException | null, files: string[] | Buffer[]) => void, + ): void; + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function readdir( + path: PathLike, + callback: (err: NodeJS.ErrnoException | null, files: string[]) => void, + ): void; + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options If called with `withFileTypes: true` the result data will be an array of Dirent. + */ + export function readdir( + path: PathLike, + options: ObjectEncodingOptions & { + withFileTypes: true; + recursive?: boolean | undefined; + }, + callback: (err: NodeJS.ErrnoException | null, files: Dirent[]) => void, + ): void; + export namespace readdir { + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function __promisify__( + path: PathLike, + options?: + | { + encoding: BufferEncoding | null; + withFileTypes?: false | undefined; + recursive?: boolean | undefined; + } + | BufferEncoding + | null, + ): Promise; + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function __promisify__( + path: PathLike, + options: + | "buffer" + | { + encoding: "buffer"; + withFileTypes?: false | undefined; + recursive?: boolean | undefined; + }, + ): Promise; + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function __promisify__( + path: PathLike, + options?: + | (ObjectEncodingOptions & { + withFileTypes?: false | undefined; + recursive?: boolean | undefined; + }) + | BufferEncoding + | null, + ): Promise; + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options If called with `withFileTypes: true` the result data will be an array of Dirent + */ + function __promisify__( + path: PathLike, + options: ObjectEncodingOptions & { + withFileTypes: true; + recursive?: boolean | undefined; + }, + ): Promise; + } + /** + * Reads the contents of the directory. + * + * See the POSIX [`readdir(3)`](http://man7.org/linux/man-pages/man3/readdir.3.html) documentation for more details. + * + * The optional `options` argument can be a string specifying an encoding, or an + * object with an `encoding` property specifying the character encoding to use for + * the filenames returned. If the `encoding` is set to `'buffer'`, + * the filenames returned will be passed as `Buffer` objects. + * + * If `options.withFileTypes` is set to `true`, the result will contain `fs.Dirent` objects. + * @since v0.1.21 + */ + export function readdirSync( + path: PathLike, + options?: + | { + encoding: BufferEncoding | null; + withFileTypes?: false | undefined; + recursive?: boolean | undefined; + } + | BufferEncoding + | null, + ): string[]; + /** + * Synchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readdirSync( + path: PathLike, + options: + | { + encoding: "buffer"; + withFileTypes?: false | undefined; + recursive?: boolean | undefined; + } + | "buffer", + ): Buffer[]; + /** + * Synchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readdirSync( + path: PathLike, + options?: + | (ObjectEncodingOptions & { + withFileTypes?: false | undefined; + recursive?: boolean | undefined; + }) + | BufferEncoding + | null, + ): string[] | Buffer[]; + /** + * Synchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options If called with `withFileTypes: true` the result data will be an array of Dirent. + */ + export function readdirSync( + path: PathLike, + options: ObjectEncodingOptions & { + withFileTypes: true; + recursive?: boolean | undefined; + }, + ): Dirent[]; + /** + * Closes the file descriptor. No arguments other than a possible exception are + * given to the completion callback. + * + * Calling `fs.close()` on any file descriptor (`fd`) that is currently in use + * through any other `fs` operation may lead to undefined behavior. + * + * See the POSIX [`close(2)`](http://man7.org/linux/man-pages/man2/close.2.html) documentation for more detail. + * @since v0.0.2 + */ + export function close(fd: number, callback?: NoParamCallback): void; + export namespace close { + /** + * Asynchronous close(2) - close a file descriptor. + * @param fd A file descriptor. + */ + function __promisify__(fd: number): Promise; + } + /** + * Closes the file descriptor. Returns `undefined`. + * + * Calling `fs.closeSync()` on any file descriptor (`fd`) that is currently in use + * through any other `fs` operation may lead to undefined behavior. + * + * See the POSIX [`close(2)`](http://man7.org/linux/man-pages/man2/close.2.html) documentation for more detail. + * @since v0.1.21 + */ + export function closeSync(fd: number): void; + /** + * Asynchronous file open. See the POSIX [`open(2)`](http://man7.org/linux/man-pages/man2/open.2.html) documentation for more details. + * + * `mode` sets the file mode (permission and sticky bits), but only if the file was + * created. On Windows, only the write permission can be manipulated; see {@link chmod}. + * + * The callback gets two arguments `(err, fd)`. + * + * Some characters (`< > : " / \ | ? *`) are reserved under Windows as documented + * by [Naming Files, Paths, and Namespaces](https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file). Under NTFS, if the filename contains + * a colon, Node.js will open a file system stream, as described by [this MSDN page](https://docs.microsoft.com/en-us/windows/desktop/FileIO/using-streams). + * + * Functions based on `fs.open()` exhibit this behavior as well:`fs.writeFile()`, `fs.readFile()`, etc. + * @since v0.0.2 + * @param [flags='r'] See `support of file system `flags``. + * @param [mode=0o666] + */ + export function open( + path: PathLike, + flags: OpenMode | undefined, + mode: Mode | undefined | null, + callback: (err: NodeJS.ErrnoException | null, fd: number) => void, + ): void; + /** + * Asynchronous open(2) - open and possibly create a file. If the file is created, its mode will be `0o666`. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param [flags='r'] See `support of file system `flags``. + */ + export function open( + path: PathLike, + flags: OpenMode | undefined, + callback: (err: NodeJS.ErrnoException | null, fd: number) => void, + ): void; + /** + * Asynchronous open(2) - open and possibly create a file. If the file is created, its mode will be `0o666`. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function open(path: PathLike, callback: (err: NodeJS.ErrnoException | null, fd: number) => void): void; + export namespace open { + /** + * Asynchronous open(2) - open and possibly create a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param mode A file mode. If a string is passed, it is parsed as an octal integer. If not supplied, defaults to `0o666`. + */ + function __promisify__(path: PathLike, flags: OpenMode, mode?: Mode | null): Promise; + } + /** + * Returns an integer representing the file descriptor. + * + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link open}. + * @since v0.1.21 + * @param [flags='r'] + * @param [mode=0o666] + */ + export function openSync(path: PathLike, flags: OpenMode, mode?: Mode | null): number; + /** + * Change the file system timestamps of the object referenced by `path`. + * + * The `atime` and `mtime` arguments follow these rules: + * + * * Values can be either numbers representing Unix epoch time in seconds,`Date`s, or a numeric string like `'123456789.0'`. + * * If the value can not be converted to a number, or is `NaN`, `Infinity`, or`-Infinity`, an `Error` will be thrown. + * @since v0.4.2 + */ + export function utimes(path: PathLike, atime: TimeLike, mtime: TimeLike, callback: NoParamCallback): void; + export namespace utimes { + /** + * Asynchronously change file timestamps of the file referenced by the supplied path. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param atime The last access time. If a string is provided, it will be coerced to number. + * @param mtime The last modified time. If a string is provided, it will be coerced to number. + */ + function __promisify__(path: PathLike, atime: TimeLike, mtime: TimeLike): Promise; + } + /** + * Returns `undefined`. + * + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link utimes}. + * @since v0.4.2 + */ + export function utimesSync(path: PathLike, atime: TimeLike, mtime: TimeLike): void; + /** + * Change the file system timestamps of the object referenced by the supplied file + * descriptor. See {@link utimes}. + * @since v0.4.2 + */ + export function futimes(fd: number, atime: TimeLike, mtime: TimeLike, callback: NoParamCallback): void; + export namespace futimes { + /** + * Asynchronously change file timestamps of the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param atime The last access time. If a string is provided, it will be coerced to number. + * @param mtime The last modified time. If a string is provided, it will be coerced to number. + */ + function __promisify__(fd: number, atime: TimeLike, mtime: TimeLike): Promise; + } + /** + * Synchronous version of {@link futimes}. Returns `undefined`. + * @since v0.4.2 + */ + export function futimesSync(fd: number, atime: TimeLike, mtime: TimeLike): void; + /** + * Request that all data for the open file descriptor is flushed to the storage + * device. The specific implementation is operating system and device specific. + * Refer to the POSIX [`fsync(2)`](http://man7.org/linux/man-pages/man2/fsync.2.html) documentation for more detail. No arguments other + * than a possible exception are given to the completion callback. + * @since v0.1.96 + */ + export function fsync(fd: number, callback: NoParamCallback): void; + export namespace fsync { + /** + * Asynchronous fsync(2) - synchronize a file's in-core state with the underlying storage device. + * @param fd A file descriptor. + */ + function __promisify__(fd: number): Promise; + } + /** + * Request that all data for the open file descriptor is flushed to the storage + * device. The specific implementation is operating system and device specific. + * Refer to the POSIX [`fsync(2)`](http://man7.org/linux/man-pages/man2/fsync.2.html) documentation for more detail. Returns `undefined`. + * @since v0.1.96 + */ + export function fsyncSync(fd: number): void; + /** + * Write `buffer` to the file specified by `fd`. + * + * `offset` determines the part of the buffer to be written, and `length` is + * an integer specifying the number of bytes to write. + * + * `position` refers to the offset from the beginning of the file where this data + * should be written. If `typeof position !== 'number'`, the data will be written + * at the current position. See [`pwrite(2)`](http://man7.org/linux/man-pages/man2/pwrite.2.html). + * + * The callback will be given three arguments `(err, bytesWritten, buffer)` where`bytesWritten` specifies how many _bytes_ were written from `buffer`. + * + * If this method is invoked as its `util.promisify()` ed version, it returns + * a promise for an `Object` with `bytesWritten` and `buffer` properties. + * + * It is unsafe to use `fs.write()` multiple times on the same file without waiting + * for the callback. For this scenario, {@link createWriteStream} is + * recommended. + * + * On Linux, positional writes don't work when the file is opened in append mode. + * The kernel ignores the position argument and always appends the data to + * the end of the file. + * @since v0.0.2 + * @param [offset=0] + * @param [length=buffer.byteLength - offset] + * @param [position='null'] + */ + export function write( + fd: number, + buffer: TBuffer, + offset: number | undefined | null, + length: number | undefined | null, + position: number | undefined | null, + callback: (err: NodeJS.ErrnoException | null, written: number, buffer: TBuffer) => void, + ): void; + /** + * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param offset The part of the buffer to be written. If not supplied, defaults to `0`. + * @param length The number of bytes to write. If not supplied, defaults to `buffer.length - offset`. + */ + export function write( + fd: number, + buffer: TBuffer, + offset: number | undefined | null, + length: number | undefined | null, + callback: (err: NodeJS.ErrnoException | null, written: number, buffer: TBuffer) => void, + ): void; + /** + * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param offset The part of the buffer to be written. If not supplied, defaults to `0`. + */ + export function write( + fd: number, + buffer: TBuffer, + offset: number | undefined | null, + callback: (err: NodeJS.ErrnoException | null, written: number, buffer: TBuffer) => void, + ): void; + /** + * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + */ + export function write( + fd: number, + buffer: TBuffer, + callback: (err: NodeJS.ErrnoException | null, written: number, buffer: TBuffer) => void, + ): void; + /** + * Asynchronously writes `string` to the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param string A string to write. + * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. + * @param encoding The expected string encoding. + */ + export function write( + fd: number, + string: string, + position: number | undefined | null, + encoding: BufferEncoding | undefined | null, + callback: (err: NodeJS.ErrnoException | null, written: number, str: string) => void, + ): void; + /** + * Asynchronously writes `string` to the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param string A string to write. + * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. + */ + export function write( + fd: number, + string: string, + position: number | undefined | null, + callback: (err: NodeJS.ErrnoException | null, written: number, str: string) => void, + ): void; + /** + * Asynchronously writes `string` to the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param string A string to write. + */ + export function write( + fd: number, + string: string, + callback: (err: NodeJS.ErrnoException | null, written: number, str: string) => void, + ): void; + export namespace write { + /** + * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param offset The part of the buffer to be written. If not supplied, defaults to `0`. + * @param length The number of bytes to write. If not supplied, defaults to `buffer.length - offset`. + * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. + */ + function __promisify__( + fd: number, + buffer?: TBuffer, + offset?: number, + length?: number, + position?: number | null, + ): Promise<{ + bytesWritten: number; + buffer: TBuffer; + }>; + /** + * Asynchronously writes `string` to the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param string A string to write. + * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. + * @param encoding The expected string encoding. + */ + function __promisify__( + fd: number, + string: string, + position?: number | null, + encoding?: BufferEncoding | null, + ): Promise<{ + bytesWritten: number; + buffer: string; + }>; + } + /** + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link write}. + * @since v0.1.21 + * @param [offset=0] + * @param [length=buffer.byteLength - offset] + * @param [position='null'] + * @return The number of bytes written. + */ + export function writeSync( + fd: number, + buffer: NodeJS.ArrayBufferView, + offset?: number | null, + length?: number | null, + position?: number | null, + ): number; + /** + * Synchronously writes `string` to the file referenced by the supplied file descriptor, returning the number of bytes written. + * @param fd A file descriptor. + * @param string A string to write. + * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. + * @param encoding The expected string encoding. + */ + export function writeSync( + fd: number, + string: string, + position?: number | null, + encoding?: BufferEncoding | null, + ): number; + export type ReadPosition = number | bigint; + export interface ReadSyncOptions { + /** + * @default 0 + */ + offset?: number | undefined; + /** + * @default `length of buffer` + */ + length?: number | undefined; + /** + * @default null + */ + position?: ReadPosition | null | undefined; + } + export interface ReadAsyncOptions extends ReadSyncOptions { + buffer?: TBuffer; + } + /** + * Read data from the file specified by `fd`. + * + * The callback is given the three arguments, `(err, bytesRead, buffer)`. + * + * If the file is not modified concurrently, the end-of-file is reached when the + * number of bytes read is zero. + * + * If this method is invoked as its `util.promisify()` ed version, it returns + * a promise for an `Object` with `bytesRead` and `buffer` properties. + * @since v0.0.2 + * @param buffer The buffer that the data will be written to. + * @param offset The position in `buffer` to write the data to. + * @param length The number of bytes to read. + * @param position Specifies where to begin reading from in the file. If `position` is `null` or `-1 `, data will be read from the current file position, and the file position will be updated. If + * `position` is an integer, the file position will be unchanged. + */ + export function read( + fd: number, + buffer: TBuffer, + offset: number, + length: number, + position: ReadPosition | null, + callback: (err: NodeJS.ErrnoException | null, bytesRead: number, buffer: TBuffer) => void, + ): void; + /** + * Similar to the above `fs.read` function, this version takes an optional `options` object. + * If not otherwise specified in an `options` object, + * `buffer` defaults to `Buffer.alloc(16384)`, + * `offset` defaults to `0`, + * `length` defaults to `buffer.byteLength`, `- offset` as of Node 17.6.0 + * `position` defaults to `null` + * @since v12.17.0, 13.11.0 + */ + export function read( + fd: number, + options: ReadAsyncOptions, + callback: (err: NodeJS.ErrnoException | null, bytesRead: number, buffer: TBuffer) => void, + ): void; + export function read( + fd: number, + callback: (err: NodeJS.ErrnoException | null, bytesRead: number, buffer: NodeJS.ArrayBufferView) => void, + ): void; + export namespace read { + /** + * @param fd A file descriptor. + * @param buffer The buffer that the data will be written to. + * @param offset The offset in the buffer at which to start writing. + * @param length The number of bytes to read. + * @param position The offset from the beginning of the file from which data should be read. If `null`, data will be read from the current position. + */ + function __promisify__( + fd: number, + buffer: TBuffer, + offset: number, + length: number, + position: number | null, + ): Promise<{ + bytesRead: number; + buffer: TBuffer; + }>; + function __promisify__( + fd: number, + options: ReadAsyncOptions, + ): Promise<{ + bytesRead: number; + buffer: TBuffer; + }>; + function __promisify__(fd: number): Promise<{ + bytesRead: number; + buffer: NodeJS.ArrayBufferView; + }>; + } + /** + * Returns the number of `bytesRead`. + * + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link read}. + * @since v0.1.21 + * @param [position='null'] + */ + export function readSync( + fd: number, + buffer: NodeJS.ArrayBufferView, + offset: number, + length: number, + position: ReadPosition | null, + ): number; + /** + * Similar to the above `fs.readSync` function, this version takes an optional `options` object. + * If no `options` object is specified, it will default with the above values. + */ + export function readSync(fd: number, buffer: NodeJS.ArrayBufferView, opts?: ReadSyncOptions): number; + /** + * Asynchronously reads the entire contents of a file. + * + * ```js + * import { readFile } from 'node:fs'; + * + * readFile('/etc/passwd', (err, data) => { + * if (err) throw err; + * console.log(data); + * }); + * ``` + * + * The callback is passed two arguments `(err, data)`, where `data` is the + * contents of the file. + * + * If no encoding is specified, then the raw buffer is returned. + * + * If `options` is a string, then it specifies the encoding: + * + * ```js + * import { readFile } from 'node:fs'; + * + * readFile('/etc/passwd', 'utf8', callback); + * ``` + * + * When the path is a directory, the behavior of `fs.readFile()` and {@link readFileSync} is platform-specific. On macOS, Linux, and Windows, an + * error will be returned. On FreeBSD, a representation of the directory's contents + * will be returned. + * + * ```js + * import { readFile } from 'node:fs'; + * + * // macOS, Linux, and Windows + * readFile('', (err, data) => { + * // => [Error: EISDIR: illegal operation on a directory, read ] + * }); + * + * // FreeBSD + * readFile('', (err, data) => { + * // => null, + * }); + * ``` + * + * It is possible to abort an ongoing request using an `AbortSignal`. If a + * request is aborted the callback is called with an `AbortError`: + * + * ```js + * import { readFile } from 'node:fs'; + * + * const controller = new AbortController(); + * const signal = controller.signal; + * readFile(fileInfo[0].name, { signal }, (err, buf) => { + * // ... + * }); + * // When you want to abort the request + * controller.abort(); + * ``` + * + * The `fs.readFile()` function buffers the entire file. To minimize memory costs, + * when possible prefer streaming via `fs.createReadStream()`. + * + * Aborting an ongoing request does not abort individual operating + * system requests but rather the internal buffering `fs.readFile` performs. + * @since v0.1.29 + * @param path filename or file descriptor + */ + export function readFile( + path: PathOrFileDescriptor, + options: + | ({ + encoding?: null | undefined; + flag?: string | undefined; + } & Abortable) + | undefined + | null, + callback: (err: NodeJS.ErrnoException | null, data: Buffer) => void, + ): void; + /** + * Asynchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + export function readFile( + path: PathOrFileDescriptor, + options: + | ({ + encoding: BufferEncoding; + flag?: string | undefined; + } & Abortable) + | BufferEncoding, + callback: (err: NodeJS.ErrnoException | null, data: string) => void, + ): void; + /** + * Asynchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + export function readFile( + path: PathOrFileDescriptor, + options: + | (ObjectEncodingOptions & { + flag?: string | undefined; + } & Abortable) + | BufferEncoding + | undefined + | null, + callback: (err: NodeJS.ErrnoException | null, data: string | Buffer) => void, + ): void; + /** + * Asynchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + */ + export function readFile( + path: PathOrFileDescriptor, + callback: (err: NodeJS.ErrnoException | null, data: Buffer) => void, + ): void; + export namespace readFile { + /** + * Asynchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param options An object that may contain an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + function __promisify__( + path: PathOrFileDescriptor, + options?: { + encoding?: null | undefined; + flag?: string | undefined; + } | null, + ): Promise; + /** + * Asynchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + function __promisify__( + path: PathOrFileDescriptor, + options: + | { + encoding: BufferEncoding; + flag?: string | undefined; + } + | BufferEncoding, + ): Promise; + /** + * Asynchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + function __promisify__( + path: PathOrFileDescriptor, + options?: + | (ObjectEncodingOptions & { + flag?: string | undefined; + }) + | BufferEncoding + | null, + ): Promise; + } + /** + * Returns the contents of the `path`. + * + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link readFile}. + * + * If the `encoding` option is specified then this function returns a + * string. Otherwise it returns a buffer. + * + * Similar to {@link readFile}, when the path is a directory, the behavior of`fs.readFileSync()` is platform-specific. + * + * ```js + * import { readFileSync } from 'node:fs'; + * + * // macOS, Linux, and Windows + * readFileSync(''); + * // => [Error: EISDIR: illegal operation on a directory, read ] + * + * // FreeBSD + * readFileSync(''); // => + * ``` + * @since v0.1.8 + * @param path filename or file descriptor + */ + export function readFileSync( + path: PathOrFileDescriptor, + options?: { + encoding?: null | undefined; + flag?: string | undefined; + } | null, + ): Buffer; + /** + * Synchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + export function readFileSync( + path: PathOrFileDescriptor, + options: + | { + encoding: BufferEncoding; + flag?: string | undefined; + } + | BufferEncoding, + ): string; + /** + * Synchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + export function readFileSync( + path: PathOrFileDescriptor, + options?: + | (ObjectEncodingOptions & { + flag?: string | undefined; + }) + | BufferEncoding + | null, + ): string | Buffer; + export type WriteFileOptions = + | ( + & ObjectEncodingOptions + & Abortable + & { + mode?: Mode | undefined; + flag?: string | undefined; + flush?: boolean | undefined; + } + ) + | BufferEncoding + | null; + /** + * When `file` is a filename, asynchronously writes data to the file, replacing the + * file if it already exists. `data` can be a string or a buffer. + * + * When `file` is a file descriptor, the behavior is similar to calling`fs.write()` directly (which is recommended). See the notes below on using + * a file descriptor. + * + * The `encoding` option is ignored if `data` is a buffer. + * + * The `mode` option only affects the newly created file. See {@link open} for more details. + * + * ```js + * import { writeFile } from 'node:fs'; + * import { Buffer } from 'node:buffer'; + * + * const data = new Uint8Array(Buffer.from('Hello Node.js')); + * writeFile('message.txt', data, (err) => { + * if (err) throw err; + * console.log('The file has been saved!'); + * }); + * ``` + * + * If `options` is a string, then it specifies the encoding: + * + * ```js + * import { writeFile } from 'node:fs'; + * + * writeFile('message.txt', 'Hello Node.js', 'utf8', callback); + * ``` + * + * It is unsafe to use `fs.writeFile()` multiple times on the same file without + * waiting for the callback. For this scenario, {@link createWriteStream} is + * recommended. + * + * Similarly to `fs.readFile` \- `fs.writeFile` is a convenience method that + * performs multiple `write` calls internally to write the buffer passed to it. + * For performance sensitive code consider using {@link createWriteStream}. + * + * It is possible to use an `AbortSignal` to cancel an `fs.writeFile()`. + * Cancelation is "best effort", and some amount of data is likely still + * to be written. + * + * ```js + * import { writeFile } from 'node:fs'; + * import { Buffer } from 'node:buffer'; + * + * const controller = new AbortController(); + * const { signal } = controller; + * const data = new Uint8Array(Buffer.from('Hello Node.js')); + * writeFile('message.txt', data, { signal }, (err) => { + * // When a request is aborted - the callback is called with an AbortError + * }); + * // When the request should be aborted + * controller.abort(); + * ``` + * + * Aborting an ongoing request does not abort individual operating + * system requests but rather the internal buffering `fs.writeFile` performs. + * @since v0.1.29 + * @param file filename or file descriptor + */ + export function writeFile( + file: PathOrFileDescriptor, + data: string | NodeJS.ArrayBufferView, + options: WriteFileOptions, + callback: NoParamCallback, + ): void; + /** + * Asynchronously writes data to a file, replacing the file if it already exists. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. + */ + export function writeFile( + path: PathOrFileDescriptor, + data: string | NodeJS.ArrayBufferView, + callback: NoParamCallback, + ): void; + export namespace writeFile { + /** + * Asynchronously writes data to a file, replacing the file if it already exists. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. + * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. + * If `encoding` is not supplied, the default of `'utf8'` is used. + * If `mode` is not supplied, the default of `0o666` is used. + * If `mode` is a string, it is parsed as an octal integer. + * If `flag` is not supplied, the default of `'w'` is used. + */ + function __promisify__( + path: PathOrFileDescriptor, + data: string | NodeJS.ArrayBufferView, + options?: WriteFileOptions, + ): Promise; + } + /** + * Returns `undefined`. + * + * The `mode` option only affects the newly created file. See {@link open} for more details. + * + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link writeFile}. + * @since v0.1.29 + * @param file filename or file descriptor + */ + export function writeFileSync( + file: PathOrFileDescriptor, + data: string | NodeJS.ArrayBufferView, + options?: WriteFileOptions, + ): void; + /** + * Asynchronously append data to a file, creating the file if it does not yet + * exist. `data` can be a string or a `Buffer`. + * + * The `mode` option only affects the newly created file. See {@link open} for more details. + * + * ```js + * import { appendFile } from 'node:fs'; + * + * appendFile('message.txt', 'data to append', (err) => { + * if (err) throw err; + * console.log('The "data to append" was appended to file!'); + * }); + * ``` + * + * If `options` is a string, then it specifies the encoding: + * + * ```js + * import { appendFile } from 'node:fs'; + * + * appendFile('message.txt', 'data to append', 'utf8', callback); + * ``` + * + * The `path` may be specified as a numeric file descriptor that has been opened + * for appending (using `fs.open()` or `fs.openSync()`). The file descriptor will + * not be closed automatically. + * + * ```js + * import { open, close, appendFile } from 'node:fs'; + * + * function closeFd(fd) { + * close(fd, (err) => { + * if (err) throw err; + * }); + * } + * + * open('message.txt', 'a', (err, fd) => { + * if (err) throw err; + * + * try { + * appendFile(fd, 'data to append', 'utf8', (err) => { + * closeFd(fd); + * if (err) throw err; + * }); + * } catch (err) { + * closeFd(fd); + * throw err; + * } + * }); + * ``` + * @since v0.6.7 + * @param path filename or file descriptor + */ + export function appendFile( + path: PathOrFileDescriptor, + data: string | Uint8Array, + options: WriteFileOptions, + callback: NoParamCallback, + ): void; + /** + * Asynchronously append data to a file, creating the file if it does not exist. + * @param file A path to a file. If a URL is provided, it must use the `file:` protocol. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. + */ + export function appendFile(file: PathOrFileDescriptor, data: string | Uint8Array, callback: NoParamCallback): void; + export namespace appendFile { + /** + * Asynchronously append data to a file, creating the file if it does not exist. + * @param file A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. + * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. + * If `encoding` is not supplied, the default of `'utf8'` is used. + * If `mode` is not supplied, the default of `0o666` is used. + * If `mode` is a string, it is parsed as an octal integer. + * If `flag` is not supplied, the default of `'a'` is used. + */ + function __promisify__( + file: PathOrFileDescriptor, + data: string | Uint8Array, + options?: WriteFileOptions, + ): Promise; + } + /** + * Synchronously append data to a file, creating the file if it does not yet + * exist. `data` can be a string or a `Buffer`. + * + * The `mode` option only affects the newly created file. See {@link open} for more details. + * + * ```js + * import { appendFileSync } from 'node:fs'; + * + * try { + * appendFileSync('message.txt', 'data to append'); + * console.log('The "data to append" was appended to file!'); + * } catch (err) { + * // Handle the error + * } + * ``` + * + * If `options` is a string, then it specifies the encoding: + * + * ```js + * import { appendFileSync } from 'node:fs'; + * + * appendFileSync('message.txt', 'data to append', 'utf8'); + * ``` + * + * The `path` may be specified as a numeric file descriptor that has been opened + * for appending (using `fs.open()` or `fs.openSync()`). The file descriptor will + * not be closed automatically. + * + * ```js + * import { openSync, closeSync, appendFileSync } from 'node:fs'; + * + * let fd; + * + * try { + * fd = openSync('message.txt', 'a'); + * appendFileSync(fd, 'data to append', 'utf8'); + * } catch (err) { + * // Handle the error + * } finally { + * if (fd !== undefined) + * closeSync(fd); + * } + * ``` + * @since v0.6.7 + * @param path filename or file descriptor + */ + export function appendFileSync( + path: PathOrFileDescriptor, + data: string | Uint8Array, + options?: WriteFileOptions, + ): void; + /** + * Watch for changes on `filename`. The callback `listener` will be called each + * time the file is accessed. + * + * The `options` argument may be omitted. If provided, it should be an object. The`options` object may contain a boolean named `persistent` that indicates + * whether the process should continue to run as long as files are being watched. + * The `options` object may specify an `interval` property indicating how often the + * target should be polled in milliseconds. + * + * The `listener` gets two arguments the current stat object and the previous + * stat object: + * + * ```js + * import { watchFile } from 'fs'; + * + * watchFile('message.text', (curr, prev) => { + * console.log(`the current mtime is: ${curr.mtime}`); + * console.log(`the previous mtime was: ${prev.mtime}`); + * }); + * ``` + * + * These stat objects are instances of `fs.Stat`. If the `bigint` option is `true`, + * the numeric values in these objects are specified as `BigInt`s. + * + * To be notified when the file was modified, not just accessed, it is necessary + * to compare `curr.mtimeMs` and `prev.mtimeMs`. + * + * When an `fs.watchFile` operation results in an `ENOENT` error, it + * will invoke the listener once, with all the fields zeroed (or, for dates, the + * Unix Epoch). If the file is created later on, the listener will be called + * again, with the latest stat objects. This is a change in functionality since + * v0.10. + * + * Using {@link watch} is more efficient than `fs.watchFile` and`fs.unwatchFile`. `fs.watch` should be used instead of `fs.watchFile` and`fs.unwatchFile` when possible. + * + * When a file being watched by `fs.watchFile()` disappears and reappears, + * then the contents of `previous` in the second callback event (the file's + * reappearance) will be the same as the contents of `previous` in the first + * callback event (its disappearance). + * + * This happens when: + * + * * the file is deleted, followed by a restore + * * the file is renamed and then renamed a second time back to its original name + * @since v0.1.31 + */ + export interface WatchFileOptions { + bigint?: boolean | undefined; + persistent?: boolean | undefined; + interval?: number | undefined; + } + /** + * Watch for changes on `filename`. The callback `listener` will be called each + * time the file is accessed. + * + * The `options` argument may be omitted. If provided, it should be an object. The`options` object may contain a boolean named `persistent` that indicates + * whether the process should continue to run as long as files are being watched. + * The `options` object may specify an `interval` property indicating how often the + * target should be polled in milliseconds. + * + * The `listener` gets two arguments the current stat object and the previous + * stat object: + * + * ```js + * import { watchFile } from 'node:fs'; + * + * watchFile('message.text', (curr, prev) => { + * console.log(`the current mtime is: ${curr.mtime}`); + * console.log(`the previous mtime was: ${prev.mtime}`); + * }); + * ``` + * + * These stat objects are instances of `fs.Stat`. If the `bigint` option is `true`, + * the numeric values in these objects are specified as `BigInt`s. + * + * To be notified when the file was modified, not just accessed, it is necessary + * to compare `curr.mtimeMs` and `prev.mtimeMs`. + * + * When an `fs.watchFile` operation results in an `ENOENT` error, it + * will invoke the listener once, with all the fields zeroed (or, for dates, the + * Unix Epoch). If the file is created later on, the listener will be called + * again, with the latest stat objects. This is a change in functionality since + * v0.10. + * + * Using {@link watch} is more efficient than `fs.watchFile` and`fs.unwatchFile`. `fs.watch` should be used instead of `fs.watchFile` and`fs.unwatchFile` when possible. + * + * When a file being watched by `fs.watchFile()` disappears and reappears, + * then the contents of `previous` in the second callback event (the file's + * reappearance) will be the same as the contents of `previous` in the first + * callback event (its disappearance). + * + * This happens when: + * + * * the file is deleted, followed by a restore + * * the file is renamed and then renamed a second time back to its original name + * @since v0.1.31 + */ + export function watchFile( + filename: PathLike, + options: + | (WatchFileOptions & { + bigint?: false | undefined; + }) + | undefined, + listener: StatsListener, + ): StatWatcher; + export function watchFile( + filename: PathLike, + options: + | (WatchFileOptions & { + bigint: true; + }) + | undefined, + listener: BigIntStatsListener, + ): StatWatcher; + /** + * Watch for changes on `filename`. The callback `listener` will be called each time the file is accessed. + * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + */ + export function watchFile(filename: PathLike, listener: StatsListener): StatWatcher; + /** + * Stop watching for changes on `filename`. If `listener` is specified, only that + * particular listener is removed. Otherwise, _all_ listeners are removed, + * effectively stopping watching of `filename`. + * + * Calling `fs.unwatchFile()` with a filename that is not being watched is a + * no-op, not an error. + * + * Using {@link watch} is more efficient than `fs.watchFile()` and`fs.unwatchFile()`. `fs.watch()` should be used instead of `fs.watchFile()`and `fs.unwatchFile()` when possible. + * @since v0.1.31 + * @param listener Optional, a listener previously attached using `fs.watchFile()` + */ + export function unwatchFile(filename: PathLike, listener?: StatsListener): void; + export function unwatchFile(filename: PathLike, listener?: BigIntStatsListener): void; + export interface WatchOptions extends Abortable { + encoding?: BufferEncoding | "buffer" | undefined; + persistent?: boolean | undefined; + recursive?: boolean | undefined; + } + export type WatchEventType = "rename" | "change"; + export type WatchListener = (event: WatchEventType, filename: T | null) => void; + export type StatsListener = (curr: Stats, prev: Stats) => void; + export type BigIntStatsListener = (curr: BigIntStats, prev: BigIntStats) => void; + /** + * Watch for changes on `filename`, where `filename` is either a file or a + * directory. + * + * The second argument is optional. If `options` is provided as a string, it + * specifies the `encoding`. Otherwise `options` should be passed as an object. + * + * The listener callback gets two arguments `(eventType, filename)`. `eventType`is either `'rename'` or `'change'`, and `filename` is the name of the file + * which triggered the event. + * + * On most platforms, `'rename'` is emitted whenever a filename appears or + * disappears in the directory. + * + * The listener callback is attached to the `'change'` event fired by `fs.FSWatcher`, but it is not the same thing as the `'change'` value of`eventType`. + * + * If a `signal` is passed, aborting the corresponding AbortController will close + * the returned `fs.FSWatcher`. + * @since v0.5.10 + * @param listener + */ + export function watch( + filename: PathLike, + options: + | (WatchOptions & { + encoding: "buffer"; + }) + | "buffer", + listener?: WatchListener, + ): FSWatcher; + /** + * Watch for changes on `filename`, where `filename` is either a file or a directory, returning an `FSWatcher`. + * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + * @param options Either the encoding for the filename provided to the listener, or an object optionally specifying encoding, persistent, and recursive options. + * If `encoding` is not supplied, the default of `'utf8'` is used. + * If `persistent` is not supplied, the default of `true` is used. + * If `recursive` is not supplied, the default of `false` is used. + */ + export function watch( + filename: PathLike, + options?: WatchOptions | BufferEncoding | null, + listener?: WatchListener, + ): FSWatcher; + /** + * Watch for changes on `filename`, where `filename` is either a file or a directory, returning an `FSWatcher`. + * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + * @param options Either the encoding for the filename provided to the listener, or an object optionally specifying encoding, persistent, and recursive options. + * If `encoding` is not supplied, the default of `'utf8'` is used. + * If `persistent` is not supplied, the default of `true` is used. + * If `recursive` is not supplied, the default of `false` is used. + */ + export function watch( + filename: PathLike, + options: WatchOptions | string, + listener?: WatchListener, + ): FSWatcher; + /** + * Watch for changes on `filename`, where `filename` is either a file or a directory, returning an `FSWatcher`. + * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + */ + export function watch(filename: PathLike, listener?: WatchListener): FSWatcher; + /** + * Test whether or not the given path exists by checking with the file system. + * Then call the `callback` argument with either true or false: + * + * ```js + * import { exists } from 'node:fs'; + * + * exists('/etc/passwd', (e) => { + * console.log(e ? 'it exists' : 'no passwd!'); + * }); + * ``` + * + * **The parameters for this callback are not consistent with other Node.js** + * **callbacks.** Normally, the first parameter to a Node.js callback is an `err`parameter, optionally followed by other parameters. The `fs.exists()` callback + * has only one boolean parameter. This is one reason `fs.access()` is recommended + * instead of `fs.exists()`. + * + * Using `fs.exists()` to check for the existence of a file before calling`fs.open()`, `fs.readFile()`, or `fs.writeFile()` is not recommended. Doing + * so introduces a race condition, since other processes may change the file's + * state between the two calls. Instead, user code should open/read/write the + * file directly and handle the error raised if the file does not exist. + * + * **write (NOT RECOMMENDED)** + * + * ```js + * import { exists, open, close } from 'node:fs'; + * + * exists('myfile', (e) => { + * if (e) { + * console.error('myfile already exists'); + * } else { + * open('myfile', 'wx', (err, fd) => { + * if (err) throw err; + * + * try { + * writeMyData(fd); + * } finally { + * close(fd, (err) => { + * if (err) throw err; + * }); + * } + * }); + * } + * }); + * ``` + * + * **write (RECOMMENDED)** + * + * ```js + * import { open, close } from 'node:fs'; + * open('myfile', 'wx', (err, fd) => { + * if (err) { + * if (err.code === 'EEXIST') { + * console.error('myfile already exists'); + * return; + * } + * + * throw err; + * } + * + * try { + * writeMyData(fd); + * } finally { + * close(fd, (err) => { + * if (err) throw err; + * }); + * } + * }); + * ``` + * + * **read (NOT RECOMMENDED)** + * + * ```js + * import { open, close, exists } from 'node:fs'; + * + * exists('myfile', (e) => { + * if (e) { + * open('myfile', 'r', (err, fd) => { + * if (err) throw err; + * + * try { + * readMyData(fd); + * } finally { + * close(fd, (err) => { + * if (err) throw err; + * }); + * } + * }); + * } else { + * console.error('myfile does not exist'); + * } + * }); + * ``` + * + * **read (RECOMMENDED)** + * + * ```js + * import { open, close } from 'node:fs'; + * + * open('myfile', 'r', (err, fd) => { + * if (err) { + * if (err.code === 'ENOENT') { + * console.error('myfile does not exist'); + * return; + * } + * + * throw err; + * } + * + * try { + * readMyData(fd); + * } finally { + * close(fd, (err) => { + * if (err) throw err; + * }); + * } + * }); + * ``` + * + * The "not recommended" examples above check for existence and then use the + * file; the "recommended" examples are better because they use the file directly + * and handle the error, if any. + * + * In general, check for the existence of a file only if the file won't be + * used directly, for example when its existence is a signal from another + * process. + * @since v0.0.2 + * @deprecated Since v1.0.0 - Use {@link stat} or {@link access} instead. + */ + export function exists(path: PathLike, callback: (exists: boolean) => void): void; + /** @deprecated */ + export namespace exists { + /** + * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + */ + function __promisify__(path: PathLike): Promise; + } + /** + * Returns `true` if the path exists, `false` otherwise. + * + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link exists}. + * + * `fs.exists()` is deprecated, but `fs.existsSync()` is not. The `callback`parameter to `fs.exists()` accepts parameters that are inconsistent with other + * Node.js callbacks. `fs.existsSync()` does not use a callback. + * + * ```js + * import { existsSync } from 'node:fs'; + * + * if (existsSync('/etc/passwd')) + * console.log('The path exists.'); + * ``` + * @since v0.1.21 + */ + export function existsSync(path: PathLike): boolean; + export namespace constants { + // File Access Constants + /** Constant for fs.access(). File is visible to the calling process. */ + const F_OK: number; + /** Constant for fs.access(). File can be read by the calling process. */ + const R_OK: number; + /** Constant for fs.access(). File can be written by the calling process. */ + const W_OK: number; + /** Constant for fs.access(). File can be executed by the calling process. */ + const X_OK: number; + // File Copy Constants + /** Constant for fs.copyFile. Flag indicating the destination file should not be overwritten if it already exists. */ + const COPYFILE_EXCL: number; + /** + * Constant for fs.copyFile. copy operation will attempt to create a copy-on-write reflink. + * If the underlying platform does not support copy-on-write, then a fallback copy mechanism is used. + */ + const COPYFILE_FICLONE: number; + /** + * Constant for fs.copyFile. Copy operation will attempt to create a copy-on-write reflink. + * If the underlying platform does not support copy-on-write, then the operation will fail with an error. + */ + const COPYFILE_FICLONE_FORCE: number; + // File Open Constants + /** Constant for fs.open(). Flag indicating to open a file for read-only access. */ + const O_RDONLY: number; + /** Constant for fs.open(). Flag indicating to open a file for write-only access. */ + const O_WRONLY: number; + /** Constant for fs.open(). Flag indicating to open a file for read-write access. */ + const O_RDWR: number; + /** Constant for fs.open(). Flag indicating to create the file if it does not already exist. */ + const O_CREAT: number; + /** Constant for fs.open(). Flag indicating that opening a file should fail if the O_CREAT flag is set and the file already exists. */ + const O_EXCL: number; + /** + * Constant for fs.open(). Flag indicating that if path identifies a terminal device, + * opening the path shall not cause that terminal to become the controlling terminal for the process + * (if the process does not already have one). + */ + const O_NOCTTY: number; + /** Constant for fs.open(). Flag indicating that if the file exists and is a regular file, and the file is opened successfully for write access, its length shall be truncated to zero. */ + const O_TRUNC: number; + /** Constant for fs.open(). Flag indicating that data will be appended to the end of the file. */ + const O_APPEND: number; + /** Constant for fs.open(). Flag indicating that the open should fail if the path is not a directory. */ + const O_DIRECTORY: number; + /** + * constant for fs.open(). + * Flag indicating reading accesses to the file system will no longer result in + * an update to the atime information associated with the file. + * This flag is available on Linux operating systems only. + */ + const O_NOATIME: number; + /** Constant for fs.open(). Flag indicating that the open should fail if the path is a symbolic link. */ + const O_NOFOLLOW: number; + /** Constant for fs.open(). Flag indicating that the file is opened for synchronous I/O. */ + const O_SYNC: number; + /** Constant for fs.open(). Flag indicating that the file is opened for synchronous I/O with write operations waiting for data integrity. */ + const O_DSYNC: number; + /** Constant for fs.open(). Flag indicating to open the symbolic link itself rather than the resource it is pointing to. */ + const O_SYMLINK: number; + /** Constant for fs.open(). When set, an attempt will be made to minimize caching effects of file I/O. */ + const O_DIRECT: number; + /** Constant for fs.open(). Flag indicating to open the file in nonblocking mode when possible. */ + const O_NONBLOCK: number; + // File Type Constants + /** Constant for fs.Stats mode property for determining a file's type. Bit mask used to extract the file type code. */ + const S_IFMT: number; + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a regular file. */ + const S_IFREG: number; + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a directory. */ + const S_IFDIR: number; + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a character-oriented device file. */ + const S_IFCHR: number; + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a block-oriented device file. */ + const S_IFBLK: number; + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a FIFO/pipe. */ + const S_IFIFO: number; + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a symbolic link. */ + const S_IFLNK: number; + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a socket. */ + const S_IFSOCK: number; + // File Mode Constants + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable, writable and executable by owner. */ + const S_IRWXU: number; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable by owner. */ + const S_IRUSR: number; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating writable by owner. */ + const S_IWUSR: number; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating executable by owner. */ + const S_IXUSR: number; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable, writable and executable by group. */ + const S_IRWXG: number; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable by group. */ + const S_IRGRP: number; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating writable by group. */ + const S_IWGRP: number; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating executable by group. */ + const S_IXGRP: number; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable, writable and executable by others. */ + const S_IRWXO: number; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable by others. */ + const S_IROTH: number; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating writable by others. */ + const S_IWOTH: number; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating executable by others. */ + const S_IXOTH: number; + /** + * When set, a memory file mapping is used to access the file. This flag + * is available on Windows operating systems only. On other operating systems, + * this flag is ignored. + */ + const UV_FS_O_FILEMAP: number; + } + /** + * Tests a user's permissions for the file or directory specified by `path`. + * The `mode` argument is an optional integer that specifies the accessibility + * checks to be performed. `mode` should be either the value `fs.constants.F_OK`or a mask consisting of the bitwise OR of any of `fs.constants.R_OK`,`fs.constants.W_OK`, and `fs.constants.X_OK` + * (e.g.`fs.constants.W_OK | fs.constants.R_OK`). Check `File access constants` for + * possible values of `mode`. + * + * The final argument, `callback`, is a callback function that is invoked with + * a possible error argument. If any of the accessibility checks fail, the error + * argument will be an `Error` object. The following examples check if`package.json` exists, and if it is readable or writable. + * + * ```js + * import { access, constants } from 'node:fs'; + * + * const file = 'package.json'; + * + * // Check if the file exists in the current directory. + * access(file, constants.F_OK, (err) => { + * console.log(`${file} ${err ? 'does not exist' : 'exists'}`); + * }); + * + * // Check if the file is readable. + * access(file, constants.R_OK, (err) => { + * console.log(`${file} ${err ? 'is not readable' : 'is readable'}`); + * }); + * + * // Check if the file is writable. + * access(file, constants.W_OK, (err) => { + * console.log(`${file} ${err ? 'is not writable' : 'is writable'}`); + * }); + * + * // Check if the file is readable and writable. + * access(file, constants.R_OK | constants.W_OK, (err) => { + * console.log(`${file} ${err ? 'is not' : 'is'} readable and writable`); + * }); + * ``` + * + * Do not use `fs.access()` to check for the accessibility of a file before calling`fs.open()`, `fs.readFile()`, or `fs.writeFile()`. Doing + * so introduces a race condition, since other processes may change the file's + * state between the two calls. Instead, user code should open/read/write the + * file directly and handle the error raised if the file is not accessible. + * + * **write (NOT RECOMMENDED)** + * + * ```js + * import { access, open, close } from 'node:fs'; + * + * access('myfile', (err) => { + * if (!err) { + * console.error('myfile already exists'); + * return; + * } + * + * open('myfile', 'wx', (err, fd) => { + * if (err) throw err; + * + * try { + * writeMyData(fd); + * } finally { + * close(fd, (err) => { + * if (err) throw err; + * }); + * } + * }); + * }); + * ``` + * + * **write (RECOMMENDED)** + * + * ```js + * import { open, close } from 'node:fs'; + * + * open('myfile', 'wx', (err, fd) => { + * if (err) { + * if (err.code === 'EEXIST') { + * console.error('myfile already exists'); + * return; + * } + * + * throw err; + * } + * + * try { + * writeMyData(fd); + * } finally { + * close(fd, (err) => { + * if (err) throw err; + * }); + * } + * }); + * ``` + * + * **read (NOT RECOMMENDED)** + * + * ```js + * import { access, open, close } from 'node:fs'; + * access('myfile', (err) => { + * if (err) { + * if (err.code === 'ENOENT') { + * console.error('myfile does not exist'); + * return; + * } + * + * throw err; + * } + * + * open('myfile', 'r', (err, fd) => { + * if (err) throw err; + * + * try { + * readMyData(fd); + * } finally { + * close(fd, (err) => { + * if (err) throw err; + * }); + * } + * }); + * }); + * ``` + * + * **read (RECOMMENDED)** + * + * ```js + * import { open, close } from 'node:fs'; + * + * open('myfile', 'r', (err, fd) => { + * if (err) { + * if (err.code === 'ENOENT') { + * console.error('myfile does not exist'); + * return; + * } + * + * throw err; + * } + * + * try { + * readMyData(fd); + * } finally { + * close(fd, (err) => { + * if (err) throw err; + * }); + * } + * }); + * ``` + * + * The "not recommended" examples above check for accessibility and then use the + * file; the "recommended" examples are better because they use the file directly + * and handle the error, if any. + * + * In general, check for the accessibility of a file only if the file will not be + * used directly, for example when its accessibility is a signal from another + * process. + * + * On Windows, access-control policies (ACLs) on a directory may limit access to + * a file or directory. The `fs.access()` function, however, does not check the + * ACL and therefore may report that a path is accessible even if the ACL restricts + * the user from reading or writing to it. + * @since v0.11.15 + * @param [mode=fs.constants.F_OK] + */ + export function access(path: PathLike, mode: number | undefined, callback: NoParamCallback): void; + /** + * Asynchronously tests a user's permissions for the file specified by path. + * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + */ + export function access(path: PathLike, callback: NoParamCallback): void; + export namespace access { + /** + * Asynchronously tests a user's permissions for the file specified by path. + * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + */ + function __promisify__(path: PathLike, mode?: number): Promise; + } + /** + * Synchronously tests a user's permissions for the file or directory specified + * by `path`. The `mode` argument is an optional integer that specifies the + * accessibility checks to be performed. `mode` should be either the value`fs.constants.F_OK` or a mask consisting of the bitwise OR of any of`fs.constants.R_OK`, `fs.constants.W_OK`, and + * `fs.constants.X_OK` (e.g.`fs.constants.W_OK | fs.constants.R_OK`). Check `File access constants` for + * possible values of `mode`. + * + * If any of the accessibility checks fail, an `Error` will be thrown. Otherwise, + * the method will return `undefined`. + * + * ```js + * import { accessSync, constants } from 'node:fs'; + * + * try { + * accessSync('etc/passwd', constants.R_OK | constants.W_OK); + * console.log('can read/write'); + * } catch (err) { + * console.error('no access!'); + * } + * ``` + * @since v0.11.15 + * @param [mode=fs.constants.F_OK] + */ + export function accessSync(path: PathLike, mode?: number): void; + interface StreamOptions { + flags?: string | undefined; + encoding?: BufferEncoding | undefined; + fd?: number | promises.FileHandle | undefined; + mode?: number | undefined; + autoClose?: boolean | undefined; + emitClose?: boolean | undefined; + start?: number | undefined; + signal?: AbortSignal | null | undefined; + highWaterMark?: number | undefined; + } + interface FSImplementation { + open?: (...args: any[]) => any; + close?: (...args: any[]) => any; + } + interface CreateReadStreamFSImplementation extends FSImplementation { + read: (...args: any[]) => any; + } + interface CreateWriteStreamFSImplementation extends FSImplementation { + write: (...args: any[]) => any; + writev?: (...args: any[]) => any; + } + interface ReadStreamOptions extends StreamOptions { + fs?: CreateReadStreamFSImplementation | null | undefined; + end?: number | undefined; + } + interface WriteStreamOptions extends StreamOptions { + fs?: CreateWriteStreamFSImplementation | null | undefined; + flush?: boolean | undefined; + } + /** + * Unlike the 16 KiB default `highWaterMark` for a `stream.Readable`, the stream + * returned by this method has a default `highWaterMark` of 64 KiB. + * + * `options` can include `start` and `end` values to read a range of bytes from + * the file instead of the entire file. Both `start` and `end` are inclusive and + * start counting at 0, allowed values are in the + * \[0, [`Number.MAX_SAFE_INTEGER`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)\] range. If `fd` is specified and `start` is + * omitted or `undefined`, `fs.createReadStream()` reads sequentially from the + * current file position. The `encoding` can be any one of those accepted by `Buffer`. + * + * If `fd` is specified, `ReadStream` will ignore the `path` argument and will use + * the specified file descriptor. This means that no `'open'` event will be + * emitted. `fd` should be blocking; non-blocking `fd`s should be passed to `net.Socket`. + * + * If `fd` points to a character device that only supports blocking reads + * (such as keyboard or sound card), read operations do not finish until data is + * available. This can prevent the process from exiting and the stream from + * closing naturally. + * + * By default, the stream will emit a `'close'` event after it has been + * destroyed. Set the `emitClose` option to `false` to change this behavior. + * + * By providing the `fs` option, it is possible to override the corresponding `fs`implementations for `open`, `read`, and `close`. When providing the `fs` option, + * an override for `read` is required. If no `fd` is provided, an override for`open` is also required. If `autoClose` is `true`, an override for `close` is + * also required. + * + * ```js + * import { createReadStream } from 'node:fs'; + * + * // Create a stream from some character device. + * const stream = createReadStream('/dev/input/event0'); + * setTimeout(() => { + * stream.close(); // This may not close the stream. + * // Artificially marking end-of-stream, as if the underlying resource had + * // indicated end-of-file by itself, allows the stream to close. + * // This does not cancel pending read operations, and if there is such an + * // operation, the process may still not be able to exit successfully + * // until it finishes. + * stream.push(null); + * stream.read(0); + * }, 100); + * ``` + * + * If `autoClose` is false, then the file descriptor won't be closed, even if + * there's an error. It is the application's responsibility to close it and make + * sure there's no file descriptor leak. If `autoClose` is set to true (default + * behavior), on `'error'` or `'end'` the file descriptor will be closed + * automatically. + * + * `mode` sets the file mode (permission and sticky bits), but only if the + * file was created. + * + * An example to read the last 10 bytes of a file which is 100 bytes long: + * + * ```js + * import { createReadStream } from 'node:fs'; + * + * createReadStream('sample.txt', { start: 90, end: 99 }); + * ``` + * + * If `options` is a string, then it specifies the encoding. + * @since v0.1.31 + */ + export function createReadStream(path: PathLike, options?: BufferEncoding | ReadStreamOptions): ReadStream; + /** + * `options` may also include a `start` option to allow writing data at some + * position past the beginning of the file, allowed values are in the + * \[0, [`Number.MAX_SAFE_INTEGER`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)\] range. Modifying a file rather than + * replacing it may require the `flags` option to be set to `r+` rather than the + * default `w`. The `encoding` can be any one of those accepted by `Buffer`. + * + * If `autoClose` is set to true (default behavior) on `'error'` or `'finish'`the file descriptor will be closed automatically. If `autoClose` is false, + * then the file descriptor won't be closed, even if there's an error. + * It is the application's responsibility to close it and make sure there's no + * file descriptor leak. + * + * By default, the stream will emit a `'close'` event after it has been + * destroyed. Set the `emitClose` option to `false` to change this behavior. + * + * By providing the `fs` option it is possible to override the corresponding `fs`implementations for `open`, `write`, `writev`, and `close`. Overriding `write()`without `writev()` can reduce + * performance as some optimizations (`_writev()`) + * will be disabled. When providing the `fs` option, overrides for at least one of`write` and `writev` are required. If no `fd` option is supplied, an override + * for `open` is also required. If `autoClose` is `true`, an override for `close`is also required. + * + * Like `fs.ReadStream`, if `fd` is specified, `fs.WriteStream` will ignore the`path` argument and will use the specified file descriptor. This means that no`'open'` event will be + * emitted. `fd` should be blocking; non-blocking `fd`s + * should be passed to `net.Socket`. + * + * If `options` is a string, then it specifies the encoding. + * @since v0.1.31 + */ + export function createWriteStream(path: PathLike, options?: BufferEncoding | WriteStreamOptions): WriteStream; + /** + * Forces all currently queued I/O operations associated with the file to the + * operating system's synchronized I/O completion state. Refer to the POSIX [`fdatasync(2)`](http://man7.org/linux/man-pages/man2/fdatasync.2.html) documentation for details. No arguments other + * than a possible + * exception are given to the completion callback. + * @since v0.1.96 + */ + export function fdatasync(fd: number, callback: NoParamCallback): void; + export namespace fdatasync { + /** + * Asynchronous fdatasync(2) - synchronize a file's in-core state with storage device. + * @param fd A file descriptor. + */ + function __promisify__(fd: number): Promise; + } + /** + * Forces all currently queued I/O operations associated with the file to the + * operating system's synchronized I/O completion state. Refer to the POSIX [`fdatasync(2)`](http://man7.org/linux/man-pages/man2/fdatasync.2.html) documentation for details. Returns `undefined`. + * @since v0.1.96 + */ + export function fdatasyncSync(fd: number): void; + /** + * Asynchronously copies `src` to `dest`. By default, `dest` is overwritten if it + * already exists. No arguments other than a possible exception are given to the + * callback function. Node.js makes no guarantees about the atomicity of the copy + * operation. If an error occurs after the destination file has been opened for + * writing, Node.js will attempt to remove the destination. + * + * `mode` is an optional integer that specifies the behavior + * of the copy operation. It is possible to create a mask consisting of the bitwise + * OR of two or more values (e.g.`fs.constants.COPYFILE_EXCL | fs.constants.COPYFILE_FICLONE`). + * + * * `fs.constants.COPYFILE_EXCL`: The copy operation will fail if `dest` already + * exists. + * * `fs.constants.COPYFILE_FICLONE`: The copy operation will attempt to create a + * copy-on-write reflink. If the platform does not support copy-on-write, then a + * fallback copy mechanism is used. + * * `fs.constants.COPYFILE_FICLONE_FORCE`: The copy operation will attempt to + * create a copy-on-write reflink. If the platform does not support + * copy-on-write, then the operation will fail. + * + * ```js + * import { copyFile, constants } from 'node:fs'; + * + * function callback(err) { + * if (err) throw err; + * console.log('source.txt was copied to destination.txt'); + * } + * + * // destination.txt will be created or overwritten by default. + * copyFile('source.txt', 'destination.txt', callback); + * + * // By using COPYFILE_EXCL, the operation will fail if destination.txt exists. + * copyFile('source.txt', 'destination.txt', constants.COPYFILE_EXCL, callback); + * ``` + * @since v8.5.0 + * @param src source filename to copy + * @param dest destination filename of the copy operation + * @param [mode=0] modifiers for copy operation. + */ + export function copyFile(src: PathLike, dest: PathLike, callback: NoParamCallback): void; + export function copyFile(src: PathLike, dest: PathLike, mode: number, callback: NoParamCallback): void; + export namespace copyFile { + function __promisify__(src: PathLike, dst: PathLike, mode?: number): Promise; + } + /** + * Synchronously copies `src` to `dest`. By default, `dest` is overwritten if it + * already exists. Returns `undefined`. Node.js makes no guarantees about the + * atomicity of the copy operation. If an error occurs after the destination file + * has been opened for writing, Node.js will attempt to remove the destination. + * + * `mode` is an optional integer that specifies the behavior + * of the copy operation. It is possible to create a mask consisting of the bitwise + * OR of two or more values (e.g.`fs.constants.COPYFILE_EXCL | fs.constants.COPYFILE_FICLONE`). + * + * * `fs.constants.COPYFILE_EXCL`: The copy operation will fail if `dest` already + * exists. + * * `fs.constants.COPYFILE_FICLONE`: The copy operation will attempt to create a + * copy-on-write reflink. If the platform does not support copy-on-write, then a + * fallback copy mechanism is used. + * * `fs.constants.COPYFILE_FICLONE_FORCE`: The copy operation will attempt to + * create a copy-on-write reflink. If the platform does not support + * copy-on-write, then the operation will fail. + * + * ```js + * import { copyFileSync, constants } from 'node:fs'; + * + * // destination.txt will be created or overwritten by default. + * copyFileSync('source.txt', 'destination.txt'); + * console.log('source.txt was copied to destination.txt'); + * + * // By using COPYFILE_EXCL, the operation will fail if destination.txt exists. + * copyFileSync('source.txt', 'destination.txt', constants.COPYFILE_EXCL); + * ``` + * @since v8.5.0 + * @param src source filename to copy + * @param dest destination filename of the copy operation + * @param [mode=0] modifiers for copy operation. + */ + export function copyFileSync(src: PathLike, dest: PathLike, mode?: number): void; + /** + * Write an array of `ArrayBufferView`s to the file specified by `fd` using`writev()`. + * + * `position` is the offset from the beginning of the file where this data + * should be written. If `typeof position !== 'number'`, the data will be written + * at the current position. + * + * The callback will be given three arguments: `err`, `bytesWritten`, and`buffers`. `bytesWritten` is how many bytes were written from `buffers`. + * + * If this method is `util.promisify()` ed, it returns a promise for an`Object` with `bytesWritten` and `buffers` properties. + * + * It is unsafe to use `fs.writev()` multiple times on the same file without + * waiting for the callback. For this scenario, use {@link createWriteStream}. + * + * On Linux, positional writes don't work when the file is opened in append mode. + * The kernel ignores the position argument and always appends the data to + * the end of the file. + * @since v12.9.0 + * @param [position='null'] + */ + export function writev( + fd: number, + buffers: readonly NodeJS.ArrayBufferView[], + cb: (err: NodeJS.ErrnoException | null, bytesWritten: number, buffers: NodeJS.ArrayBufferView[]) => void, + ): void; + export function writev( + fd: number, + buffers: readonly NodeJS.ArrayBufferView[], + position: number, + cb: (err: NodeJS.ErrnoException | null, bytesWritten: number, buffers: NodeJS.ArrayBufferView[]) => void, + ): void; + export interface WriteVResult { + bytesWritten: number; + buffers: NodeJS.ArrayBufferView[]; + } + export namespace writev { + function __promisify__( + fd: number, + buffers: readonly NodeJS.ArrayBufferView[], + position?: number, + ): Promise; + } + /** + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link writev}. + * @since v12.9.0 + * @param [position='null'] + * @return The number of bytes written. + */ + export function writevSync(fd: number, buffers: readonly NodeJS.ArrayBufferView[], position?: number): number; + /** + * Read from a file specified by `fd` and write to an array of `ArrayBufferView`s + * using `readv()`. + * + * `position` is the offset from the beginning of the file from where data + * should be read. If `typeof position !== 'number'`, the data will be read + * from the current position. + * + * The callback will be given three arguments: `err`, `bytesRead`, and`buffers`. `bytesRead` is how many bytes were read from the file. + * + * If this method is invoked as its `util.promisify()` ed version, it returns + * a promise for an `Object` with `bytesRead` and `buffers` properties. + * @since v13.13.0, v12.17.0 + * @param [position='null'] + */ + export function readv( + fd: number, + buffers: readonly NodeJS.ArrayBufferView[], + cb: (err: NodeJS.ErrnoException | null, bytesRead: number, buffers: NodeJS.ArrayBufferView[]) => void, + ): void; + export function readv( + fd: number, + buffers: readonly NodeJS.ArrayBufferView[], + position: number, + cb: (err: NodeJS.ErrnoException | null, bytesRead: number, buffers: NodeJS.ArrayBufferView[]) => void, + ): void; + export interface ReadVResult { + bytesRead: number; + buffers: NodeJS.ArrayBufferView[]; + } + export namespace readv { + function __promisify__( + fd: number, + buffers: readonly NodeJS.ArrayBufferView[], + position?: number, + ): Promise; + } + /** + * For detailed information, see the documentation of the asynchronous version of + * this API: {@link readv}. + * @since v13.13.0, v12.17.0 + * @param [position='null'] + * @return The number of bytes read. + */ + export function readvSync(fd: number, buffers: readonly NodeJS.ArrayBufferView[], position?: number): number; + + export interface OpenAsBlobOptions { + /** + * An optional mime type for the blob. + * + * @default 'undefined' + */ + type?: string | undefined; + } + + /** + * Returns a `Blob` whose data is backed by the given file. + * + * The file must not be modified after the `Blob` is created. Any modifications + * will cause reading the `Blob` data to fail with a `DOMException` error. + * Synchronous stat operations on the file when the `Blob` is created, and before + * each read in order to detect whether the file data has been modified on disk. + * + * ```js + * import { openAsBlob } from 'node:fs'; + * + * const blob = await openAsBlob('the.file.txt'); + * const ab = await blob.arrayBuffer(); + * blob.stream(); + * ``` + * @since v19.8.0 + * @experimental + */ + export function openAsBlob(path: PathLike, options?: OpenAsBlobOptions): Promise; + + export interface OpenDirOptions { + /** + * @default 'utf8' + */ + encoding?: BufferEncoding | undefined; + /** + * Number of directory entries that are buffered + * internally when reading from the directory. Higher values lead to better + * performance but higher memory usage. + * @default 32 + */ + bufferSize?: number | undefined; + /** + * @default false + */ + recursive?: boolean; + } + /** + * Synchronously open a directory. See [`opendir(3)`](http://man7.org/linux/man-pages/man3/opendir.3.html). + * + * Creates an `fs.Dir`, which contains all further functions for reading from + * and cleaning up the directory. + * + * The `encoding` option sets the encoding for the `path` while opening the + * directory and subsequent read operations. + * @since v12.12.0 + */ + export function opendirSync(path: PathLike, options?: OpenDirOptions): Dir; + /** + * Asynchronously open a directory. See the POSIX [`opendir(3)`](http://man7.org/linux/man-pages/man3/opendir.3.html) documentation for + * more details. + * + * Creates an `fs.Dir`, which contains all further functions for reading from + * and cleaning up the directory. + * + * The `encoding` option sets the encoding for the `path` while opening the + * directory and subsequent read operations. + * @since v12.12.0 + */ + export function opendir(path: PathLike, cb: (err: NodeJS.ErrnoException | null, dir: Dir) => void): void; + export function opendir( + path: PathLike, + options: OpenDirOptions, + cb: (err: NodeJS.ErrnoException | null, dir: Dir) => void, + ): void; + export namespace opendir { + function __promisify__(path: PathLike, options?: OpenDirOptions): Promise; + } + export interface BigIntStats extends StatsBase { + atimeNs: bigint; + mtimeNs: bigint; + ctimeNs: bigint; + birthtimeNs: bigint; + } + export interface BigIntOptions { + bigint: true; + } + export interface StatOptions { + bigint?: boolean | undefined; + } + export interface StatSyncOptions extends StatOptions { + throwIfNoEntry?: boolean | undefined; + } + interface CopyOptionsBase { + /** + * Dereference symlinks + * @default false + */ + dereference?: boolean; + /** + * When `force` is `false`, and the destination + * exists, throw an error. + * @default false + */ + errorOnExist?: boolean; + /** + * Overwrite existing file or directory. _The copy + * operation will ignore errors if you set this to false and the destination + * exists. Use the `errorOnExist` option to change this behavior. + * @default true + */ + force?: boolean; + /** + * Modifiers for copy operation. See `mode` flag of {@link copyFileSync()} + */ + mode?: number; + /** + * When `true` timestamps from `src` will + * be preserved. + * @default false + */ + preserveTimestamps?: boolean; + /** + * Copy directories recursively. + * @default false + */ + recursive?: boolean; + /** + * When true, path resolution for symlinks will be skipped + * @default false + */ + verbatimSymlinks?: boolean; + } + export interface CopyOptions extends CopyOptionsBase { + /** + * Function to filter copied files/directories. Return + * `true` to copy the item, `false` to ignore it. + */ + filter?(source: string, destination: string): boolean | Promise; + } + export interface CopySyncOptions extends CopyOptionsBase { + /** + * Function to filter copied files/directories. Return + * `true` to copy the item, `false` to ignore it. + */ + filter?(source: string, destination: string): boolean; + } + /** + * Asynchronously copies the entire directory structure from `src` to `dest`, + * including subdirectories and files. + * + * When copying a directory to another directory, globs are not supported and + * behavior is similar to `cp dir1/ dir2/`. + * @since v16.7.0 + * @experimental + * @param src source path to copy. + * @param dest destination path to copy to. + */ + export function cp( + source: string | URL, + destination: string | URL, + callback: (err: NodeJS.ErrnoException | null) => void, + ): void; + export function cp( + source: string | URL, + destination: string | URL, + opts: CopyOptions, + callback: (err: NodeJS.ErrnoException | null) => void, + ): void; + /** + * Synchronously copies the entire directory structure from `src` to `dest`, + * including subdirectories and files. + * + * When copying a directory to another directory, globs are not supported and + * behavior is similar to `cp dir1/ dir2/`. + * @since v16.7.0 + * @experimental + * @param src source path to copy. + * @param dest destination path to copy to. + */ + export function cpSync(source: string | URL, destination: string | URL, opts?: CopySyncOptions): void; +} +declare module "node:fs" { + export * from "fs"; +} diff --git a/task/node_modules/@types/node/ts4.8/fs/promises.d.ts b/task/node_modules/@types/node/ts4.8/fs/promises.d.ts new file mode 100644 index 0000000..88a9fc3 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/fs/promises.d.ts @@ -0,0 +1,1239 @@ +/** + * The `fs/promises` API provides asynchronous file system methods that return + * promises. + * + * The promise APIs use the underlying Node.js threadpool to perform file + * system operations off the event loop thread. These operations are not + * synchronized or threadsafe. Care must be taken when performing multiple + * concurrent modifications on the same file or data corruption may occur. + * @since v10.0.0 + */ +declare module "fs/promises" { + import { Abortable } from "node:events"; + import { Stream } from "node:stream"; + import { ReadableStream } from "node:stream/web"; + import { + BigIntStats, + BigIntStatsFs, + BufferEncodingOption, + constants as fsConstants, + CopyOptions, + Dir, + Dirent, + MakeDirectoryOptions, + Mode, + ObjectEncodingOptions, + OpenDirOptions, + OpenMode, + PathLike, + ReadStream, + ReadVResult, + RmDirOptions, + RmOptions, + StatFsOptions, + StatOptions, + Stats, + StatsFs, + TimeLike, + WatchEventType, + WatchOptions, + WriteStream, + WriteVResult, + } from "node:fs"; + import { Interface as ReadlineInterface } from "node:readline"; + interface FileChangeInfo { + eventType: WatchEventType; + filename: T | null; + } + interface FlagAndOpenMode { + mode?: Mode | undefined; + flag?: OpenMode | undefined; + } + interface FileReadResult { + bytesRead: number; + buffer: T; + } + interface FileReadOptions { + /** + * @default `Buffer.alloc(0xffff)` + */ + buffer?: T; + /** + * @default 0 + */ + offset?: number | null; + /** + * @default `buffer.byteLength` + */ + length?: number | null; + position?: number | null; + } + interface CreateReadStreamOptions { + encoding?: BufferEncoding | null | undefined; + autoClose?: boolean | undefined; + emitClose?: boolean | undefined; + start?: number | undefined; + end?: number | undefined; + highWaterMark?: number | undefined; + } + interface CreateWriteStreamOptions { + encoding?: BufferEncoding | null | undefined; + autoClose?: boolean | undefined; + emitClose?: boolean | undefined; + start?: number | undefined; + highWaterMark?: number | undefined; + flush?: boolean | undefined; + } + interface ReadableWebStreamOptions { + /** + * Whether to open a normal or a `'bytes'` stream. + * @since v20.0.0 + */ + type?: "bytes" | undefined; + } + // TODO: Add `EventEmitter` close + interface FileHandle { + /** + * The numeric file descriptor managed by the {FileHandle} object. + * @since v10.0.0 + */ + readonly fd: number; + /** + * Alias of `filehandle.writeFile()`. + * + * When operating on file handles, the mode cannot be changed from what it was set + * to with `fsPromises.open()`. Therefore, this is equivalent to `filehandle.writeFile()`. + * @since v10.0.0 + * @return Fulfills with `undefined` upon success. + */ + appendFile( + data: string | Uint8Array, + options?: + | (ObjectEncodingOptions & FlagAndOpenMode & { flush?: boolean | undefined }) + | BufferEncoding + | null, + ): Promise; + /** + * Changes the ownership of the file. A wrapper for [`chown(2)`](http://man7.org/linux/man-pages/man2/chown.2.html). + * @since v10.0.0 + * @param uid The file's new owner's user id. + * @param gid The file's new group's group id. + * @return Fulfills with `undefined` upon success. + */ + chown(uid: number, gid: number): Promise; + /** + * Modifies the permissions on the file. See [`chmod(2)`](http://man7.org/linux/man-pages/man2/chmod.2.html). + * @since v10.0.0 + * @param mode the file mode bit mask. + * @return Fulfills with `undefined` upon success. + */ + chmod(mode: Mode): Promise; + /** + * Unlike the 16 KiB default `highWaterMark` for a `stream.Readable`, the stream + * returned by this method has a default `highWaterMark` of 64 KiB. + * + * `options` can include `start` and `end` values to read a range of bytes from + * the file instead of the entire file. Both `start` and `end` are inclusive and + * start counting at 0, allowed values are in the + * \[0, [`Number.MAX_SAFE_INTEGER`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)\] range. If `start` is + * omitted or `undefined`, `filehandle.createReadStream()` reads sequentially from + * the current file position. The `encoding` can be any one of those accepted by `Buffer`. + * + * If the `FileHandle` points to a character device that only supports blocking + * reads (such as keyboard or sound card), read operations do not finish until data + * is available. This can prevent the process from exiting and the stream from + * closing naturally. + * + * By default, the stream will emit a `'close'` event after it has been + * destroyed. Set the `emitClose` option to `false` to change this behavior. + * + * ```js + * import { open } from 'node:fs/promises'; + * + * const fd = await open('/dev/input/event0'); + * // Create a stream from some character device. + * const stream = fd.createReadStream(); + * setTimeout(() => { + * stream.close(); // This may not close the stream. + * // Artificially marking end-of-stream, as if the underlying resource had + * // indicated end-of-file by itself, allows the stream to close. + * // This does not cancel pending read operations, and if there is such an + * // operation, the process may still not be able to exit successfully + * // until it finishes. + * stream.push(null); + * stream.read(0); + * }, 100); + * ``` + * + * If `autoClose` is false, then the file descriptor won't be closed, even if + * there's an error. It is the application's responsibility to close it and make + * sure there's no file descriptor leak. If `autoClose` is set to true (default + * behavior), on `'error'` or `'end'` the file descriptor will be closed + * automatically. + * + * An example to read the last 10 bytes of a file which is 100 bytes long: + * + * ```js + * import { open } from 'node:fs/promises'; + * + * const fd = await open('sample.txt'); + * fd.createReadStream({ start: 90, end: 99 }); + * ``` + * @since v16.11.0 + */ + createReadStream(options?: CreateReadStreamOptions): ReadStream; + /** + * `options` may also include a `start` option to allow writing data at some + * position past the beginning of the file, allowed values are in the + * \[0, [`Number.MAX_SAFE_INTEGER`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)\] range. Modifying a file rather than + * replacing it may require the `flags` `open` option to be set to `r+` rather than + * the default `r`. The `encoding` can be any one of those accepted by `Buffer`. + * + * If `autoClose` is set to true (default behavior) on `'error'` or `'finish'`the file descriptor will be closed automatically. If `autoClose` is false, + * then the file descriptor won't be closed, even if there's an error. + * It is the application's responsibility to close it and make sure there's no + * file descriptor leak. + * + * By default, the stream will emit a `'close'` event after it has been + * destroyed. Set the `emitClose` option to `false` to change this behavior. + * @since v16.11.0 + */ + createWriteStream(options?: CreateWriteStreamOptions): WriteStream; + /** + * Forces all currently queued I/O operations associated with the file to the + * operating system's synchronized I/O completion state. Refer to the POSIX [`fdatasync(2)`](http://man7.org/linux/man-pages/man2/fdatasync.2.html) documentation for details. + * + * Unlike `filehandle.sync` this method does not flush modified metadata. + * @since v10.0.0 + * @return Fulfills with `undefined` upon success. + */ + datasync(): Promise; + /** + * Request that all data for the open file descriptor is flushed to the storage + * device. The specific implementation is operating system and device specific. + * Refer to the POSIX [`fsync(2)`](http://man7.org/linux/man-pages/man2/fsync.2.html) documentation for more detail. + * @since v10.0.0 + * @return Fulfills with `undefined` upon success. + */ + sync(): Promise; + /** + * Reads data from the file and stores that in the given buffer. + * + * If the file is not modified concurrently, the end-of-file is reached when the + * number of bytes read is zero. + * @since v10.0.0 + * @param buffer A buffer that will be filled with the file data read. + * @param offset The location in the buffer at which to start filling. + * @param length The number of bytes to read. + * @param position The location where to begin reading data from the file. If `null`, data will be read from the current file position, and the position will be updated. If `position` is an + * integer, the current file position will remain unchanged. + * @return Fulfills upon success with an object with two properties: + */ + read( + buffer: T, + offset?: number | null, + length?: number | null, + position?: number | null, + ): Promise>; + read(options?: FileReadOptions): Promise>; + /** + * Returns a `ReadableStream` that may be used to read the files data. + * + * An error will be thrown if this method is called more than once or is called + * after the `FileHandle` is closed or closing. + * + * ```js + * import { + * open, + * } from 'node:fs/promises'; + * + * const file = await open('./some/file/to/read'); + * + * for await (const chunk of file.readableWebStream()) + * console.log(chunk); + * + * await file.close(); + * ``` + * + * While the `ReadableStream` will read the file to completion, it will not + * close the `FileHandle` automatically. User code must still call the`fileHandle.close()` method. + * @since v17.0.0 + * @experimental + */ + readableWebStream(options?: ReadableWebStreamOptions): ReadableStream; + /** + * Asynchronously reads the entire contents of a file. + * + * If `options` is a string, then it specifies the `encoding`. + * + * The `FileHandle` has to support reading. + * + * If one or more `filehandle.read()` calls are made on a file handle and then a`filehandle.readFile()` call is made, the data will be read from the current + * position till the end of the file. It doesn't always read from the beginning + * of the file. + * @since v10.0.0 + * @return Fulfills upon a successful read with the contents of the file. If no encoding is specified (using `options.encoding`), the data is returned as a {Buffer} object. Otherwise, the + * data will be a string. + */ + readFile( + options?: { + encoding?: null | undefined; + flag?: OpenMode | undefined; + } | null, + ): Promise; + /** + * Asynchronously reads the entire contents of a file. The underlying file will _not_ be closed automatically. + * The `FileHandle` must have been opened for reading. + * @param options An object that may contain an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + readFile( + options: + | { + encoding: BufferEncoding; + flag?: OpenMode | undefined; + } + | BufferEncoding, + ): Promise; + /** + * Asynchronously reads the entire contents of a file. The underlying file will _not_ be closed automatically. + * The `FileHandle` must have been opened for reading. + * @param options An object that may contain an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + readFile( + options?: + | (ObjectEncodingOptions & { + flag?: OpenMode | undefined; + }) + | BufferEncoding + | null, + ): Promise; + /** + * Convenience method to create a `readline` interface and stream over the file. + * See `filehandle.createReadStream()` for the options. + * + * ```js + * import { open } from 'node:fs/promises'; + * + * const file = await open('./some/file/to/read'); + * + * for await (const line of file.readLines()) { + * console.log(line); + * } + * ``` + * @since v18.11.0 + */ + readLines(options?: CreateReadStreamOptions): ReadlineInterface; + /** + * @since v10.0.0 + * @return Fulfills with an {fs.Stats} for the file. + */ + stat( + opts?: StatOptions & { + bigint?: false | undefined; + }, + ): Promise; + stat( + opts: StatOptions & { + bigint: true; + }, + ): Promise; + stat(opts?: StatOptions): Promise; + /** + * Truncates the file. + * + * If the file was larger than `len` bytes, only the first `len` bytes will be + * retained in the file. + * + * The following example retains only the first four bytes of the file: + * + * ```js + * import { open } from 'node:fs/promises'; + * + * let filehandle = null; + * try { + * filehandle = await open('temp.txt', 'r+'); + * await filehandle.truncate(4); + * } finally { + * await filehandle?.close(); + * } + * ``` + * + * If the file previously was shorter than `len` bytes, it is extended, and the + * extended part is filled with null bytes (`'\0'`): + * + * If `len` is negative then `0` will be used. + * @since v10.0.0 + * @param [len=0] + * @return Fulfills with `undefined` upon success. + */ + truncate(len?: number): Promise; + /** + * Change the file system timestamps of the object referenced by the `FileHandle` then fulfills the promise with no arguments upon success. + * @since v10.0.0 + */ + utimes(atime: TimeLike, mtime: TimeLike): Promise; + /** + * Asynchronously writes data to a file, replacing the file if it already exists.`data` can be a string, a buffer, an + * [AsyncIterable](https://tc39.github.io/ecma262/#sec-asynciterable-interface), or an + * [Iterable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#The_iterable_protocol) object. + * The promise is fulfilled with no arguments upon success. + * + * If `options` is a string, then it specifies the `encoding`. + * + * The `FileHandle` has to support writing. + * + * It is unsafe to use `filehandle.writeFile()` multiple times on the same file + * without waiting for the promise to be fulfilled (or rejected). + * + * If one or more `filehandle.write()` calls are made on a file handle and then a`filehandle.writeFile()` call is made, the data will be written from the + * current position till the end of the file. It doesn't always write from the + * beginning of the file. + * @since v10.0.0 + */ + writeFile( + data: string | Uint8Array, + options?: + | (ObjectEncodingOptions & FlagAndOpenMode & Abortable & { flush?: boolean | undefined }) + | BufferEncoding + | null, + ): Promise; + /** + * Write `buffer` to the file. + * + * The promise is fulfilled with an object containing two properties: + * + * It is unsafe to use `filehandle.write()` multiple times on the same file + * without waiting for the promise to be fulfilled (or rejected). For this + * scenario, use `filehandle.createWriteStream()`. + * + * On Linux, positional writes do not work when the file is opened in append mode. + * The kernel ignores the position argument and always appends the data to + * the end of the file. + * @since v10.0.0 + * @param offset The start position from within `buffer` where the data to write begins. + * @param [length=buffer.byteLength - offset] The number of bytes from `buffer` to write. + * @param [position='null'] The offset from the beginning of the file where the data from `buffer` should be written. If `position` is not a `number`, the data will be written at the current + * position. See the POSIX pwrite(2) documentation for more detail. + */ + write( + buffer: TBuffer, + offset?: number | null, + length?: number | null, + position?: number | null, + ): Promise<{ + bytesWritten: number; + buffer: TBuffer; + }>; + write( + data: string, + position?: number | null, + encoding?: BufferEncoding | null, + ): Promise<{ + bytesWritten: number; + buffer: string; + }>; + /** + * Write an array of [ArrayBufferView](https://developer.mozilla.org/en-US/docs/Web/API/ArrayBufferView) s to the file. + * + * The promise is fulfilled with an object containing a two properties: + * + * It is unsafe to call `writev()` multiple times on the same file without waiting + * for the promise to be fulfilled (or rejected). + * + * On Linux, positional writes don't work when the file is opened in append mode. + * The kernel ignores the position argument and always appends the data to + * the end of the file. + * @since v12.9.0 + * @param [position='null'] The offset from the beginning of the file where the data from `buffers` should be written. If `position` is not a `number`, the data will be written at the current + * position. + */ + writev(buffers: readonly NodeJS.ArrayBufferView[], position?: number): Promise; + /** + * Read from a file and write to an array of [ArrayBufferView](https://developer.mozilla.org/en-US/docs/Web/API/ArrayBufferView) s + * @since v13.13.0, v12.17.0 + * @param [position='null'] The offset from the beginning of the file where the data should be read from. If `position` is not a `number`, the data will be read from the current position. + * @return Fulfills upon success an object containing two properties: + */ + readv(buffers: readonly NodeJS.ArrayBufferView[], position?: number): Promise; + /** + * Closes the file handle after waiting for any pending operation on the handle to + * complete. + * + * ```js + * import { open } from 'node:fs/promises'; + * + * let filehandle; + * try { + * filehandle = await open('thefile.txt', 'r'); + * } finally { + * await filehandle?.close(); + * } + * ``` + * @since v10.0.0 + * @return Fulfills with `undefined` upon success. + */ + close(): Promise; + /** + * An alias for {@link FileHandle.close()}. + * @since v20.4.0 + */ + [Symbol.asyncDispose](): Promise; + } + const constants: typeof fsConstants; + /** + * Tests a user's permissions for the file or directory specified by `path`. + * The `mode` argument is an optional integer that specifies the accessibility + * checks to be performed. `mode` should be either the value `fs.constants.F_OK`or a mask consisting of the bitwise OR of any of `fs.constants.R_OK`,`fs.constants.W_OK`, and `fs.constants.X_OK` + * (e.g.`fs.constants.W_OK | fs.constants.R_OK`). Check `File access constants` for + * possible values of `mode`. + * + * If the accessibility check is successful, the promise is fulfilled with no + * value. If any of the accessibility checks fail, the promise is rejected + * with an [Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error) object. The following example checks if the file`/etc/passwd` can be read and + * written by the current process. + * + * ```js + * import { access, constants } from 'node:fs/promises'; + * + * try { + * await access('/etc/passwd', constants.R_OK | constants.W_OK); + * console.log('can access'); + * } catch { + * console.error('cannot access'); + * } + * ``` + * + * Using `fsPromises.access()` to check for the accessibility of a file before + * calling `fsPromises.open()` is not recommended. Doing so introduces a race + * condition, since other processes may change the file's state between the two + * calls. Instead, user code should open/read/write the file directly and handle + * the error raised if the file is not accessible. + * @since v10.0.0 + * @param [mode=fs.constants.F_OK] + * @return Fulfills with `undefined` upon success. + */ + function access(path: PathLike, mode?: number): Promise; + /** + * Asynchronously copies `src` to `dest`. By default, `dest` is overwritten if it + * already exists. + * + * No guarantees are made about the atomicity of the copy operation. If an + * error occurs after the destination file has been opened for writing, an attempt + * will be made to remove the destination. + * + * ```js + * import { copyFile, constants } from 'node:fs/promises'; + * + * try { + * await copyFile('source.txt', 'destination.txt'); + * console.log('source.txt was copied to destination.txt'); + * } catch { + * console.error('The file could not be copied'); + * } + * + * // By using COPYFILE_EXCL, the operation will fail if destination.txt exists. + * try { + * await copyFile('source.txt', 'destination.txt', constants.COPYFILE_EXCL); + * console.log('source.txt was copied to destination.txt'); + * } catch { + * console.error('The file could not be copied'); + * } + * ``` + * @since v10.0.0 + * @param src source filename to copy + * @param dest destination filename of the copy operation + * @param [mode=0] Optional modifiers that specify the behavior of the copy operation. It is possible to create a mask consisting of the bitwise OR of two or more values (e.g. + * `fs.constants.COPYFILE_EXCL | fs.constants.COPYFILE_FICLONE`) + * @return Fulfills with `undefined` upon success. + */ + function copyFile(src: PathLike, dest: PathLike, mode?: number): Promise; + /** + * Opens a `FileHandle`. + * + * Refer to the POSIX [`open(2)`](http://man7.org/linux/man-pages/man2/open.2.html) documentation for more detail. + * + * Some characters (`< > : " / \ | ? *`) are reserved under Windows as documented + * by [Naming Files, Paths, and Namespaces](https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file). Under NTFS, if the filename contains + * a colon, Node.js will open a file system stream, as described by [this MSDN page](https://docs.microsoft.com/en-us/windows/desktop/FileIO/using-streams). + * @since v10.0.0 + * @param [flags='r'] See `support of file system `flags``. + * @param [mode=0o666] Sets the file mode (permission and sticky bits) if the file is created. + * @return Fulfills with a {FileHandle} object. + */ + function open(path: PathLike, flags?: string | number, mode?: Mode): Promise; + /** + * Renames `oldPath` to `newPath`. + * @since v10.0.0 + * @return Fulfills with `undefined` upon success. + */ + function rename(oldPath: PathLike, newPath: PathLike): Promise; + /** + * Truncates (shortens or extends the length) of the content at `path` to `len`bytes. + * @since v10.0.0 + * @param [len=0] + * @return Fulfills with `undefined` upon success. + */ + function truncate(path: PathLike, len?: number): Promise; + /** + * Removes the directory identified by `path`. + * + * Using `fsPromises.rmdir()` on a file (not a directory) results in the + * promise being rejected with an `ENOENT` error on Windows and an `ENOTDIR`error on POSIX. + * + * To get a behavior similar to the `rm -rf` Unix command, use `fsPromises.rm()` with options `{ recursive: true, force: true }`. + * @since v10.0.0 + * @return Fulfills with `undefined` upon success. + */ + function rmdir(path: PathLike, options?: RmDirOptions): Promise; + /** + * Removes files and directories (modeled on the standard POSIX `rm` utility). + * @since v14.14.0 + * @return Fulfills with `undefined` upon success. + */ + function rm(path: PathLike, options?: RmOptions): Promise; + /** + * Asynchronously creates a directory. + * + * The optional `options` argument can be an integer specifying `mode` (permission + * and sticky bits), or an object with a `mode` property and a `recursive`property indicating whether parent directories should be created. Calling`fsPromises.mkdir()` when `path` is a directory + * that exists results in a + * rejection only when `recursive` is false. + * + * ```js + * import { mkdir } from 'node:fs/promises'; + * + * try { + * const projectFolder = new URL('./test/project/', import.meta.url); + * const createDir = await mkdir(projectFolder, { recursive: true }); + * + * console.log(`created ${createDir}`); + * } catch (err) { + * console.error(err.message); + * } + * ``` + * @since v10.0.0 + * @return Upon success, fulfills with `undefined` if `recursive` is `false`, or the first directory path created if `recursive` is `true`. + */ + function mkdir( + path: PathLike, + options: MakeDirectoryOptions & { + recursive: true; + }, + ): Promise; + /** + * Asynchronous mkdir(2) - create a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options Either the file mode, or an object optionally specifying the file mode and whether parent folders + * should be created. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. + */ + function mkdir( + path: PathLike, + options?: + | Mode + | (MakeDirectoryOptions & { + recursive?: false | undefined; + }) + | null, + ): Promise; + /** + * Asynchronous mkdir(2) - create a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options Either the file mode, or an object optionally specifying the file mode and whether parent folders + * should be created. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. + */ + function mkdir(path: PathLike, options?: Mode | MakeDirectoryOptions | null): Promise; + /** + * Reads the contents of a directory. + * + * The optional `options` argument can be a string specifying an encoding, or an + * object with an `encoding` property specifying the character encoding to use for + * the filenames. If the `encoding` is set to `'buffer'`, the filenames returned + * will be passed as `Buffer` objects. + * + * If `options.withFileTypes` is set to `true`, the returned array will contain `fs.Dirent` objects. + * + * ```js + * import { readdir } from 'node:fs/promises'; + * + * try { + * const files = await readdir(path); + * for (const file of files) + * console.log(file); + * } catch (err) { + * console.error(err); + * } + * ``` + * @since v10.0.0 + * @return Fulfills with an array of the names of the files in the directory excluding `'.'` and `'..'`. + */ + function readdir( + path: PathLike, + options?: + | (ObjectEncodingOptions & { + withFileTypes?: false | undefined; + recursive?: boolean | undefined; + }) + | BufferEncoding + | null, + ): Promise; + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function readdir( + path: PathLike, + options: + | { + encoding: "buffer"; + withFileTypes?: false | undefined; + recursive?: boolean | undefined; + } + | "buffer", + ): Promise; + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function readdir( + path: PathLike, + options?: + | (ObjectEncodingOptions & { + withFileTypes?: false | undefined; + recursive?: boolean | undefined; + }) + | BufferEncoding + | null, + ): Promise; + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options If called with `withFileTypes: true` the result data will be an array of Dirent. + */ + function readdir( + path: PathLike, + options: ObjectEncodingOptions & { + withFileTypes: true; + recursive?: boolean | undefined; + }, + ): Promise; + /** + * Reads the contents of the symbolic link referred to by `path`. See the POSIX [`readlink(2)`](http://man7.org/linux/man-pages/man2/readlink.2.html) documentation for more detail. The promise is + * fulfilled with the`linkString` upon success. + * + * The optional `options` argument can be a string specifying an encoding, or an + * object with an `encoding` property specifying the character encoding to use for + * the link path returned. If the `encoding` is set to `'buffer'`, the link path + * returned will be passed as a `Buffer` object. + * @since v10.0.0 + * @return Fulfills with the `linkString` upon success. + */ + function readlink(path: PathLike, options?: ObjectEncodingOptions | BufferEncoding | null): Promise; + /** + * Asynchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function readlink(path: PathLike, options: BufferEncodingOption): Promise; + /** + * Asynchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function readlink(path: PathLike, options?: ObjectEncodingOptions | string | null): Promise; + /** + * Creates a symbolic link. + * + * The `type` argument is only used on Windows platforms and can be one of `'dir'`,`'file'`, or `'junction'`. If the `type` argument is not a string, Node.js will + * autodetect `target` type and use `'file'` or `'dir'`. If the `target` does not + * exist, `'file'` will be used. Windows junction points require the destination + * path to be absolute. When using `'junction'`, the `target` argument will + * automatically be normalized to absolute path. Junction points on NTFS volumes + * can only point to directories. + * @since v10.0.0 + * @param [type='null'] + * @return Fulfills with `undefined` upon success. + */ + function symlink(target: PathLike, path: PathLike, type?: string | null): Promise; + /** + * Equivalent to `fsPromises.stat()` unless `path` refers to a symbolic link, + * in which case the link itself is stat-ed, not the file that it refers to. + * Refer to the POSIX [`lstat(2)`](http://man7.org/linux/man-pages/man2/lstat.2.html) document for more detail. + * @since v10.0.0 + * @return Fulfills with the {fs.Stats} object for the given symbolic link `path`. + */ + function lstat( + path: PathLike, + opts?: StatOptions & { + bigint?: false | undefined; + }, + ): Promise; + function lstat( + path: PathLike, + opts: StatOptions & { + bigint: true; + }, + ): Promise; + function lstat(path: PathLike, opts?: StatOptions): Promise; + /** + * @since v10.0.0 + * @return Fulfills with the {fs.Stats} object for the given `path`. + */ + function stat( + path: PathLike, + opts?: StatOptions & { + bigint?: false | undefined; + }, + ): Promise; + function stat( + path: PathLike, + opts: StatOptions & { + bigint: true; + }, + ): Promise; + function stat(path: PathLike, opts?: StatOptions): Promise; + /** + * @since v19.6.0, v18.15.0 + * @return Fulfills with the {fs.StatFs} object for the given `path`. + */ + function statfs( + path: PathLike, + opts?: StatFsOptions & { + bigint?: false | undefined; + }, + ): Promise; + function statfs( + path: PathLike, + opts: StatFsOptions & { + bigint: true; + }, + ): Promise; + function statfs(path: PathLike, opts?: StatFsOptions): Promise; + /** + * Creates a new link from the `existingPath` to the `newPath`. See the POSIX [`link(2)`](http://man7.org/linux/man-pages/man2/link.2.html) documentation for more detail. + * @since v10.0.0 + * @return Fulfills with `undefined` upon success. + */ + function link(existingPath: PathLike, newPath: PathLike): Promise; + /** + * If `path` refers to a symbolic link, then the link is removed without affecting + * the file or directory to which that link refers. If the `path` refers to a file + * path that is not a symbolic link, the file is deleted. See the POSIX [`unlink(2)`](http://man7.org/linux/man-pages/man2/unlink.2.html) documentation for more detail. + * @since v10.0.0 + * @return Fulfills with `undefined` upon success. + */ + function unlink(path: PathLike): Promise; + /** + * Changes the permissions of a file. + * @since v10.0.0 + * @return Fulfills with `undefined` upon success. + */ + function chmod(path: PathLike, mode: Mode): Promise; + /** + * Changes the permissions on a symbolic link. + * + * This method is only implemented on macOS. + * @deprecated Since v10.0.0 + * @return Fulfills with `undefined` upon success. + */ + function lchmod(path: PathLike, mode: Mode): Promise; + /** + * Changes the ownership on a symbolic link. + * @since v10.0.0 + * @return Fulfills with `undefined` upon success. + */ + function lchown(path: PathLike, uid: number, gid: number): Promise; + /** + * Changes the access and modification times of a file in the same way as `fsPromises.utimes()`, with the difference that if the path refers to a + * symbolic link, then the link is not dereferenced: instead, the timestamps of + * the symbolic link itself are changed. + * @since v14.5.0, v12.19.0 + * @return Fulfills with `undefined` upon success. + */ + function lutimes(path: PathLike, atime: TimeLike, mtime: TimeLike): Promise; + /** + * Changes the ownership of a file. + * @since v10.0.0 + * @return Fulfills with `undefined` upon success. + */ + function chown(path: PathLike, uid: number, gid: number): Promise; + /** + * Change the file system timestamps of the object referenced by `path`. + * + * The `atime` and `mtime` arguments follow these rules: + * + * * Values can be either numbers representing Unix epoch time, `Date`s, or a + * numeric string like `'123456789.0'`. + * * If the value can not be converted to a number, or is `NaN`, `Infinity`, or`-Infinity`, an `Error` will be thrown. + * @since v10.0.0 + * @return Fulfills with `undefined` upon success. + */ + function utimes(path: PathLike, atime: TimeLike, mtime: TimeLike): Promise; + /** + * Determines the actual location of `path` using the same semantics as the`fs.realpath.native()` function. + * + * Only paths that can be converted to UTF8 strings are supported. + * + * The optional `options` argument can be a string specifying an encoding, or an + * object with an `encoding` property specifying the character encoding to use for + * the path. If the `encoding` is set to `'buffer'`, the path returned will be + * passed as a `Buffer` object. + * + * On Linux, when Node.js is linked against musl libc, the procfs file system must + * be mounted on `/proc` in order for this function to work. Glibc does not have + * this restriction. + * @since v10.0.0 + * @return Fulfills with the resolved path upon success. + */ + function realpath(path: PathLike, options?: ObjectEncodingOptions | BufferEncoding | null): Promise; + /** + * Asynchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function realpath(path: PathLike, options: BufferEncodingOption): Promise; + /** + * Asynchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function realpath( + path: PathLike, + options?: ObjectEncodingOptions | BufferEncoding | null, + ): Promise; + /** + * Creates a unique temporary directory. A unique directory name is generated by + * appending six random characters to the end of the provided `prefix`. Due to + * platform inconsistencies, avoid trailing `X` characters in `prefix`. Some + * platforms, notably the BSDs, can return more than six random characters, and + * replace trailing `X` characters in `prefix` with random characters. + * + * The optional `options` argument can be a string specifying an encoding, or an + * object with an `encoding` property specifying the character encoding to use. + * + * ```js + * import { mkdtemp } from 'node:fs/promises'; + * import { join } from 'node:path'; + * import { tmpdir } from 'node:os'; + * + * try { + * await mkdtemp(join(tmpdir(), 'foo-')); + * } catch (err) { + * console.error(err); + * } + * ``` + * + * The `fsPromises.mkdtemp()` method will append the six randomly selected + * characters directly to the `prefix` string. For instance, given a directory`/tmp`, if the intention is to create a temporary directory _within_`/tmp`, the`prefix` must end with a trailing + * platform-specific path separator + * (`require('node:path').sep`). + * @since v10.0.0 + * @return Fulfills with a string containing the file system path of the newly created temporary directory. + */ + function mkdtemp(prefix: string, options?: ObjectEncodingOptions | BufferEncoding | null): Promise; + /** + * Asynchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required `prefix` to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function mkdtemp(prefix: string, options: BufferEncodingOption): Promise; + /** + * Asynchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required `prefix` to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + function mkdtemp(prefix: string, options?: ObjectEncodingOptions | BufferEncoding | null): Promise; + /** + * Asynchronously writes data to a file, replacing the file if it already exists.`data` can be a string, a buffer, an + * [AsyncIterable](https://tc39.github.io/ecma262/#sec-asynciterable-interface), or an + * [Iterable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#The_iterable_protocol) object. + * + * The `encoding` option is ignored if `data` is a buffer. + * + * If `options` is a string, then it specifies the encoding. + * + * The `mode` option only affects the newly created file. See `fs.open()` for more details. + * + * Any specified `FileHandle` has to support writing. + * + * It is unsafe to use `fsPromises.writeFile()` multiple times on the same file + * without waiting for the promise to be settled. + * + * Similarly to `fsPromises.readFile` \- `fsPromises.writeFile` is a convenience + * method that performs multiple `write` calls internally to write the buffer + * passed to it. For performance sensitive code consider using `fs.createWriteStream()` or `filehandle.createWriteStream()`. + * + * It is possible to use an `AbortSignal` to cancel an `fsPromises.writeFile()`. + * Cancelation is "best effort", and some amount of data is likely still + * to be written. + * + * ```js + * import { writeFile } from 'node:fs/promises'; + * import { Buffer } from 'node:buffer'; + * + * try { + * const controller = new AbortController(); + * const { signal } = controller; + * const data = new Uint8Array(Buffer.from('Hello Node.js')); + * const promise = writeFile('message.txt', data, { signal }); + * + * // Abort the request before the promise settles. + * controller.abort(); + * + * await promise; + * } catch (err) { + * // When a request is aborted - err is an AbortError + * console.error(err); + * } + * ``` + * + * Aborting an ongoing request does not abort individual operating + * system requests but rather the internal buffering `fs.writeFile` performs. + * @since v10.0.0 + * @param file filename or `FileHandle` + * @return Fulfills with `undefined` upon success. + */ + function writeFile( + file: PathLike | FileHandle, + data: + | string + | NodeJS.ArrayBufferView + | Iterable + | AsyncIterable + | Stream, + options?: + | (ObjectEncodingOptions & { + mode?: Mode | undefined; + flag?: OpenMode | undefined; + } & Abortable) + | BufferEncoding + | null, + ): Promise; + /** + * Asynchronously append data to a file, creating the file if it does not yet + * exist. `data` can be a string or a `Buffer`. + * + * If `options` is a string, then it specifies the `encoding`. + * + * The `mode` option only affects the newly created file. See `fs.open()` for more details. + * + * The `path` may be specified as a `FileHandle` that has been opened + * for appending (using `fsPromises.open()`). + * @since v10.0.0 + * @param path filename or {FileHandle} + * @return Fulfills with `undefined` upon success. + */ + function appendFile( + path: PathLike | FileHandle, + data: string | Uint8Array, + options?: (ObjectEncodingOptions & FlagAndOpenMode & { flush?: boolean | undefined }) | BufferEncoding | null, + ): Promise; + /** + * Asynchronously reads the entire contents of a file. + * + * If no encoding is specified (using `options.encoding`), the data is returned + * as a `Buffer` object. Otherwise, the data will be a string. + * + * If `options` is a string, then it specifies the encoding. + * + * When the `path` is a directory, the behavior of `fsPromises.readFile()` is + * platform-specific. On macOS, Linux, and Windows, the promise will be rejected + * with an error. On FreeBSD, a representation of the directory's contents will be + * returned. + * + * An example of reading a `package.json` file located in the same directory of the + * running code: + * + * ```js + * import { readFile } from 'node:fs/promises'; + * try { + * const filePath = new URL('./package.json', import.meta.url); + * const contents = await readFile(filePath, { encoding: 'utf8' }); + * console.log(contents); + * } catch (err) { + * console.error(err.message); + * } + * ``` + * + * It is possible to abort an ongoing `readFile` using an `AbortSignal`. If a + * request is aborted the promise returned is rejected with an `AbortError`: + * + * ```js + * import { readFile } from 'node:fs/promises'; + * + * try { + * const controller = new AbortController(); + * const { signal } = controller; + * const promise = readFile(fileName, { signal }); + * + * // Abort the request before the promise settles. + * controller.abort(); + * + * await promise; + * } catch (err) { + * // When a request is aborted - err is an AbortError + * console.error(err); + * } + * ``` + * + * Aborting an ongoing request does not abort individual operating + * system requests but rather the internal buffering `fs.readFile` performs. + * + * Any specified `FileHandle` has to support reading. + * @since v10.0.0 + * @param path filename or `FileHandle` + * @return Fulfills with the contents of the file. + */ + function readFile( + path: PathLike | FileHandle, + options?: + | ({ + encoding?: null | undefined; + flag?: OpenMode | undefined; + } & Abortable) + | null, + ): Promise; + /** + * Asynchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * If a `FileHandle` is provided, the underlying file will _not_ be closed automatically. + * @param options An object that may contain an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + function readFile( + path: PathLike | FileHandle, + options: + | ({ + encoding: BufferEncoding; + flag?: OpenMode | undefined; + } & Abortable) + | BufferEncoding, + ): Promise; + /** + * Asynchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * If a `FileHandle` is provided, the underlying file will _not_ be closed automatically. + * @param options An object that may contain an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + function readFile( + path: PathLike | FileHandle, + options?: + | ( + & ObjectEncodingOptions + & Abortable + & { + flag?: OpenMode | undefined; + } + ) + | BufferEncoding + | null, + ): Promise; + /** + * Asynchronously open a directory for iterative scanning. See the POSIX [`opendir(3)`](http://man7.org/linux/man-pages/man3/opendir.3.html) documentation for more detail. + * + * Creates an `fs.Dir`, which contains all further functions for reading from + * and cleaning up the directory. + * + * The `encoding` option sets the encoding for the `path` while opening the + * directory and subsequent read operations. + * + * Example using async iteration: + * + * ```js + * import { opendir } from 'node:fs/promises'; + * + * try { + * const dir = await opendir('./'); + * for await (const dirent of dir) + * console.log(dirent.name); + * } catch (err) { + * console.error(err); + * } + * ``` + * + * When using the async iterator, the `fs.Dir` object will be automatically + * closed after the iterator exits. + * @since v12.12.0 + * @return Fulfills with an {fs.Dir}. + */ + function opendir(path: PathLike, options?: OpenDirOptions): Promise; + /** + * Returns an async iterator that watches for changes on `filename`, where `filename`is either a file or a directory. + * + * ```js + * const { watch } = require('node:fs/promises'); + * + * const ac = new AbortController(); + * const { signal } = ac; + * setTimeout(() => ac.abort(), 10000); + * + * (async () => { + * try { + * const watcher = watch(__filename, { signal }); + * for await (const event of watcher) + * console.log(event); + * } catch (err) { + * if (err.name === 'AbortError') + * return; + * throw err; + * } + * })(); + * ``` + * + * On most platforms, `'rename'` is emitted whenever a filename appears or + * disappears in the directory. + * + * All the `caveats` for `fs.watch()` also apply to `fsPromises.watch()`. + * @since v15.9.0, v14.18.0 + * @return of objects with the properties: + */ + function watch( + filename: PathLike, + options: + | (WatchOptions & { + encoding: "buffer"; + }) + | "buffer", + ): AsyncIterable>; + /** + * Watch for changes on `filename`, where `filename` is either a file or a directory, returning an `FSWatcher`. + * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + * @param options Either the encoding for the filename provided to the listener, or an object optionally specifying encoding, persistent, and recursive options. + * If `encoding` is not supplied, the default of `'utf8'` is used. + * If `persistent` is not supplied, the default of `true` is used. + * If `recursive` is not supplied, the default of `false` is used. + */ + function watch(filename: PathLike, options?: WatchOptions | BufferEncoding): AsyncIterable>; + /** + * Watch for changes on `filename`, where `filename` is either a file or a directory, returning an `FSWatcher`. + * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + * @param options Either the encoding for the filename provided to the listener, or an object optionally specifying encoding, persistent, and recursive options. + * If `encoding` is not supplied, the default of `'utf8'` is used. + * If `persistent` is not supplied, the default of `true` is used. + * If `recursive` is not supplied, the default of `false` is used. + */ + function watch( + filename: PathLike, + options: WatchOptions | string, + ): AsyncIterable> | AsyncIterable>; + /** + * Asynchronously copies the entire directory structure from `src` to `dest`, + * including subdirectories and files. + * + * When copying a directory to another directory, globs are not supported and + * behavior is similar to `cp dir1/ dir2/`. + * @since v16.7.0 + * @experimental + * @param src source path to copy. + * @param dest destination path to copy to. + * @return Fulfills with `undefined` upon success. + */ + function cp(source: string | URL, destination: string | URL, opts?: CopyOptions): Promise; +} +declare module "node:fs/promises" { + export * from "fs/promises"; +} diff --git a/task/node_modules/@types/node/ts4.8/globals.d.ts b/task/node_modules/@types/node/ts4.8/globals.d.ts new file mode 100644 index 0000000..72d1860 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/globals.d.ts @@ -0,0 +1,385 @@ +export {}; // Make this a module + +// #region Fetch and friends +// Conditional type aliases, used at the end of this file. +// Will either be empty if lib-dom is included, or the undici version otherwise. +type _Request = typeof globalThis extends { onmessage: any } ? {} : import("undici-types").Request; +type _Response = typeof globalThis extends { onmessage: any } ? {} : import("undici-types").Response; +type _FormData = typeof globalThis extends { onmessage: any } ? {} : import("undici-types").FormData; +type _Headers = typeof globalThis extends { onmessage: any } ? {} : import("undici-types").Headers; +type _RequestInit = typeof globalThis extends { onmessage: any } ? {} + : import("undici-types").RequestInit; +type _ResponseInit = typeof globalThis extends { onmessage: any } ? {} + : import("undici-types").ResponseInit; +type _File = typeof globalThis extends { onmessage: any } ? {} : import("node:buffer").File; +// #endregion Fetch and friends + +declare global { + // Declare "static" methods in Error + interface ErrorConstructor { + /** Create .stack property on a target object */ + captureStackTrace(targetObject: object, constructorOpt?: Function): void; + + /** + * Optional override for formatting stack traces + * + * @see https://v8.dev/docs/stack-trace-api#customizing-stack-traces + */ + prepareStackTrace?: ((err: Error, stackTraces: NodeJS.CallSite[]) => any) | undefined; + + stackTraceLimit: number; + } + + /*-----------------------------------------------* + * * + * GLOBAL * + * * + ------------------------------------------------*/ + + // For backwards compability + interface NodeRequire extends NodeJS.Require {} + interface RequireResolve extends NodeJS.RequireResolve {} + interface NodeModule extends NodeJS.Module {} + + var process: NodeJS.Process; + var console: Console; + + var __filename: string; + var __dirname: string; + + var require: NodeRequire; + var module: NodeModule; + + // Same as module.exports + var exports: any; + + /** + * Only available if `--expose-gc` is passed to the process. + */ + var gc: undefined | (() => void); + + // #region borrowed + // from https://github.com/microsoft/TypeScript/blob/38da7c600c83e7b31193a62495239a0fe478cb67/lib/lib.webworker.d.ts#L633 until moved to separate lib + /** A controller object that allows you to abort one or more DOM requests as and when desired. */ + interface AbortController { + /** + * Returns the AbortSignal object associated with this object. + */ + + readonly signal: AbortSignal; + /** + * Invoking this method will set this object's AbortSignal's aborted flag and signal to any observers that the associated activity is to be aborted. + */ + abort(reason?: any): void; + } + + /** A signal object that allows you to communicate with a DOM request (such as a Fetch) and abort it if required via an AbortController object. */ + interface AbortSignal extends EventTarget { + /** + * Returns true if this AbortSignal's AbortController has signaled to abort, and false otherwise. + */ + readonly aborted: boolean; + readonly reason: any; + onabort: null | ((this: AbortSignal, event: Event) => any); + throwIfAborted(): void; + } + + var AbortController: typeof globalThis extends { onmessage: any; AbortController: infer T } ? T + : { + prototype: AbortController; + new(): AbortController; + }; + + var AbortSignal: typeof globalThis extends { onmessage: any; AbortSignal: infer T } ? T + : { + prototype: AbortSignal; + new(): AbortSignal; + abort(reason?: any): AbortSignal; + timeout(milliseconds: number): AbortSignal; + }; + // #endregion borrowed + + // #region Disposable + interface SymbolConstructor { + /** + * A method that is used to release resources held by an object. Called by the semantics of the `using` statement. + */ + readonly dispose: unique symbol; + + /** + * A method that is used to asynchronously release resources held by an object. Called by the semantics of the `await using` statement. + */ + readonly asyncDispose: unique symbol; + } + + interface Disposable { + [Symbol.dispose](): void; + } + + interface AsyncDisposable { + [Symbol.asyncDispose](): PromiseLike; + } + // #endregion Disposable + + // #region ArrayLike.at() + interface RelativeIndexable { + /** + * Takes an integer value and returns the item at that index, + * allowing for positive and negative integers. + * Negative integers count back from the last item in the array. + */ + at(index: number): T | undefined; + } + interface String extends RelativeIndexable {} + interface Array extends RelativeIndexable {} + interface ReadonlyArray extends RelativeIndexable {} + interface Int8Array extends RelativeIndexable {} + interface Uint8Array extends RelativeIndexable {} + interface Uint8ClampedArray extends RelativeIndexable {} + interface Int16Array extends RelativeIndexable {} + interface Uint16Array extends RelativeIndexable {} + interface Int32Array extends RelativeIndexable {} + interface Uint32Array extends RelativeIndexable {} + interface Float32Array extends RelativeIndexable {} + interface Float64Array extends RelativeIndexable {} + interface BigInt64Array extends RelativeIndexable {} + interface BigUint64Array extends RelativeIndexable {} + // #endregion ArrayLike.at() end + + /** + * @since v17.0.0 + * + * Creates a deep clone of an object. + */ + function structuredClone( + value: T, + transfer?: { transfer: ReadonlyArray }, + ): T; + + /*----------------------------------------------* + * * + * GLOBAL INTERFACES * + * * + *-----------------------------------------------*/ + namespace NodeJS { + interface CallSite { + /** + * Value of "this" + */ + getThis(): unknown; + + /** + * Type of "this" as a string. + * This is the name of the function stored in the constructor field of + * "this", if available. Otherwise the object's [[Class]] internal + * property. + */ + getTypeName(): string | null; + + /** + * Current function + */ + getFunction(): Function | undefined; + + /** + * Name of the current function, typically its name property. + * If a name property is not available an attempt will be made to try + * to infer a name from the function's context. + */ + getFunctionName(): string | null; + + /** + * Name of the property [of "this" or one of its prototypes] that holds + * the current function + */ + getMethodName(): string | null; + + /** + * Name of the script [if this function was defined in a script] + */ + getFileName(): string | undefined; + + /** + * Current line number [if this function was defined in a script] + */ + getLineNumber(): number | null; + + /** + * Current column number [if this function was defined in a script] + */ + getColumnNumber(): number | null; + + /** + * A call site object representing the location where eval was called + * [if this function was created using a call to eval] + */ + getEvalOrigin(): string | undefined; + + /** + * Is this a toplevel invocation, that is, is "this" the global object? + */ + isToplevel(): boolean; + + /** + * Does this call take place in code defined by a call to eval? + */ + isEval(): boolean; + + /** + * Is this call in native V8 code? + */ + isNative(): boolean; + + /** + * Is this a constructor call? + */ + isConstructor(): boolean; + } + + interface ErrnoException extends Error { + errno?: number | undefined; + code?: string | undefined; + path?: string | undefined; + syscall?: string | undefined; + } + + interface ReadableStream extends EventEmitter { + readable: boolean; + read(size?: number): string | Buffer; + setEncoding(encoding: BufferEncoding): this; + pause(): this; + resume(): this; + isPaused(): boolean; + pipe(destination: T, options?: { end?: boolean | undefined }): T; + unpipe(destination?: WritableStream): this; + unshift(chunk: string | Uint8Array, encoding?: BufferEncoding): void; + wrap(oldStream: ReadableStream): this; + [Symbol.asyncIterator](): AsyncIterableIterator; + } + + interface WritableStream extends EventEmitter { + writable: boolean; + write(buffer: Uint8Array | string, cb?: (err?: Error | null) => void): boolean; + write(str: string, encoding?: BufferEncoding, cb?: (err?: Error | null) => void): boolean; + end(cb?: () => void): this; + end(data: string | Uint8Array, cb?: () => void): this; + end(str: string, encoding?: BufferEncoding, cb?: () => void): this; + } + + interface ReadWriteStream extends ReadableStream, WritableStream {} + + interface RefCounted { + ref(): this; + unref(): this; + } + + type TypedArray = + | Uint8Array + | Uint8ClampedArray + | Uint16Array + | Uint32Array + | Int8Array + | Int16Array + | Int32Array + | BigUint64Array + | BigInt64Array + | Float32Array + | Float64Array; + type ArrayBufferView = TypedArray | DataView; + + interface Require { + (id: string): any; + resolve: RequireResolve; + cache: Dict; + /** + * @deprecated + */ + extensions: RequireExtensions; + main: Module | undefined; + } + + interface RequireResolve { + (id: string, options?: { paths?: string[] | undefined }): string; + paths(request: string): string[] | null; + } + + interface RequireExtensions extends Dict<(m: Module, filename: string) => any> { + ".js": (m: Module, filename: string) => any; + ".json": (m: Module, filename: string) => any; + ".node": (m: Module, filename: string) => any; + } + interface Module { + /** + * `true` if the module is running during the Node.js preload + */ + isPreloading: boolean; + exports: any; + require: Require; + id: string; + filename: string; + loaded: boolean; + /** @deprecated since v14.6.0 Please use `require.main` and `module.children` instead. */ + parent: Module | null | undefined; + children: Module[]; + /** + * @since v11.14.0 + * + * The directory name of the module. This is usually the same as the path.dirname() of the module.id. + */ + path: string; + paths: string[]; + } + + interface Dict { + [key: string]: T | undefined; + } + + interface ReadOnlyDict { + readonly [key: string]: T | undefined; + } + } + + interface RequestInit extends _RequestInit {} + + function fetch( + input: string | URL | globalThis.Request, + init?: RequestInit, + ): Promise; + + interface Request extends _Request {} + var Request: typeof globalThis extends { + onmessage: any; + Request: infer T; + } ? T + : typeof import("undici-types").Request; + + interface ResponseInit extends _ResponseInit {} + + interface Response extends _Response {} + var Response: typeof globalThis extends { + onmessage: any; + Response: infer T; + } ? T + : typeof import("undici-types").Response; + + interface FormData extends _FormData {} + var FormData: typeof globalThis extends { + onmessage: any; + FormData: infer T; + } ? T + : typeof import("undici-types").FormData; + + interface Headers extends _Headers {} + var Headers: typeof globalThis extends { + onmessage: any; + Headers: infer T; + } ? T + : typeof import("undici-types").Headers; + + interface File extends _File {} + var File: typeof globalThis extends { + onmessage: any; + File: infer T; + } ? T + : typeof import("node:buffer").File; +} diff --git a/task/node_modules/@types/node/ts4.8/globals.global.d.ts b/task/node_modules/@types/node/ts4.8/globals.global.d.ts new file mode 100644 index 0000000..ef1198c --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/globals.global.d.ts @@ -0,0 +1 @@ +declare var global: typeof globalThis; diff --git a/task/node_modules/@types/node/ts4.8/http.d.ts b/task/node_modules/@types/node/ts4.8/http.d.ts new file mode 100644 index 0000000..9b2c3c2 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/http.d.ts @@ -0,0 +1,1888 @@ +/** + * To use the HTTP server and client one must `require('node:http')`. + * + * The HTTP interfaces in Node.js are designed to support many features + * of the protocol which have been traditionally difficult to use. + * In particular, large, possibly chunk-encoded, messages. The interface is + * careful to never buffer entire requests or responses, so the + * user is able to stream data. + * + * HTTP message headers are represented by an object like this: + * + * ```js + * { 'content-length': '123', + * 'content-type': 'text/plain', + * 'connection': 'keep-alive', + * 'host': 'example.com', + * 'accept': '*' } + * ``` + * + * Keys are lowercased. Values are not modified. + * + * In order to support the full spectrum of possible HTTP applications, the Node.js + * HTTP API is very low-level. It deals with stream handling and message + * parsing only. It parses a message into headers and body but it does not + * parse the actual headers or the body. + * + * See `message.headers` for details on how duplicate headers are handled. + * + * The raw headers as they were received are retained in the `rawHeaders`property, which is an array of `[key, value, key2, value2, ...]`. For + * example, the previous message header object might have a `rawHeaders`list like the following: + * + * ```js + * [ 'ConTent-Length', '123456', + * 'content-LENGTH', '123', + * 'content-type', 'text/plain', + * 'CONNECTION', 'keep-alive', + * 'Host', 'example.com', + * 'accepT', '*' ] + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/http.js) + */ +declare module "http" { + import * as stream from "node:stream"; + import { URL } from "node:url"; + import { LookupOptions } from "node:dns"; + import { EventEmitter } from "node:events"; + import { LookupFunction, Server as NetServer, Socket, TcpSocketConnectOpts } from "node:net"; + // incoming headers will never contain number + interface IncomingHttpHeaders extends NodeJS.Dict { + accept?: string | undefined; + "accept-language"?: string | undefined; + "accept-patch"?: string | undefined; + "accept-ranges"?: string | undefined; + "access-control-allow-credentials"?: string | undefined; + "access-control-allow-headers"?: string | undefined; + "access-control-allow-methods"?: string | undefined; + "access-control-allow-origin"?: string | undefined; + "access-control-expose-headers"?: string | undefined; + "access-control-max-age"?: string | undefined; + "access-control-request-headers"?: string | undefined; + "access-control-request-method"?: string | undefined; + age?: string | undefined; + allow?: string | undefined; + "alt-svc"?: string | undefined; + authorization?: string | undefined; + "cache-control"?: string | undefined; + connection?: string | undefined; + "content-disposition"?: string | undefined; + "content-encoding"?: string | undefined; + "content-language"?: string | undefined; + "content-length"?: string | undefined; + "content-location"?: string | undefined; + "content-range"?: string | undefined; + "content-type"?: string | undefined; + cookie?: string | undefined; + date?: string | undefined; + etag?: string | undefined; + expect?: string | undefined; + expires?: string | undefined; + forwarded?: string | undefined; + from?: string | undefined; + host?: string | undefined; + "if-match"?: string | undefined; + "if-modified-since"?: string | undefined; + "if-none-match"?: string | undefined; + "if-unmodified-since"?: string | undefined; + "last-modified"?: string | undefined; + location?: string | undefined; + origin?: string | undefined; + pragma?: string | undefined; + "proxy-authenticate"?: string | undefined; + "proxy-authorization"?: string | undefined; + "public-key-pins"?: string | undefined; + range?: string | undefined; + referer?: string | undefined; + "retry-after"?: string | undefined; + "sec-websocket-accept"?: string | undefined; + "sec-websocket-extensions"?: string | undefined; + "sec-websocket-key"?: string | undefined; + "sec-websocket-protocol"?: string | undefined; + "sec-websocket-version"?: string | undefined; + "set-cookie"?: string[] | undefined; + "strict-transport-security"?: string | undefined; + tk?: string | undefined; + trailer?: string | undefined; + "transfer-encoding"?: string | undefined; + upgrade?: string | undefined; + "user-agent"?: string | undefined; + vary?: string | undefined; + via?: string | undefined; + warning?: string | undefined; + "www-authenticate"?: string | undefined; + } + // outgoing headers allows numbers (as they are converted internally to strings) + type OutgoingHttpHeader = number | string | string[]; + interface OutgoingHttpHeaders extends NodeJS.Dict { + accept?: string | string[] | undefined; + "accept-charset"?: string | string[] | undefined; + "accept-encoding"?: string | string[] | undefined; + "accept-language"?: string | string[] | undefined; + "accept-ranges"?: string | undefined; + "access-control-allow-credentials"?: string | undefined; + "access-control-allow-headers"?: string | undefined; + "access-control-allow-methods"?: string | undefined; + "access-control-allow-origin"?: string | undefined; + "access-control-expose-headers"?: string | undefined; + "access-control-max-age"?: string | undefined; + "access-control-request-headers"?: string | undefined; + "access-control-request-method"?: string | undefined; + age?: string | undefined; + allow?: string | undefined; + authorization?: string | undefined; + "cache-control"?: string | undefined; + "cdn-cache-control"?: string | undefined; + connection?: string | string[] | undefined; + "content-disposition"?: string | undefined; + "content-encoding"?: string | undefined; + "content-language"?: string | undefined; + "content-length"?: string | number | undefined; + "content-location"?: string | undefined; + "content-range"?: string | undefined; + "content-security-policy"?: string | undefined; + "content-security-policy-report-only"?: string | undefined; + cookie?: string | string[] | undefined; + dav?: string | string[] | undefined; + dnt?: string | undefined; + date?: string | undefined; + etag?: string | undefined; + expect?: string | undefined; + expires?: string | undefined; + forwarded?: string | undefined; + from?: string | undefined; + host?: string | undefined; + "if-match"?: string | undefined; + "if-modified-since"?: string | undefined; + "if-none-match"?: string | undefined; + "if-range"?: string | undefined; + "if-unmodified-since"?: string | undefined; + "last-modified"?: string | undefined; + link?: string | string[] | undefined; + location?: string | undefined; + "max-forwards"?: string | undefined; + origin?: string | undefined; + prgama?: string | string[] | undefined; + "proxy-authenticate"?: string | string[] | undefined; + "proxy-authorization"?: string | undefined; + "public-key-pins"?: string | undefined; + "public-key-pins-report-only"?: string | undefined; + range?: string | undefined; + referer?: string | undefined; + "referrer-policy"?: string | undefined; + refresh?: string | undefined; + "retry-after"?: string | undefined; + "sec-websocket-accept"?: string | undefined; + "sec-websocket-extensions"?: string | string[] | undefined; + "sec-websocket-key"?: string | undefined; + "sec-websocket-protocol"?: string | string[] | undefined; + "sec-websocket-version"?: string | undefined; + server?: string | undefined; + "set-cookie"?: string | string[] | undefined; + "strict-transport-security"?: string | undefined; + te?: string | undefined; + trailer?: string | undefined; + "transfer-encoding"?: string | undefined; + "user-agent"?: string | undefined; + upgrade?: string | undefined; + "upgrade-insecure-requests"?: string | undefined; + vary?: string | undefined; + via?: string | string[] | undefined; + warning?: string | undefined; + "www-authenticate"?: string | string[] | undefined; + "x-content-type-options"?: string | undefined; + "x-dns-prefetch-control"?: string | undefined; + "x-frame-options"?: string | undefined; + "x-xss-protection"?: string | undefined; + } + interface ClientRequestArgs { + _defaultAgent?: Agent | undefined; + agent?: Agent | boolean | undefined; + auth?: string | null | undefined; + // https://github.com/nodejs/node/blob/master/lib/_http_client.js#L278 + createConnection?: + | ((options: ClientRequestArgs, oncreate: (err: Error, socket: Socket) => void) => Socket) + | undefined; + defaultPort?: number | string | undefined; + family?: number | undefined; + headers?: OutgoingHttpHeaders | undefined; + hints?: LookupOptions["hints"]; + host?: string | null | undefined; + hostname?: string | null | undefined; + insecureHTTPParser?: boolean | undefined; + localAddress?: string | undefined; + localPort?: number | undefined; + lookup?: LookupFunction | undefined; + /** + * @default 16384 + */ + maxHeaderSize?: number | undefined; + method?: string | undefined; + path?: string | null | undefined; + port?: number | string | null | undefined; + protocol?: string | null | undefined; + setHost?: boolean | undefined; + signal?: AbortSignal | undefined; + socketPath?: string | undefined; + timeout?: number | undefined; + uniqueHeaders?: Array | undefined; + joinDuplicateHeaders?: boolean; + } + interface ServerOptions< + Request extends typeof IncomingMessage = typeof IncomingMessage, + Response extends typeof ServerResponse = typeof ServerResponse, + > { + /** + * Specifies the `IncomingMessage` class to be used. Useful for extending the original `IncomingMessage`. + */ + IncomingMessage?: Request | undefined; + /** + * Specifies the `ServerResponse` class to be used. Useful for extending the original `ServerResponse`. + */ + ServerResponse?: Response | undefined; + /** + * Sets the timeout value in milliseconds for receiving the entire request from the client. + * @see Server.requestTimeout for more information. + * @default 300000 + * @since v18.0.0 + */ + requestTimeout?: number | undefined; + /** + * It joins the field line values of multiple headers in a request with `, ` instead of discarding the duplicates. + * @default false + * @since v18.14.0 + */ + joinDuplicateHeaders?: boolean; + /** + * The number of milliseconds of inactivity a server needs to wait for additional incoming data, + * after it has finished writing the last response, before a socket will be destroyed. + * @see Server.keepAliveTimeout for more information. + * @default 5000 + * @since v18.0.0 + */ + keepAliveTimeout?: number | undefined; + /** + * Sets the interval value in milliseconds to check for request and headers timeout in incomplete requests. + * @default 30000 + */ + connectionsCheckingInterval?: number | undefined; + /** + * Optionally overrides all `socket`s' `readableHighWaterMark` and `writableHighWaterMark`. + * This affects `highWaterMark` property of both `IncomingMessage` and `ServerResponse`. + * Default: @see stream.getDefaultHighWaterMark(). + * @since v20.1.0 + */ + highWaterMark?: number | undefined; + /** + * Use an insecure HTTP parser that accepts invalid HTTP headers when `true`. + * Using the insecure parser should be avoided. + * See --insecure-http-parser for more information. + * @default false + */ + insecureHTTPParser?: boolean | undefined; + /** + * Optionally overrides the value of + * `--max-http-header-size` for requests received by this server, i.e. + * the maximum length of request headers in bytes. + * @default 16384 + * @since v13.3.0 + */ + maxHeaderSize?: number | undefined; + /** + * If set to `true`, it disables the use of Nagle's algorithm immediately after a new incoming connection is received. + * @default true + * @since v16.5.0 + */ + noDelay?: boolean | undefined; + /** + * If set to `true`, it enables keep-alive functionality on the socket immediately after a new incoming connection is received, + * similarly on what is done in `socket.setKeepAlive([enable][, initialDelay])`. + * @default false + * @since v16.5.0 + */ + keepAlive?: boolean | undefined; + /** + * If set to a positive number, it sets the initial delay before the first keepalive probe is sent on an idle socket. + * @default 0 + * @since v16.5.0 + */ + keepAliveInitialDelay?: number | undefined; + /** + * A list of response headers that should be sent only once. + * If the header's value is an array, the items will be joined using `; `. + */ + uniqueHeaders?: Array | undefined; + } + type RequestListener< + Request extends typeof IncomingMessage = typeof IncomingMessage, + Response extends typeof ServerResponse = typeof ServerResponse, + > = (req: InstanceType, res: InstanceType & { req: InstanceType }) => void; + /** + * @since v0.1.17 + */ + class Server< + Request extends typeof IncomingMessage = typeof IncomingMessage, + Response extends typeof ServerResponse = typeof ServerResponse, + > extends NetServer { + constructor(requestListener?: RequestListener); + constructor(options: ServerOptions, requestListener?: RequestListener); + /** + * Sets the timeout value for sockets, and emits a `'timeout'` event on + * the Server object, passing the socket as an argument, if a timeout + * occurs. + * + * If there is a `'timeout'` event listener on the Server object, then it + * will be called with the timed-out socket as an argument. + * + * By default, the Server does not timeout sockets. However, if a callback + * is assigned to the Server's `'timeout'` event, timeouts must be handled + * explicitly. + * @since v0.9.12 + * @param [msecs=0 (no timeout)] + */ + setTimeout(msecs?: number, callback?: () => void): this; + setTimeout(callback: () => void): this; + /** + * Limits maximum incoming headers count. If set to 0, no limit will be applied. + * @since v0.7.0 + */ + maxHeadersCount: number | null; + /** + * The maximum number of requests socket can handle + * before closing keep alive connection. + * + * A value of `0` will disable the limit. + * + * When the limit is reached it will set the `Connection` header value to `close`, + * but will not actually close the connection, subsequent requests sent + * after the limit is reached will get `503 Service Unavailable` as a response. + * @since v16.10.0 + */ + maxRequestsPerSocket: number | null; + /** + * The number of milliseconds of inactivity before a socket is presumed + * to have timed out. + * + * A value of `0` will disable the timeout behavior on incoming connections. + * + * The socket timeout logic is set up on connection, so changing this + * value only affects new connections to the server, not any existing connections. + * @since v0.9.12 + */ + timeout: number; + /** + * Limit the amount of time the parser will wait to receive the complete HTTP + * headers. + * + * If the timeout expires, the server responds with status 408 without + * forwarding the request to the request listener and then closes the connection. + * + * It must be set to a non-zero value (e.g. 120 seconds) to protect against + * potential Denial-of-Service attacks in case the server is deployed without a + * reverse proxy in front. + * @since v11.3.0, v10.14.0 + */ + headersTimeout: number; + /** + * The number of milliseconds of inactivity a server needs to wait for additional + * incoming data, after it has finished writing the last response, before a socket + * will be destroyed. If the server receives new data before the keep-alive + * timeout has fired, it will reset the regular inactivity timeout, i.e.,`server.timeout`. + * + * A value of `0` will disable the keep-alive timeout behavior on incoming + * connections. + * A value of `0` makes the http server behave similarly to Node.js versions prior + * to 8.0.0, which did not have a keep-alive timeout. + * + * The socket timeout logic is set up on connection, so changing this value only + * affects new connections to the server, not any existing connections. + * @since v8.0.0 + */ + keepAliveTimeout: number; + /** + * Sets the timeout value in milliseconds for receiving the entire request from + * the client. + * + * If the timeout expires, the server responds with status 408 without + * forwarding the request to the request listener and then closes the connection. + * + * It must be set to a non-zero value (e.g. 120 seconds) to protect against + * potential Denial-of-Service attacks in case the server is deployed without a + * reverse proxy in front. + * @since v14.11.0 + */ + requestTimeout: number; + /** + * Closes all connections connected to this server. + * @since v18.2.0 + */ + closeAllConnections(): void; + /** + * Closes all connections connected to this server which are not sending a request + * or waiting for a response. + * @since v18.2.0 + */ + closeIdleConnections(): void; + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "connection", listener: (socket: Socket) => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "listening", listener: () => void): this; + addListener(event: "checkContinue", listener: RequestListener): this; + addListener(event: "checkExpectation", listener: RequestListener): this; + addListener(event: "clientError", listener: (err: Error, socket: stream.Duplex) => void): this; + addListener( + event: "connect", + listener: (req: InstanceType, socket: stream.Duplex, head: Buffer) => void, + ): this; + addListener(event: "dropRequest", listener: (req: InstanceType, socket: stream.Duplex) => void): this; + addListener(event: "request", listener: RequestListener): this; + addListener( + event: "upgrade", + listener: (req: InstanceType, socket: stream.Duplex, head: Buffer) => void, + ): this; + emit(event: string, ...args: any[]): boolean; + emit(event: "close"): boolean; + emit(event: "connection", socket: Socket): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "listening"): boolean; + emit( + event: "checkContinue", + req: InstanceType, + res: InstanceType & { req: InstanceType }, + ): boolean; + emit( + event: "checkExpectation", + req: InstanceType, + res: InstanceType & { req: InstanceType }, + ): boolean; + emit(event: "clientError", err: Error, socket: stream.Duplex): boolean; + emit(event: "connect", req: InstanceType, socket: stream.Duplex, head: Buffer): boolean; + emit(event: "dropRequest", req: InstanceType, socket: stream.Duplex): boolean; + emit( + event: "request", + req: InstanceType, + res: InstanceType & { req: InstanceType }, + ): boolean; + emit(event: "upgrade", req: InstanceType, socket: stream.Duplex, head: Buffer): boolean; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "close", listener: () => void): this; + on(event: "connection", listener: (socket: Socket) => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "listening", listener: () => void): this; + on(event: "checkContinue", listener: RequestListener): this; + on(event: "checkExpectation", listener: RequestListener): this; + on(event: "clientError", listener: (err: Error, socket: stream.Duplex) => void): this; + on(event: "connect", listener: (req: InstanceType, socket: stream.Duplex, head: Buffer) => void): this; + on(event: "dropRequest", listener: (req: InstanceType, socket: stream.Duplex) => void): this; + on(event: "request", listener: RequestListener): this; + on(event: "upgrade", listener: (req: InstanceType, socket: stream.Duplex, head: Buffer) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "connection", listener: (socket: Socket) => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "listening", listener: () => void): this; + once(event: "checkContinue", listener: RequestListener): this; + once(event: "checkExpectation", listener: RequestListener): this; + once(event: "clientError", listener: (err: Error, socket: stream.Duplex) => void): this; + once( + event: "connect", + listener: (req: InstanceType, socket: stream.Duplex, head: Buffer) => void, + ): this; + once(event: "dropRequest", listener: (req: InstanceType, socket: stream.Duplex) => void): this; + once(event: "request", listener: RequestListener): this; + once( + event: "upgrade", + listener: (req: InstanceType, socket: stream.Duplex, head: Buffer) => void, + ): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "connection", listener: (socket: Socket) => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "listening", listener: () => void): this; + prependListener(event: "checkContinue", listener: RequestListener): this; + prependListener(event: "checkExpectation", listener: RequestListener): this; + prependListener(event: "clientError", listener: (err: Error, socket: stream.Duplex) => void): this; + prependListener( + event: "connect", + listener: (req: InstanceType, socket: stream.Duplex, head: Buffer) => void, + ): this; + prependListener( + event: "dropRequest", + listener: (req: InstanceType, socket: stream.Duplex) => void, + ): this; + prependListener(event: "request", listener: RequestListener): this; + prependListener( + event: "upgrade", + listener: (req: InstanceType, socket: stream.Duplex, head: Buffer) => void, + ): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "connection", listener: (socket: Socket) => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "listening", listener: () => void): this; + prependOnceListener(event: "checkContinue", listener: RequestListener): this; + prependOnceListener(event: "checkExpectation", listener: RequestListener): this; + prependOnceListener(event: "clientError", listener: (err: Error, socket: stream.Duplex) => void): this; + prependOnceListener( + event: "connect", + listener: (req: InstanceType, socket: stream.Duplex, head: Buffer) => void, + ): this; + prependOnceListener( + event: "dropRequest", + listener: (req: InstanceType, socket: stream.Duplex) => void, + ): this; + prependOnceListener(event: "request", listener: RequestListener): this; + prependOnceListener( + event: "upgrade", + listener: (req: InstanceType, socket: stream.Duplex, head: Buffer) => void, + ): this; + } + /** + * This class serves as the parent class of {@link ClientRequest} and {@link ServerResponse}. It is an abstract outgoing message from + * the perspective of the participants of an HTTP transaction. + * @since v0.1.17 + */ + class OutgoingMessage extends stream.Writable { + readonly req: Request; + chunkedEncoding: boolean; + shouldKeepAlive: boolean; + useChunkedEncodingByDefault: boolean; + sendDate: boolean; + /** + * @deprecated Use `writableEnded` instead. + */ + finished: boolean; + /** + * Read-only. `true` if the headers were sent, otherwise `false`. + * @since v0.9.3 + */ + readonly headersSent: boolean; + /** + * Alias of `outgoingMessage.socket`. + * @since v0.3.0 + * @deprecated Since v15.12.0,v14.17.1 - Use `socket` instead. + */ + readonly connection: Socket | null; + /** + * Reference to the underlying socket. Usually, users will not want to access + * this property. + * + * After calling `outgoingMessage.end()`, this property will be nulled. + * @since v0.3.0 + */ + readonly socket: Socket | null; + constructor(); + /** + * Once a socket is associated with the message and is connected,`socket.setTimeout()` will be called with `msecs` as the first parameter. + * @since v0.9.12 + * @param callback Optional function to be called when a timeout occurs. Same as binding to the `timeout` event. + */ + setTimeout(msecs: number, callback?: () => void): this; + /** + * Sets a single header value. If the header already exists in the to-be-sent + * headers, its value will be replaced. Use an array of strings to send multiple + * headers with the same name. + * @since v0.4.0 + * @param name Header name + * @param value Header value + */ + setHeader(name: string, value: number | string | readonly string[]): this; + /** + * Append a single header value for the header object. + * + * If the value is an array, this is equivalent of calling this method multiple + * times. + * + * If there were no previous value for the header, this is equivalent of calling `outgoingMessage.setHeader(name, value)`. + * + * Depending of the value of `options.uniqueHeaders` when the client request or the + * server were created, this will end up in the header being sent multiple times or + * a single time with values joined using `; `. + * @since v18.3.0, v16.17.0 + * @param name Header name + * @param value Header value + */ + appendHeader(name: string, value: string | readonly string[]): this; + /** + * Gets the value of the HTTP header with the given name. If that header is not + * set, the returned value will be `undefined`. + * @since v0.4.0 + * @param name Name of header + */ + getHeader(name: string): number | string | string[] | undefined; + /** + * Returns a shallow copy of the current outgoing headers. Since a shallow + * copy is used, array values may be mutated without additional calls to + * various header-related HTTP module methods. The keys of the returned + * object are the header names and the values are the respective header + * values. All header names are lowercase. + * + * The object returned by the `outgoingMessage.getHeaders()` method does + * not prototypically inherit from the JavaScript `Object`. This means that + * typical `Object` methods such as `obj.toString()`, `obj.hasOwnProperty()`, + * and others are not defined and will not work. + * + * ```js + * outgoingMessage.setHeader('Foo', 'bar'); + * outgoingMessage.setHeader('Set-Cookie', ['foo=bar', 'bar=baz']); + * + * const headers = outgoingMessage.getHeaders(); + * // headers === { foo: 'bar', 'set-cookie': ['foo=bar', 'bar=baz'] } + * ``` + * @since v7.7.0 + */ + getHeaders(): OutgoingHttpHeaders; + /** + * Returns an array containing the unique names of the current outgoing headers. + * All names are lowercase. + * @since v7.7.0 + */ + getHeaderNames(): string[]; + /** + * Returns `true` if the header identified by `name` is currently set in the + * outgoing headers. The header name is case-insensitive. + * + * ```js + * const hasContentType = outgoingMessage.hasHeader('content-type'); + * ``` + * @since v7.7.0 + */ + hasHeader(name: string): boolean; + /** + * Removes a header that is queued for implicit sending. + * + * ```js + * outgoingMessage.removeHeader('Content-Encoding'); + * ``` + * @since v0.4.0 + * @param name Header name + */ + removeHeader(name: string): void; + /** + * Adds HTTP trailers (headers but at the end of the message) to the message. + * + * Trailers will **only** be emitted if the message is chunked encoded. If not, + * the trailers will be silently discarded. + * + * HTTP requires the `Trailer` header to be sent to emit trailers, + * with a list of header field names in its value, e.g. + * + * ```js + * message.writeHead(200, { 'Content-Type': 'text/plain', + * 'Trailer': 'Content-MD5' }); + * message.write(fileData); + * message.addTrailers({ 'Content-MD5': '7895bf4b8828b55ceaf47747b4bca667' }); + * message.end(); + * ``` + * + * Attempting to set a header field name or value that contains invalid characters + * will result in a `TypeError` being thrown. + * @since v0.3.0 + */ + addTrailers(headers: OutgoingHttpHeaders | ReadonlyArray<[string, string]>): void; + /** + * Flushes the message headers. + * + * For efficiency reason, Node.js normally buffers the message headers + * until `outgoingMessage.end()` is called or the first chunk of message data + * is written. It then tries to pack the headers and data into a single TCP + * packet. + * + * It is usually desired (it saves a TCP round-trip), but not when the first + * data is not sent until possibly much later. `outgoingMessage.flushHeaders()`bypasses the optimization and kickstarts the message. + * @since v1.6.0 + */ + flushHeaders(): void; + } + /** + * This object is created internally by an HTTP server, not by the user. It is + * passed as the second parameter to the `'request'` event. + * @since v0.1.17 + */ + class ServerResponse extends OutgoingMessage { + /** + * When using implicit headers (not calling `response.writeHead()` explicitly), + * this property controls the status code that will be sent to the client when + * the headers get flushed. + * + * ```js + * response.statusCode = 404; + * ``` + * + * After response header was sent to the client, this property indicates the + * status code which was sent out. + * @since v0.4.0 + */ + statusCode: number; + /** + * When using implicit headers (not calling `response.writeHead()` explicitly), + * this property controls the status message that will be sent to the client when + * the headers get flushed. If this is left as `undefined` then the standard + * message for the status code will be used. + * + * ```js + * response.statusMessage = 'Not found'; + * ``` + * + * After response header was sent to the client, this property indicates the + * status message which was sent out. + * @since v0.11.8 + */ + statusMessage: string; + /** + * If set to `true`, Node.js will check whether the `Content-Length`header value and the size of the body, in bytes, are equal. + * Mismatching the `Content-Length` header value will result + * in an `Error` being thrown, identified by `code:``'ERR_HTTP_CONTENT_LENGTH_MISMATCH'`. + * @since v18.10.0, v16.18.0 + */ + strictContentLength: boolean; + constructor(req: Request); + assignSocket(socket: Socket): void; + detachSocket(socket: Socket): void; + /** + * Sends an HTTP/1.1 100 Continue message to the client, indicating that + * the request body should be sent. See the `'checkContinue'` event on`Server`. + * @since v0.3.0 + */ + writeContinue(callback?: () => void): void; + /** + * Sends an HTTP/1.1 103 Early Hints message to the client with a Link header, + * indicating that the user agent can preload/preconnect the linked resources. + * The `hints` is an object containing the values of headers to be sent with + * early hints message. The optional `callback` argument will be called when + * the response message has been written. + * + * **Example** + * + * ```js + * const earlyHintsLink = '; rel=preload; as=style'; + * response.writeEarlyHints({ + * 'link': earlyHintsLink, + * }); + * + * const earlyHintsLinks = [ + * '; rel=preload; as=style', + * '; rel=preload; as=script', + * ]; + * response.writeEarlyHints({ + * 'link': earlyHintsLinks, + * 'x-trace-id': 'id for diagnostics', + * }); + * + * const earlyHintsCallback = () => console.log('early hints message sent'); + * response.writeEarlyHints({ + * 'link': earlyHintsLinks, + * }, earlyHintsCallback); + * ``` + * @since v18.11.0 + * @param hints An object containing the values of headers + * @param callback Will be called when the response message has been written + */ + writeEarlyHints(hints: Record, callback?: () => void): void; + /** + * Sends a response header to the request. The status code is a 3-digit HTTP + * status code, like `404`. The last argument, `headers`, are the response headers. + * Optionally one can give a human-readable `statusMessage` as the second + * argument. + * + * `headers` may be an `Array` where the keys and values are in the same list. + * It is _not_ a list of tuples. So, the even-numbered offsets are key values, + * and the odd-numbered offsets are the associated values. The array is in the same + * format as `request.rawHeaders`. + * + * Returns a reference to the `ServerResponse`, so that calls can be chained. + * + * ```js + * const body = 'hello world'; + * response + * .writeHead(200, { + * 'Content-Length': Buffer.byteLength(body), + * 'Content-Type': 'text/plain', + * }) + * .end(body); + * ``` + * + * This method must only be called once on a message and it must + * be called before `response.end()` is called. + * + * If `response.write()` or `response.end()` are called before calling + * this, the implicit/mutable headers will be calculated and call this function. + * + * When headers have been set with `response.setHeader()`, they will be merged + * with any headers passed to `response.writeHead()`, with the headers passed + * to `response.writeHead()` given precedence. + * + * If this method is called and `response.setHeader()` has not been called, + * it will directly write the supplied header values onto the network channel + * without caching internally, and the `response.getHeader()` on the header + * will not yield the expected result. If progressive population of headers is + * desired with potential future retrieval and modification, use `response.setHeader()` instead. + * + * ```js + * // Returns content-type = text/plain + * const server = http.createServer((req, res) => { + * res.setHeader('Content-Type', 'text/html'); + * res.setHeader('X-Foo', 'bar'); + * res.writeHead(200, { 'Content-Type': 'text/plain' }); + * res.end('ok'); + * }); + * ``` + * + * `Content-Length` is read in bytes, not characters. Use `Buffer.byteLength()` to determine the length of the body in bytes. Node.js + * will check whether `Content-Length` and the length of the body which has + * been transmitted are equal or not. + * + * Attempting to set a header field name or value that contains invalid characters + * will result in a \[`Error`\]\[\] being thrown. + * @since v0.1.30 + */ + writeHead( + statusCode: number, + statusMessage?: string, + headers?: OutgoingHttpHeaders | OutgoingHttpHeader[], + ): this; + writeHead(statusCode: number, headers?: OutgoingHttpHeaders | OutgoingHttpHeader[]): this; + /** + * Sends a HTTP/1.1 102 Processing message to the client, indicating that + * the request body should be sent. + * @since v10.0.0 + */ + writeProcessing(): void; + } + interface InformationEvent { + statusCode: number; + statusMessage: string; + httpVersion: string; + httpVersionMajor: number; + httpVersionMinor: number; + headers: IncomingHttpHeaders; + rawHeaders: string[]; + } + /** + * This object is created internally and returned from {@link request}. It + * represents an _in-progress_ request whose header has already been queued. The + * header is still mutable using the `setHeader(name, value)`,`getHeader(name)`, `removeHeader(name)` API. The actual header will + * be sent along with the first data chunk or when calling `request.end()`. + * + * To get the response, add a listener for `'response'` to the request object.`'response'` will be emitted from the request object when the response + * headers have been received. The `'response'` event is executed with one + * argument which is an instance of {@link IncomingMessage}. + * + * During the `'response'` event, one can add listeners to the + * response object; particularly to listen for the `'data'` event. + * + * If no `'response'` handler is added, then the response will be + * entirely discarded. However, if a `'response'` event handler is added, + * then the data from the response object **must** be consumed, either by + * calling `response.read()` whenever there is a `'readable'` event, or + * by adding a `'data'` handler, or by calling the `.resume()` method. + * Until the data is consumed, the `'end'` event will not fire. Also, until + * the data is read it will consume memory that can eventually lead to a + * 'process out of memory' error. + * + * For backward compatibility, `res` will only emit `'error'` if there is an`'error'` listener registered. + * + * Set `Content-Length` header to limit the response body size. + * If `response.strictContentLength` is set to `true`, mismatching the`Content-Length` header value will result in an `Error` being thrown, + * identified by `code:``'ERR_HTTP_CONTENT_LENGTH_MISMATCH'`. + * + * `Content-Length` value should be in bytes, not characters. Use `Buffer.byteLength()` to determine the length of the body in bytes. + * @since v0.1.17 + */ + class ClientRequest extends OutgoingMessage { + /** + * The `request.aborted` property will be `true` if the request has + * been aborted. + * @since v0.11.14 + * @deprecated Since v17.0.0,v16.12.0 - Check `destroyed` instead. + */ + aborted: boolean; + /** + * The request host. + * @since v14.5.0, v12.19.0 + */ + host: string; + /** + * The request protocol. + * @since v14.5.0, v12.19.0 + */ + protocol: string; + /** + * When sending request through a keep-alive enabled agent, the underlying socket + * might be reused. But if server closes connection at unfortunate time, client + * may run into a 'ECONNRESET' error. + * + * ```js + * import http from 'node:http'; + * + * // Server has a 5 seconds keep-alive timeout by default + * http + * .createServer((req, res) => { + * res.write('hello\n'); + * res.end(); + * }) + * .listen(3000); + * + * setInterval(() => { + * // Adapting a keep-alive agent + * http.get('http://localhost:3000', { agent }, (res) => { + * res.on('data', (data) => { + * // Do nothing + * }); + * }); + * }, 5000); // Sending request on 5s interval so it's easy to hit idle timeout + * ``` + * + * By marking a request whether it reused socket or not, we can do + * automatic error retry base on it. + * + * ```js + * import http from 'node:http'; + * const agent = new http.Agent({ keepAlive: true }); + * + * function retriableRequest() { + * const req = http + * .get('http://localhost:3000', { agent }, (res) => { + * // ... + * }) + * .on('error', (err) => { + * // Check if retry is needed + * if (req.reusedSocket && err.code === 'ECONNRESET') { + * retriableRequest(); + * } + * }); + * } + * + * retriableRequest(); + * ``` + * @since v13.0.0, v12.16.0 + */ + reusedSocket: boolean; + /** + * Limits maximum response headers count. If set to 0, no limit will be applied. + */ + maxHeadersCount: number; + constructor(url: string | URL | ClientRequestArgs, cb?: (res: IncomingMessage) => void); + /** + * The request method. + * @since v0.1.97 + */ + method: string; + /** + * The request path. + * @since v0.4.0 + */ + path: string; + /** + * Marks the request as aborting. Calling this will cause remaining data + * in the response to be dropped and the socket to be destroyed. + * @since v0.3.8 + * @deprecated Since v14.1.0,v13.14.0 - Use `destroy` instead. + */ + abort(): void; + onSocket(socket: Socket): void; + /** + * Once a socket is assigned to this request and is connected `socket.setTimeout()` will be called. + * @since v0.5.9 + * @param timeout Milliseconds before a request times out. + * @param callback Optional function to be called when a timeout occurs. Same as binding to the `'timeout'` event. + */ + setTimeout(timeout: number, callback?: () => void): this; + /** + * Once a socket is assigned to this request and is connected `socket.setNoDelay()` will be called. + * @since v0.5.9 + */ + setNoDelay(noDelay?: boolean): void; + /** + * Once a socket is assigned to this request and is connected `socket.setKeepAlive()` will be called. + * @since v0.5.9 + */ + setSocketKeepAlive(enable?: boolean, initialDelay?: number): void; + /** + * Returns an array containing the unique names of the current outgoing raw + * headers. Header names are returned with their exact casing being set. + * + * ```js + * request.setHeader('Foo', 'bar'); + * request.setHeader('Set-Cookie', ['foo=bar', 'bar=baz']); + * + * const headerNames = request.getRawHeaderNames(); + * // headerNames === ['Foo', 'Set-Cookie'] + * ``` + * @since v15.13.0, v14.17.0 + */ + getRawHeaderNames(): string[]; + /** + * @deprecated + */ + addListener(event: "abort", listener: () => void): this; + addListener( + event: "connect", + listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void, + ): this; + addListener(event: "continue", listener: () => void): this; + addListener(event: "information", listener: (info: InformationEvent) => void): this; + addListener(event: "response", listener: (response: IncomingMessage) => void): this; + addListener(event: "socket", listener: (socket: Socket) => void): this; + addListener(event: "timeout", listener: () => void): this; + addListener( + event: "upgrade", + listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void, + ): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "drain", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "finish", listener: () => void): this; + addListener(event: "pipe", listener: (src: stream.Readable) => void): this; + addListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + /** + * @deprecated + */ + on(event: "abort", listener: () => void): this; + on(event: "connect", listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this; + on(event: "continue", listener: () => void): this; + on(event: "information", listener: (info: InformationEvent) => void): this; + on(event: "response", listener: (response: IncomingMessage) => void): this; + on(event: "socket", listener: (socket: Socket) => void): this; + on(event: "timeout", listener: () => void): this; + on(event: "upgrade", listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this; + on(event: "close", listener: () => void): this; + on(event: "drain", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "finish", listener: () => void): this; + on(event: "pipe", listener: (src: stream.Readable) => void): this; + on(event: "unpipe", listener: (src: stream.Readable) => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + /** + * @deprecated + */ + once(event: "abort", listener: () => void): this; + once(event: "connect", listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this; + once(event: "continue", listener: () => void): this; + once(event: "information", listener: (info: InformationEvent) => void): this; + once(event: "response", listener: (response: IncomingMessage) => void): this; + once(event: "socket", listener: (socket: Socket) => void): this; + once(event: "timeout", listener: () => void): this; + once(event: "upgrade", listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this; + once(event: "close", listener: () => void): this; + once(event: "drain", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "finish", listener: () => void): this; + once(event: "pipe", listener: (src: stream.Readable) => void): this; + once(event: "unpipe", listener: (src: stream.Readable) => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + /** + * @deprecated + */ + prependListener(event: "abort", listener: () => void): this; + prependListener( + event: "connect", + listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void, + ): this; + prependListener(event: "continue", listener: () => void): this; + prependListener(event: "information", listener: (info: InformationEvent) => void): this; + prependListener(event: "response", listener: (response: IncomingMessage) => void): this; + prependListener(event: "socket", listener: (socket: Socket) => void): this; + prependListener(event: "timeout", listener: () => void): this; + prependListener( + event: "upgrade", + listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void, + ): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "drain", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "finish", listener: () => void): this; + prependListener(event: "pipe", listener: (src: stream.Readable) => void): this; + prependListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + /** + * @deprecated + */ + prependOnceListener(event: "abort", listener: () => void): this; + prependOnceListener( + event: "connect", + listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void, + ): this; + prependOnceListener(event: "continue", listener: () => void): this; + prependOnceListener(event: "information", listener: (info: InformationEvent) => void): this; + prependOnceListener(event: "response", listener: (response: IncomingMessage) => void): this; + prependOnceListener(event: "socket", listener: (socket: Socket) => void): this; + prependOnceListener(event: "timeout", listener: () => void): this; + prependOnceListener( + event: "upgrade", + listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void, + ): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "drain", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "finish", listener: () => void): this; + prependOnceListener(event: "pipe", listener: (src: stream.Readable) => void): this; + prependOnceListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + /** + * An `IncomingMessage` object is created by {@link Server} or {@link ClientRequest} and passed as the first argument to the `'request'` and `'response'` event respectively. It may be used to + * access response + * status, headers, and data. + * + * Different from its `socket` value which is a subclass of `stream.Duplex`, the`IncomingMessage` itself extends `stream.Readable` and is created separately to + * parse and emit the incoming HTTP headers and payload, as the underlying socket + * may be reused multiple times in case of keep-alive. + * @since v0.1.17 + */ + class IncomingMessage extends stream.Readable { + constructor(socket: Socket); + /** + * The `message.aborted` property will be `true` if the request has + * been aborted. + * @since v10.1.0 + * @deprecated Since v17.0.0,v16.12.0 - Check `message.destroyed` from stream.Readable. + */ + aborted: boolean; + /** + * In case of server request, the HTTP version sent by the client. In the case of + * client response, the HTTP version of the connected-to server. + * Probably either `'1.1'` or `'1.0'`. + * + * Also `message.httpVersionMajor` is the first integer and`message.httpVersionMinor` is the second. + * @since v0.1.1 + */ + httpVersion: string; + httpVersionMajor: number; + httpVersionMinor: number; + /** + * The `message.complete` property will be `true` if a complete HTTP message has + * been received and successfully parsed. + * + * This property is particularly useful as a means of determining if a client or + * server fully transmitted a message before a connection was terminated: + * + * ```js + * const req = http.request({ + * host: '127.0.0.1', + * port: 8080, + * method: 'POST', + * }, (res) => { + * res.resume(); + * res.on('end', () => { + * if (!res.complete) + * console.error( + * 'The connection was terminated while the message was still being sent'); + * }); + * }); + * ``` + * @since v0.3.0 + */ + complete: boolean; + /** + * Alias for `message.socket`. + * @since v0.1.90 + * @deprecated Since v16.0.0 - Use `socket`. + */ + connection: Socket; + /** + * The `net.Socket` object associated with the connection. + * + * With HTTPS support, use `request.socket.getPeerCertificate()` to obtain the + * client's authentication details. + * + * This property is guaranteed to be an instance of the `net.Socket` class, + * a subclass of `stream.Duplex`, unless the user specified a socket + * type other than `net.Socket` or internally nulled. + * @since v0.3.0 + */ + socket: Socket; + /** + * The request/response headers object. + * + * Key-value pairs of header names and values. Header names are lower-cased. + * + * ```js + * // Prints something like: + * // + * // { 'user-agent': 'curl/7.22.0', + * // host: '127.0.0.1:8000', + * // accept: '*' } + * console.log(request.headers); + * ``` + * + * Duplicates in raw headers are handled in the following ways, depending on the + * header name: + * + * * Duplicates of `age`, `authorization`, `content-length`, `content-type`,`etag`, `expires`, `from`, `host`, `if-modified-since`, `if-unmodified-since`,`last-modified`, `location`, + * `max-forwards`, `proxy-authorization`, `referer`,`retry-after`, `server`, or `user-agent` are discarded. + * To allow duplicate values of the headers listed above to be joined, + * use the option `joinDuplicateHeaders` in {@link request} and {@link createServer}. See RFC 9110 Section 5.3 for more + * information. + * * `set-cookie` is always an array. Duplicates are added to the array. + * * For duplicate `cookie` headers, the values are joined together with `; `. + * * For all other headers, the values are joined together with `, `. + * @since v0.1.5 + */ + headers: IncomingHttpHeaders; + /** + * Similar to `message.headers`, but there is no join logic and the values are + * always arrays of strings, even for headers received just once. + * + * ```js + * // Prints something like: + * // + * // { 'user-agent': ['curl/7.22.0'], + * // host: ['127.0.0.1:8000'], + * // accept: ['*'] } + * console.log(request.headersDistinct); + * ``` + * @since v18.3.0, v16.17.0 + */ + headersDistinct: NodeJS.Dict; + /** + * The raw request/response headers list exactly as they were received. + * + * The keys and values are in the same list. It is _not_ a + * list of tuples. So, the even-numbered offsets are key values, and the + * odd-numbered offsets are the associated values. + * + * Header names are not lowercased, and duplicates are not merged. + * + * ```js + * // Prints something like: + * // + * // [ 'user-agent', + * // 'this is invalid because there can be only one', + * // 'User-Agent', + * // 'curl/7.22.0', + * // 'Host', + * // '127.0.0.1:8000', + * // 'ACCEPT', + * // '*' ] + * console.log(request.rawHeaders); + * ``` + * @since v0.11.6 + */ + rawHeaders: string[]; + /** + * The request/response trailers object. Only populated at the `'end'` event. + * @since v0.3.0 + */ + trailers: NodeJS.Dict; + /** + * Similar to `message.trailers`, but there is no join logic and the values are + * always arrays of strings, even for headers received just once. + * Only populated at the `'end'` event. + * @since v18.3.0, v16.17.0 + */ + trailersDistinct: NodeJS.Dict; + /** + * The raw request/response trailer keys and values exactly as they were + * received. Only populated at the `'end'` event. + * @since v0.11.6 + */ + rawTrailers: string[]; + /** + * Calls `message.socket.setTimeout(msecs, callback)`. + * @since v0.5.9 + */ + setTimeout(msecs: number, callback?: () => void): this; + /** + * **Only valid for request obtained from {@link Server}.** + * + * The request method as a string. Read only. Examples: `'GET'`, `'DELETE'`. + * @since v0.1.1 + */ + method?: string | undefined; + /** + * **Only valid for request obtained from {@link Server}.** + * + * Request URL string. This contains only the URL that is present in the actual + * HTTP request. Take the following request: + * + * ```http + * GET /status?name=ryan HTTP/1.1 + * Accept: text/plain + * ``` + * + * To parse the URL into its parts: + * + * ```js + * new URL(request.url, `http://${request.headers.host}`); + * ``` + * + * When `request.url` is `'/status?name=ryan'` and `request.headers.host` is`'localhost:3000'`: + * + * ```console + * $ node + * > new URL(request.url, `http://${request.headers.host}`) + * URL { + * href: 'http://localhost:3000/status?name=ryan', + * origin: 'http://localhost:3000', + * protocol: 'http:', + * username: '', + * password: '', + * host: 'localhost:3000', + * hostname: 'localhost', + * port: '3000', + * pathname: '/status', + * search: '?name=ryan', + * searchParams: URLSearchParams { 'name' => 'ryan' }, + * hash: '' + * } + * ``` + * @since v0.1.90 + */ + url?: string | undefined; + /** + * **Only valid for response obtained from {@link ClientRequest}.** + * + * The 3-digit HTTP response status code. E.G. `404`. + * @since v0.1.1 + */ + statusCode?: number | undefined; + /** + * **Only valid for response obtained from {@link ClientRequest}.** + * + * The HTTP response status message (reason phrase). E.G. `OK` or `Internal Server Error`. + * @since v0.11.10 + */ + statusMessage?: string | undefined; + /** + * Calls `destroy()` on the socket that received the `IncomingMessage`. If `error`is provided, an `'error'` event is emitted on the socket and `error` is passed + * as an argument to any listeners on the event. + * @since v0.3.0 + */ + destroy(error?: Error): this; + } + interface AgentOptions extends Partial { + /** + * Keep sockets around in a pool to be used by other requests in the future. Default = false + */ + keepAlive?: boolean | undefined; + /** + * When using HTTP KeepAlive, how often to send TCP KeepAlive packets over sockets being kept alive. Default = 1000. + * Only relevant if keepAlive is set to true. + */ + keepAliveMsecs?: number | undefined; + /** + * Maximum number of sockets to allow per host. Default for Node 0.10 is 5, default for Node 0.12 is Infinity + */ + maxSockets?: number | undefined; + /** + * Maximum number of sockets allowed for all hosts in total. Each request will use a new socket until the maximum is reached. Default: Infinity. + */ + maxTotalSockets?: number | undefined; + /** + * Maximum number of sockets to leave open in a free state. Only relevant if keepAlive is set to true. Default = 256. + */ + maxFreeSockets?: number | undefined; + /** + * Socket timeout in milliseconds. This will set the timeout after the socket is connected. + */ + timeout?: number | undefined; + /** + * Scheduling strategy to apply when picking the next free socket to use. + * @default `lifo` + */ + scheduling?: "fifo" | "lifo" | undefined; + } + /** + * An `Agent` is responsible for managing connection persistence + * and reuse for HTTP clients. It maintains a queue of pending requests + * 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`. + * + * 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 + * pool and a new connection will be made when a new HTTP request is made for + * that host and port. Servers may also refuse to allow multiple requests + * over the same connection, in which case the connection will have to be + * remade for every request and cannot be pooled. The `Agent` will still make + * the requests to that server, but each one will occur over a new connection. + * + * When a connection is closed by the client or the server, it is removed + * from the pool. Any unused sockets in the pool will be unrefed so as not + * to keep the Node.js process running when there are no outstanding requests. + * (see `socket.unref()`). + * + * It is good practice, to `destroy()` an `Agent` instance when it is no + * longer in use, because unused sockets consume OS resources. + * + * Sockets are removed from an agent when the socket emits either + * a `'close'` event or an `'agentRemove'` event. When intending to keep one + * HTTP request open for a long time without keeping it in the agent, something + * like the following may be done: + * + * ```js + * http.get(options, (res) => { + * // Do stuff + * }).on('socket', (socket) => { + * socket.emit('agentRemove'); + * }); + * ``` + * + * An agent may also be used for an individual request. By providing`{agent: false}` as an option to the `http.get()` or `http.request()`functions, a one-time use `Agent` with default options + * will be used + * for the client connection. + * + * `agent:false`: + * + * ```js + * http.get({ + * hostname: 'localhost', + * port: 80, + * path: '/', + * agent: false, // Create a new agent just for this one request + * }, (res) => { + * // Do stuff with response + * }); + * ``` + * @since v0.3.4 + */ + class Agent extends EventEmitter { + /** + * By default set to 256. For agents with `keepAlive` enabled, this + * sets the maximum number of sockets that will be left open in the free + * state. + * @since v0.11.7 + */ + maxFreeSockets: number; + /** + * By default set to `Infinity`. Determines how many concurrent sockets the agent + * can have open per origin. Origin is the returned value of `agent.getName()`. + * @since v0.3.6 + */ + maxSockets: number; + /** + * By default set to `Infinity`. Determines how many concurrent sockets the agent + * can have open. Unlike `maxSockets`, this parameter applies across all origins. + * @since v14.5.0, v12.19.0 + */ + maxTotalSockets: number; + /** + * An object which contains arrays of sockets currently awaiting use by + * the agent when `keepAlive` is enabled. Do not modify. + * + * Sockets in the `freeSockets` list will be automatically destroyed and + * removed from the array on `'timeout'`. + * @since v0.11.4 + */ + readonly freeSockets: NodeJS.ReadOnlyDict; + /** + * An object which contains arrays of sockets currently in use by the + * agent. Do not modify. + * @since v0.3.6 + */ + readonly sockets: NodeJS.ReadOnlyDict; + /** + * An object which contains queues of requests that have not yet been assigned to + * sockets. Do not modify. + * @since v0.5.9 + */ + readonly requests: NodeJS.ReadOnlyDict; + constructor(opts?: AgentOptions); + /** + * Destroy any sockets that are currently in use by the agent. + * + * It is usually not necessary to do this. However, if using an + * agent with `keepAlive` enabled, then it is best to explicitly shut down + * the agent when it is no longer needed. Otherwise, + * sockets might stay open for quite a long time before the server + * terminates them. + * @since v0.11.4 + */ + destroy(): void; + } + const METHODS: string[]; + const STATUS_CODES: { + [errorCode: number]: string | undefined; + [errorCode: string]: string | undefined; + }; + /** + * Returns a new instance of {@link Server}. + * + * The `requestListener` is a function which is automatically + * added to the `'request'` event. + * + * ```js + * import http from 'node:http'; + * + * // Create a local server to receive data from + * const server = http.createServer((req, res) => { + * res.writeHead(200, { 'Content-Type': 'application/json' }); + * res.end(JSON.stringify({ + * data: 'Hello World!', + * })); + * }); + * + * server.listen(8000); + * ``` + * + * ```js + * import http from 'node:http'; + * + * // Create a local server to receive data from + * const server = http.createServer(); + * + * // Listen to the request event + * server.on('request', (request, res) => { + * res.writeHead(200, { 'Content-Type': 'application/json' }); + * res.end(JSON.stringify({ + * data: 'Hello World!', + * })); + * }); + * + * server.listen(8000); + * ``` + * @since v0.1.13 + */ + function createServer< + Request extends typeof IncomingMessage = typeof IncomingMessage, + Response extends typeof ServerResponse = typeof ServerResponse, + >(requestListener?: RequestListener): Server; + function createServer< + Request extends typeof IncomingMessage = typeof IncomingMessage, + Response extends typeof ServerResponse = typeof ServerResponse, + >( + options: ServerOptions, + requestListener?: RequestListener, + ): Server; + // although RequestOptions are passed as ClientRequestArgs to ClientRequest directly, + // create interface RequestOptions would make the naming more clear to developers + interface RequestOptions extends ClientRequestArgs {} + /** + * `options` in `socket.connect()` are also supported. + * + * Node.js maintains several connections per server to make HTTP requests. + * This function allows one to transparently issue requests. + * + * `url` can be a string or a `URL` object. If `url` is a + * string, it is automatically parsed with `new URL()`. If it is a `URL` object, it will be automatically converted to an ordinary `options` object. + * + * If both `url` and `options` are specified, the objects are merged, with the`options` properties taking precedence. + * + * The optional `callback` parameter will be added as a one-time listener for + * the `'response'` event. + * + * `http.request()` returns an instance of the {@link ClientRequest} class. The `ClientRequest` instance is a writable stream. If one needs to + * upload a file with a POST request, then write to the `ClientRequest` object. + * + * ```js + * import http from 'node:http'; + * import { Buffer } from 'node:buffer'; + * + * const postData = JSON.stringify({ + * 'msg': 'Hello World!', + * }); + * + * const options = { + * hostname: 'www.google.com', + * port: 80, + * path: '/upload', + * method: 'POST', + * headers: { + * 'Content-Type': 'application/json', + * 'Content-Length': Buffer.byteLength(postData), + * }, + * }; + * + * const req = http.request(options, (res) => { + * console.log(`STATUS: ${res.statusCode}`); + * console.log(`HEADERS: ${JSON.stringify(res.headers)}`); + * res.setEncoding('utf8'); + * res.on('data', (chunk) => { + * console.log(`BODY: ${chunk}`); + * }); + * res.on('end', () => { + * console.log('No more data in response.'); + * }); + * }); + * + * req.on('error', (e) => { + * console.error(`problem with request: ${e.message}`); + * }); + * + * // Write data to request body + * req.write(postData); + * req.end(); + * ``` + * + * In the example `req.end()` was called. With `http.request()` one + * must always call `req.end()` to signify the end of the request - + * even if there is no data being written to the request body. + * + * If any error is encountered during the request (be that with DNS resolution, + * TCP level errors, or actual HTTP parse errors) an `'error'` event is emitted + * on the returned request object. As with all `'error'` events, if no listeners + * are registered the error will be thrown. + * + * There are a few special headers that should be noted. + * + * * Sending a 'Connection: keep-alive' will notify Node.js that the connection to + * the server should be persisted until the next request. + * * Sending a 'Content-Length' header will disable the default chunked encoding. + * * Sending an 'Expect' header will immediately send the request headers. + * Usually, when sending 'Expect: 100-continue', both a timeout and a listener + * for the `'continue'` event should be set. See RFC 2616 Section 8.2.3 for more + * information. + * * Sending an Authorization header will override using the `auth` option + * to compute basic authentication. + * + * Example using a `URL` as `options`: + * + * ```js + * const options = new URL('http://abc:xyz@example.com'); + * + * const req = http.request(options, (res) => { + * // ... + * }); + * ``` + * + * In a successful request, the following events will be emitted in the following + * order: + * + * * `'socket'` + * * `'response'` + * * `'data'` any number of times, on the `res` object + * (`'data'` will not be emitted at all if the response body is empty, for + * instance, in most redirects) + * * `'end'` on the `res` object + * * `'close'` + * + * In the case of a connection error, the following events will be emitted: + * + * * `'socket'` + * * `'error'` + * * `'close'` + * + * In the case of a premature connection close before the response is received, + * the following events will be emitted in the following order: + * + * * `'socket'` + * * `'error'` with an error with message `'Error: socket hang up'` and code`'ECONNRESET'` + * * `'close'` + * + * In the case of a premature connection close after the response is received, + * the following events will be emitted in the following order: + * + * * `'socket'` + * * `'response'` + * * `'data'` any number of times, on the `res` object + * * (connection closed here) + * * `'aborted'` on the `res` object + * * `'error'` on the `res` object with an error with message`'Error: aborted'` and code `'ECONNRESET'` + * * `'close'` + * * `'close'` on the `res` object + * + * If `req.destroy()` is called before a socket is assigned, the following + * events will be emitted in the following order: + * + * * (`req.destroy()` called here) + * * `'error'` with an error with message `'Error: socket hang up'` and code`'ECONNRESET'`, or the error with which `req.destroy()` was called + * * `'close'` + * + * If `req.destroy()` is called before the connection succeeds, the following + * events will be emitted in the following order: + * + * * `'socket'` + * * (`req.destroy()` called here) + * * `'error'` with an error with message `'Error: socket hang up'` and code`'ECONNRESET'`, or the error with which `req.destroy()` was called + * * `'close'` + * + * If `req.destroy()` is called after the response is received, the following + * events will be emitted in the following order: + * + * * `'socket'` + * * `'response'` + * * `'data'` any number of times, on the `res` object + * * (`req.destroy()` called here) + * * `'aborted'` on the `res` object + * * `'error'` on the `res` object with an error with message `'Error: aborted'`and code `'ECONNRESET'`, or the error with which `req.destroy()` was called + * * `'close'` + * * `'close'` on the `res` object + * + * If `req.abort()` is called before a socket is assigned, the following + * events will be emitted in the following order: + * + * * (`req.abort()` called here) + * * `'abort'` + * * `'close'` + * + * If `req.abort()` is called before the connection succeeds, the following + * events will be emitted in the following order: + * + * * `'socket'` + * * (`req.abort()` called here) + * * `'abort'` + * * `'error'` with an error with message `'Error: socket hang up'` and code`'ECONNRESET'` + * * `'close'` + * + * If `req.abort()` is called after the response is received, the following + * events will be emitted in the following order: + * + * * `'socket'` + * * `'response'` + * * `'data'` any number of times, on the `res` object + * * (`req.abort()` called here) + * * `'abort'` + * * `'aborted'` on the `res` object + * * `'error'` on the `res` object with an error with message`'Error: aborted'` and code `'ECONNRESET'`. + * * `'close'` + * * `'close'` on the `res` object + * + * Setting the `timeout` option or using the `setTimeout()` function will + * not abort the request or do anything besides add a `'timeout'` event. + * + * Passing an `AbortSignal` and then calling `abort()` on the corresponding`AbortController` will behave the same way as calling `.destroy()` on the + * request. Specifically, the `'error'` event will be emitted with an error with + * the message `'AbortError: The operation was aborted'`, the code `'ABORT_ERR'`and the `cause`, if one was provided. + * @since v0.3.6 + */ + function request(options: RequestOptions | string | URL, callback?: (res: IncomingMessage) => void): ClientRequest; + function request( + url: string | URL, + options: RequestOptions, + callback?: (res: IncomingMessage) => void, + ): ClientRequest; + /** + * Since most requests are GET requests without bodies, Node.js provides this + * convenience method. The only difference between this method and {@link request} is that it sets the method to GET by default and calls `req.end()`automatically. The callback must take care to + * consume the response + * data for reasons stated in {@link ClientRequest} section. + * + * The `callback` is invoked with a single argument that is an instance of {@link IncomingMessage}. + * + * JSON fetching example: + * + * ```js + * http.get('http://localhost:8000/', (res) => { + * const { statusCode } = res; + * const contentType = res.headers['content-type']; + * + * let error; + * // Any 2xx status code signals a successful response but + * // here we're only checking for 200. + * if (statusCode !== 200) { + * error = new Error('Request Failed.\n' + + * `Status Code: ${statusCode}`); + * } else if (!/^application\/json/.test(contentType)) { + * error = new Error('Invalid content-type.\n' + + * `Expected application/json but received ${contentType}`); + * } + * if (error) { + * console.error(error.message); + * // Consume response data to free up memory + * res.resume(); + * return; + * } + * + * res.setEncoding('utf8'); + * let rawData = ''; + * res.on('data', (chunk) => { rawData += chunk; }); + * res.on('end', () => { + * try { + * const parsedData = JSON.parse(rawData); + * console.log(parsedData); + * } catch (e) { + * console.error(e.message); + * } + * }); + * }).on('error', (e) => { + * console.error(`Got error: ${e.message}`); + * }); + * + * // Create a local server to receive data from + * const server = http.createServer((req, res) => { + * res.writeHead(200, { 'Content-Type': 'application/json' }); + * res.end(JSON.stringify({ + * data: 'Hello World!', + * })); + * }); + * + * server.listen(8000); + * ``` + * @since v0.3.6 + * @param options Accepts the same `options` as {@link request}, with the method set to GET by default. + */ + function get(options: RequestOptions | string | URL, callback?: (res: IncomingMessage) => void): ClientRequest; + function get(url: string | URL, options: RequestOptions, callback?: (res: IncomingMessage) => void): ClientRequest; + /** + * Performs the low-level validations on the provided `name` that are done when`res.setHeader(name, value)` is called. + * + * Passing illegal value as `name` will result in a `TypeError` being thrown, + * identified by `code: 'ERR_INVALID_HTTP_TOKEN'`. + * + * It is not necessary to use this method before passing headers to an HTTP request + * or response. The HTTP module will automatically validate such headers. + * Examples: + * + * Example: + * + * ```js + * import { validateHeaderName } from 'node:http'; + * + * try { + * validateHeaderName(''); + * } catch (err) { + * console.error(err instanceof TypeError); // --> true + * console.error(err.code); // --> 'ERR_INVALID_HTTP_TOKEN' + * console.error(err.message); // --> 'Header name must be a valid HTTP token [""]' + * } + * ``` + * @since v14.3.0 + * @param [label='Header name'] Label for error message. + */ + function validateHeaderName(name: string): void; + /** + * Performs the low-level validations on the provided `value` that are done when`res.setHeader(name, value)` is called. + * + * Passing illegal value as `value` will result in a `TypeError` being thrown. + * + * * Undefined value error is identified by `code: 'ERR_HTTP_INVALID_HEADER_VALUE'`. + * * Invalid value character error is identified by `code: 'ERR_INVALID_CHAR'`. + * + * It is not necessary to use this method before passing headers to an HTTP request + * or response. The HTTP module will automatically validate such headers. + * + * Examples: + * + * ```js + * import { validateHeaderValue } from 'node:http'; + * + * try { + * validateHeaderValue('x-my-header', undefined); + * } catch (err) { + * console.error(err instanceof TypeError); // --> true + * console.error(err.code === 'ERR_HTTP_INVALID_HEADER_VALUE'); // --> true + * console.error(err.message); // --> 'Invalid value "undefined" for header "x-my-header"' + * } + * + * try { + * validateHeaderValue('x-my-header', 'oʊmɪɡə'); + * } catch (err) { + * console.error(err instanceof TypeError); // --> true + * console.error(err.code === 'ERR_INVALID_CHAR'); // --> true + * console.error(err.message); // --> 'Invalid character in header content ["x-my-header"]' + * } + * ``` + * @since v14.3.0 + * @param name Header name + * @param value Header value + */ + function validateHeaderValue(name: string, value: string): void; + /** + * Set the maximum number of idle HTTP parsers. + * @since v18.8.0, v16.18.0 + * @param [max=1000] + */ + function setMaxIdleHTTPParsers(max: number): void; + let globalAgent: Agent; + /** + * Read-only property specifying the maximum allowed size of HTTP headers in bytes. + * Defaults to 16KB. Configurable using the `--max-http-header-size` CLI option. + */ + const maxHeaderSize: number; +} +declare module "node:http" { + export * from "http"; +} diff --git a/task/node_modules/@types/node/ts4.8/http2.d.ts b/task/node_modules/@types/node/ts4.8/http2.d.ts new file mode 100644 index 0000000..c3b3e8e --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/http2.d.ts @@ -0,0 +1,2382 @@ +/** + * The `node:http2` module provides an implementation of the [HTTP/2](https://tools.ietf.org/html/rfc7540) protocol. + * It can be accessed using: + * + * ```js + * const http2 = require('node:http2'); + * ``` + * @since v8.4.0 + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/http2.js) + */ +declare module "http2" { + import EventEmitter = require("node:events"); + import * as fs from "node:fs"; + import * as net from "node:net"; + import * as stream from "node:stream"; + import * as tls from "node:tls"; + import * as url from "node:url"; + import { + IncomingHttpHeaders as Http1IncomingHttpHeaders, + IncomingMessage, + OutgoingHttpHeaders, + ServerResponse, + } from "node:http"; + export { OutgoingHttpHeaders } from "node:http"; + export interface IncomingHttpStatusHeader { + ":status"?: number | undefined; + } + export interface IncomingHttpHeaders extends Http1IncomingHttpHeaders { + ":path"?: string | undefined; + ":method"?: string | undefined; + ":authority"?: string | undefined; + ":scheme"?: string | undefined; + } + // Http2Stream + export interface StreamPriorityOptions { + exclusive?: boolean | undefined; + parent?: number | undefined; + weight?: number | undefined; + silent?: boolean | undefined; + } + export interface StreamState { + localWindowSize?: number | undefined; + state?: number | undefined; + localClose?: number | undefined; + remoteClose?: number | undefined; + sumDependencyWeight?: number | undefined; + weight?: number | undefined; + } + export interface ServerStreamResponseOptions { + endStream?: boolean | undefined; + waitForTrailers?: boolean | undefined; + } + export interface StatOptions { + offset: number; + length: number; + } + export interface ServerStreamFileResponseOptions { + // eslint-disable-next-line @typescript-eslint/no-invalid-void-type + statCheck?(stats: fs.Stats, headers: OutgoingHttpHeaders, statOptions: StatOptions): void | boolean; + waitForTrailers?: boolean | undefined; + offset?: number | undefined; + length?: number | undefined; + } + export interface ServerStreamFileResponseOptionsWithError extends ServerStreamFileResponseOptions { + onError?(err: NodeJS.ErrnoException): void; + } + export interface Http2Stream extends stream.Duplex { + /** + * Set to `true` if the `Http2Stream` instance was aborted abnormally. When set, + * the `'aborted'` event will have been emitted. + * @since v8.4.0 + */ + readonly aborted: boolean; + /** + * This property shows the number of characters currently buffered to be written. + * See `net.Socket.bufferSize` for details. + * @since v11.2.0, v10.16.0 + */ + readonly bufferSize: number; + /** + * Set to `true` if the `Http2Stream` instance has been closed. + * @since v9.4.0 + */ + readonly closed: boolean; + /** + * Set to `true` if the `Http2Stream` instance has been destroyed and is no longer + * usable. + * @since v8.4.0 + */ + readonly destroyed: boolean; + /** + * Set to `true` if the `END_STREAM` flag was set in the request or response + * HEADERS frame received, indicating that no additional data should be received + * and the readable side of the `Http2Stream` will be closed. + * @since v10.11.0 + */ + readonly endAfterHeaders: boolean; + /** + * The numeric stream identifier of this `Http2Stream` instance. Set to `undefined`if the stream identifier has not yet been assigned. + * @since v8.4.0 + */ + readonly id?: number | undefined; + /** + * Set to `true` if the `Http2Stream` instance has not yet been assigned a + * numeric stream identifier. + * @since v9.4.0 + */ + readonly pending: boolean; + /** + * Set to the `RST_STREAM` `error code` reported when the `Http2Stream` is + * destroyed after either receiving an `RST_STREAM` frame from the connected peer, + * calling `http2stream.close()`, or `http2stream.destroy()`. Will be`undefined` if the `Http2Stream` has not been closed. + * @since v8.4.0 + */ + readonly rstCode: number; + /** + * An object containing the outbound headers sent for this `Http2Stream`. + * @since v9.5.0 + */ + readonly sentHeaders: OutgoingHttpHeaders; + /** + * An array of objects containing the outbound informational (additional) headers + * sent for this `Http2Stream`. + * @since v9.5.0 + */ + readonly sentInfoHeaders?: OutgoingHttpHeaders[] | undefined; + /** + * An object containing the outbound trailers sent for this `HttpStream`. + * @since v9.5.0 + */ + readonly sentTrailers?: OutgoingHttpHeaders | undefined; + /** + * A reference to the `Http2Session` instance that owns this `Http2Stream`. The + * value will be `undefined` after the `Http2Stream` instance is destroyed. + * @since v8.4.0 + */ + readonly session: Http2Session | undefined; + /** + * Provides miscellaneous information about the current state of the`Http2Stream`. + * + * A current state of this `Http2Stream`. + * @since v8.4.0 + */ + readonly state: StreamState; + /** + * Closes the `Http2Stream` instance by sending an `RST_STREAM` frame to the + * connected HTTP/2 peer. + * @since v8.4.0 + * @param [code=http2.constants.NGHTTP2_NO_ERROR] Unsigned 32-bit integer identifying the error code. + * @param callback An optional function registered to listen for the `'close'` event. + */ + close(code?: number, callback?: () => void): void; + /** + * Updates the priority for this `Http2Stream` instance. + * @since v8.4.0 + */ + priority(options: StreamPriorityOptions): void; + /** + * ```js + * const http2 = require('node:http2'); + * const client = http2.connect('http://example.org:8000'); + * const { NGHTTP2_CANCEL } = http2.constants; + * const req = client.request({ ':path': '/' }); + * + * // Cancel the stream if there's no activity after 5 seconds + * req.setTimeout(5000, () => req.close(NGHTTP2_CANCEL)); + * ``` + * @since v8.4.0 + */ + setTimeout(msecs: number, callback?: () => void): void; + /** + * Sends a trailing `HEADERS` frame to the connected HTTP/2 peer. This method + * will cause the `Http2Stream` to be immediately closed and must only be + * called after the `'wantTrailers'` event has been emitted. When sending a + * request or sending a response, the `options.waitForTrailers` option must be set + * in order to keep the `Http2Stream` open after the final `DATA` frame so that + * trailers can be sent. + * + * ```js + * const http2 = require('node:http2'); + * const server = http2.createServer(); + * server.on('stream', (stream) => { + * stream.respond(undefined, { waitForTrailers: true }); + * stream.on('wantTrailers', () => { + * stream.sendTrailers({ xyz: 'abc' }); + * }); + * stream.end('Hello World'); + * }); + * ``` + * + * The HTTP/1 specification forbids trailers from containing HTTP/2 pseudo-header + * fields (e.g. `':method'`, `':path'`, etc). + * @since v10.0.0 + */ + sendTrailers(headers: OutgoingHttpHeaders): void; + addListener(event: "aborted", listener: () => void): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "data", listener: (chunk: Buffer | string) => void): this; + addListener(event: "drain", listener: () => void): this; + addListener(event: "end", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "finish", listener: () => void): this; + addListener(event: "frameError", listener: (frameType: number, errorCode: number) => void): this; + addListener(event: "pipe", listener: (src: stream.Readable) => void): this; + addListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + addListener(event: "streamClosed", listener: (code: number) => void): this; + addListener(event: "timeout", listener: () => void): this; + addListener(event: "trailers", listener: (trailers: IncomingHttpHeaders, flags: number) => void): this; + addListener(event: "wantTrailers", listener: () => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + emit(event: "aborted"): boolean; + emit(event: "close"): boolean; + emit(event: "data", chunk: Buffer | string): boolean; + emit(event: "drain"): boolean; + emit(event: "end"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "finish"): boolean; + emit(event: "frameError", frameType: number, errorCode: number): boolean; + emit(event: "pipe", src: stream.Readable): boolean; + emit(event: "unpipe", src: stream.Readable): boolean; + emit(event: "streamClosed", code: number): boolean; + emit(event: "timeout"): boolean; + emit(event: "trailers", trailers: IncomingHttpHeaders, flags: number): boolean; + emit(event: "wantTrailers"): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on(event: "aborted", listener: () => void): this; + on(event: "close", listener: () => void): this; + on(event: "data", listener: (chunk: Buffer | string) => void): this; + on(event: "drain", listener: () => void): this; + on(event: "end", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "finish", listener: () => void): this; + on(event: "frameError", listener: (frameType: number, errorCode: number) => void): this; + on(event: "pipe", listener: (src: stream.Readable) => void): this; + on(event: "unpipe", listener: (src: stream.Readable) => void): this; + on(event: "streamClosed", listener: (code: number) => void): this; + on(event: "timeout", listener: () => void): this; + on(event: "trailers", listener: (trailers: IncomingHttpHeaders, flags: number) => void): this; + on(event: "wantTrailers", listener: () => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: "aborted", listener: () => void): this; + once(event: "close", listener: () => void): this; + once(event: "data", listener: (chunk: Buffer | string) => void): this; + once(event: "drain", listener: () => void): this; + once(event: "end", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "finish", listener: () => void): this; + once(event: "frameError", listener: (frameType: number, errorCode: number) => void): this; + once(event: "pipe", listener: (src: stream.Readable) => void): this; + once(event: "unpipe", listener: (src: stream.Readable) => void): this; + once(event: "streamClosed", listener: (code: number) => void): this; + once(event: "timeout", listener: () => void): this; + once(event: "trailers", listener: (trailers: IncomingHttpHeaders, flags: number) => void): this; + once(event: "wantTrailers", listener: () => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener(event: "aborted", listener: () => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "data", listener: (chunk: Buffer | string) => void): this; + prependListener(event: "drain", listener: () => void): this; + prependListener(event: "end", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "finish", listener: () => void): this; + prependListener(event: "frameError", listener: (frameType: number, errorCode: number) => void): this; + prependListener(event: "pipe", listener: (src: stream.Readable) => void): this; + prependListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + prependListener(event: "streamClosed", listener: (code: number) => void): this; + prependListener(event: "timeout", listener: () => void): this; + prependListener(event: "trailers", listener: (trailers: IncomingHttpHeaders, flags: number) => void): this; + prependListener(event: "wantTrailers", listener: () => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener(event: "aborted", listener: () => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "data", listener: (chunk: Buffer | string) => void): this; + prependOnceListener(event: "drain", listener: () => void): this; + prependOnceListener(event: "end", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "finish", listener: () => void): this; + prependOnceListener(event: "frameError", listener: (frameType: number, errorCode: number) => void): this; + prependOnceListener(event: "pipe", listener: (src: stream.Readable) => void): this; + prependOnceListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + prependOnceListener(event: "streamClosed", listener: (code: number) => void): this; + prependOnceListener(event: "timeout", listener: () => void): this; + prependOnceListener(event: "trailers", listener: (trailers: IncomingHttpHeaders, flags: number) => void): this; + prependOnceListener(event: "wantTrailers", listener: () => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + export interface ClientHttp2Stream extends Http2Stream { + addListener(event: "continue", listener: () => {}): this; + addListener( + event: "headers", + listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void, + ): this; + addListener(event: "push", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; + addListener( + event: "response", + listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void, + ): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + emit(event: "continue"): boolean; + emit(event: "headers", headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number): boolean; + emit(event: "push", headers: IncomingHttpHeaders, flags: number): boolean; + emit(event: "response", headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on(event: "continue", listener: () => {}): this; + on( + event: "headers", + listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void, + ): this; + on(event: "push", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; + on( + event: "response", + listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void, + ): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: "continue", listener: () => {}): this; + once( + event: "headers", + listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void, + ): this; + once(event: "push", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; + once( + event: "response", + listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void, + ): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener(event: "continue", listener: () => {}): this; + prependListener( + event: "headers", + listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void, + ): this; + prependListener(event: "push", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; + prependListener( + event: "response", + listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void, + ): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener(event: "continue", listener: () => {}): this; + prependOnceListener( + event: "headers", + listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void, + ): this; + prependOnceListener(event: "push", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; + prependOnceListener( + event: "response", + listener: (headers: IncomingHttpHeaders & IncomingHttpStatusHeader, flags: number) => void, + ): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + export interface ServerHttp2Stream extends Http2Stream { + /** + * True if headers were sent, false otherwise (read-only). + * @since v8.4.0 + */ + readonly headersSent: boolean; + /** + * Read-only property mapped to the `SETTINGS_ENABLE_PUSH` flag of the remote + * client's most recent `SETTINGS` frame. Will be `true` if the remote peer + * accepts push streams, `false` otherwise. Settings are the same for every`Http2Stream` in the same `Http2Session`. + * @since v8.4.0 + */ + readonly pushAllowed: boolean; + /** + * Sends an additional informational `HEADERS` frame to the connected HTTP/2 peer. + * @since v8.4.0 + */ + additionalHeaders(headers: OutgoingHttpHeaders): void; + /** + * Initiates a push stream. The callback is invoked with the new `Http2Stream`instance created for the push stream passed as the second argument, or an`Error` passed as the first argument. + * + * ```js + * const http2 = require('node:http2'); + * const server = http2.createServer(); + * server.on('stream', (stream) => { + * stream.respond({ ':status': 200 }); + * stream.pushStream({ ':path': '/' }, (err, pushStream, headers) => { + * if (err) throw err; + * pushStream.respond({ ':status': 200 }); + * pushStream.end('some pushed data'); + * }); + * stream.end('some data'); + * }); + * ``` + * + * Setting the weight of a push stream is not allowed in the `HEADERS` frame. Pass + * a `weight` value to `http2stream.priority` with the `silent` option set to`true` to enable server-side bandwidth balancing between concurrent streams. + * + * Calling `http2stream.pushStream()` from within a pushed stream is not permitted + * and will throw an error. + * @since v8.4.0 + * @param callback Callback that is called once the push stream has been initiated. + */ + pushStream( + headers: OutgoingHttpHeaders, + callback?: (err: Error | null, pushStream: ServerHttp2Stream, headers: OutgoingHttpHeaders) => void, + ): void; + pushStream( + headers: OutgoingHttpHeaders, + options?: StreamPriorityOptions, + callback?: (err: Error | null, pushStream: ServerHttp2Stream, headers: OutgoingHttpHeaders) => void, + ): void; + /** + * ```js + * const http2 = require('node:http2'); + * const server = http2.createServer(); + * server.on('stream', (stream) => { + * stream.respond({ ':status': 200 }); + * stream.end('some data'); + * }); + * ``` + * + * Initiates a response. When the `options.waitForTrailers` option is set, the`'wantTrailers'` event will be emitted immediately after queuing the last chunk + * of payload data to be sent. The `http2stream.sendTrailers()` method can then be + * used to sent trailing header fields to the peer. + * + * When `options.waitForTrailers` is set, the `Http2Stream` will not automatically + * close when the final `DATA` frame is transmitted. User code must call either`http2stream.sendTrailers()` or `http2stream.close()` to close the`Http2Stream`. + * + * ```js + * const http2 = require('node:http2'); + * const server = http2.createServer(); + * server.on('stream', (stream) => { + * stream.respond({ ':status': 200 }, { waitForTrailers: true }); + * stream.on('wantTrailers', () => { + * stream.sendTrailers({ ABC: 'some value to send' }); + * }); + * stream.end('some data'); + * }); + * ``` + * @since v8.4.0 + */ + respond(headers?: OutgoingHttpHeaders, options?: ServerStreamResponseOptions): void; + /** + * Initiates a response whose data is read from the given file descriptor. No + * validation is performed on the given file descriptor. If an error occurs while + * attempting to read data using the file descriptor, the `Http2Stream` will be + * closed using an `RST_STREAM` frame using the standard `INTERNAL_ERROR` code. + * + * When used, the `Http2Stream` object's `Duplex` interface will be closed + * automatically. + * + * ```js + * const http2 = require('node:http2'); + * const fs = require('node:fs'); + * + * const server = http2.createServer(); + * server.on('stream', (stream) => { + * const fd = fs.openSync('/some/file', 'r'); + * + * const stat = fs.fstatSync(fd); + * const headers = { + * 'content-length': stat.size, + * 'last-modified': stat.mtime.toUTCString(), + * 'content-type': 'text/plain; charset=utf-8', + * }; + * stream.respondWithFD(fd, headers); + * stream.on('close', () => fs.closeSync(fd)); + * }); + * ``` + * + * The optional `options.statCheck` function may be specified to give user code + * an opportunity to set additional content headers based on the `fs.Stat` details + * of the given fd. If the `statCheck` function is provided, the`http2stream.respondWithFD()` method will perform an `fs.fstat()` call to + * collect details on the provided file descriptor. + * + * The `offset` and `length` options may be used to limit the response to a + * specific range subset. This can be used, for instance, to support HTTP Range + * requests. + * + * The file descriptor or `FileHandle` is not closed when the stream is closed, + * so it will need to be closed manually once it is no longer needed. + * Using the same file descriptor concurrently for multiple streams + * is not supported and may result in data loss. Re-using a file descriptor + * after a stream has finished is supported. + * + * When the `options.waitForTrailers` option is set, the `'wantTrailers'` event + * will be emitted immediately after queuing the last chunk of payload data to be + * sent. The `http2stream.sendTrailers()` method can then be used to sent trailing + * header fields to the peer. + * + * When `options.waitForTrailers` is set, the `Http2Stream` will not automatically + * close when the final `DATA` frame is transmitted. User code _must_ call either`http2stream.sendTrailers()` or `http2stream.close()` to close the`Http2Stream`. + * + * ```js + * const http2 = require('node:http2'); + * const fs = require('node:fs'); + * + * const server = http2.createServer(); + * server.on('stream', (stream) => { + * const fd = fs.openSync('/some/file', 'r'); + * + * const stat = fs.fstatSync(fd); + * const headers = { + * 'content-length': stat.size, + * 'last-modified': stat.mtime.toUTCString(), + * 'content-type': 'text/plain; charset=utf-8', + * }; + * stream.respondWithFD(fd, headers, { waitForTrailers: true }); + * stream.on('wantTrailers', () => { + * stream.sendTrailers({ ABC: 'some value to send' }); + * }); + * + * stream.on('close', () => fs.closeSync(fd)); + * }); + * ``` + * @since v8.4.0 + * @param fd A readable file descriptor. + */ + respondWithFD( + fd: number | fs.promises.FileHandle, + headers?: OutgoingHttpHeaders, + options?: ServerStreamFileResponseOptions, + ): void; + /** + * Sends a regular file as the response. The `path` must specify a regular file + * or an `'error'` event will be emitted on the `Http2Stream` object. + * + * When used, the `Http2Stream` object's `Duplex` interface will be closed + * automatically. + * + * The optional `options.statCheck` function may be specified to give user code + * an opportunity to set additional content headers based on the `fs.Stat` details + * of the given file: + * + * If an error occurs while attempting to read the file data, the `Http2Stream`will be closed using an `RST_STREAM` frame using the standard `INTERNAL_ERROR`code. If the `onError` callback is + * defined, then it will be called. Otherwise + * the stream will be destroyed. + * + * Example using a file path: + * + * ```js + * const http2 = require('node:http2'); + * const server = http2.createServer(); + * server.on('stream', (stream) => { + * function statCheck(stat, headers) { + * headers['last-modified'] = stat.mtime.toUTCString(); + * } + * + * function onError(err) { + * // stream.respond() can throw if the stream has been destroyed by + * // the other side. + * try { + * if (err.code === 'ENOENT') { + * stream.respond({ ':status': 404 }); + * } else { + * stream.respond({ ':status': 500 }); + * } + * } catch (err) { + * // Perform actual error handling. + * console.error(err); + * } + * stream.end(); + * } + * + * stream.respondWithFile('/some/file', + * { 'content-type': 'text/plain; charset=utf-8' }, + * { statCheck, onError }); + * }); + * ``` + * + * The `options.statCheck` function may also be used to cancel the send operation + * by returning `false`. For instance, a conditional request may check the stat + * results to determine if the file has been modified to return an appropriate`304` response: + * + * ```js + * const http2 = require('node:http2'); + * const server = http2.createServer(); + * server.on('stream', (stream) => { + * function statCheck(stat, headers) { + * // Check the stat here... + * stream.respond({ ':status': 304 }); + * return false; // Cancel the send operation + * } + * stream.respondWithFile('/some/file', + * { 'content-type': 'text/plain; charset=utf-8' }, + * { statCheck }); + * }); + * ``` + * + * The `content-length` header field will be automatically set. + * + * The `offset` and `length` options may be used to limit the response to a + * specific range subset. This can be used, for instance, to support HTTP Range + * requests. + * + * The `options.onError` function may also be used to handle all the errors + * that could happen before the delivery of the file is initiated. The + * default behavior is to destroy the stream. + * + * When the `options.waitForTrailers` option is set, the `'wantTrailers'` event + * will be emitted immediately after queuing the last chunk of payload data to be + * sent. The `http2stream.sendTrailers()` method can then be used to sent trailing + * header fields to the peer. + * + * When `options.waitForTrailers` is set, the `Http2Stream` will not automatically + * close when the final `DATA` frame is transmitted. User code must call either`http2stream.sendTrailers()` or `http2stream.close()` to close the`Http2Stream`. + * + * ```js + * const http2 = require('node:http2'); + * const server = http2.createServer(); + * server.on('stream', (stream) => { + * stream.respondWithFile('/some/file', + * { 'content-type': 'text/plain; charset=utf-8' }, + * { waitForTrailers: true }); + * stream.on('wantTrailers', () => { + * stream.sendTrailers({ ABC: 'some value to send' }); + * }); + * }); + * ``` + * @since v8.4.0 + */ + respondWithFile( + path: string, + headers?: OutgoingHttpHeaders, + options?: ServerStreamFileResponseOptionsWithError, + ): void; + } + // Http2Session + export interface Settings { + headerTableSize?: number | undefined; + enablePush?: boolean | undefined; + initialWindowSize?: number | undefined; + maxFrameSize?: number | undefined; + maxConcurrentStreams?: number | undefined; + maxHeaderListSize?: number | undefined; + enableConnectProtocol?: boolean | undefined; + } + export interface ClientSessionRequestOptions { + endStream?: boolean | undefined; + exclusive?: boolean | undefined; + parent?: number | undefined; + weight?: number | undefined; + waitForTrailers?: boolean | undefined; + signal?: AbortSignal | undefined; + } + export interface SessionState { + effectiveLocalWindowSize?: number | undefined; + effectiveRecvDataLength?: number | undefined; + nextStreamID?: number | undefined; + localWindowSize?: number | undefined; + lastProcStreamID?: number | undefined; + remoteWindowSize?: number | undefined; + outboundQueueSize?: number | undefined; + deflateDynamicTableSize?: number | undefined; + inflateDynamicTableSize?: number | undefined; + } + export interface Http2Session extends EventEmitter { + /** + * Value will be `undefined` if the `Http2Session` is not yet connected to a + * socket, `h2c` if the `Http2Session` is not connected to a `TLSSocket`, or + * will return the value of the connected `TLSSocket`'s own `alpnProtocol`property. + * @since v9.4.0 + */ + readonly alpnProtocol?: string | undefined; + /** + * Will be `true` if this `Http2Session` instance has been closed, otherwise`false`. + * @since v9.4.0 + */ + readonly closed: boolean; + /** + * Will be `true` if this `Http2Session` instance is still connecting, will be set + * to `false` before emitting `connect` event and/or calling the `http2.connect`callback. + * @since v10.0.0 + */ + readonly connecting: boolean; + /** + * Will be `true` if this `Http2Session` instance has been destroyed and must no + * longer be used, otherwise `false`. + * @since v8.4.0 + */ + readonly destroyed: boolean; + /** + * Value is `undefined` if the `Http2Session` session socket has not yet been + * connected, `true` if the `Http2Session` is connected with a `TLSSocket`, + * and `false` if the `Http2Session` is connected to any other kind of socket + * or stream. + * @since v9.4.0 + */ + readonly encrypted?: boolean | undefined; + /** + * A prototype-less object describing the current local settings of this`Http2Session`. The local settings are local to _this_`Http2Session` instance. + * @since v8.4.0 + */ + readonly localSettings: Settings; + /** + * If the `Http2Session` is connected to a `TLSSocket`, the `originSet` property + * will return an `Array` of origins for which the `Http2Session` may be + * considered authoritative. + * + * The `originSet` property is only available when using a secure TLS connection. + * @since v9.4.0 + */ + readonly originSet?: string[] | undefined; + /** + * Indicates whether the `Http2Session` is currently waiting for acknowledgment of + * a sent `SETTINGS` frame. Will be `true` after calling the`http2session.settings()` method. Will be `false` once all sent `SETTINGS`frames have been acknowledged. + * @since v8.4.0 + */ + readonly pendingSettingsAck: boolean; + /** + * A prototype-less object describing the current remote settings of this`Http2Session`. The remote settings are set by the _connected_ HTTP/2 peer. + * @since v8.4.0 + */ + readonly remoteSettings: Settings; + /** + * Returns a `Proxy` object that acts as a `net.Socket` (or `tls.TLSSocket`) but + * limits available methods to ones safe to use with HTTP/2. + * + * `destroy`, `emit`, `end`, `pause`, `read`, `resume`, and `write` will throw + * an error with code `ERR_HTTP2_NO_SOCKET_MANIPULATION`. See `Http2Session and Sockets` for more information. + * + * `setTimeout` method will be called on this `Http2Session`. + * + * All other interactions will be routed directly to the socket. + * @since v8.4.0 + */ + readonly socket: net.Socket | tls.TLSSocket; + /** + * Provides miscellaneous information about the current state of the`Http2Session`. + * + * An object describing the current status of this `Http2Session`. + * @since v8.4.0 + */ + readonly state: SessionState; + /** + * The `http2session.type` will be equal to`http2.constants.NGHTTP2_SESSION_SERVER` if this `Http2Session` instance is a + * server, and `http2.constants.NGHTTP2_SESSION_CLIENT` if the instance is a + * client. + * @since v8.4.0 + */ + readonly type: number; + /** + * Gracefully closes the `Http2Session`, allowing any existing streams to + * complete on their own and preventing new `Http2Stream` instances from being + * created. Once closed, `http2session.destroy()`_might_ be called if there + * are no open `Http2Stream` instances. + * + * If specified, the `callback` function is registered as a handler for the`'close'` event. + * @since v9.4.0 + */ + close(callback?: () => void): void; + /** + * Immediately terminates the `Http2Session` and the associated `net.Socket` or`tls.TLSSocket`. + * + * Once destroyed, the `Http2Session` will emit the `'close'` event. If `error`is not undefined, an `'error'` event will be emitted immediately before the`'close'` event. + * + * If there are any remaining open `Http2Streams` associated with the`Http2Session`, those will also be destroyed. + * @since v8.4.0 + * @param error An `Error` object if the `Http2Session` is being destroyed due to an error. + * @param code The HTTP/2 error code to send in the final `GOAWAY` frame. If unspecified, and `error` is not undefined, the default is `INTERNAL_ERROR`, otherwise defaults to `NO_ERROR`. + */ + destroy(error?: Error, code?: number): void; + /** + * Transmits a `GOAWAY` frame to the connected peer _without_ shutting down the`Http2Session`. + * @since v9.4.0 + * @param code An HTTP/2 error code + * @param lastStreamID The numeric ID of the last processed `Http2Stream` + * @param opaqueData A `TypedArray` or `DataView` instance containing additional data to be carried within the `GOAWAY` frame. + */ + goaway(code?: number, lastStreamID?: number, opaqueData?: NodeJS.ArrayBufferView): void; + /** + * Sends a `PING` frame to the connected HTTP/2 peer. A `callback` function must + * be provided. The method will return `true` if the `PING` was sent, `false`otherwise. + * + * The maximum number of outstanding (unacknowledged) pings is determined by the`maxOutstandingPings` configuration option. The default maximum is 10. + * + * If provided, the `payload` must be a `Buffer`, `TypedArray`, or `DataView`containing 8 bytes of data that will be transmitted with the `PING` and + * returned with the ping acknowledgment. + * + * The callback will be invoked with three arguments: an error argument that will + * be `null` if the `PING` was successfully acknowledged, a `duration` argument + * that reports the number of milliseconds elapsed since the ping was sent and the + * acknowledgment was received, and a `Buffer` containing the 8-byte `PING`payload. + * + * ```js + * session.ping(Buffer.from('abcdefgh'), (err, duration, payload) => { + * if (!err) { + * console.log(`Ping acknowledged in ${duration} milliseconds`); + * console.log(`With payload '${payload.toString()}'`); + * } + * }); + * ``` + * + * If the `payload` argument is not specified, the default payload will be the + * 64-bit timestamp (little endian) marking the start of the `PING` duration. + * @since v8.9.3 + * @param payload Optional ping payload. + */ + ping(callback: (err: Error | null, duration: number, payload: Buffer) => void): boolean; + ping( + payload: NodeJS.ArrayBufferView, + callback: (err: Error | null, duration: number, payload: Buffer) => void, + ): boolean; + /** + * Calls `ref()` on this `Http2Session`instance's underlying `net.Socket`. + * @since v9.4.0 + */ + ref(): void; + /** + * Sets the local endpoint's window size. + * The `windowSize` is the total window size to set, not + * the delta. + * + * ```js + * const http2 = require('node:http2'); + * + * const server = http2.createServer(); + * const expectedWindowSize = 2 ** 20; + * server.on('connect', (session) => { + * + * // Set local window size to be 2 ** 20 + * session.setLocalWindowSize(expectedWindowSize); + * }); + * ``` + * @since v15.3.0, v14.18.0 + */ + setLocalWindowSize(windowSize: number): void; + /** + * Used to set a callback function that is called when there is no activity on + * the `Http2Session` after `msecs` milliseconds. The given `callback` is + * registered as a listener on the `'timeout'` event. + * @since v8.4.0 + */ + setTimeout(msecs: number, callback?: () => void): void; + /** + * Updates the current local settings for this `Http2Session` and sends a new`SETTINGS` frame to the connected HTTP/2 peer. + * + * Once called, the `http2session.pendingSettingsAck` property will be `true`while the session is waiting for the remote peer to acknowledge the new + * settings. + * + * The new settings will not become effective until the `SETTINGS` acknowledgment + * is received and the `'localSettings'` event is emitted. It is possible to send + * multiple `SETTINGS` frames while acknowledgment is still pending. + * @since v8.4.0 + * @param callback Callback that is called once the session is connected or right away if the session is already connected. + */ + settings( + settings: Settings, + callback?: (err: Error | null, settings: Settings, duration: number) => void, + ): void; + /** + * Calls `unref()` on this `Http2Session`instance's underlying `net.Socket`. + * @since v9.4.0 + */ + unref(): void; + addListener(event: "close", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener( + event: "frameError", + listener: (frameType: number, errorCode: number, streamID: number) => void, + ): this; + addListener( + event: "goaway", + listener: (errorCode: number, lastStreamID: number, opaqueData?: Buffer) => void, + ): this; + addListener(event: "localSettings", listener: (settings: Settings) => void): this; + addListener(event: "ping", listener: () => void): this; + addListener(event: "remoteSettings", listener: (settings: Settings) => void): this; + addListener(event: "timeout", listener: () => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + emit(event: "close"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "frameError", frameType: number, errorCode: number, streamID: number): boolean; + emit(event: "goaway", errorCode: number, lastStreamID: number, opaqueData?: Buffer): boolean; + emit(event: "localSettings", settings: Settings): boolean; + emit(event: "ping"): boolean; + emit(event: "remoteSettings", settings: Settings): boolean; + emit(event: "timeout"): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on(event: "close", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "frameError", listener: (frameType: number, errorCode: number, streamID: number) => void): this; + on(event: "goaway", listener: (errorCode: number, lastStreamID: number, opaqueData?: Buffer) => void): this; + on(event: "localSettings", listener: (settings: Settings) => void): this; + on(event: "ping", listener: () => void): this; + on(event: "remoteSettings", listener: (settings: Settings) => void): this; + on(event: "timeout", listener: () => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "frameError", listener: (frameType: number, errorCode: number, streamID: number) => void): this; + once(event: "goaway", listener: (errorCode: number, lastStreamID: number, opaqueData?: Buffer) => void): this; + once(event: "localSettings", listener: (settings: Settings) => void): this; + once(event: "ping", listener: () => void): this; + once(event: "remoteSettings", listener: (settings: Settings) => void): this; + once(event: "timeout", listener: () => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener( + event: "frameError", + listener: (frameType: number, errorCode: number, streamID: number) => void, + ): this; + prependListener( + event: "goaway", + listener: (errorCode: number, lastStreamID: number, opaqueData?: Buffer) => void, + ): this; + prependListener(event: "localSettings", listener: (settings: Settings) => void): this; + prependListener(event: "ping", listener: () => void): this; + prependListener(event: "remoteSettings", listener: (settings: Settings) => void): this; + prependListener(event: "timeout", listener: () => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener( + event: "frameError", + listener: (frameType: number, errorCode: number, streamID: number) => void, + ): this; + prependOnceListener( + event: "goaway", + listener: (errorCode: number, lastStreamID: number, opaqueData?: Buffer) => void, + ): this; + prependOnceListener(event: "localSettings", listener: (settings: Settings) => void): this; + prependOnceListener(event: "ping", listener: () => void): this; + prependOnceListener(event: "remoteSettings", listener: (settings: Settings) => void): this; + prependOnceListener(event: "timeout", listener: () => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + export interface ClientHttp2Session extends Http2Session { + /** + * For HTTP/2 Client `Http2Session` instances only, the `http2session.request()`creates and returns an `Http2Stream` instance that can be used to send an + * HTTP/2 request to the connected server. + * + * When a `ClientHttp2Session` is first created, the socket may not yet be + * connected. if `clienthttp2session.request()` is called during this time, the + * actual request will be deferred until the socket is ready to go. + * If the `session` is closed before the actual request be executed, an`ERR_HTTP2_GOAWAY_SESSION` is thrown. + * + * This method is only available if `http2session.type` is equal to`http2.constants.NGHTTP2_SESSION_CLIENT`. + * + * ```js + * const http2 = require('node:http2'); + * const clientSession = http2.connect('https://localhost:1234'); + * const { + * HTTP2_HEADER_PATH, + * HTTP2_HEADER_STATUS, + * } = http2.constants; + * + * const req = clientSession.request({ [HTTP2_HEADER_PATH]: '/' }); + * req.on('response', (headers) => { + * console.log(headers[HTTP2_HEADER_STATUS]); + * req.on('data', (chunk) => { // .. }); + * req.on('end', () => { // .. }); + * }); + * ``` + * + * When the `options.waitForTrailers` option is set, the `'wantTrailers'` event + * is emitted immediately after queuing the last chunk of payload data to be sent. + * The `http2stream.sendTrailers()` method can then be called to send trailing + * headers to the peer. + * + * When `options.waitForTrailers` is set, the `Http2Stream` will not automatically + * close when the final `DATA` frame is transmitted. User code must call either`http2stream.sendTrailers()` or `http2stream.close()` to close the`Http2Stream`. + * + * When `options.signal` is set with an `AbortSignal` and then `abort` on the + * corresponding `AbortController` is called, the request will emit an `'error'`event with an `AbortError` error. + * + * The `:method` and `:path` pseudo-headers are not specified within `headers`, + * they respectively default to: + * + * * `:method` \= `'GET'` + * * `:path` \= `/` + * @since v8.4.0 + */ + request(headers?: OutgoingHttpHeaders, options?: ClientSessionRequestOptions): ClientHttp2Stream; + addListener(event: "altsvc", listener: (alt: string, origin: string, stream: number) => void): this; + addListener(event: "origin", listener: (origins: string[]) => void): this; + addListener( + event: "connect", + listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void, + ): this; + addListener( + event: "stream", + listener: ( + stream: ClientHttp2Stream, + headers: IncomingHttpHeaders & IncomingHttpStatusHeader, + flags: number, + ) => void, + ): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + emit(event: "altsvc", alt: string, origin: string, stream: number): boolean; + emit(event: "origin", origins: readonly string[]): boolean; + emit(event: "connect", session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket): boolean; + emit( + event: "stream", + stream: ClientHttp2Stream, + headers: IncomingHttpHeaders & IncomingHttpStatusHeader, + flags: number, + ): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on(event: "altsvc", listener: (alt: string, origin: string, stream: number) => void): this; + on(event: "origin", listener: (origins: string[]) => void): this; + on(event: "connect", listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; + on( + event: "stream", + listener: ( + stream: ClientHttp2Stream, + headers: IncomingHttpHeaders & IncomingHttpStatusHeader, + flags: number, + ) => void, + ): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: "altsvc", listener: (alt: string, origin: string, stream: number) => void): this; + once(event: "origin", listener: (origins: string[]) => void): this; + once( + event: "connect", + listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void, + ): this; + once( + event: "stream", + listener: ( + stream: ClientHttp2Stream, + headers: IncomingHttpHeaders & IncomingHttpStatusHeader, + flags: number, + ) => void, + ): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener(event: "altsvc", listener: (alt: string, origin: string, stream: number) => void): this; + prependListener(event: "origin", listener: (origins: string[]) => void): this; + prependListener( + event: "connect", + listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void, + ): this; + prependListener( + event: "stream", + listener: ( + stream: ClientHttp2Stream, + headers: IncomingHttpHeaders & IncomingHttpStatusHeader, + flags: number, + ) => void, + ): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener(event: "altsvc", listener: (alt: string, origin: string, stream: number) => void): this; + prependOnceListener(event: "origin", listener: (origins: string[]) => void): this; + prependOnceListener( + event: "connect", + listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void, + ): this; + prependOnceListener( + event: "stream", + listener: ( + stream: ClientHttp2Stream, + headers: IncomingHttpHeaders & IncomingHttpStatusHeader, + flags: number, + ) => void, + ): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + export interface AlternativeServiceOptions { + origin: number | string | url.URL; + } + export interface ServerHttp2Session extends Http2Session { + readonly server: Http2Server | Http2SecureServer; + /** + * Submits an `ALTSVC` frame (as defined by [RFC 7838](https://tools.ietf.org/html/rfc7838)) to the connected client. + * + * ```js + * const http2 = require('node:http2'); + * + * const server = http2.createServer(); + * server.on('session', (session) => { + * // Set altsvc for origin https://example.org:80 + * session.altsvc('h2=":8000"', 'https://example.org:80'); + * }); + * + * server.on('stream', (stream) => { + * // Set altsvc for a specific stream + * stream.session.altsvc('h2=":8000"', stream.id); + * }); + * ``` + * + * Sending an `ALTSVC` frame with a specific stream ID indicates that the alternate + * service is associated with the origin of the given `Http2Stream`. + * + * The `alt` and origin string _must_ contain only ASCII bytes and are + * strictly interpreted as a sequence of ASCII bytes. The special value `'clear'`may be passed to clear any previously set alternative service for a given + * domain. + * + * When a string is passed for the `originOrStream` argument, it will be parsed as + * a URL and the origin will be derived. For instance, the origin for the + * HTTP URL `'https://example.org/foo/bar'` is the ASCII string`'https://example.org'`. An error will be thrown if either the given string + * cannot be parsed as a URL or if a valid origin cannot be derived. + * + * A `URL` object, or any object with an `origin` property, may be passed as`originOrStream`, in which case the value of the `origin` property will be + * used. The value of the `origin` property _must_ be a properly serialized + * ASCII origin. + * @since v9.4.0 + * @param alt A description of the alternative service configuration as defined by `RFC 7838`. + * @param originOrStream Either a URL string specifying the origin (or an `Object` with an `origin` property) or the numeric identifier of an active `Http2Stream` as given by the + * `http2stream.id` property. + */ + altsvc(alt: string, originOrStream: number | string | url.URL | AlternativeServiceOptions): void; + /** + * Submits an `ORIGIN` frame (as defined by [RFC 8336](https://tools.ietf.org/html/rfc8336)) to the connected client + * to advertise the set of origins for which the server is capable of providing + * authoritative responses. + * + * ```js + * const http2 = require('node:http2'); + * const options = getSecureOptionsSomehow(); + * const server = http2.createSecureServer(options); + * server.on('stream', (stream) => { + * stream.respond(); + * stream.end('ok'); + * }); + * server.on('session', (session) => { + * session.origin('https://example.com', 'https://example.org'); + * }); + * ``` + * + * When a string is passed as an `origin`, it will be parsed as a URL and the + * origin will be derived. For instance, the origin for the HTTP URL`'https://example.org/foo/bar'` is the ASCII string`'https://example.org'`. An error will be thrown if either the given + * string + * cannot be parsed as a URL or if a valid origin cannot be derived. + * + * A `URL` object, or any object with an `origin` property, may be passed as + * an `origin`, in which case the value of the `origin` property will be + * used. The value of the `origin` property _must_ be a properly serialized + * ASCII origin. + * + * Alternatively, the `origins` option may be used when creating a new HTTP/2 + * server using the `http2.createSecureServer()` method: + * + * ```js + * const http2 = require('node:http2'); + * const options = getSecureOptionsSomehow(); + * options.origins = ['https://example.com', 'https://example.org']; + * const server = http2.createSecureServer(options); + * server.on('stream', (stream) => { + * stream.respond(); + * stream.end('ok'); + * }); + * ``` + * @since v10.12.0 + * @param origins One or more URL Strings passed as separate arguments. + */ + origin( + ...origins: Array< + | string + | url.URL + | { + origin: string; + } + > + ): void; + addListener( + event: "connect", + listener: (session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket) => void, + ): this; + addListener( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + emit(event: "connect", session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket): boolean; + emit(event: "stream", stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on(event: "connect", listener: (session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; + on( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once( + event: "connect", + listener: (session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket) => void, + ): this; + once( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener( + event: "connect", + listener: (session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket) => void, + ): this; + prependListener( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener( + event: "connect", + listener: (session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket) => void, + ): this; + prependOnceListener( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + // Http2Server + export interface SessionOptions { + maxDeflateDynamicTableSize?: number | undefined; + maxSessionMemory?: number | undefined; + maxHeaderListPairs?: number | undefined; + maxOutstandingPings?: number | undefined; + maxSendHeaderBlockLength?: number | undefined; + paddingStrategy?: number | undefined; + peerMaxConcurrentStreams?: number | undefined; + settings?: Settings | undefined; + /** + * Specifies a timeout in milliseconds that + * a server should wait when an [`'unknownProtocol'`][] is emitted. If the + * socket has not been destroyed by that time the server will destroy it. + * @default 100000 + */ + unknownProtocolTimeout?: number | undefined; + selectPadding?(frameLen: number, maxFrameLen: number): number; + } + export interface ClientSessionOptions extends SessionOptions { + maxReservedRemoteStreams?: number | undefined; + createConnection?: ((authority: url.URL, option: SessionOptions) => stream.Duplex) | undefined; + protocol?: "http:" | "https:" | undefined; + } + export interface ServerSessionOptions extends SessionOptions { + Http1IncomingMessage?: typeof IncomingMessage | undefined; + Http1ServerResponse?: typeof ServerResponse | undefined; + Http2ServerRequest?: typeof Http2ServerRequest | undefined; + Http2ServerResponse?: typeof Http2ServerResponse | undefined; + } + export interface SecureClientSessionOptions extends ClientSessionOptions, tls.ConnectionOptions {} + export interface SecureServerSessionOptions extends ServerSessionOptions, tls.TlsOptions {} + export interface ServerOptions extends ServerSessionOptions {} + export interface SecureServerOptions extends SecureServerSessionOptions { + allowHTTP1?: boolean | undefined; + origins?: string[] | undefined; + } + interface HTTP2ServerCommon { + setTimeout(msec?: number, callback?: () => void): this; + /** + * Throws ERR_HTTP2_INVALID_SETTING_VALUE for invalid settings values. + * Throws ERR_INVALID_ARG_TYPE for invalid settings argument. + */ + updateSettings(settings: Settings): void; + } + export interface Http2Server extends net.Server, HTTP2ServerCommon { + addListener( + event: "checkContinue", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + addListener( + event: "request", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + addListener(event: "session", listener: (session: ServerHttp2Session) => void): this; + addListener(event: "sessionError", listener: (err: Error) => void): this; + addListener( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + addListener(event: "timeout", listener: () => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + emit(event: "checkContinue", request: Http2ServerRequest, response: Http2ServerResponse): boolean; + emit(event: "request", request: Http2ServerRequest, response: Http2ServerResponse): boolean; + emit(event: "session", session: ServerHttp2Session): boolean; + emit(event: "sessionError", err: Error): boolean; + emit(event: "stream", stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number): boolean; + emit(event: "timeout"): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on( + event: "checkContinue", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + on(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; + on(event: "session", listener: (session: ServerHttp2Session) => void): this; + on(event: "sessionError", listener: (err: Error) => void): this; + on( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + on(event: "timeout", listener: () => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once( + event: "checkContinue", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + once(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; + once(event: "session", listener: (session: ServerHttp2Session) => void): this; + once(event: "sessionError", listener: (err: Error) => void): this; + once( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + once(event: "timeout", listener: () => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener( + event: "checkContinue", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + prependListener( + event: "request", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + prependListener(event: "session", listener: (session: ServerHttp2Session) => void): this; + prependListener(event: "sessionError", listener: (err: Error) => void): this; + prependListener( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + prependListener(event: "timeout", listener: () => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener( + event: "checkContinue", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + prependOnceListener( + event: "request", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + prependOnceListener(event: "session", listener: (session: ServerHttp2Session) => void): this; + prependOnceListener(event: "sessionError", listener: (err: Error) => void): this; + prependOnceListener( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + prependOnceListener(event: "timeout", listener: () => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + export interface Http2SecureServer extends tls.Server, HTTP2ServerCommon { + addListener( + event: "checkContinue", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + addListener( + event: "request", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + addListener(event: "session", listener: (session: ServerHttp2Session) => void): this; + addListener(event: "sessionError", listener: (err: Error) => void): this; + addListener( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + addListener(event: "timeout", listener: () => void): this; + addListener(event: "unknownProtocol", listener: (socket: tls.TLSSocket) => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + emit(event: "checkContinue", request: Http2ServerRequest, response: Http2ServerResponse): boolean; + emit(event: "request", request: Http2ServerRequest, response: Http2ServerResponse): boolean; + emit(event: "session", session: ServerHttp2Session): boolean; + emit(event: "sessionError", err: Error): boolean; + emit(event: "stream", stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number): boolean; + emit(event: "timeout"): boolean; + emit(event: "unknownProtocol", socket: tls.TLSSocket): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on( + event: "checkContinue", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + on(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; + on(event: "session", listener: (session: ServerHttp2Session) => void): this; + on(event: "sessionError", listener: (err: Error) => void): this; + on( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + on(event: "timeout", listener: () => void): this; + on(event: "unknownProtocol", listener: (socket: tls.TLSSocket) => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once( + event: "checkContinue", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + once(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; + once(event: "session", listener: (session: ServerHttp2Session) => void): this; + once(event: "sessionError", listener: (err: Error) => void): this; + once( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + once(event: "timeout", listener: () => void): this; + once(event: "unknownProtocol", listener: (socket: tls.TLSSocket) => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener( + event: "checkContinue", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + prependListener( + event: "request", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + prependListener(event: "session", listener: (session: ServerHttp2Session) => void): this; + prependListener(event: "sessionError", listener: (err: Error) => void): this; + prependListener( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + prependListener(event: "timeout", listener: () => void): this; + prependListener(event: "unknownProtocol", listener: (socket: tls.TLSSocket) => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener( + event: "checkContinue", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + prependOnceListener( + event: "request", + listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): this; + prependOnceListener(event: "session", listener: (session: ServerHttp2Session) => void): this; + prependOnceListener(event: "sessionError", listener: (err: Error) => void): this; + prependOnceListener( + event: "stream", + listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void, + ): this; + prependOnceListener(event: "timeout", listener: () => void): this; + prependOnceListener(event: "unknownProtocol", listener: (socket: tls.TLSSocket) => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + /** + * A `Http2ServerRequest` object is created by {@link Server} or {@link SecureServer} and passed as the first argument to the `'request'` event. It may be used to access a request status, + * headers, and + * data. + * @since v8.4.0 + */ + export class Http2ServerRequest extends stream.Readable { + constructor( + stream: ServerHttp2Stream, + headers: IncomingHttpHeaders, + options: stream.ReadableOptions, + rawHeaders: readonly string[], + ); + /** + * The `request.aborted` property will be `true` if the request has + * been aborted. + * @since v10.1.0 + */ + readonly aborted: boolean; + /** + * The request authority pseudo header field. Because HTTP/2 allows requests + * to set either `:authority` or `host`, this value is derived from`req.headers[':authority']` if present. Otherwise, it is derived from`req.headers['host']`. + * @since v8.4.0 + */ + readonly authority: string; + /** + * See `request.socket`. + * @since v8.4.0 + * @deprecated Since v13.0.0 - Use `socket`. + */ + readonly connection: net.Socket | tls.TLSSocket; + /** + * The `request.complete` property will be `true` if the request has + * been completed, aborted, or destroyed. + * @since v12.10.0 + */ + readonly complete: boolean; + /** + * The request/response headers object. + * + * Key-value pairs of header names and values. Header names are lower-cased. + * + * ```js + * // Prints something like: + * // + * // { 'user-agent': 'curl/7.22.0', + * // host: '127.0.0.1:8000', + * // accept: '*' } + * console.log(request.headers); + * ``` + * + * See `HTTP/2 Headers Object`. + * + * In HTTP/2, the request path, host name, protocol, and method are represented as + * special headers prefixed with the `:` character (e.g. `':path'`). These special + * headers will be included in the `request.headers` object. Care must be taken not + * to inadvertently modify these special headers or errors may occur. For instance, + * removing all headers from the request will cause errors to occur: + * + * ```js + * removeAllHeaders(request.headers); + * assert(request.url); // Fails because the :path header has been removed + * ``` + * @since v8.4.0 + */ + readonly headers: IncomingHttpHeaders; + /** + * In case of server request, the HTTP version sent by the client. In the case of + * client response, the HTTP version of the connected-to server. Returns`'2.0'`. + * + * Also `message.httpVersionMajor` is the first integer and`message.httpVersionMinor` is the second. + * @since v8.4.0 + */ + readonly httpVersion: string; + readonly httpVersionMinor: number; + readonly httpVersionMajor: number; + /** + * The request method as a string. Read-only. Examples: `'GET'`, `'DELETE'`. + * @since v8.4.0 + */ + readonly method: string; + /** + * The raw request/response headers list exactly as they were received. + * + * The keys and values are in the same list. It is _not_ a + * list of tuples. So, the even-numbered offsets are key values, and the + * odd-numbered offsets are the associated values. + * + * Header names are not lowercased, and duplicates are not merged. + * + * ```js + * // Prints something like: + * // + * // [ 'user-agent', + * // 'this is invalid because there can be only one', + * // 'User-Agent', + * // 'curl/7.22.0', + * // 'Host', + * // '127.0.0.1:8000', + * // 'ACCEPT', + * // '*' ] + * console.log(request.rawHeaders); + * ``` + * @since v8.4.0 + */ + readonly rawHeaders: string[]; + /** + * The raw request/response trailer keys and values exactly as they were + * received. Only populated at the `'end'` event. + * @since v8.4.0 + */ + readonly rawTrailers: string[]; + /** + * The request scheme pseudo header field indicating the scheme + * portion of the target URL. + * @since v8.4.0 + */ + readonly scheme: string; + /** + * Returns a `Proxy` object that acts as a `net.Socket` (or `tls.TLSSocket`) but + * applies getters, setters, and methods based on HTTP/2 logic. + * + * `destroyed`, `readable`, and `writable` properties will be retrieved from and + * set on `request.stream`. + * + * `destroy`, `emit`, `end`, `on` and `once` methods will be called on`request.stream`. + * + * `setTimeout` method will be called on `request.stream.session`. + * + * `pause`, `read`, `resume`, and `write` will throw an error with code`ERR_HTTP2_NO_SOCKET_MANIPULATION`. See `Http2Session and Sockets` for + * more information. + * + * All other interactions will be routed directly to the socket. With TLS support, + * use `request.socket.getPeerCertificate()` to obtain the client's + * authentication details. + * @since v8.4.0 + */ + readonly socket: net.Socket | tls.TLSSocket; + /** + * The `Http2Stream` object backing the request. + * @since v8.4.0 + */ + readonly stream: ServerHttp2Stream; + /** + * The request/response trailers object. Only populated at the `'end'` event. + * @since v8.4.0 + */ + readonly trailers: IncomingHttpHeaders; + /** + * Request URL string. This contains only the URL that is present in the actual + * HTTP request. If the request is: + * + * ```http + * GET /status?name=ryan HTTP/1.1 + * Accept: text/plain + * ``` + * + * Then `request.url` will be: + * + * ```js + * '/status?name=ryan' + * ``` + * + * To parse the url into its parts, `new URL()` can be used: + * + * ```console + * $ node + * > new URL('/status?name=ryan', 'http://example.com') + * URL { + * href: 'http://example.com/status?name=ryan', + * origin: 'http://example.com', + * protocol: 'http:', + * username: '', + * password: '', + * host: 'example.com', + * hostname: 'example.com', + * port: '', + * pathname: '/status', + * search: '?name=ryan', + * searchParams: URLSearchParams { 'name' => 'ryan' }, + * hash: '' + * } + * ``` + * @since v8.4.0 + */ + url: string; + /** + * Sets the `Http2Stream`'s timeout value to `msecs`. If a callback is + * provided, then it is added as a listener on the `'timeout'` event on + * the response object. + * + * If no `'timeout'` listener is added to the request, the response, or + * the server, then `Http2Stream` s are destroyed when they time out. If a + * handler is assigned to the request, the response, or the server's `'timeout'`events, timed out sockets must be handled explicitly. + * @since v8.4.0 + */ + setTimeout(msecs: number, callback?: () => void): void; + read(size?: number): Buffer | string | null; + addListener(event: "aborted", listener: (hadError: boolean, code: number) => void): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "data", listener: (chunk: Buffer | string) => void): this; + addListener(event: "end", listener: () => void): this; + addListener(event: "readable", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + emit(event: "aborted", hadError: boolean, code: number): boolean; + emit(event: "close"): boolean; + emit(event: "data", chunk: Buffer | string): boolean; + emit(event: "end"): boolean; + emit(event: "readable"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on(event: "aborted", listener: (hadError: boolean, code: number) => void): this; + on(event: "close", listener: () => void): this; + on(event: "data", listener: (chunk: Buffer | string) => void): this; + on(event: "end", listener: () => void): this; + on(event: "readable", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: "aborted", listener: (hadError: boolean, code: number) => void): this; + once(event: "close", listener: () => void): this; + once(event: "data", listener: (chunk: Buffer | string) => void): this; + once(event: "end", listener: () => void): this; + once(event: "readable", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener(event: "aborted", listener: (hadError: boolean, code: number) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "data", listener: (chunk: Buffer | string) => void): this; + prependListener(event: "end", listener: () => void): this; + prependListener(event: "readable", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener(event: "aborted", listener: (hadError: boolean, code: number) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "data", listener: (chunk: Buffer | string) => void): this; + prependOnceListener(event: "end", listener: () => void): this; + prependOnceListener(event: "readable", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + /** + * This object is created internally by an HTTP server, not by the user. It is + * passed as the second parameter to the `'request'` event. + * @since v8.4.0 + */ + export class Http2ServerResponse extends stream.Writable { + constructor(stream: ServerHttp2Stream); + /** + * See `response.socket`. + * @since v8.4.0 + * @deprecated Since v13.0.0 - Use `socket`. + */ + readonly connection: net.Socket | tls.TLSSocket; + /** + * Boolean value that indicates whether the response has completed. Starts + * as `false`. After `response.end()` executes, the value will be `true`. + * @since v8.4.0 + * @deprecated Since v13.4.0,v12.16.0 - Use `writableEnded`. + */ + readonly finished: boolean; + /** + * True if headers were sent, false otherwise (read-only). + * @since v8.4.0 + */ + readonly headersSent: boolean; + /** + * A reference to the original HTTP2 `request` object. + * @since v15.7.0 + */ + readonly req: Http2ServerRequest; + /** + * Returns a `Proxy` object that acts as a `net.Socket` (or `tls.TLSSocket`) but + * applies getters, setters, and methods based on HTTP/2 logic. + * + * `destroyed`, `readable`, and `writable` properties will be retrieved from and + * set on `response.stream`. + * + * `destroy`, `emit`, `end`, `on` and `once` methods will be called on`response.stream`. + * + * `setTimeout` method will be called on `response.stream.session`. + * + * `pause`, `read`, `resume`, and `write` will throw an error with code`ERR_HTTP2_NO_SOCKET_MANIPULATION`. See `Http2Session and Sockets` for + * more information. + * + * All other interactions will be routed directly to the socket. + * + * ```js + * const http2 = require('node:http2'); + * const server = http2.createServer((req, res) => { + * const ip = req.socket.remoteAddress; + * const port = req.socket.remotePort; + * res.end(`Your IP address is ${ip} and your source port is ${port}.`); + * }).listen(3000); + * ``` + * @since v8.4.0 + */ + readonly socket: net.Socket | tls.TLSSocket; + /** + * The `Http2Stream` object backing the response. + * @since v8.4.0 + */ + readonly stream: ServerHttp2Stream; + /** + * When true, the Date header will be automatically generated and sent in + * the response if it is not already present in the headers. Defaults to true. + * + * This should only be disabled for testing; HTTP requires the Date header + * in responses. + * @since v8.4.0 + */ + sendDate: boolean; + /** + * When using implicit headers (not calling `response.writeHead()` explicitly), + * this property controls the status code that will be sent to the client when + * the headers get flushed. + * + * ```js + * response.statusCode = 404; + * ``` + * + * After response header was sent to the client, this property indicates the + * status code which was sent out. + * @since v8.4.0 + */ + statusCode: number; + /** + * Status message is not supported by HTTP/2 (RFC 7540 8.1.2.4). It returns + * an empty string. + * @since v8.4.0 + */ + statusMessage: ""; + /** + * This method adds HTTP trailing headers (a header but at the end of the + * message) to the response. + * + * Attempting to set a header field name or value that contains invalid characters + * will result in a `TypeError` being thrown. + * @since v8.4.0 + */ + addTrailers(trailers: OutgoingHttpHeaders): void; + /** + * This method signals to the server that all of the response headers and body + * have been sent; that server should consider this message complete. + * The method, `response.end()`, MUST be called on each response. + * + * If `data` is specified, it is equivalent to calling `response.write(data, encoding)` followed by `response.end(callback)`. + * + * If `callback` is specified, it will be called when the response stream + * is finished. + * @since v8.4.0 + */ + end(callback?: () => void): this; + end(data: string | Uint8Array, callback?: () => void): this; + end(data: string | Uint8Array, encoding: BufferEncoding, callback?: () => void): this; + /** + * Reads out a header that has already been queued but not sent to the client. + * The name is case-insensitive. + * + * ```js + * const contentType = response.getHeader('content-type'); + * ``` + * @since v8.4.0 + */ + getHeader(name: string): string; + /** + * Returns an array containing the unique names of the current outgoing headers. + * All header names are lowercase. + * + * ```js + * response.setHeader('Foo', 'bar'); + * response.setHeader('Set-Cookie', ['foo=bar', 'bar=baz']); + * + * const headerNames = response.getHeaderNames(); + * // headerNames === ['foo', 'set-cookie'] + * ``` + * @since v8.4.0 + */ + getHeaderNames(): string[]; + /** + * Returns a shallow copy of the current outgoing headers. Since a shallow copy + * is used, array values may be mutated without additional calls to various + * header-related http module methods. The keys of the returned object are the + * header names and the values are the respective header values. All header names + * are lowercase. + * + * The object returned by the `response.getHeaders()` method _does not_prototypically inherit from the JavaScript `Object`. This means that typical`Object` methods such as `obj.toString()`, + * `obj.hasOwnProperty()`, and others + * are not defined and _will not work_. + * + * ```js + * response.setHeader('Foo', 'bar'); + * response.setHeader('Set-Cookie', ['foo=bar', 'bar=baz']); + * + * const headers = response.getHeaders(); + * // headers === { foo: 'bar', 'set-cookie': ['foo=bar', 'bar=baz'] } + * ``` + * @since v8.4.0 + */ + getHeaders(): OutgoingHttpHeaders; + /** + * Returns `true` if the header identified by `name` is currently set in the + * outgoing headers. The header name matching is case-insensitive. + * + * ```js + * const hasContentType = response.hasHeader('content-type'); + * ``` + * @since v8.4.0 + */ + hasHeader(name: string): boolean; + /** + * Removes a header that has been queued for implicit sending. + * + * ```js + * response.removeHeader('Content-Encoding'); + * ``` + * @since v8.4.0 + */ + removeHeader(name: string): void; + /** + * Sets a single header value for implicit headers. If this header already exists + * in the to-be-sent headers, its value will be replaced. Use an array of strings + * here to send multiple headers with the same name. + * + * ```js + * response.setHeader('Content-Type', 'text/html; charset=utf-8'); + * ``` + * + * or + * + * ```js + * response.setHeader('Set-Cookie', ['type=ninja', 'language=javascript']); + * ``` + * + * Attempting to set a header field name or value that contains invalid characters + * will result in a `TypeError` being thrown. + * + * When headers have been set with `response.setHeader()`, they will be merged + * with any headers passed to `response.writeHead()`, with the headers passed + * to `response.writeHead()` given precedence. + * + * ```js + * // Returns content-type = text/plain + * const server = http2.createServer((req, res) => { + * res.setHeader('Content-Type', 'text/html; charset=utf-8'); + * res.setHeader('X-Foo', 'bar'); + * res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }); + * res.end('ok'); + * }); + * ``` + * @since v8.4.0 + */ + setHeader(name: string, value: number | string | readonly string[]): void; + /** + * Sets the `Http2Stream`'s timeout value to `msecs`. If a callback is + * provided, then it is added as a listener on the `'timeout'` event on + * the response object. + * + * If no `'timeout'` listener is added to the request, the response, or + * the server, then `Http2Stream` s are destroyed when they time out. If a + * handler is assigned to the request, the response, or the server's `'timeout'`events, timed out sockets must be handled explicitly. + * @since v8.4.0 + */ + setTimeout(msecs: number, callback?: () => void): void; + /** + * If this method is called and `response.writeHead()` has not been called, + * it will switch to implicit header mode and flush the implicit headers. + * + * This sends a chunk of the response body. This method may + * be called multiple times to provide successive parts of the body. + * + * In the `node:http` module, the response body is omitted when the + * request is a HEAD request. Similarly, the `204` and `304` responses _must not_ include a message body. + * + * `chunk` can be a string or a buffer. If `chunk` is a string, + * the second parameter specifies how to encode it into a byte stream. + * By default the `encoding` is `'utf8'`. `callback` will be called when this chunk + * of data is flushed. + * + * This is the raw HTTP body and has nothing to do with higher-level multi-part + * body encodings that may be used. + * + * The first time `response.write()` is called, it will send the buffered + * header information and the first chunk of the body to the client. The second + * time `response.write()` is called, Node.js assumes data will be streamed, + * and sends the new data separately. That is, the response is buffered up to the + * first chunk of the body. + * + * Returns `true` if the entire data was flushed successfully to the kernel + * buffer. Returns `false` if all or part of the data was queued in user memory.`'drain'` will be emitted when the buffer is free again. + * @since v8.4.0 + */ + write(chunk: string | Uint8Array, callback?: (err: Error) => void): boolean; + write(chunk: string | Uint8Array, encoding: BufferEncoding, callback?: (err: Error) => void): boolean; + /** + * Sends a status `100 Continue` to the client, indicating that the request body + * should be sent. See the `'checkContinue'` event on `Http2Server` and`Http2SecureServer`. + * @since v8.4.0 + */ + writeContinue(): void; + /** + * Sends a status `103 Early Hints` to the client with a Link header, + * indicating that the user agent can preload/preconnect the linked resources. + * The `hints` is an object containing the values of headers to be sent with + * early hints message. + * + * **Example** + * + * ```js + * const earlyHintsLink = '; rel=preload; as=style'; + * response.writeEarlyHints({ + * 'link': earlyHintsLink, + * }); + * + * const earlyHintsLinks = [ + * '; rel=preload; as=style', + * '; rel=preload; as=script', + * ]; + * response.writeEarlyHints({ + * 'link': earlyHintsLinks, + * }); + * ``` + * @since v18.11.0 + */ + writeEarlyHints(hints: Record): void; + /** + * Sends a response header to the request. The status code is a 3-digit HTTP + * status code, like `404`. The last argument, `headers`, are the response headers. + * + * Returns a reference to the `Http2ServerResponse`, so that calls can be chained. + * + * For compatibility with `HTTP/1`, a human-readable `statusMessage` may be + * passed as the second argument. However, because the `statusMessage` has no + * meaning within HTTP/2, the argument will have no effect and a process warning + * will be emitted. + * + * ```js + * const body = 'hello world'; + * response.writeHead(200, { + * 'Content-Length': Buffer.byteLength(body), + * 'Content-Type': 'text/plain; charset=utf-8', + * }); + * ``` + * + * `Content-Length` is given in bytes not characters. The`Buffer.byteLength()` API may be used to determine the number of bytes in a + * given encoding. On outbound messages, Node.js does not check if Content-Length + * and the length of the body being transmitted are equal or not. However, when + * receiving messages, Node.js will automatically reject messages when the`Content-Length` does not match the actual payload size. + * + * This method may be called at most one time on a message before `response.end()` is called. + * + * If `response.write()` or `response.end()` are called before calling + * this, the implicit/mutable headers will be calculated and call this function. + * + * When headers have been set with `response.setHeader()`, they will be merged + * with any headers passed to `response.writeHead()`, with the headers passed + * to `response.writeHead()` given precedence. + * + * ```js + * // Returns content-type = text/plain + * const server = http2.createServer((req, res) => { + * res.setHeader('Content-Type', 'text/html; charset=utf-8'); + * res.setHeader('X-Foo', 'bar'); + * res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }); + * res.end('ok'); + * }); + * ``` + * + * Attempting to set a header field name or value that contains invalid characters + * will result in a `TypeError` being thrown. + * @since v8.4.0 + */ + writeHead(statusCode: number, headers?: OutgoingHttpHeaders): this; + writeHead(statusCode: number, statusMessage: string, headers?: OutgoingHttpHeaders): this; + /** + * Call `http2stream.pushStream()` with the given headers, and wrap the + * given `Http2Stream` on a newly created `Http2ServerResponse` as the callback + * parameter if successful. When `Http2ServerRequest` is closed, the callback is + * called with an error `ERR_HTTP2_INVALID_STREAM`. + * @since v8.4.0 + * @param headers An object describing the headers + * @param callback Called once `http2stream.pushStream()` is finished, or either when the attempt to create the pushed `Http2Stream` has failed or has been rejected, or the state of + * `Http2ServerRequest` is closed prior to calling the `http2stream.pushStream()` method + */ + createPushResponse( + headers: OutgoingHttpHeaders, + callback: (err: Error | null, res: Http2ServerResponse) => void, + ): void; + addListener(event: "close", listener: () => void): this; + addListener(event: "drain", listener: () => void): this; + addListener(event: "error", listener: (error: Error) => void): this; + addListener(event: "finish", listener: () => void): this; + addListener(event: "pipe", listener: (src: stream.Readable) => void): this; + addListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + emit(event: "close"): boolean; + emit(event: "drain"): boolean; + emit(event: "error", error: Error): boolean; + emit(event: "finish"): boolean; + emit(event: "pipe", src: stream.Readable): boolean; + emit(event: "unpipe", src: stream.Readable): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on(event: "close", listener: () => void): this; + on(event: "drain", listener: () => void): this; + on(event: "error", listener: (error: Error) => void): this; + on(event: "finish", listener: () => void): this; + on(event: "pipe", listener: (src: stream.Readable) => void): this; + on(event: "unpipe", listener: (src: stream.Readable) => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "drain", listener: () => void): this; + once(event: "error", listener: (error: Error) => void): this; + once(event: "finish", listener: () => void): this; + once(event: "pipe", listener: (src: stream.Readable) => void): this; + once(event: "unpipe", listener: (src: stream.Readable) => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "drain", listener: () => void): this; + prependListener(event: "error", listener: (error: Error) => void): this; + prependListener(event: "finish", listener: () => void): this; + prependListener(event: "pipe", listener: (src: stream.Readable) => void): this; + prependListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "drain", listener: () => void): this; + prependOnceListener(event: "error", listener: (error: Error) => void): this; + prependOnceListener(event: "finish", listener: () => void): this; + prependOnceListener(event: "pipe", listener: (src: stream.Readable) => void): this; + prependOnceListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + export namespace constants { + const NGHTTP2_SESSION_SERVER: number; + const NGHTTP2_SESSION_CLIENT: number; + const NGHTTP2_STREAM_STATE_IDLE: number; + const NGHTTP2_STREAM_STATE_OPEN: number; + const NGHTTP2_STREAM_STATE_RESERVED_LOCAL: number; + const NGHTTP2_STREAM_STATE_RESERVED_REMOTE: number; + const NGHTTP2_STREAM_STATE_HALF_CLOSED_LOCAL: number; + const NGHTTP2_STREAM_STATE_HALF_CLOSED_REMOTE: number; + const NGHTTP2_STREAM_STATE_CLOSED: number; + const NGHTTP2_NO_ERROR: number; + const NGHTTP2_PROTOCOL_ERROR: number; + const NGHTTP2_INTERNAL_ERROR: number; + const NGHTTP2_FLOW_CONTROL_ERROR: number; + const NGHTTP2_SETTINGS_TIMEOUT: number; + const NGHTTP2_STREAM_CLOSED: number; + const NGHTTP2_FRAME_SIZE_ERROR: number; + const NGHTTP2_REFUSED_STREAM: number; + const NGHTTP2_CANCEL: number; + const NGHTTP2_COMPRESSION_ERROR: number; + const NGHTTP2_CONNECT_ERROR: number; + const NGHTTP2_ENHANCE_YOUR_CALM: number; + const NGHTTP2_INADEQUATE_SECURITY: number; + const NGHTTP2_HTTP_1_1_REQUIRED: number; + const NGHTTP2_ERR_FRAME_SIZE_ERROR: number; + const NGHTTP2_FLAG_NONE: number; + const NGHTTP2_FLAG_END_STREAM: number; + const NGHTTP2_FLAG_END_HEADERS: number; + const NGHTTP2_FLAG_ACK: number; + const NGHTTP2_FLAG_PADDED: number; + const NGHTTP2_FLAG_PRIORITY: number; + const DEFAULT_SETTINGS_HEADER_TABLE_SIZE: number; + const DEFAULT_SETTINGS_ENABLE_PUSH: number; + const DEFAULT_SETTINGS_INITIAL_WINDOW_SIZE: number; + const DEFAULT_SETTINGS_MAX_FRAME_SIZE: number; + const MAX_MAX_FRAME_SIZE: number; + const MIN_MAX_FRAME_SIZE: number; + const MAX_INITIAL_WINDOW_SIZE: number; + const NGHTTP2_DEFAULT_WEIGHT: number; + const NGHTTP2_SETTINGS_HEADER_TABLE_SIZE: number; + const NGHTTP2_SETTINGS_ENABLE_PUSH: number; + const NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS: number; + const NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE: number; + const NGHTTP2_SETTINGS_MAX_FRAME_SIZE: number; + const NGHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE: number; + const PADDING_STRATEGY_NONE: number; + const PADDING_STRATEGY_MAX: number; + const PADDING_STRATEGY_CALLBACK: number; + const HTTP2_HEADER_STATUS: string; + const HTTP2_HEADER_METHOD: string; + const HTTP2_HEADER_AUTHORITY: string; + const HTTP2_HEADER_SCHEME: string; + const HTTP2_HEADER_PATH: string; + const HTTP2_HEADER_ACCEPT_CHARSET: string; + const HTTP2_HEADER_ACCEPT_ENCODING: string; + const HTTP2_HEADER_ACCEPT_LANGUAGE: string; + const HTTP2_HEADER_ACCEPT_RANGES: string; + const HTTP2_HEADER_ACCEPT: string; + const HTTP2_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN: string; + const HTTP2_HEADER_AGE: string; + const HTTP2_HEADER_ALLOW: string; + const HTTP2_HEADER_AUTHORIZATION: string; + const HTTP2_HEADER_CACHE_CONTROL: string; + const HTTP2_HEADER_CONNECTION: string; + const HTTP2_HEADER_CONTENT_DISPOSITION: string; + const HTTP2_HEADER_CONTENT_ENCODING: string; + const HTTP2_HEADER_CONTENT_LANGUAGE: string; + const HTTP2_HEADER_CONTENT_LENGTH: string; + const HTTP2_HEADER_CONTENT_LOCATION: string; + const HTTP2_HEADER_CONTENT_MD5: string; + const HTTP2_HEADER_CONTENT_RANGE: string; + const HTTP2_HEADER_CONTENT_TYPE: string; + const HTTP2_HEADER_COOKIE: string; + const HTTP2_HEADER_DATE: string; + const HTTP2_HEADER_ETAG: string; + const HTTP2_HEADER_EXPECT: string; + const HTTP2_HEADER_EXPIRES: string; + const HTTP2_HEADER_FROM: string; + const HTTP2_HEADER_HOST: string; + const HTTP2_HEADER_IF_MATCH: string; + const HTTP2_HEADER_IF_MODIFIED_SINCE: string; + const HTTP2_HEADER_IF_NONE_MATCH: string; + const HTTP2_HEADER_IF_RANGE: string; + const HTTP2_HEADER_IF_UNMODIFIED_SINCE: string; + const HTTP2_HEADER_LAST_MODIFIED: string; + const HTTP2_HEADER_LINK: string; + const HTTP2_HEADER_LOCATION: string; + const HTTP2_HEADER_MAX_FORWARDS: string; + const HTTP2_HEADER_PREFER: string; + const HTTP2_HEADER_PROXY_AUTHENTICATE: string; + const HTTP2_HEADER_PROXY_AUTHORIZATION: string; + const HTTP2_HEADER_RANGE: string; + const HTTP2_HEADER_REFERER: string; + const HTTP2_HEADER_REFRESH: string; + const HTTP2_HEADER_RETRY_AFTER: string; + const HTTP2_HEADER_SERVER: string; + const HTTP2_HEADER_SET_COOKIE: string; + const HTTP2_HEADER_STRICT_TRANSPORT_SECURITY: string; + const HTTP2_HEADER_TRANSFER_ENCODING: string; + const HTTP2_HEADER_TE: string; + const HTTP2_HEADER_UPGRADE: string; + const HTTP2_HEADER_USER_AGENT: string; + const HTTP2_HEADER_VARY: string; + const HTTP2_HEADER_VIA: string; + const HTTP2_HEADER_WWW_AUTHENTICATE: string; + const HTTP2_HEADER_HTTP2_SETTINGS: string; + const HTTP2_HEADER_KEEP_ALIVE: string; + const HTTP2_HEADER_PROXY_CONNECTION: string; + const HTTP2_METHOD_ACL: string; + const HTTP2_METHOD_BASELINE_CONTROL: string; + const HTTP2_METHOD_BIND: string; + const HTTP2_METHOD_CHECKIN: string; + const HTTP2_METHOD_CHECKOUT: string; + const HTTP2_METHOD_CONNECT: string; + const HTTP2_METHOD_COPY: string; + const HTTP2_METHOD_DELETE: string; + const HTTP2_METHOD_GET: string; + const HTTP2_METHOD_HEAD: string; + const HTTP2_METHOD_LABEL: string; + const HTTP2_METHOD_LINK: string; + const HTTP2_METHOD_LOCK: string; + const HTTP2_METHOD_MERGE: string; + const HTTP2_METHOD_MKACTIVITY: string; + const HTTP2_METHOD_MKCALENDAR: string; + const HTTP2_METHOD_MKCOL: string; + const HTTP2_METHOD_MKREDIRECTREF: string; + const HTTP2_METHOD_MKWORKSPACE: string; + const HTTP2_METHOD_MOVE: string; + const HTTP2_METHOD_OPTIONS: string; + const HTTP2_METHOD_ORDERPATCH: string; + const HTTP2_METHOD_PATCH: string; + const HTTP2_METHOD_POST: string; + const HTTP2_METHOD_PRI: string; + const HTTP2_METHOD_PROPFIND: string; + const HTTP2_METHOD_PROPPATCH: string; + const HTTP2_METHOD_PUT: string; + const HTTP2_METHOD_REBIND: string; + const HTTP2_METHOD_REPORT: string; + const HTTP2_METHOD_SEARCH: string; + const HTTP2_METHOD_TRACE: string; + const HTTP2_METHOD_UNBIND: string; + const HTTP2_METHOD_UNCHECKOUT: string; + const HTTP2_METHOD_UNLINK: string; + const HTTP2_METHOD_UNLOCK: string; + const HTTP2_METHOD_UPDATE: string; + const HTTP2_METHOD_UPDATEREDIRECTREF: string; + const HTTP2_METHOD_VERSION_CONTROL: string; + const HTTP_STATUS_CONTINUE: number; + const HTTP_STATUS_SWITCHING_PROTOCOLS: number; + const HTTP_STATUS_PROCESSING: number; + const HTTP_STATUS_OK: number; + const HTTP_STATUS_CREATED: number; + const HTTP_STATUS_ACCEPTED: number; + const HTTP_STATUS_NON_AUTHORITATIVE_INFORMATION: number; + const HTTP_STATUS_NO_CONTENT: number; + const HTTP_STATUS_RESET_CONTENT: number; + const HTTP_STATUS_PARTIAL_CONTENT: number; + const HTTP_STATUS_MULTI_STATUS: number; + const HTTP_STATUS_ALREADY_REPORTED: number; + const HTTP_STATUS_IM_USED: number; + const HTTP_STATUS_MULTIPLE_CHOICES: number; + const HTTP_STATUS_MOVED_PERMANENTLY: number; + const HTTP_STATUS_FOUND: number; + const HTTP_STATUS_SEE_OTHER: number; + const HTTP_STATUS_NOT_MODIFIED: number; + const HTTP_STATUS_USE_PROXY: number; + const HTTP_STATUS_TEMPORARY_REDIRECT: number; + const HTTP_STATUS_PERMANENT_REDIRECT: number; + const HTTP_STATUS_BAD_REQUEST: number; + const HTTP_STATUS_UNAUTHORIZED: number; + const HTTP_STATUS_PAYMENT_REQUIRED: number; + const HTTP_STATUS_FORBIDDEN: number; + const HTTP_STATUS_NOT_FOUND: number; + const HTTP_STATUS_METHOD_NOT_ALLOWED: number; + const HTTP_STATUS_NOT_ACCEPTABLE: number; + const HTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED: number; + const HTTP_STATUS_REQUEST_TIMEOUT: number; + const HTTP_STATUS_CONFLICT: number; + const HTTP_STATUS_GONE: number; + const HTTP_STATUS_LENGTH_REQUIRED: number; + const HTTP_STATUS_PRECONDITION_FAILED: number; + const HTTP_STATUS_PAYLOAD_TOO_LARGE: number; + const HTTP_STATUS_URI_TOO_LONG: number; + const HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE: number; + const HTTP_STATUS_RANGE_NOT_SATISFIABLE: number; + const HTTP_STATUS_EXPECTATION_FAILED: number; + const HTTP_STATUS_TEAPOT: number; + const HTTP_STATUS_MISDIRECTED_REQUEST: number; + const HTTP_STATUS_UNPROCESSABLE_ENTITY: number; + const HTTP_STATUS_LOCKED: number; + const HTTP_STATUS_FAILED_DEPENDENCY: number; + const HTTP_STATUS_UNORDERED_COLLECTION: number; + const HTTP_STATUS_UPGRADE_REQUIRED: number; + const HTTP_STATUS_PRECONDITION_REQUIRED: number; + const HTTP_STATUS_TOO_MANY_REQUESTS: number; + const HTTP_STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE: number; + const HTTP_STATUS_UNAVAILABLE_FOR_LEGAL_REASONS: number; + const HTTP_STATUS_INTERNAL_SERVER_ERROR: number; + const HTTP_STATUS_NOT_IMPLEMENTED: number; + const HTTP_STATUS_BAD_GATEWAY: number; + const HTTP_STATUS_SERVICE_UNAVAILABLE: number; + const HTTP_STATUS_GATEWAY_TIMEOUT: number; + const HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED: number; + const HTTP_STATUS_VARIANT_ALSO_NEGOTIATES: number; + const HTTP_STATUS_INSUFFICIENT_STORAGE: number; + const HTTP_STATUS_LOOP_DETECTED: number; + const HTTP_STATUS_BANDWIDTH_LIMIT_EXCEEDED: number; + const HTTP_STATUS_NOT_EXTENDED: number; + const HTTP_STATUS_NETWORK_AUTHENTICATION_REQUIRED: number; + } + /** + * This symbol can be set as a property on the HTTP/2 headers object with + * an array value in order to provide a list of headers considered sensitive. + */ + export const sensitiveHeaders: symbol; + /** + * Returns an object containing the default settings for an `Http2Session`instance. This method returns a new object instance every time it is called + * so instances returned may be safely modified for use. + * @since v8.4.0 + */ + export function getDefaultSettings(): Settings; + /** + * Returns a `Buffer` instance containing serialized representation of the given + * HTTP/2 settings as specified in the [HTTP/2](https://tools.ietf.org/html/rfc7540) specification. This is intended + * for use with the `HTTP2-Settings` header field. + * + * ```js + * const http2 = require('node:http2'); + * + * const packed = http2.getPackedSettings({ enablePush: false }); + * + * console.log(packed.toString('base64')); + * // Prints: AAIAAAAA + * ``` + * @since v8.4.0 + */ + export function getPackedSettings(settings: Settings): Buffer; + /** + * Returns a `HTTP/2 Settings Object` containing the deserialized settings from + * the given `Buffer` as generated by `http2.getPackedSettings()`. + * @since v8.4.0 + * @param buf The packed settings. + */ + export function getUnpackedSettings(buf: Uint8Array): Settings; + /** + * Returns a `net.Server` instance that creates and manages `Http2Session`instances. + * + * Since there are no browsers known that support [unencrypted HTTP/2](https://http2.github.io/faq/#does-http2-require-encryption), the use of {@link createSecureServer} is necessary when + * communicating + * with browser clients. + * + * ```js + * const http2 = require('node:http2'); + * + * // Create an unencrypted HTTP/2 server. + * // Since there are no browsers known that support + * // unencrypted HTTP/2, the use of `http2.createSecureServer()` + * // is necessary when communicating with browser clients. + * const server = http2.createServer(); + * + * server.on('stream', (stream, headers) => { + * stream.respond({ + * 'content-type': 'text/html; charset=utf-8', + * ':status': 200, + * }); + * stream.end('

Hello World

'); + * }); + * + * server.listen(8000); + * ``` + * @since v8.4.0 + * @param onRequestHandler See `Compatibility API` + */ + export function createServer( + onRequestHandler?: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): Http2Server; + export function createServer( + options: ServerOptions, + onRequestHandler?: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): Http2Server; + /** + * Returns a `tls.Server` instance that creates and manages `Http2Session`instances. + * + * ```js + * const http2 = require('node:http2'); + * const fs = require('node:fs'); + * + * const options = { + * key: fs.readFileSync('server-key.pem'), + * cert: fs.readFileSync('server-cert.pem'), + * }; + * + * // Create a secure HTTP/2 server + * const server = http2.createSecureServer(options); + * + * server.on('stream', (stream, headers) => { + * stream.respond({ + * 'content-type': 'text/html; charset=utf-8', + * ':status': 200, + * }); + * stream.end('

Hello World

'); + * }); + * + * server.listen(8443); + * ``` + * @since v8.4.0 + * @param onRequestHandler See `Compatibility API` + */ + export function createSecureServer( + onRequestHandler?: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): Http2SecureServer; + export function createSecureServer( + options: SecureServerOptions, + onRequestHandler?: (request: Http2ServerRequest, response: Http2ServerResponse) => void, + ): Http2SecureServer; + /** + * Returns a `ClientHttp2Session` instance. + * + * ```js + * const http2 = require('node:http2'); + * const client = http2.connect('https://localhost:1234'); + * + * // Use the client + * + * client.close(); + * ``` + * @since v8.4.0 + * @param authority The remote HTTP/2 server to connect to. This must be in the form of a minimal, valid URL with the `http://` or `https://` prefix, host name, and IP port (if a non-default port + * is used). Userinfo (user ID and password), path, querystring, and fragment details in the URL will be ignored. + * @param listener Will be registered as a one-time listener of the {@link 'connect'} event. + */ + export function connect( + authority: string | url.URL, + listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void, + ): ClientHttp2Session; + export function connect( + authority: string | url.URL, + options?: ClientSessionOptions | SecureClientSessionOptions, + listener?: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void, + ): ClientHttp2Session; +} +declare module "node:http2" { + export * from "http2"; +} diff --git a/task/node_modules/@types/node/ts4.8/https.d.ts b/task/node_modules/@types/node/ts4.8/https.d.ts new file mode 100644 index 0000000..36ae5b2 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/https.d.ts @@ -0,0 +1,550 @@ +/** + * HTTPS is the HTTP protocol over TLS/SSL. In Node.js this is implemented as a + * separate module. + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/https.js) + */ +declare module "https" { + import { Duplex } from "node:stream"; + import * as tls from "node:tls"; + import * as http from "node:http"; + import { URL } from "node:url"; + type ServerOptions< + Request extends typeof http.IncomingMessage = typeof http.IncomingMessage, + Response extends typeof http.ServerResponse = typeof http.ServerResponse, + > = tls.SecureContextOptions & tls.TlsOptions & http.ServerOptions; + type RequestOptions = + & http.RequestOptions + & tls.SecureContextOptions + & { + checkServerIdentity?: typeof tls.checkServerIdentity | undefined; + rejectUnauthorized?: boolean | undefined; // Defaults to true + servername?: string | undefined; // SNI TLS Extension + }; + interface AgentOptions extends http.AgentOptions, tls.ConnectionOptions { + rejectUnauthorized?: boolean | undefined; + maxCachedSessions?: number | undefined; + } + /** + * An `Agent` object for HTTPS similar to `http.Agent`. See {@link request} for more information. + * @since v0.4.5 + */ + class Agent extends http.Agent { + constructor(options?: AgentOptions); + options: AgentOptions; + } + interface Server< + Request extends typeof http.IncomingMessage = typeof http.IncomingMessage, + Response extends typeof http.ServerResponse = typeof http.ServerResponse, + > extends http.Server {} + /** + * See `http.Server` for more information. + * @since v0.3.4 + */ + class Server< + Request extends typeof http.IncomingMessage = typeof http.IncomingMessage, + Response extends typeof http.ServerResponse = typeof http.ServerResponse, + > extends tls.Server { + constructor(requestListener?: http.RequestListener); + constructor( + options: ServerOptions, + requestListener?: http.RequestListener, + ); + /** + * Closes all connections connected to this server. + * @since v18.2.0 + */ + closeAllConnections(): void; + /** + * Closes all connections connected to this server which are not sending a request or waiting for a response. + * @since v18.2.0 + */ + closeIdleConnections(): void; + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "keylog", listener: (line: Buffer, tlsSocket: tls.TLSSocket) => void): this; + addListener( + event: "newSession", + listener: (sessionId: Buffer, sessionData: Buffer, callback: (err: Error, resp: Buffer) => void) => void, + ): this; + addListener( + event: "OCSPRequest", + listener: ( + certificate: Buffer, + issuer: Buffer, + callback: (err: Error | null, resp: Buffer) => void, + ) => void, + ): this; + addListener( + event: "resumeSession", + listener: (sessionId: Buffer, callback: (err: Error, sessionData: Buffer) => void) => void, + ): this; + addListener(event: "secureConnection", listener: (tlsSocket: tls.TLSSocket) => void): this; + addListener(event: "tlsClientError", listener: (err: Error, tlsSocket: tls.TLSSocket) => void): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "connection", listener: (socket: Duplex) => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "listening", listener: () => void): this; + addListener(event: "checkContinue", listener: http.RequestListener): this; + addListener(event: "checkExpectation", listener: http.RequestListener): this; + addListener(event: "clientError", listener: (err: Error, socket: Duplex) => void): this; + addListener( + event: "connect", + listener: (req: InstanceType, socket: Duplex, head: Buffer) => void, + ): this; + addListener(event: "request", listener: http.RequestListener): this; + addListener( + event: "upgrade", + listener: (req: InstanceType, socket: Duplex, head: Buffer) => void, + ): this; + emit(event: string, ...args: any[]): boolean; + emit(event: "keylog", line: Buffer, tlsSocket: tls.TLSSocket): boolean; + emit( + event: "newSession", + sessionId: Buffer, + sessionData: Buffer, + callback: (err: Error, resp: Buffer) => void, + ): boolean; + emit( + event: "OCSPRequest", + certificate: Buffer, + issuer: Buffer, + callback: (err: Error | null, resp: Buffer) => void, + ): boolean; + emit(event: "resumeSession", sessionId: Buffer, callback: (err: Error, sessionData: Buffer) => void): boolean; + emit(event: "secureConnection", tlsSocket: tls.TLSSocket): boolean; + emit(event: "tlsClientError", err: Error, tlsSocket: tls.TLSSocket): boolean; + emit(event: "close"): boolean; + emit(event: "connection", socket: Duplex): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "listening"): boolean; + emit( + event: "checkContinue", + req: InstanceType, + res: InstanceType & { + req: InstanceType; + }, + ): boolean; + emit( + event: "checkExpectation", + req: InstanceType, + res: InstanceType & { + req: InstanceType; + }, + ): boolean; + emit(event: "clientError", err: Error, socket: Duplex): boolean; + emit(event: "connect", req: InstanceType, socket: Duplex, head: Buffer): boolean; + emit( + event: "request", + req: InstanceType, + res: InstanceType & { + req: InstanceType; + }, + ): boolean; + emit(event: "upgrade", req: InstanceType, socket: Duplex, head: Buffer): boolean; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "keylog", listener: (line: Buffer, tlsSocket: tls.TLSSocket) => void): this; + on( + event: "newSession", + listener: (sessionId: Buffer, sessionData: Buffer, callback: (err: Error, resp: Buffer) => void) => void, + ): this; + on( + event: "OCSPRequest", + listener: ( + certificate: Buffer, + issuer: Buffer, + callback: (err: Error | null, resp: Buffer) => void, + ) => void, + ): this; + on( + event: "resumeSession", + listener: (sessionId: Buffer, callback: (err: Error, sessionData: Buffer) => void) => void, + ): this; + on(event: "secureConnection", listener: (tlsSocket: tls.TLSSocket) => void): this; + on(event: "tlsClientError", listener: (err: Error, tlsSocket: tls.TLSSocket) => void): this; + on(event: "close", listener: () => void): this; + on(event: "connection", listener: (socket: Duplex) => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "listening", listener: () => void): this; + on(event: "checkContinue", listener: http.RequestListener): this; + on(event: "checkExpectation", listener: http.RequestListener): this; + on(event: "clientError", listener: (err: Error, socket: Duplex) => void): this; + on(event: "connect", listener: (req: InstanceType, socket: Duplex, head: Buffer) => void): this; + on(event: "request", listener: http.RequestListener): this; + on(event: "upgrade", listener: (req: InstanceType, socket: Duplex, head: Buffer) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "keylog", listener: (line: Buffer, tlsSocket: tls.TLSSocket) => void): this; + once( + event: "newSession", + listener: (sessionId: Buffer, sessionData: Buffer, callback: (err: Error, resp: Buffer) => void) => void, + ): this; + once( + event: "OCSPRequest", + listener: ( + certificate: Buffer, + issuer: Buffer, + callback: (err: Error | null, resp: Buffer) => void, + ) => void, + ): this; + once( + event: "resumeSession", + listener: (sessionId: Buffer, callback: (err: Error, sessionData: Buffer) => void) => void, + ): this; + once(event: "secureConnection", listener: (tlsSocket: tls.TLSSocket) => void): this; + once(event: "tlsClientError", listener: (err: Error, tlsSocket: tls.TLSSocket) => void): this; + once(event: "close", listener: () => void): this; + once(event: "connection", listener: (socket: Duplex) => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "listening", listener: () => void): this; + once(event: "checkContinue", listener: http.RequestListener): this; + once(event: "checkExpectation", listener: http.RequestListener): this; + once(event: "clientError", listener: (err: Error, socket: Duplex) => void): this; + once(event: "connect", listener: (req: InstanceType, socket: Duplex, head: Buffer) => void): this; + once(event: "request", listener: http.RequestListener): this; + once(event: "upgrade", listener: (req: InstanceType, socket: Duplex, head: Buffer) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "keylog", listener: (line: Buffer, tlsSocket: tls.TLSSocket) => void): this; + prependListener( + event: "newSession", + listener: (sessionId: Buffer, sessionData: Buffer, callback: (err: Error, resp: Buffer) => void) => void, + ): this; + prependListener( + event: "OCSPRequest", + listener: ( + certificate: Buffer, + issuer: Buffer, + callback: (err: Error | null, resp: Buffer) => void, + ) => void, + ): this; + prependListener( + event: "resumeSession", + listener: (sessionId: Buffer, callback: (err: Error, sessionData: Buffer) => void) => void, + ): this; + prependListener(event: "secureConnection", listener: (tlsSocket: tls.TLSSocket) => void): this; + prependListener(event: "tlsClientError", listener: (err: Error, tlsSocket: tls.TLSSocket) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "connection", listener: (socket: Duplex) => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "listening", listener: () => void): this; + prependListener(event: "checkContinue", listener: http.RequestListener): this; + prependListener(event: "checkExpectation", listener: http.RequestListener): this; + prependListener(event: "clientError", listener: (err: Error, socket: Duplex) => void): this; + prependListener( + event: "connect", + listener: (req: InstanceType, socket: Duplex, head: Buffer) => void, + ): this; + prependListener(event: "request", listener: http.RequestListener): this; + prependListener( + event: "upgrade", + listener: (req: InstanceType, socket: Duplex, head: Buffer) => void, + ): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "keylog", listener: (line: Buffer, tlsSocket: tls.TLSSocket) => void): this; + prependOnceListener( + event: "newSession", + listener: (sessionId: Buffer, sessionData: Buffer, callback: (err: Error, resp: Buffer) => void) => void, + ): this; + prependOnceListener( + event: "OCSPRequest", + listener: ( + certificate: Buffer, + issuer: Buffer, + callback: (err: Error | null, resp: Buffer) => void, + ) => void, + ): this; + prependOnceListener( + event: "resumeSession", + listener: (sessionId: Buffer, callback: (err: Error, sessionData: Buffer) => void) => void, + ): this; + prependOnceListener(event: "secureConnection", listener: (tlsSocket: tls.TLSSocket) => void): this; + prependOnceListener(event: "tlsClientError", listener: (err: Error, tlsSocket: tls.TLSSocket) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "connection", listener: (socket: Duplex) => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "listening", listener: () => void): this; + prependOnceListener(event: "checkContinue", listener: http.RequestListener): this; + prependOnceListener(event: "checkExpectation", listener: http.RequestListener): this; + prependOnceListener(event: "clientError", listener: (err: Error, socket: Duplex) => void): this; + prependOnceListener( + event: "connect", + listener: (req: InstanceType, socket: Duplex, head: Buffer) => void, + ): this; + prependOnceListener(event: "request", listener: http.RequestListener): this; + prependOnceListener( + event: "upgrade", + listener: (req: InstanceType, socket: Duplex, head: Buffer) => void, + ): this; + } + /** + * ```js + * // curl -k https://localhost:8000/ + * const https = require('node:https'); + * const fs = require('node:fs'); + * + * const options = { + * key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'), + * cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem'), + * }; + * + * https.createServer(options, (req, res) => { + * res.writeHead(200); + * res.end('hello world\n'); + * }).listen(8000); + * ``` + * + * Or + * + * ```js + * const https = require('node:https'); + * const fs = require('node:fs'); + * + * const options = { + * pfx: fs.readFileSync('test/fixtures/test_cert.pfx'), + * passphrase: 'sample', + * }; + * + * https.createServer(options, (req, res) => { + * res.writeHead(200); + * res.end('hello world\n'); + * }).listen(8000); + * ``` + * @since v0.3.4 + * @param options Accepts `options` from `createServer`, `createSecureContext` and `createServer`. + * @param requestListener A listener to be added to the `'request'` event. + */ + function createServer< + Request extends typeof http.IncomingMessage = typeof http.IncomingMessage, + Response extends typeof http.ServerResponse = typeof http.ServerResponse, + >(requestListener?: http.RequestListener): Server; + function createServer< + Request extends typeof http.IncomingMessage = typeof http.IncomingMessage, + Response extends typeof http.ServerResponse = typeof http.ServerResponse, + >( + options: ServerOptions, + requestListener?: http.RequestListener, + ): Server; + /** + * Makes a request to a secure web server. + * + * The following additional `options` from `tls.connect()` are also accepted:`ca`, `cert`, `ciphers`, `clientCertEngine`, `crl`, `dhparam`, `ecdhCurve`,`honorCipherOrder`, `key`, `passphrase`, + * `pfx`, `rejectUnauthorized`,`secureOptions`, `secureProtocol`, `servername`, `sessionIdContext`,`highWaterMark`. + * + * `options` can be an object, a string, or a `URL` object. If `options` is a + * string, it is automatically parsed with `new URL()`. If it is a `URL` object, it will be automatically converted to an ordinary `options` object. + * + * `https.request()` returns an instance of the `http.ClientRequest` class. The `ClientRequest` instance is a writable stream. If one needs to + * upload a file with a POST request, then write to the `ClientRequest` object. + * + * ```js + * const https = require('node:https'); + * + * const options = { + * hostname: 'encrypted.google.com', + * port: 443, + * path: '/', + * method: 'GET', + * }; + * + * const req = https.request(options, (res) => { + * console.log('statusCode:', res.statusCode); + * console.log('headers:', res.headers); + * + * res.on('data', (d) => { + * process.stdout.write(d); + * }); + * }); + * + * req.on('error', (e) => { + * console.error(e); + * }); + * req.end(); + * ``` + * + * Example using options from `tls.connect()`: + * + * ```js + * const options = { + * hostname: 'encrypted.google.com', + * port: 443, + * path: '/', + * method: 'GET', + * key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'), + * cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem'), + * }; + * options.agent = new https.Agent(options); + * + * const req = https.request(options, (res) => { + * // ... + * }); + * ``` + * + * Alternatively, opt out of connection pooling by not using an `Agent`. + * + * ```js + * const options = { + * hostname: 'encrypted.google.com', + * port: 443, + * path: '/', + * method: 'GET', + * key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'), + * cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem'), + * agent: false, + * }; + * + * const req = https.request(options, (res) => { + * // ... + * }); + * ``` + * + * Example using a `URL` as `options`: + * + * ```js + * const options = new URL('https://abc:xyz@example.com'); + * + * const req = https.request(options, (res) => { + * // ... + * }); + * ``` + * + * Example pinning on certificate fingerprint, or the public key (similar to`pin-sha256`): + * + * ```js + * const tls = require('node:tls'); + * const https = require('node:https'); + * const crypto = require('node:crypto'); + * + * function sha256(s) { + * return crypto.createHash('sha256').update(s).digest('base64'); + * } + * const options = { + * hostname: 'github.com', + * port: 443, + * path: '/', + * method: 'GET', + * checkServerIdentity: function(host, cert) { + * // Make sure the certificate is issued to the host we are connected to + * const err = tls.checkServerIdentity(host, cert); + * if (err) { + * return err; + * } + * + * // Pin the public key, similar to HPKP pin-sha256 pinning + * const pubkey256 = 'pL1+qb9HTMRZJmuC/bB/ZI9d302BYrrqiVuRyW+DGrU='; + * if (sha256(cert.pubkey) !== pubkey256) { + * const msg = 'Certificate verification error: ' + + * `The public key of '${cert.subject.CN}' ` + + * 'does not match our pinned fingerprint'; + * return new Error(msg); + * } + * + * // Pin the exact certificate, rather than the pub key + * const cert256 = '25:FE:39:32:D9:63:8C:8A:FC:A1:9A:29:87:' + + * 'D8:3E:4C:1D:98:DB:71:E4:1A:48:03:98:EA:22:6A:BD:8B:93:16'; + * if (cert.fingerprint256 !== cert256) { + * const msg = 'Certificate verification error: ' + + * `The certificate of '${cert.subject.CN}' ` + + * 'does not match our pinned fingerprint'; + * return new Error(msg); + * } + * + * // This loop is informational only. + * // Print the certificate and public key fingerprints of all certs in the + * // chain. Its common to pin the public key of the issuer on the public + * // internet, while pinning the public key of the service in sensitive + * // environments. + * do { + * console.log('Subject Common Name:', cert.subject.CN); + * console.log(' Certificate SHA256 fingerprint:', cert.fingerprint256); + * + * hash = crypto.createHash('sha256'); + * console.log(' Public key ping-sha256:', sha256(cert.pubkey)); + * + * lastprint256 = cert.fingerprint256; + * cert = cert.issuerCertificate; + * } while (cert.fingerprint256 !== lastprint256); + * + * }, + * }; + * + * options.agent = new https.Agent(options); + * const req = https.request(options, (res) => { + * console.log('All OK. Server matched our pinned cert or public key'); + * console.log('statusCode:', res.statusCode); + * // Print the HPKP values + * console.log('headers:', res.headers['public-key-pins']); + * + * res.on('data', (d) => {}); + * }); + * + * req.on('error', (e) => { + * console.error(e.message); + * }); + * req.end(); + * ``` + * + * Outputs for example: + * + * ```text + * Subject Common Name: github.com + * Certificate SHA256 fingerprint: 25:FE:39:32:D9:63:8C:8A:FC:A1:9A:29:87:D8:3E:4C:1D:98:DB:71:E4:1A:48:03:98:EA:22:6A:BD:8B:93:16 + * Public key ping-sha256: pL1+qb9HTMRZJmuC/bB/ZI9d302BYrrqiVuRyW+DGrU= + * Subject Common Name: DigiCert SHA2 Extended Validation Server CA + * Certificate SHA256 fingerprint: 40:3E:06:2A:26:53:05:91:13:28:5B:AF:80:A0:D4:AE:42:2C:84:8C:9F:78:FA:D0:1F:C9:4B:C5:B8:7F:EF:1A + * Public key ping-sha256: RRM1dGqnDFsCJXBTHky16vi1obOlCgFFn/yOhI/y+ho= + * Subject Common Name: DigiCert High Assurance EV Root CA + * Certificate SHA256 fingerprint: 74:31:E5:F4:C3:C1:CE:46:90:77:4F:0B:61:E0:54:40:88:3B:A9:A0:1E:D0:0B:A6:AB:D7:80:6E:D3:B1:18:CF + * Public key ping-sha256: WoiWRyIOVNa9ihaBciRSC7XHjliYS9VwUGOIud4PB18= + * All OK. Server matched our pinned cert or public key + * 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 + * ``` + * @since v0.3.6 + * @param options Accepts all `options` from `request`, with some differences in default values: + */ + function request( + options: RequestOptions | string | URL, + callback?: (res: http.IncomingMessage) => void, + ): http.ClientRequest; + function request( + url: string | URL, + options: RequestOptions, + callback?: (res: http.IncomingMessage) => void, + ): http.ClientRequest; + /** + * Like `http.get()` but for HTTPS. + * + * `options` can be an object, a string, or a `URL` object. If `options` is a + * string, it is automatically parsed with `new URL()`. If it is a `URL` object, it will be automatically converted to an ordinary `options` object. + * + * ```js + * const https = require('node:https'); + * + * https.get('https://encrypted.google.com/', (res) => { + * console.log('statusCode:', res.statusCode); + * console.log('headers:', res.headers); + * + * res.on('data', (d) => { + * process.stdout.write(d); + * }); + * + * }).on('error', (e) => { + * console.error(e); + * }); + * ``` + * @since v0.3.6 + * @param options Accepts the same `options` as {@link request}, with the `method` always set to `GET`. + */ + function get( + options: RequestOptions | string | URL, + callback?: (res: http.IncomingMessage) => void, + ): http.ClientRequest; + function get( + url: string | URL, + options: RequestOptions, + callback?: (res: http.IncomingMessage) => void, + ): http.ClientRequest; + let globalAgent: Agent; +} +declare module "node:https" { + export * from "https"; +} diff --git a/task/node_modules/@types/node/ts4.8/index.d.ts b/task/node_modules/@types/node/ts4.8/index.d.ts new file mode 100644 index 0000000..7c8b38c --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/index.d.ts @@ -0,0 +1,88 @@ +/** + * License for programmatically and manually incorporated + * documentation aka. `JSDoc` from https://github.com/nodejs/node/tree/master/doc + * + * Copyright Node.js contributors. All rights reserved. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +// NOTE: These definitions support NodeJS and TypeScript 4.8 and earlier. + +// Reference required types from the default lib: +/// +/// +/// +/// + +// Base definitions for all NodeJS modules that are not specific to any version of TypeScript: +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// + +/// diff --git a/task/node_modules/@types/node/ts4.8/inspector.d.ts b/task/node_modules/@types/node/ts4.8/inspector.d.ts new file mode 100644 index 0000000..3927b81 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/inspector.d.ts @@ -0,0 +1,2747 @@ +// Type definitions for inspector + +// These definitions are auto-generated. +// Please see https://github.com/DefinitelyTyped/DefinitelyTyped/pull/19330 +// for more information. + + +/** + * The `node:inspector` module provides an API for interacting with the V8 + * inspector. + * + * It can be accessed using: + * + * ```js + * import * as inspector from 'node:inspector/promises'; + * ``` + * + * or + * + * ```js + * import * as inspector from 'node:inspector'; + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/inspector.js) + */ +declare module 'inspector' { + import EventEmitter = require('node:events'); + interface InspectorNotification { + method: string; + params: T; + } + namespace Schema { + /** + * Description of the protocol domain. + */ + interface Domain { + /** + * Domain name. + */ + name: string; + /** + * Domain version. + */ + version: string; + } + interface GetDomainsReturnType { + /** + * List of supported domains. + */ + domains: Domain[]; + } + } + namespace Runtime { + /** + * Unique script identifier. + */ + type ScriptId = string; + /** + * Unique object identifier. + */ + type RemoteObjectId = string; + /** + * Primitive value which cannot be JSON-stringified. + */ + type UnserializableValue = string; + /** + * Mirror object referencing original JavaScript object. + */ + interface RemoteObject { + /** + * Object type. + */ + type: string; + /** + * Object subtype hint. Specified for object type values only. + */ + subtype?: string | undefined; + /** + * Object class (constructor) name. Specified for object type values only. + */ + className?: string | undefined; + /** + * Remote object value in case of primitive values or JSON values (if it was requested). + */ + value?: any; + /** + * Primitive value which can not be JSON-stringified does not have value, but gets this property. + */ + unserializableValue?: UnserializableValue | undefined; + /** + * String representation of the object. + */ + description?: string | undefined; + /** + * Unique object identifier (for non-primitive values). + */ + objectId?: RemoteObjectId | undefined; + /** + * Preview containing abbreviated property values. Specified for object type values only. + * @experimental + */ + preview?: ObjectPreview | undefined; + /** + * @experimental + */ + customPreview?: CustomPreview | undefined; + } + /** + * @experimental + */ + interface CustomPreview { + header: string; + hasBody: boolean; + formatterObjectId: RemoteObjectId; + bindRemoteObjectFunctionId: RemoteObjectId; + configObjectId?: RemoteObjectId | undefined; + } + /** + * Object containing abbreviated remote object value. + * @experimental + */ + interface ObjectPreview { + /** + * Object type. + */ + type: string; + /** + * Object subtype hint. Specified for object type values only. + */ + subtype?: string | undefined; + /** + * String representation of the object. + */ + description?: string | undefined; + /** + * True iff some of the properties or entries of the original object did not fit. + */ + overflow: boolean; + /** + * List of the properties. + */ + properties: PropertyPreview[]; + /** + * List of the entries. Specified for map and set subtype values only. + */ + entries?: EntryPreview[] | undefined; + } + /** + * @experimental + */ + interface PropertyPreview { + /** + * Property name. + */ + name: string; + /** + * Object type. Accessor means that the property itself is an accessor property. + */ + type: string; + /** + * User-friendly property value string. + */ + value?: string | undefined; + /** + * Nested value preview. + */ + valuePreview?: ObjectPreview | undefined; + /** + * Object subtype hint. Specified for object type values only. + */ + subtype?: string | undefined; + } + /** + * @experimental + */ + interface EntryPreview { + /** + * Preview of the key. Specified for map-like collection entries. + */ + key?: ObjectPreview | undefined; + /** + * Preview of the value. + */ + value: ObjectPreview; + } + /** + * Object property descriptor. + */ + interface PropertyDescriptor { + /** + * Property name or symbol description. + */ + name: string; + /** + * The value associated with the property. + */ + value?: RemoteObject | undefined; + /** + * True if the value associated with the property may be changed (data descriptors only). + */ + writable?: boolean | undefined; + /** + * A function which serves as a getter for the property, or undefined if there is no getter (accessor descriptors only). + */ + get?: RemoteObject | undefined; + /** + * A function which serves as a setter for the property, or undefined if there is no setter (accessor descriptors only). + */ + set?: RemoteObject | undefined; + /** + * True if the type of this property descriptor may be changed and if the property may be deleted from the corresponding object. + */ + configurable: boolean; + /** + * True if this property shows up during enumeration of the properties on the corresponding object. + */ + enumerable: boolean; + /** + * True if the result was thrown during the evaluation. + */ + wasThrown?: boolean | undefined; + /** + * True if the property is owned for the object. + */ + isOwn?: boolean | undefined; + /** + * Property symbol object, if the property is of the symbol type. + */ + symbol?: RemoteObject | undefined; + } + /** + * Object internal property descriptor. This property isn't normally visible in JavaScript code. + */ + interface InternalPropertyDescriptor { + /** + * Conventional property name. + */ + name: string; + /** + * The value associated with the property. + */ + value?: RemoteObject | undefined; + } + /** + * Represents function call argument. Either remote object id objectId, primitive value, unserializable primitive value or neither of (for undefined) them should be specified. + */ + interface CallArgument { + /** + * Primitive value or serializable javascript object. + */ + value?: any; + /** + * Primitive value which can not be JSON-stringified. + */ + unserializableValue?: UnserializableValue | undefined; + /** + * Remote object handle. + */ + objectId?: RemoteObjectId | undefined; + } + /** + * Id of an execution context. + */ + type ExecutionContextId = number; + /** + * Description of an isolated world. + */ + interface ExecutionContextDescription { + /** + * Unique id of the execution context. It can be used to specify in which execution context script evaluation should be performed. + */ + id: ExecutionContextId; + /** + * Execution context origin. + */ + origin: string; + /** + * Human readable name describing given context. + */ + name: string; + /** + * Embedder-specific auxiliary data. + */ + auxData?: {} | undefined; + } + /** + * Detailed information about exception (or error) that was thrown during script compilation or execution. + */ + interface ExceptionDetails { + /** + * Exception id. + */ + exceptionId: number; + /** + * Exception text, which should be used together with exception object when available. + */ + text: string; + /** + * Line number of the exception location (0-based). + */ + lineNumber: number; + /** + * Column number of the exception location (0-based). + */ + columnNumber: number; + /** + * Script ID of the exception location. + */ + scriptId?: ScriptId | undefined; + /** + * URL of the exception location, to be used when the script was not reported. + */ + url?: string | undefined; + /** + * JavaScript stack trace if available. + */ + stackTrace?: StackTrace | undefined; + /** + * Exception object if available. + */ + exception?: RemoteObject | undefined; + /** + * Identifier of the context where exception happened. + */ + executionContextId?: ExecutionContextId | undefined; + } + /** + * Number of milliseconds since epoch. + */ + type Timestamp = number; + /** + * Stack entry for runtime errors and assertions. + */ + interface CallFrame { + /** + * JavaScript function name. + */ + functionName: string; + /** + * JavaScript script id. + */ + scriptId: ScriptId; + /** + * JavaScript script name or url. + */ + url: string; + /** + * JavaScript script line number (0-based). + */ + lineNumber: number; + /** + * JavaScript script column number (0-based). + */ + columnNumber: number; + } + /** + * Call frames for assertions or error messages. + */ + interface StackTrace { + /** + * String label of this stack trace. For async traces this may be a name of the function that initiated the async call. + */ + description?: string | undefined; + /** + * JavaScript function name. + */ + callFrames: CallFrame[]; + /** + * Asynchronous JavaScript stack trace that preceded this stack, if available. + */ + parent?: StackTrace | undefined; + /** + * Asynchronous JavaScript stack trace that preceded this stack, if available. + * @experimental + */ + parentId?: StackTraceId | undefined; + } + /** + * Unique identifier of current debugger. + * @experimental + */ + type UniqueDebuggerId = string; + /** + * If debuggerId is set stack trace comes from another debugger and can be resolved there. This allows to track cross-debugger calls. See Runtime.StackTrace and Debugger.paused for usages. + * @experimental + */ + interface StackTraceId { + id: string; + debuggerId?: UniqueDebuggerId | undefined; + } + interface EvaluateParameterType { + /** + * Expression to evaluate. + */ + expression: string; + /** + * Symbolic group name that can be used to release multiple objects. + */ + objectGroup?: string | undefined; + /** + * Determines whether Command Line API should be available during the evaluation. + */ + includeCommandLineAPI?: boolean | undefined; + /** + * In silent mode exceptions thrown during evaluation are not reported and do not pause execution. Overrides setPauseOnException state. + */ + silent?: boolean | undefined; + /** + * Specifies in which execution context to perform evaluation. If the parameter is omitted the evaluation will be performed in the context of the inspected page. + */ + contextId?: ExecutionContextId | undefined; + /** + * Whether the result is expected to be a JSON object that should be sent by value. + */ + returnByValue?: boolean | undefined; + /** + * Whether preview should be generated for the result. + * @experimental + */ + generatePreview?: boolean | undefined; + /** + * Whether execution should be treated as initiated by user in the UI. + */ + userGesture?: boolean | undefined; + /** + * Whether execution should await for resulting value and return once awaited promise is resolved. + */ + awaitPromise?: boolean | undefined; + } + interface AwaitPromiseParameterType { + /** + * Identifier of the promise. + */ + promiseObjectId: RemoteObjectId; + /** + * Whether the result is expected to be a JSON object that should be sent by value. + */ + returnByValue?: boolean | undefined; + /** + * Whether preview should be generated for the result. + */ + generatePreview?: boolean | undefined; + } + interface CallFunctionOnParameterType { + /** + * Declaration of the function to call. + */ + functionDeclaration: string; + /** + * Identifier of the object to call function on. Either objectId or executionContextId should be specified. + */ + objectId?: RemoteObjectId | undefined; + /** + * Call arguments. All call arguments must belong to the same JavaScript world as the target object. + */ + arguments?: CallArgument[] | undefined; + /** + * In silent mode exceptions thrown during evaluation are not reported and do not pause execution. Overrides setPauseOnException state. + */ + silent?: boolean | undefined; + /** + * Whether the result is expected to be a JSON object which should be sent by value. + */ + returnByValue?: boolean | undefined; + /** + * Whether preview should be generated for the result. + * @experimental + */ + generatePreview?: boolean | undefined; + /** + * Whether execution should be treated as initiated by user in the UI. + */ + userGesture?: boolean | undefined; + /** + * Whether execution should await for resulting value and return once awaited promise is resolved. + */ + awaitPromise?: boolean | undefined; + /** + * Specifies execution context which global object will be used to call function on. Either executionContextId or objectId should be specified. + */ + executionContextId?: ExecutionContextId | undefined; + /** + * Symbolic group name that can be used to release multiple objects. If objectGroup is not specified and objectId is, objectGroup will be inherited from object. + */ + objectGroup?: string | undefined; + } + interface GetPropertiesParameterType { + /** + * Identifier of the object to return properties for. + */ + objectId: RemoteObjectId; + /** + * If true, returns properties belonging only to the element itself, not to its prototype chain. + */ + ownProperties?: boolean | undefined; + /** + * If true, returns accessor properties (with getter/setter) only; internal properties are not returned either. + * @experimental + */ + accessorPropertiesOnly?: boolean | undefined; + /** + * Whether preview should be generated for the results. + * @experimental + */ + generatePreview?: boolean | undefined; + } + interface ReleaseObjectParameterType { + /** + * Identifier of the object to release. + */ + objectId: RemoteObjectId; + } + interface ReleaseObjectGroupParameterType { + /** + * Symbolic object group name. + */ + objectGroup: string; + } + interface SetCustomObjectFormatterEnabledParameterType { + enabled: boolean; + } + interface CompileScriptParameterType { + /** + * Expression to compile. + */ + expression: string; + /** + * Source url to be set for the script. + */ + sourceURL: string; + /** + * Specifies whether the compiled script should be persisted. + */ + persistScript: boolean; + /** + * Specifies in which execution context to perform script run. If the parameter is omitted the evaluation will be performed in the context of the inspected page. + */ + executionContextId?: ExecutionContextId | undefined; + } + interface RunScriptParameterType { + /** + * Id of the script to run. + */ + scriptId: ScriptId; + /** + * Specifies in which execution context to perform script run. If the parameter is omitted the evaluation will be performed in the context of the inspected page. + */ + executionContextId?: ExecutionContextId | undefined; + /** + * Symbolic group name that can be used to release multiple objects. + */ + objectGroup?: string | undefined; + /** + * In silent mode exceptions thrown during evaluation are not reported and do not pause execution. Overrides setPauseOnException state. + */ + silent?: boolean | undefined; + /** + * Determines whether Command Line API should be available during the evaluation. + */ + includeCommandLineAPI?: boolean | undefined; + /** + * Whether the result is expected to be a JSON object which should be sent by value. + */ + returnByValue?: boolean | undefined; + /** + * Whether preview should be generated for the result. + */ + generatePreview?: boolean | undefined; + /** + * Whether execution should await for resulting value and return once awaited promise is resolved. + */ + awaitPromise?: boolean | undefined; + } + interface QueryObjectsParameterType { + /** + * Identifier of the prototype to return objects for. + */ + prototypeObjectId: RemoteObjectId; + } + interface GlobalLexicalScopeNamesParameterType { + /** + * Specifies in which execution context to lookup global scope variables. + */ + executionContextId?: ExecutionContextId | undefined; + } + interface EvaluateReturnType { + /** + * Evaluation result. + */ + result: RemoteObject; + /** + * Exception details. + */ + exceptionDetails?: ExceptionDetails | undefined; + } + interface AwaitPromiseReturnType { + /** + * Promise result. Will contain rejected value if promise was rejected. + */ + result: RemoteObject; + /** + * Exception details if stack strace is available. + */ + exceptionDetails?: ExceptionDetails | undefined; + } + interface CallFunctionOnReturnType { + /** + * Call result. + */ + result: RemoteObject; + /** + * Exception details. + */ + exceptionDetails?: ExceptionDetails | undefined; + } + interface GetPropertiesReturnType { + /** + * Object properties. + */ + result: PropertyDescriptor[]; + /** + * Internal object properties (only of the element itself). + */ + internalProperties?: InternalPropertyDescriptor[] | undefined; + /** + * Exception details. + */ + exceptionDetails?: ExceptionDetails | undefined; + } + interface CompileScriptReturnType { + /** + * Id of the script. + */ + scriptId?: ScriptId | undefined; + /** + * Exception details. + */ + exceptionDetails?: ExceptionDetails | undefined; + } + interface RunScriptReturnType { + /** + * Run result. + */ + result: RemoteObject; + /** + * Exception details. + */ + exceptionDetails?: ExceptionDetails | undefined; + } + interface QueryObjectsReturnType { + /** + * Array with objects. + */ + objects: RemoteObject; + } + interface GlobalLexicalScopeNamesReturnType { + names: string[]; + } + interface ExecutionContextCreatedEventDataType { + /** + * A newly created execution context. + */ + context: ExecutionContextDescription; + } + interface ExecutionContextDestroyedEventDataType { + /** + * Id of the destroyed context + */ + executionContextId: ExecutionContextId; + } + interface ExceptionThrownEventDataType { + /** + * Timestamp of the exception. + */ + timestamp: Timestamp; + exceptionDetails: ExceptionDetails; + } + interface ExceptionRevokedEventDataType { + /** + * Reason describing why exception was revoked. + */ + reason: string; + /** + * The id of revoked exception, as reported in exceptionThrown. + */ + exceptionId: number; + } + interface ConsoleAPICalledEventDataType { + /** + * Type of the call. + */ + type: string; + /** + * Call arguments. + */ + args: RemoteObject[]; + /** + * Identifier of the context where the call was made. + */ + executionContextId: ExecutionContextId; + /** + * Call timestamp. + */ + timestamp: Timestamp; + /** + * Stack trace captured when the call was made. + */ + stackTrace?: StackTrace | undefined; + /** + * Console context descriptor for calls on non-default console context (not console.*): 'anonymous#unique-logger-id' for call on unnamed context, 'name#unique-logger-id' for call on named context. + * @experimental + */ + context?: string | undefined; + } + interface InspectRequestedEventDataType { + object: RemoteObject; + hints: {}; + } + } + namespace Debugger { + /** + * Breakpoint identifier. + */ + type BreakpointId = string; + /** + * Call frame identifier. + */ + type CallFrameId = string; + /** + * Location in the source code. + */ + interface Location { + /** + * Script identifier as reported in the Debugger.scriptParsed. + */ + scriptId: Runtime.ScriptId; + /** + * Line number in the script (0-based). + */ + lineNumber: number; + /** + * Column number in the script (0-based). + */ + columnNumber?: number | undefined; + } + /** + * Location in the source code. + * @experimental + */ + interface ScriptPosition { + lineNumber: number; + columnNumber: number; + } + /** + * JavaScript call frame. Array of call frames form the call stack. + */ + interface CallFrame { + /** + * Call frame identifier. This identifier is only valid while the virtual machine is paused. + */ + callFrameId: CallFrameId; + /** + * Name of the JavaScript function called on this call frame. + */ + functionName: string; + /** + * Location in the source code. + */ + functionLocation?: Location | undefined; + /** + * Location in the source code. + */ + location: Location; + /** + * JavaScript script name or url. + */ + url: string; + /** + * Scope chain for this call frame. + */ + scopeChain: Scope[]; + /** + * this object for this call frame. + */ + this: Runtime.RemoteObject; + /** + * The value being returned, if the function is at return point. + */ + returnValue?: Runtime.RemoteObject | undefined; + } + /** + * Scope description. + */ + interface Scope { + /** + * Scope type. + */ + type: string; + /** + * Object representing the scope. For global and with scopes it represents the actual object; for the rest of the scopes, it is artificial transient object enumerating scope variables as its properties. + */ + object: Runtime.RemoteObject; + name?: string | undefined; + /** + * Location in the source code where scope starts + */ + startLocation?: Location | undefined; + /** + * Location in the source code where scope ends + */ + endLocation?: Location | undefined; + } + /** + * Search match for resource. + */ + interface SearchMatch { + /** + * Line number in resource content. + */ + lineNumber: number; + /** + * Line with match content. + */ + lineContent: string; + } + interface BreakLocation { + /** + * Script identifier as reported in the Debugger.scriptParsed. + */ + scriptId: Runtime.ScriptId; + /** + * Line number in the script (0-based). + */ + lineNumber: number; + /** + * Column number in the script (0-based). + */ + columnNumber?: number | undefined; + type?: string | undefined; + } + interface SetBreakpointsActiveParameterType { + /** + * New value for breakpoints active state. + */ + active: boolean; + } + interface SetSkipAllPausesParameterType { + /** + * New value for skip pauses state. + */ + skip: boolean; + } + interface SetBreakpointByUrlParameterType { + /** + * Line number to set breakpoint at. + */ + lineNumber: number; + /** + * URL of the resources to set breakpoint on. + */ + url?: string | undefined; + /** + * Regex pattern for the URLs of the resources to set breakpoints on. Either url or urlRegex must be specified. + */ + urlRegex?: string | undefined; + /** + * Script hash of the resources to set breakpoint on. + */ + scriptHash?: string | undefined; + /** + * Offset in the line to set breakpoint at. + */ + columnNumber?: number | undefined; + /** + * Expression to use as a breakpoint condition. When specified, debugger will only stop on the breakpoint if this expression evaluates to true. + */ + condition?: string | undefined; + } + interface SetBreakpointParameterType { + /** + * Location to set breakpoint in. + */ + location: Location; + /** + * Expression to use as a breakpoint condition. When specified, debugger will only stop on the breakpoint if this expression evaluates to true. + */ + condition?: string | undefined; + } + interface RemoveBreakpointParameterType { + breakpointId: BreakpointId; + } + interface GetPossibleBreakpointsParameterType { + /** + * Start of range to search possible breakpoint locations in. + */ + start: Location; + /** + * End of range to search possible breakpoint locations in (excluding). When not specified, end of scripts is used as end of range. + */ + end?: Location | undefined; + /** + * Only consider locations which are in the same (non-nested) function as start. + */ + restrictToFunction?: boolean | undefined; + } + interface ContinueToLocationParameterType { + /** + * Location to continue to. + */ + location: Location; + targetCallFrames?: string | undefined; + } + interface PauseOnAsyncCallParameterType { + /** + * Debugger will pause when async call with given stack trace is started. + */ + parentStackTraceId: Runtime.StackTraceId; + } + interface StepIntoParameterType { + /** + * Debugger will issue additional Debugger.paused notification if any async task is scheduled before next pause. + * @experimental + */ + breakOnAsyncCall?: boolean | undefined; + } + interface GetStackTraceParameterType { + stackTraceId: Runtime.StackTraceId; + } + interface SearchInContentParameterType { + /** + * Id of the script to search in. + */ + scriptId: Runtime.ScriptId; + /** + * String to search for. + */ + query: string; + /** + * If true, search is case sensitive. + */ + caseSensitive?: boolean | undefined; + /** + * If true, treats string parameter as regex. + */ + isRegex?: boolean | undefined; + } + interface SetScriptSourceParameterType { + /** + * Id of the script to edit. + */ + scriptId: Runtime.ScriptId; + /** + * New content of the script. + */ + scriptSource: string; + /** + * If true the change will not actually be applied. Dry run may be used to get result description without actually modifying the code. + */ + dryRun?: boolean | undefined; + } + interface RestartFrameParameterType { + /** + * Call frame identifier to evaluate on. + */ + callFrameId: CallFrameId; + } + interface GetScriptSourceParameterType { + /** + * Id of the script to get source for. + */ + scriptId: Runtime.ScriptId; + } + interface SetPauseOnExceptionsParameterType { + /** + * Pause on exceptions mode. + */ + state: string; + } + interface EvaluateOnCallFrameParameterType { + /** + * Call frame identifier to evaluate on. + */ + callFrameId: CallFrameId; + /** + * Expression to evaluate. + */ + expression: string; + /** + * String object group name to put result into (allows rapid releasing resulting object handles using releaseObjectGroup). + */ + objectGroup?: string | undefined; + /** + * Specifies whether command line API should be available to the evaluated expression, defaults to false. + */ + includeCommandLineAPI?: boolean | undefined; + /** + * In silent mode exceptions thrown during evaluation are not reported and do not pause execution. Overrides setPauseOnException state. + */ + silent?: boolean | undefined; + /** + * Whether the result is expected to be a JSON object that should be sent by value. + */ + returnByValue?: boolean | undefined; + /** + * Whether preview should be generated for the result. + * @experimental + */ + generatePreview?: boolean | undefined; + /** + * Whether to throw an exception if side effect cannot be ruled out during evaluation. + */ + throwOnSideEffect?: boolean | undefined; + } + interface SetVariableValueParameterType { + /** + * 0-based number of scope as was listed in scope chain. Only 'local', 'closure' and 'catch' scope types are allowed. Other scopes could be manipulated manually. + */ + scopeNumber: number; + /** + * Variable name. + */ + variableName: string; + /** + * New variable value. + */ + newValue: Runtime.CallArgument; + /** + * Id of callframe that holds variable. + */ + callFrameId: CallFrameId; + } + interface SetReturnValueParameterType { + /** + * New return value. + */ + newValue: Runtime.CallArgument; + } + interface SetAsyncCallStackDepthParameterType { + /** + * Maximum depth of async call stacks. Setting to 0 will effectively disable collecting async call stacks (default). + */ + maxDepth: number; + } + interface SetBlackboxPatternsParameterType { + /** + * Array of regexps that will be used to check script url for blackbox state. + */ + patterns: string[]; + } + interface SetBlackboxedRangesParameterType { + /** + * Id of the script. + */ + scriptId: Runtime.ScriptId; + positions: ScriptPosition[]; + } + interface EnableReturnType { + /** + * Unique identifier of the debugger. + * @experimental + */ + debuggerId: Runtime.UniqueDebuggerId; + } + interface SetBreakpointByUrlReturnType { + /** + * Id of the created breakpoint for further reference. + */ + breakpointId: BreakpointId; + /** + * List of the locations this breakpoint resolved into upon addition. + */ + locations: Location[]; + } + interface SetBreakpointReturnType { + /** + * Id of the created breakpoint for further reference. + */ + breakpointId: BreakpointId; + /** + * Location this breakpoint resolved into. + */ + actualLocation: Location; + } + interface GetPossibleBreakpointsReturnType { + /** + * List of the possible breakpoint locations. + */ + locations: BreakLocation[]; + } + interface GetStackTraceReturnType { + stackTrace: Runtime.StackTrace; + } + interface SearchInContentReturnType { + /** + * List of search matches. + */ + result: SearchMatch[]; + } + interface SetScriptSourceReturnType { + /** + * New stack trace in case editing has happened while VM was stopped. + */ + callFrames?: CallFrame[] | undefined; + /** + * Whether current call stack was modified after applying the changes. + */ + stackChanged?: boolean | undefined; + /** + * Async stack trace, if any. + */ + asyncStackTrace?: Runtime.StackTrace | undefined; + /** + * Async stack trace, if any. + * @experimental + */ + asyncStackTraceId?: Runtime.StackTraceId | undefined; + /** + * Exception details if any. + */ + exceptionDetails?: Runtime.ExceptionDetails | undefined; + } + interface RestartFrameReturnType { + /** + * New stack trace. + */ + callFrames: CallFrame[]; + /** + * Async stack trace, if any. + */ + asyncStackTrace?: Runtime.StackTrace | undefined; + /** + * Async stack trace, if any. + * @experimental + */ + asyncStackTraceId?: Runtime.StackTraceId | undefined; + } + interface GetScriptSourceReturnType { + /** + * Script source. + */ + scriptSource: string; + } + interface EvaluateOnCallFrameReturnType { + /** + * Object wrapper for the evaluation result. + */ + result: Runtime.RemoteObject; + /** + * Exception details. + */ + exceptionDetails?: Runtime.ExceptionDetails | undefined; + } + interface ScriptParsedEventDataType { + /** + * Identifier of the script parsed. + */ + scriptId: Runtime.ScriptId; + /** + * URL or name of the script parsed (if any). + */ + url: string; + /** + * Line offset of the script within the resource with given URL (for script tags). + */ + startLine: number; + /** + * Column offset of the script within the resource with given URL. + */ + startColumn: number; + /** + * Last line of the script. + */ + endLine: number; + /** + * Length of the last line of the script. + */ + endColumn: number; + /** + * Specifies script creation context. + */ + executionContextId: Runtime.ExecutionContextId; + /** + * Content hash of the script. + */ + hash: string; + /** + * Embedder-specific auxiliary data. + */ + executionContextAuxData?: {} | undefined; + /** + * True, if this script is generated as a result of the live edit operation. + * @experimental + */ + isLiveEdit?: boolean | undefined; + /** + * URL of source map associated with script (if any). + */ + sourceMapURL?: string | undefined; + /** + * True, if this script has sourceURL. + */ + hasSourceURL?: boolean | undefined; + /** + * True, if this script is ES6 module. + */ + isModule?: boolean | undefined; + /** + * This script length. + */ + length?: number | undefined; + /** + * JavaScript top stack frame of where the script parsed event was triggered if available. + * @experimental + */ + stackTrace?: Runtime.StackTrace | undefined; + } + interface ScriptFailedToParseEventDataType { + /** + * Identifier of the script parsed. + */ + scriptId: Runtime.ScriptId; + /** + * URL or name of the script parsed (if any). + */ + url: string; + /** + * Line offset of the script within the resource with given URL (for script tags). + */ + startLine: number; + /** + * Column offset of the script within the resource with given URL. + */ + startColumn: number; + /** + * Last line of the script. + */ + endLine: number; + /** + * Length of the last line of the script. + */ + endColumn: number; + /** + * Specifies script creation context. + */ + executionContextId: Runtime.ExecutionContextId; + /** + * Content hash of the script. + */ + hash: string; + /** + * Embedder-specific auxiliary data. + */ + executionContextAuxData?: {} | undefined; + /** + * URL of source map associated with script (if any). + */ + sourceMapURL?: string | undefined; + /** + * True, if this script has sourceURL. + */ + hasSourceURL?: boolean | undefined; + /** + * True, if this script is ES6 module. + */ + isModule?: boolean | undefined; + /** + * This script length. + */ + length?: number | undefined; + /** + * JavaScript top stack frame of where the script parsed event was triggered if available. + * @experimental + */ + stackTrace?: Runtime.StackTrace | undefined; + } + interface BreakpointResolvedEventDataType { + /** + * Breakpoint unique identifier. + */ + breakpointId: BreakpointId; + /** + * Actual breakpoint location. + */ + location: Location; + } + interface PausedEventDataType { + /** + * Call stack the virtual machine stopped on. + */ + callFrames: CallFrame[]; + /** + * Pause reason. + */ + reason: string; + /** + * Object containing break-specific auxiliary properties. + */ + data?: {} | undefined; + /** + * Hit breakpoints IDs + */ + hitBreakpoints?: string[] | undefined; + /** + * Async stack trace, if any. + */ + asyncStackTrace?: Runtime.StackTrace | undefined; + /** + * Async stack trace, if any. + * @experimental + */ + asyncStackTraceId?: Runtime.StackTraceId | undefined; + /** + * Just scheduled async call will have this stack trace as parent stack during async execution. This field is available only after Debugger.stepInto call with breakOnAsynCall flag. + * @experimental + */ + asyncCallStackTraceId?: Runtime.StackTraceId | undefined; + } + } + namespace Console { + /** + * Console message. + */ + interface ConsoleMessage { + /** + * Message source. + */ + source: string; + /** + * Message severity. + */ + level: string; + /** + * Message text. + */ + text: string; + /** + * URL of the message origin. + */ + url?: string | undefined; + /** + * Line number in the resource that generated this message (1-based). + */ + line?: number | undefined; + /** + * Column number in the resource that generated this message (1-based). + */ + column?: number | undefined; + } + interface MessageAddedEventDataType { + /** + * Console message that has been added. + */ + message: ConsoleMessage; + } + } + namespace Profiler { + /** + * Profile node. Holds callsite information, execution statistics and child nodes. + */ + interface ProfileNode { + /** + * Unique id of the node. + */ + id: number; + /** + * Function location. + */ + callFrame: Runtime.CallFrame; + /** + * Number of samples where this node was on top of the call stack. + */ + hitCount?: number | undefined; + /** + * Child node ids. + */ + children?: number[] | undefined; + /** + * The reason of being not optimized. The function may be deoptimized or marked as don't optimize. + */ + deoptReason?: string | undefined; + /** + * An array of source position ticks. + */ + positionTicks?: PositionTickInfo[] | undefined; + } + /** + * Profile. + */ + interface Profile { + /** + * The list of profile nodes. First item is the root node. + */ + nodes: ProfileNode[]; + /** + * Profiling start timestamp in microseconds. + */ + startTime: number; + /** + * Profiling end timestamp in microseconds. + */ + endTime: number; + /** + * Ids of samples top nodes. + */ + samples?: number[] | undefined; + /** + * Time intervals between adjacent samples in microseconds. The first delta is relative to the profile startTime. + */ + timeDeltas?: number[] | undefined; + } + /** + * Specifies a number of samples attributed to a certain source position. + */ + interface PositionTickInfo { + /** + * Source line number (1-based). + */ + line: number; + /** + * Number of samples attributed to the source line. + */ + ticks: number; + } + /** + * Coverage data for a source range. + */ + interface CoverageRange { + /** + * JavaScript script source offset for the range start. + */ + startOffset: number; + /** + * JavaScript script source offset for the range end. + */ + endOffset: number; + /** + * Collected execution count of the source range. + */ + count: number; + } + /** + * Coverage data for a JavaScript function. + */ + interface FunctionCoverage { + /** + * JavaScript function name. + */ + functionName: string; + /** + * Source ranges inside the function with coverage data. + */ + ranges: CoverageRange[]; + /** + * Whether coverage data for this function has block granularity. + */ + isBlockCoverage: boolean; + } + /** + * Coverage data for a JavaScript script. + */ + interface ScriptCoverage { + /** + * JavaScript script id. + */ + scriptId: Runtime.ScriptId; + /** + * JavaScript script name or url. + */ + url: string; + /** + * Functions contained in the script that has coverage data. + */ + functions: FunctionCoverage[]; + } + /** + * Describes a type collected during runtime. + * @experimental + */ + interface TypeObject { + /** + * Name of a type collected with type profiling. + */ + name: string; + } + /** + * Source offset and types for a parameter or return value. + * @experimental + */ + interface TypeProfileEntry { + /** + * Source offset of the parameter or end of function for return values. + */ + offset: number; + /** + * The types for this parameter or return value. + */ + types: TypeObject[]; + } + /** + * Type profile data collected during runtime for a JavaScript script. + * @experimental + */ + interface ScriptTypeProfile { + /** + * JavaScript script id. + */ + scriptId: Runtime.ScriptId; + /** + * JavaScript script name or url. + */ + url: string; + /** + * Type profile entries for parameters and return values of the functions in the script. + */ + entries: TypeProfileEntry[]; + } + interface SetSamplingIntervalParameterType { + /** + * New sampling interval in microseconds. + */ + interval: number; + } + interface StartPreciseCoverageParameterType { + /** + * Collect accurate call counts beyond simple 'covered' or 'not covered'. + */ + callCount?: boolean | undefined; + /** + * Collect block-based coverage. + */ + detailed?: boolean | undefined; + } + interface StopReturnType { + /** + * Recorded profile. + */ + profile: Profile; + } + interface TakePreciseCoverageReturnType { + /** + * Coverage data for the current isolate. + */ + result: ScriptCoverage[]; + } + interface GetBestEffortCoverageReturnType { + /** + * Coverage data for the current isolate. + */ + result: ScriptCoverage[]; + } + interface TakeTypeProfileReturnType { + /** + * Type profile for all scripts since startTypeProfile() was turned on. + */ + result: ScriptTypeProfile[]; + } + interface ConsoleProfileStartedEventDataType { + id: string; + /** + * Location of console.profile(). + */ + location: Debugger.Location; + /** + * Profile title passed as an argument to console.profile(). + */ + title?: string | undefined; + } + interface ConsoleProfileFinishedEventDataType { + id: string; + /** + * Location of console.profileEnd(). + */ + location: Debugger.Location; + profile: Profile; + /** + * Profile title passed as an argument to console.profile(). + */ + title?: string | undefined; + } + } + namespace HeapProfiler { + /** + * Heap snapshot object id. + */ + type HeapSnapshotObjectId = string; + /** + * Sampling Heap Profile node. Holds callsite information, allocation statistics and child nodes. + */ + interface SamplingHeapProfileNode { + /** + * Function location. + */ + callFrame: Runtime.CallFrame; + /** + * Allocations size in bytes for the node excluding children. + */ + selfSize: number; + /** + * Child nodes. + */ + children: SamplingHeapProfileNode[]; + } + /** + * Profile. + */ + interface SamplingHeapProfile { + head: SamplingHeapProfileNode; + } + interface StartTrackingHeapObjectsParameterType { + trackAllocations?: boolean | undefined; + } + interface StopTrackingHeapObjectsParameterType { + /** + * If true 'reportHeapSnapshotProgress' events will be generated while snapshot is being taken when the tracking is stopped. + */ + reportProgress?: boolean | undefined; + } + interface TakeHeapSnapshotParameterType { + /** + * If true 'reportHeapSnapshotProgress' events will be generated while snapshot is being taken. + */ + reportProgress?: boolean | undefined; + } + interface GetObjectByHeapObjectIdParameterType { + objectId: HeapSnapshotObjectId; + /** + * Symbolic group name that can be used to release multiple objects. + */ + objectGroup?: string | undefined; + } + interface AddInspectedHeapObjectParameterType { + /** + * Heap snapshot object id to be accessible by means of $x command line API. + */ + heapObjectId: HeapSnapshotObjectId; + } + interface GetHeapObjectIdParameterType { + /** + * Identifier of the object to get heap object id for. + */ + objectId: Runtime.RemoteObjectId; + } + interface StartSamplingParameterType { + /** + * Average sample interval in bytes. Poisson distribution is used for the intervals. The default value is 32768 bytes. + */ + samplingInterval?: number | undefined; + } + interface GetObjectByHeapObjectIdReturnType { + /** + * Evaluation result. + */ + result: Runtime.RemoteObject; + } + interface GetHeapObjectIdReturnType { + /** + * Id of the heap snapshot object corresponding to the passed remote object id. + */ + heapSnapshotObjectId: HeapSnapshotObjectId; + } + interface StopSamplingReturnType { + /** + * Recorded sampling heap profile. + */ + profile: SamplingHeapProfile; + } + interface GetSamplingProfileReturnType { + /** + * Return the sampling profile being collected. + */ + profile: SamplingHeapProfile; + } + interface AddHeapSnapshotChunkEventDataType { + chunk: string; + } + interface ReportHeapSnapshotProgressEventDataType { + done: number; + total: number; + finished?: boolean | undefined; + } + interface LastSeenObjectIdEventDataType { + lastSeenObjectId: number; + timestamp: number; + } + interface HeapStatsUpdateEventDataType { + /** + * An array of triplets. Each triplet describes a fragment. The first integer is the fragment index, the second integer is a total count of objects for the fragment, the third integer is a total size of the objects for the fragment. + */ + statsUpdate: number[]; + } + } + namespace NodeTracing { + interface TraceConfig { + /** + * Controls how the trace buffer stores data. + */ + recordMode?: string | undefined; + /** + * Included category filters. + */ + includedCategories: string[]; + } + interface StartParameterType { + traceConfig: TraceConfig; + } + interface GetCategoriesReturnType { + /** + * A list of supported tracing categories. + */ + categories: string[]; + } + interface DataCollectedEventDataType { + value: Array<{}>; + } + } + namespace NodeWorker { + type WorkerID = string; + /** + * Unique identifier of attached debugging session. + */ + type SessionID = string; + interface WorkerInfo { + workerId: WorkerID; + type: string; + title: string; + url: string; + } + interface SendMessageToWorkerParameterType { + message: string; + /** + * Identifier of the session. + */ + sessionId: SessionID; + } + interface EnableParameterType { + /** + * Whether to new workers should be paused until the frontend sends `Runtime.runIfWaitingForDebugger` + * message to run them. + */ + waitForDebuggerOnStart: boolean; + } + interface DetachParameterType { + sessionId: SessionID; + } + interface AttachedToWorkerEventDataType { + /** + * Identifier assigned to the session used to send/receive messages. + */ + sessionId: SessionID; + workerInfo: WorkerInfo; + waitingForDebugger: boolean; + } + interface DetachedFromWorkerEventDataType { + /** + * Detached session identifier. + */ + sessionId: SessionID; + } + interface ReceivedMessageFromWorkerEventDataType { + /** + * Identifier of a session which sends a message. + */ + sessionId: SessionID; + message: string; + } + } + namespace NodeRuntime { + interface NotifyWhenWaitingForDisconnectParameterType { + enabled: boolean; + } + } + /** + * The `inspector.Session` is used for dispatching messages to the V8 inspector + * back-end and receiving message responses and notifications. + */ + class Session extends EventEmitter { + /** + * Create a new instance of the inspector.Session class. + * The inspector session needs to be connected through session.connect() before the messages can be dispatched to the inspector backend. + */ + constructor(); + /** + * Connects a session to the inspector back-end. + * @since v8.0.0 + */ + connect(): void; + /** + * Immediately close the session. All pending message callbacks will be called + * with an error. `session.connect()` will need to be called to be able to send + * messages again. Reconnected session will lose all inspector state, such as + * enabled agents or configured breakpoints. + * @since v8.0.0 + */ + disconnect(): void; + /** + * Posts a message to the inspector back-end. `callback` will be notified when + * a response is received. `callback` is a function that accepts two optional + * arguments: error and message-specific result. + * + * ```js + * session.post('Runtime.evaluate', { expression: '2 + 2' }, + * (error, { result }) => console.log(result)); + * // Output: { type: 'number', value: 4, description: '4' } + * ``` + * + * The latest version of the V8 inspector protocol is published on the [Chrome DevTools Protocol Viewer](https://chromedevtools.github.io/devtools-protocol/v8/). + * + * Node.js inspector supports all the Chrome DevTools Protocol domains declared + * by V8\. Chrome DevTools Protocol domain provides an interface for interacting + * with one of the runtime agents used to inspect the application state and listen + * to the run-time events. + * + * ## Example usage + * + * Apart from the debugger, various V8 Profilers are available through the DevTools + * protocol. + * @since v8.0.0 + */ + post(method: string, params?: {}, callback?: (err: Error | null, params?: {}) => void): void; + post(method: string, callback?: (err: Error | null, params?: {}) => void): void; + /** + * Returns supported domains. + */ + post(method: 'Schema.getDomains', callback?: (err: Error | null, params: Schema.GetDomainsReturnType) => void): void; + /** + * Evaluates expression on global object. + */ + post(method: 'Runtime.evaluate', params?: Runtime.EvaluateParameterType, callback?: (err: Error | null, params: Runtime.EvaluateReturnType) => void): void; + post(method: 'Runtime.evaluate', callback?: (err: Error | null, params: Runtime.EvaluateReturnType) => void): void; + /** + * Add handler to promise with given promise object id. + */ + post(method: 'Runtime.awaitPromise', params?: Runtime.AwaitPromiseParameterType, callback?: (err: Error | null, params: Runtime.AwaitPromiseReturnType) => void): void; + post(method: 'Runtime.awaitPromise', callback?: (err: Error | null, params: Runtime.AwaitPromiseReturnType) => void): void; + /** + * Calls function with given declaration on the given object. Object group of the result is inherited from the target object. + */ + post(method: 'Runtime.callFunctionOn', params?: Runtime.CallFunctionOnParameterType, callback?: (err: Error | null, params: Runtime.CallFunctionOnReturnType) => void): void; + post(method: 'Runtime.callFunctionOn', callback?: (err: Error | null, params: Runtime.CallFunctionOnReturnType) => void): void; + /** + * Returns properties of a given object. Object group of the result is inherited from the target object. + */ + post(method: 'Runtime.getProperties', params?: Runtime.GetPropertiesParameterType, callback?: (err: Error | null, params: Runtime.GetPropertiesReturnType) => void): void; + post(method: 'Runtime.getProperties', callback?: (err: Error | null, params: Runtime.GetPropertiesReturnType) => void): void; + /** + * Releases remote object with given id. + */ + post(method: 'Runtime.releaseObject', params?: Runtime.ReleaseObjectParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Runtime.releaseObject', callback?: (err: Error | null) => void): void; + /** + * Releases all remote objects that belong to a given group. + */ + post(method: 'Runtime.releaseObjectGroup', params?: Runtime.ReleaseObjectGroupParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Runtime.releaseObjectGroup', callback?: (err: Error | null) => void): void; + /** + * Tells inspected instance to run if it was waiting for debugger to attach. + */ + post(method: 'Runtime.runIfWaitingForDebugger', callback?: (err: Error | null) => void): void; + /** + * Enables reporting of execution contexts creation by means of executionContextCreated event. When the reporting gets enabled the event will be sent immediately for each existing execution context. + */ + post(method: 'Runtime.enable', callback?: (err: Error | null) => void): void; + /** + * Disables reporting of execution contexts creation. + */ + post(method: 'Runtime.disable', callback?: (err: Error | null) => void): void; + /** + * Discards collected exceptions and console API calls. + */ + post(method: 'Runtime.discardConsoleEntries', callback?: (err: Error | null) => void): void; + /** + * @experimental + */ + post(method: 'Runtime.setCustomObjectFormatterEnabled', params?: Runtime.SetCustomObjectFormatterEnabledParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Runtime.setCustomObjectFormatterEnabled', callback?: (err: Error | null) => void): void; + /** + * Compiles expression. + */ + post(method: 'Runtime.compileScript', params?: Runtime.CompileScriptParameterType, callback?: (err: Error | null, params: Runtime.CompileScriptReturnType) => void): void; + post(method: 'Runtime.compileScript', callback?: (err: Error | null, params: Runtime.CompileScriptReturnType) => void): void; + /** + * Runs script with given id in a given context. + */ + post(method: 'Runtime.runScript', params?: Runtime.RunScriptParameterType, callback?: (err: Error | null, params: Runtime.RunScriptReturnType) => void): void; + post(method: 'Runtime.runScript', callback?: (err: Error | null, params: Runtime.RunScriptReturnType) => void): void; + post(method: 'Runtime.queryObjects', params?: Runtime.QueryObjectsParameterType, callback?: (err: Error | null, params: Runtime.QueryObjectsReturnType) => void): void; + post(method: 'Runtime.queryObjects', callback?: (err: Error | null, params: Runtime.QueryObjectsReturnType) => void): void; + /** + * Returns all let, const and class variables from global scope. + */ + post( + method: 'Runtime.globalLexicalScopeNames', + params?: Runtime.GlobalLexicalScopeNamesParameterType, + callback?: (err: Error | null, params: Runtime.GlobalLexicalScopeNamesReturnType) => void + ): void; + post(method: 'Runtime.globalLexicalScopeNames', callback?: (err: Error | null, params: Runtime.GlobalLexicalScopeNamesReturnType) => void): void; + /** + * Enables debugger for the given page. Clients should not assume that the debugging has been enabled until the result for this command is received. + */ + post(method: 'Debugger.enable', callback?: (err: Error | null, params: Debugger.EnableReturnType) => void): void; + /** + * Disables debugger for given page. + */ + post(method: 'Debugger.disable', callback?: (err: Error | null) => void): void; + /** + * Activates / deactivates all breakpoints on the page. + */ + post(method: 'Debugger.setBreakpointsActive', params?: Debugger.SetBreakpointsActiveParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Debugger.setBreakpointsActive', callback?: (err: Error | null) => void): void; + /** + * Makes page not interrupt on any pauses (breakpoint, exception, dom exception etc). + */ + post(method: 'Debugger.setSkipAllPauses', params?: Debugger.SetSkipAllPausesParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Debugger.setSkipAllPauses', callback?: (err: Error | null) => void): void; + /** + * Sets JavaScript breakpoint at given location specified either by URL or URL regex. Once this command is issued, all existing parsed scripts will have breakpoints resolved and returned in locations property. Further matching script parsing will result in subsequent breakpointResolved events issued. This logical breakpoint will survive page reloads. + */ + post(method: 'Debugger.setBreakpointByUrl', params?: Debugger.SetBreakpointByUrlParameterType, callback?: (err: Error | null, params: Debugger.SetBreakpointByUrlReturnType) => void): void; + post(method: 'Debugger.setBreakpointByUrl', callback?: (err: Error | null, params: Debugger.SetBreakpointByUrlReturnType) => void): void; + /** + * Sets JavaScript breakpoint at a given location. + */ + post(method: 'Debugger.setBreakpoint', params?: Debugger.SetBreakpointParameterType, callback?: (err: Error | null, params: Debugger.SetBreakpointReturnType) => void): void; + post(method: 'Debugger.setBreakpoint', callback?: (err: Error | null, params: Debugger.SetBreakpointReturnType) => void): void; + /** + * Removes JavaScript breakpoint. + */ + post(method: 'Debugger.removeBreakpoint', params?: Debugger.RemoveBreakpointParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Debugger.removeBreakpoint', callback?: (err: Error | null) => void): void; + /** + * Returns possible locations for breakpoint. scriptId in start and end range locations should be the same. + */ + post( + method: 'Debugger.getPossibleBreakpoints', + params?: Debugger.GetPossibleBreakpointsParameterType, + callback?: (err: Error | null, params: Debugger.GetPossibleBreakpointsReturnType) => void + ): void; + post(method: 'Debugger.getPossibleBreakpoints', callback?: (err: Error | null, params: Debugger.GetPossibleBreakpointsReturnType) => void): void; + /** + * Continues execution until specific location is reached. + */ + post(method: 'Debugger.continueToLocation', params?: Debugger.ContinueToLocationParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Debugger.continueToLocation', callback?: (err: Error | null) => void): void; + /** + * @experimental + */ + post(method: 'Debugger.pauseOnAsyncCall', params?: Debugger.PauseOnAsyncCallParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Debugger.pauseOnAsyncCall', callback?: (err: Error | null) => void): void; + /** + * Steps over the statement. + */ + post(method: 'Debugger.stepOver', callback?: (err: Error | null) => void): void; + /** + * Steps into the function call. + */ + post(method: 'Debugger.stepInto', params?: Debugger.StepIntoParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Debugger.stepInto', callback?: (err: Error | null) => void): void; + /** + * Steps out of the function call. + */ + post(method: 'Debugger.stepOut', callback?: (err: Error | null) => void): void; + /** + * Stops on the next JavaScript statement. + */ + post(method: 'Debugger.pause', callback?: (err: Error | null) => void): void; + /** + * This method is deprecated - use Debugger.stepInto with breakOnAsyncCall and Debugger.pauseOnAsyncTask instead. Steps into next scheduled async task if any is scheduled before next pause. Returns success when async task is actually scheduled, returns error if no task were scheduled or another scheduleStepIntoAsync was called. + * @experimental + */ + post(method: 'Debugger.scheduleStepIntoAsync', callback?: (err: Error | null) => void): void; + /** + * Resumes JavaScript execution. + */ + post(method: 'Debugger.resume', callback?: (err: Error | null) => void): void; + /** + * Returns stack trace with given stackTraceId. + * @experimental + */ + post(method: 'Debugger.getStackTrace', params?: Debugger.GetStackTraceParameterType, callback?: (err: Error | null, params: Debugger.GetStackTraceReturnType) => void): void; + post(method: 'Debugger.getStackTrace', callback?: (err: Error | null, params: Debugger.GetStackTraceReturnType) => void): void; + /** + * Searches for given string in script content. + */ + post(method: 'Debugger.searchInContent', params?: Debugger.SearchInContentParameterType, callback?: (err: Error | null, params: Debugger.SearchInContentReturnType) => void): void; + post(method: 'Debugger.searchInContent', callback?: (err: Error | null, params: Debugger.SearchInContentReturnType) => void): void; + /** + * Edits JavaScript source live. + */ + post(method: 'Debugger.setScriptSource', params?: Debugger.SetScriptSourceParameterType, callback?: (err: Error | null, params: Debugger.SetScriptSourceReturnType) => void): void; + post(method: 'Debugger.setScriptSource', callback?: (err: Error | null, params: Debugger.SetScriptSourceReturnType) => void): void; + /** + * Restarts particular call frame from the beginning. + */ + post(method: 'Debugger.restartFrame', params?: Debugger.RestartFrameParameterType, callback?: (err: Error | null, params: Debugger.RestartFrameReturnType) => void): void; + post(method: 'Debugger.restartFrame', callback?: (err: Error | null, params: Debugger.RestartFrameReturnType) => void): void; + /** + * Returns source for the script with given id. + */ + post(method: 'Debugger.getScriptSource', params?: Debugger.GetScriptSourceParameterType, callback?: (err: Error | null, params: Debugger.GetScriptSourceReturnType) => void): void; + post(method: 'Debugger.getScriptSource', callback?: (err: Error | null, params: Debugger.GetScriptSourceReturnType) => void): void; + /** + * Defines pause on exceptions state. Can be set to stop on all exceptions, uncaught exceptions or no exceptions. Initial pause on exceptions state is none. + */ + post(method: 'Debugger.setPauseOnExceptions', params?: Debugger.SetPauseOnExceptionsParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Debugger.setPauseOnExceptions', callback?: (err: Error | null) => void): void; + /** + * Evaluates expression on a given call frame. + */ + post(method: 'Debugger.evaluateOnCallFrame', params?: Debugger.EvaluateOnCallFrameParameterType, callback?: (err: Error | null, params: Debugger.EvaluateOnCallFrameReturnType) => void): void; + post(method: 'Debugger.evaluateOnCallFrame', callback?: (err: Error | null, params: Debugger.EvaluateOnCallFrameReturnType) => void): void; + /** + * Changes value of variable in a callframe. Object-based scopes are not supported and must be mutated manually. + */ + post(method: 'Debugger.setVariableValue', params?: Debugger.SetVariableValueParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Debugger.setVariableValue', callback?: (err: Error | null) => void): void; + /** + * Changes return value in top frame. Available only at return break position. + * @experimental + */ + post(method: 'Debugger.setReturnValue', params?: Debugger.SetReturnValueParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Debugger.setReturnValue', callback?: (err: Error | null) => void): void; + /** + * Enables or disables async call stacks tracking. + */ + post(method: 'Debugger.setAsyncCallStackDepth', params?: Debugger.SetAsyncCallStackDepthParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Debugger.setAsyncCallStackDepth', callback?: (err: Error | null) => void): void; + /** + * Replace previous blackbox patterns with passed ones. Forces backend to skip stepping/pausing in scripts with url matching one of the patterns. VM will try to leave blackboxed script by performing 'step in' several times, finally resorting to 'step out' if unsuccessful. + * @experimental + */ + post(method: 'Debugger.setBlackboxPatterns', params?: Debugger.SetBlackboxPatternsParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Debugger.setBlackboxPatterns', callback?: (err: Error | null) => void): void; + /** + * Makes backend skip steps in the script in blackboxed ranges. VM will try leave blacklisted scripts by performing 'step in' several times, finally resorting to 'step out' if unsuccessful. Positions array contains positions where blackbox state is changed. First interval isn't blackboxed. Array should be sorted. + * @experimental + */ + post(method: 'Debugger.setBlackboxedRanges', params?: Debugger.SetBlackboxedRangesParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Debugger.setBlackboxedRanges', callback?: (err: Error | null) => void): void; + /** + * Enables console domain, sends the messages collected so far to the client by means of the messageAdded notification. + */ + post(method: 'Console.enable', callback?: (err: Error | null) => void): void; + /** + * Disables console domain, prevents further console messages from being reported to the client. + */ + post(method: 'Console.disable', callback?: (err: Error | null) => void): void; + /** + * Does nothing. + */ + post(method: 'Console.clearMessages', callback?: (err: Error | null) => void): void; + post(method: 'Profiler.enable', callback?: (err: Error | null) => void): void; + post(method: 'Profiler.disable', callback?: (err: Error | null) => void): void; + /** + * Changes CPU profiler sampling interval. Must be called before CPU profiles recording started. + */ + post(method: 'Profiler.setSamplingInterval', params?: Profiler.SetSamplingIntervalParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Profiler.setSamplingInterval', callback?: (err: Error | null) => void): void; + post(method: 'Profiler.start', callback?: (err: Error | null) => void): void; + post(method: 'Profiler.stop', callback?: (err: Error | null, params: Profiler.StopReturnType) => void): void; + /** + * Enable precise code coverage. Coverage data for JavaScript executed before enabling precise code coverage may be incomplete. Enabling prevents running optimized code and resets execution counters. + */ + post(method: 'Profiler.startPreciseCoverage', params?: Profiler.StartPreciseCoverageParameterType, callback?: (err: Error | null) => void): void; + post(method: 'Profiler.startPreciseCoverage', callback?: (err: Error | null) => void): void; + /** + * Disable precise code coverage. Disabling releases unnecessary execution count records and allows executing optimized code. + */ + post(method: 'Profiler.stopPreciseCoverage', callback?: (err: Error | null) => void): void; + /** + * Collect coverage data for the current isolate, and resets execution counters. Precise code coverage needs to have started. + */ + post(method: 'Profiler.takePreciseCoverage', callback?: (err: Error | null, params: Profiler.TakePreciseCoverageReturnType) => void): void; + /** + * Collect coverage data for the current isolate. The coverage data may be incomplete due to garbage collection. + */ + post(method: 'Profiler.getBestEffortCoverage', callback?: (err: Error | null, params: Profiler.GetBestEffortCoverageReturnType) => void): void; + /** + * Enable type profile. + * @experimental + */ + post(method: 'Profiler.startTypeProfile', callback?: (err: Error | null) => void): void; + /** + * Disable type profile. Disabling releases type profile data collected so far. + * @experimental + */ + post(method: 'Profiler.stopTypeProfile', callback?: (err: Error | null) => void): void; + /** + * Collect type profile. + * @experimental + */ + post(method: 'Profiler.takeTypeProfile', callback?: (err: Error | null, params: Profiler.TakeTypeProfileReturnType) => void): void; + post(method: 'HeapProfiler.enable', callback?: (err: Error | null) => void): void; + post(method: 'HeapProfiler.disable', callback?: (err: Error | null) => void): void; + post(method: 'HeapProfiler.startTrackingHeapObjects', params?: HeapProfiler.StartTrackingHeapObjectsParameterType, callback?: (err: Error | null) => void): void; + post(method: 'HeapProfiler.startTrackingHeapObjects', callback?: (err: Error | null) => void): void; + post(method: 'HeapProfiler.stopTrackingHeapObjects', params?: HeapProfiler.StopTrackingHeapObjectsParameterType, callback?: (err: Error | null) => void): void; + post(method: 'HeapProfiler.stopTrackingHeapObjects', callback?: (err: Error | null) => void): void; + post(method: 'HeapProfiler.takeHeapSnapshot', params?: HeapProfiler.TakeHeapSnapshotParameterType, callback?: (err: Error | null) => void): void; + post(method: 'HeapProfiler.takeHeapSnapshot', callback?: (err: Error | null) => void): void; + post(method: 'HeapProfiler.collectGarbage', callback?: (err: Error | null) => void): void; + post( + method: 'HeapProfiler.getObjectByHeapObjectId', + params?: HeapProfiler.GetObjectByHeapObjectIdParameterType, + callback?: (err: Error | null, params: HeapProfiler.GetObjectByHeapObjectIdReturnType) => void + ): void; + post(method: 'HeapProfiler.getObjectByHeapObjectId', callback?: (err: Error | null, params: HeapProfiler.GetObjectByHeapObjectIdReturnType) => void): void; + /** + * Enables console to refer to the node with given id via $x (see Command Line API for more details $x functions). + */ + post(method: 'HeapProfiler.addInspectedHeapObject', params?: HeapProfiler.AddInspectedHeapObjectParameterType, callback?: (err: Error | null) => void): void; + post(method: 'HeapProfiler.addInspectedHeapObject', callback?: (err: Error | null) => void): void; + post(method: 'HeapProfiler.getHeapObjectId', params?: HeapProfiler.GetHeapObjectIdParameterType, callback?: (err: Error | null, params: HeapProfiler.GetHeapObjectIdReturnType) => void): void; + post(method: 'HeapProfiler.getHeapObjectId', callback?: (err: Error | null, params: HeapProfiler.GetHeapObjectIdReturnType) => void): void; + post(method: 'HeapProfiler.startSampling', params?: HeapProfiler.StartSamplingParameterType, callback?: (err: Error | null) => void): void; + post(method: 'HeapProfiler.startSampling', callback?: (err: Error | null) => void): void; + post(method: 'HeapProfiler.stopSampling', callback?: (err: Error | null, params: HeapProfiler.StopSamplingReturnType) => void): void; + post(method: 'HeapProfiler.getSamplingProfile', callback?: (err: Error | null, params: HeapProfiler.GetSamplingProfileReturnType) => void): void; + /** + * Gets supported tracing categories. + */ + post(method: 'NodeTracing.getCategories', callback?: (err: Error | null, params: NodeTracing.GetCategoriesReturnType) => void): void; + /** + * Start trace events collection. + */ + post(method: 'NodeTracing.start', params?: NodeTracing.StartParameterType, callback?: (err: Error | null) => void): void; + post(method: 'NodeTracing.start', callback?: (err: Error | null) => void): void; + /** + * Stop trace events collection. Remaining collected events will be sent as a sequence of + * dataCollected events followed by tracingComplete event. + */ + post(method: 'NodeTracing.stop', callback?: (err: Error | null) => void): void; + /** + * Sends protocol message over session with given id. + */ + post(method: 'NodeWorker.sendMessageToWorker', params?: NodeWorker.SendMessageToWorkerParameterType, callback?: (err: Error | null) => void): void; + post(method: 'NodeWorker.sendMessageToWorker', callback?: (err: Error | null) => void): void; + /** + * Instructs the inspector to attach to running workers. Will also attach to new workers + * as they start + */ + post(method: 'NodeWorker.enable', params?: NodeWorker.EnableParameterType, callback?: (err: Error | null) => void): void; + post(method: 'NodeWorker.enable', callback?: (err: Error | null) => void): void; + /** + * Detaches from all running workers and disables attaching to new workers as they are started. + */ + post(method: 'NodeWorker.disable', callback?: (err: Error | null) => void): void; + /** + * Detached from the worker with given sessionId. + */ + post(method: 'NodeWorker.detach', params?: NodeWorker.DetachParameterType, callback?: (err: Error | null) => void): void; + post(method: 'NodeWorker.detach', callback?: (err: Error | null) => void): void; + /** + * Enable the `NodeRuntime.waitingForDisconnect`. + */ + post(method: 'NodeRuntime.notifyWhenWaitingForDisconnect', params?: NodeRuntime.NotifyWhenWaitingForDisconnectParameterType, callback?: (err: Error | null) => void): void; + post(method: 'NodeRuntime.notifyWhenWaitingForDisconnect', callback?: (err: Error | null) => void): void; + // Events + addListener(event: string, listener: (...args: any[]) => void): this; + /** + * Emitted when any notification from the V8 Inspector is received. + */ + addListener(event: 'inspectorNotification', listener: (message: InspectorNotification<{}>) => void): this; + /** + * Issued when new execution context is created. + */ + addListener(event: 'Runtime.executionContextCreated', listener: (message: InspectorNotification) => void): this; + /** + * Issued when execution context is destroyed. + */ + addListener(event: 'Runtime.executionContextDestroyed', listener: (message: InspectorNotification) => void): this; + /** + * Issued when all executionContexts were cleared in browser + */ + addListener(event: 'Runtime.executionContextsCleared', listener: () => void): this; + /** + * Issued when exception was thrown and unhandled. + */ + addListener(event: 'Runtime.exceptionThrown', listener: (message: InspectorNotification) => void): this; + /** + * Issued when unhandled exception was revoked. + */ + addListener(event: 'Runtime.exceptionRevoked', listener: (message: InspectorNotification) => void): this; + /** + * Issued when console API was called. + */ + addListener(event: 'Runtime.consoleAPICalled', listener: (message: InspectorNotification) => void): this; + /** + * Issued when object should be inspected (for example, as a result of inspect() command line API call). + */ + addListener(event: 'Runtime.inspectRequested', listener: (message: InspectorNotification) => void): this; + /** + * Fired when virtual machine parses script. This event is also fired for all known and uncollected scripts upon enabling debugger. + */ + addListener(event: 'Debugger.scriptParsed', listener: (message: InspectorNotification) => void): this; + /** + * Fired when virtual machine fails to parse the script. + */ + addListener(event: 'Debugger.scriptFailedToParse', listener: (message: InspectorNotification) => void): this; + /** + * Fired when breakpoint is resolved to an actual script and location. + */ + addListener(event: 'Debugger.breakpointResolved', listener: (message: InspectorNotification) => void): this; + /** + * Fired when the virtual machine stopped on breakpoint or exception or any other stop criteria. + */ + addListener(event: 'Debugger.paused', listener: (message: InspectorNotification) => void): this; + /** + * Fired when the virtual machine resumed execution. + */ + addListener(event: 'Debugger.resumed', listener: () => void): this; + /** + * Issued when new console message is added. + */ + addListener(event: 'Console.messageAdded', listener: (message: InspectorNotification) => void): this; + /** + * Sent when new profile recording is started using console.profile() call. + */ + addListener(event: 'Profiler.consoleProfileStarted', listener: (message: InspectorNotification) => void): this; + addListener(event: 'Profiler.consoleProfileFinished', listener: (message: InspectorNotification) => void): this; + addListener(event: 'HeapProfiler.addHeapSnapshotChunk', listener: (message: InspectorNotification) => void): this; + addListener(event: 'HeapProfiler.resetProfiles', listener: () => void): this; + addListener(event: 'HeapProfiler.reportHeapSnapshotProgress', listener: (message: InspectorNotification) => void): this; + /** + * If heap objects tracking has been started then backend regularly sends a current value for last seen object id and corresponding timestamp. If the were changes in the heap since last event then one or more heapStatsUpdate events will be sent before a new lastSeenObjectId event. + */ + addListener(event: 'HeapProfiler.lastSeenObjectId', listener: (message: InspectorNotification) => void): this; + /** + * If heap objects tracking has been started then backend may send update for one or more fragments + */ + addListener(event: 'HeapProfiler.heapStatsUpdate', listener: (message: InspectorNotification) => void): this; + /** + * Contains an bucket of collected trace events. + */ + addListener(event: 'NodeTracing.dataCollected', listener: (message: InspectorNotification) => void): this; + /** + * Signals that tracing is stopped and there is no trace buffers pending flush, all data were + * delivered via dataCollected events. + */ + addListener(event: 'NodeTracing.tracingComplete', listener: () => void): this; + /** + * Issued when attached to a worker. + */ + addListener(event: 'NodeWorker.attachedToWorker', listener: (message: InspectorNotification) => void): this; + /** + * Issued when detached from the worker. + */ + addListener(event: 'NodeWorker.detachedFromWorker', listener: (message: InspectorNotification) => void): this; + /** + * Notifies about a new protocol message received from the session + * (session ID is provided in attachedToWorker notification). + */ + addListener(event: 'NodeWorker.receivedMessageFromWorker', listener: (message: InspectorNotification) => void): this; + /** + * This event is fired instead of `Runtime.executionContextDestroyed` when + * enabled. + * It is fired when the Node process finished all code execution and is + * waiting for all frontends to disconnect. + */ + addListener(event: 'NodeRuntime.waitingForDisconnect', listener: () => void): this; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: 'inspectorNotification', message: InspectorNotification<{}>): boolean; + emit(event: 'Runtime.executionContextCreated', message: InspectorNotification): boolean; + emit(event: 'Runtime.executionContextDestroyed', message: InspectorNotification): boolean; + emit(event: 'Runtime.executionContextsCleared'): boolean; + emit(event: 'Runtime.exceptionThrown', message: InspectorNotification): boolean; + emit(event: 'Runtime.exceptionRevoked', message: InspectorNotification): boolean; + emit(event: 'Runtime.consoleAPICalled', message: InspectorNotification): boolean; + emit(event: 'Runtime.inspectRequested', message: InspectorNotification): boolean; + emit(event: 'Debugger.scriptParsed', message: InspectorNotification): boolean; + emit(event: 'Debugger.scriptFailedToParse', message: InspectorNotification): boolean; + emit(event: 'Debugger.breakpointResolved', message: InspectorNotification): boolean; + emit(event: 'Debugger.paused', message: InspectorNotification): boolean; + emit(event: 'Debugger.resumed'): boolean; + emit(event: 'Console.messageAdded', message: InspectorNotification): boolean; + emit(event: 'Profiler.consoleProfileStarted', message: InspectorNotification): boolean; + emit(event: 'Profiler.consoleProfileFinished', message: InspectorNotification): boolean; + emit(event: 'HeapProfiler.addHeapSnapshotChunk', message: InspectorNotification): boolean; + emit(event: 'HeapProfiler.resetProfiles'): boolean; + emit(event: 'HeapProfiler.reportHeapSnapshotProgress', message: InspectorNotification): boolean; + emit(event: 'HeapProfiler.lastSeenObjectId', message: InspectorNotification): boolean; + emit(event: 'HeapProfiler.heapStatsUpdate', message: InspectorNotification): boolean; + emit(event: 'NodeTracing.dataCollected', message: InspectorNotification): boolean; + emit(event: 'NodeTracing.tracingComplete'): boolean; + emit(event: 'NodeWorker.attachedToWorker', message: InspectorNotification): boolean; + emit(event: 'NodeWorker.detachedFromWorker', message: InspectorNotification): boolean; + emit(event: 'NodeWorker.receivedMessageFromWorker', message: InspectorNotification): boolean; + emit(event: 'NodeRuntime.waitingForDisconnect'): boolean; + on(event: string, listener: (...args: any[]) => void): this; + /** + * Emitted when any notification from the V8 Inspector is received. + */ + on(event: 'inspectorNotification', listener: (message: InspectorNotification<{}>) => void): this; + /** + * Issued when new execution context is created. + */ + on(event: 'Runtime.executionContextCreated', listener: (message: InspectorNotification) => void): this; + /** + * Issued when execution context is destroyed. + */ + on(event: 'Runtime.executionContextDestroyed', listener: (message: InspectorNotification) => void): this; + /** + * Issued when all executionContexts were cleared in browser + */ + on(event: 'Runtime.executionContextsCleared', listener: () => void): this; + /** + * Issued when exception was thrown and unhandled. + */ + on(event: 'Runtime.exceptionThrown', listener: (message: InspectorNotification) => void): this; + /** + * Issued when unhandled exception was revoked. + */ + on(event: 'Runtime.exceptionRevoked', listener: (message: InspectorNotification) => void): this; + /** + * Issued when console API was called. + */ + on(event: 'Runtime.consoleAPICalled', listener: (message: InspectorNotification) => void): this; + /** + * Issued when object should be inspected (for example, as a result of inspect() command line API call). + */ + on(event: 'Runtime.inspectRequested', listener: (message: InspectorNotification) => void): this; + /** + * Fired when virtual machine parses script. This event is also fired for all known and uncollected scripts upon enabling debugger. + */ + on(event: 'Debugger.scriptParsed', listener: (message: InspectorNotification) => void): this; + /** + * Fired when virtual machine fails to parse the script. + */ + on(event: 'Debugger.scriptFailedToParse', listener: (message: InspectorNotification) => void): this; + /** + * Fired when breakpoint is resolved to an actual script and location. + */ + on(event: 'Debugger.breakpointResolved', listener: (message: InspectorNotification) => void): this; + /** + * Fired when the virtual machine stopped on breakpoint or exception or any other stop criteria. + */ + on(event: 'Debugger.paused', listener: (message: InspectorNotification) => void): this; + /** + * Fired when the virtual machine resumed execution. + */ + on(event: 'Debugger.resumed', listener: () => void): this; + /** + * Issued when new console message is added. + */ + on(event: 'Console.messageAdded', listener: (message: InspectorNotification) => void): this; + /** + * Sent when new profile recording is started using console.profile() call. + */ + on(event: 'Profiler.consoleProfileStarted', listener: (message: InspectorNotification) => void): this; + on(event: 'Profiler.consoleProfileFinished', listener: (message: InspectorNotification) => void): this; + on(event: 'HeapProfiler.addHeapSnapshotChunk', listener: (message: InspectorNotification) => void): this; + on(event: 'HeapProfiler.resetProfiles', listener: () => void): this; + on(event: 'HeapProfiler.reportHeapSnapshotProgress', listener: (message: InspectorNotification) => void): this; + /** + * If heap objects tracking has been started then backend regularly sends a current value for last seen object id and corresponding timestamp. If the were changes in the heap since last event then one or more heapStatsUpdate events will be sent before a new lastSeenObjectId event. + */ + on(event: 'HeapProfiler.lastSeenObjectId', listener: (message: InspectorNotification) => void): this; + /** + * If heap objects tracking has been started then backend may send update for one or more fragments + */ + on(event: 'HeapProfiler.heapStatsUpdate', listener: (message: InspectorNotification) => void): this; + /** + * Contains an bucket of collected trace events. + */ + on(event: 'NodeTracing.dataCollected', listener: (message: InspectorNotification) => void): this; + /** + * Signals that tracing is stopped and there is no trace buffers pending flush, all data were + * delivered via dataCollected events. + */ + on(event: 'NodeTracing.tracingComplete', listener: () => void): this; + /** + * Issued when attached to a worker. + */ + on(event: 'NodeWorker.attachedToWorker', listener: (message: InspectorNotification) => void): this; + /** + * Issued when detached from the worker. + */ + on(event: 'NodeWorker.detachedFromWorker', listener: (message: InspectorNotification) => void): this; + /** + * Notifies about a new protocol message received from the session + * (session ID is provided in attachedToWorker notification). + */ + on(event: 'NodeWorker.receivedMessageFromWorker', listener: (message: InspectorNotification) => void): this; + /** + * This event is fired instead of `Runtime.executionContextDestroyed` when + * enabled. + * It is fired when the Node process finished all code execution and is + * waiting for all frontends to disconnect. + */ + on(event: 'NodeRuntime.waitingForDisconnect', listener: () => void): this; + once(event: string, listener: (...args: any[]) => void): this; + /** + * Emitted when any notification from the V8 Inspector is received. + */ + once(event: 'inspectorNotification', listener: (message: InspectorNotification<{}>) => void): this; + /** + * Issued when new execution context is created. + */ + once(event: 'Runtime.executionContextCreated', listener: (message: InspectorNotification) => void): this; + /** + * Issued when execution context is destroyed. + */ + once(event: 'Runtime.executionContextDestroyed', listener: (message: InspectorNotification) => void): this; + /** + * Issued when all executionContexts were cleared in browser + */ + once(event: 'Runtime.executionContextsCleared', listener: () => void): this; + /** + * Issued when exception was thrown and unhandled. + */ + once(event: 'Runtime.exceptionThrown', listener: (message: InspectorNotification) => void): this; + /** + * Issued when unhandled exception was revoked. + */ + once(event: 'Runtime.exceptionRevoked', listener: (message: InspectorNotification) => void): this; + /** + * Issued when console API was called. + */ + once(event: 'Runtime.consoleAPICalled', listener: (message: InspectorNotification) => void): this; + /** + * Issued when object should be inspected (for example, as a result of inspect() command line API call). + */ + once(event: 'Runtime.inspectRequested', listener: (message: InspectorNotification) => void): this; + /** + * Fired when virtual machine parses script. This event is also fired for all known and uncollected scripts upon enabling debugger. + */ + once(event: 'Debugger.scriptParsed', listener: (message: InspectorNotification) => void): this; + /** + * Fired when virtual machine fails to parse the script. + */ + once(event: 'Debugger.scriptFailedToParse', listener: (message: InspectorNotification) => void): this; + /** + * Fired when breakpoint is resolved to an actual script and location. + */ + once(event: 'Debugger.breakpointResolved', listener: (message: InspectorNotification) => void): this; + /** + * Fired when the virtual machine stopped on breakpoint or exception or any other stop criteria. + */ + once(event: 'Debugger.paused', listener: (message: InspectorNotification) => void): this; + /** + * Fired when the virtual machine resumed execution. + */ + once(event: 'Debugger.resumed', listener: () => void): this; + /** + * Issued when new console message is added. + */ + once(event: 'Console.messageAdded', listener: (message: InspectorNotification) => void): this; + /** + * Sent when new profile recording is started using console.profile() call. + */ + once(event: 'Profiler.consoleProfileStarted', listener: (message: InspectorNotification) => void): this; + once(event: 'Profiler.consoleProfileFinished', listener: (message: InspectorNotification) => void): this; + once(event: 'HeapProfiler.addHeapSnapshotChunk', listener: (message: InspectorNotification) => void): this; + once(event: 'HeapProfiler.resetProfiles', listener: () => void): this; + once(event: 'HeapProfiler.reportHeapSnapshotProgress', listener: (message: InspectorNotification) => void): this; + /** + * If heap objects tracking has been started then backend regularly sends a current value for last seen object id and corresponding timestamp. If the were changes in the heap since last event then one or more heapStatsUpdate events will be sent before a new lastSeenObjectId event. + */ + once(event: 'HeapProfiler.lastSeenObjectId', listener: (message: InspectorNotification) => void): this; + /** + * If heap objects tracking has been started then backend may send update for one or more fragments + */ + once(event: 'HeapProfiler.heapStatsUpdate', listener: (message: InspectorNotification) => void): this; + /** + * Contains an bucket of collected trace events. + */ + once(event: 'NodeTracing.dataCollected', listener: (message: InspectorNotification) => void): this; + /** + * Signals that tracing is stopped and there is no trace buffers pending flush, all data were + * delivered via dataCollected events. + */ + once(event: 'NodeTracing.tracingComplete', listener: () => void): this; + /** + * Issued when attached to a worker. + */ + once(event: 'NodeWorker.attachedToWorker', listener: (message: InspectorNotification) => void): this; + /** + * Issued when detached from the worker. + */ + once(event: 'NodeWorker.detachedFromWorker', listener: (message: InspectorNotification) => void): this; + /** + * Notifies about a new protocol message received from the session + * (session ID is provided in attachedToWorker notification). + */ + once(event: 'NodeWorker.receivedMessageFromWorker', listener: (message: InspectorNotification) => void): this; + /** + * This event is fired instead of `Runtime.executionContextDestroyed` when + * enabled. + * It is fired when the Node process finished all code execution and is + * waiting for all frontends to disconnect. + */ + once(event: 'NodeRuntime.waitingForDisconnect', listener: () => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + /** + * Emitted when any notification from the V8 Inspector is received. + */ + prependListener(event: 'inspectorNotification', listener: (message: InspectorNotification<{}>) => void): this; + /** + * Issued when new execution context is created. + */ + prependListener(event: 'Runtime.executionContextCreated', listener: (message: InspectorNotification) => void): this; + /** + * Issued when execution context is destroyed. + */ + prependListener(event: 'Runtime.executionContextDestroyed', listener: (message: InspectorNotification) => void): this; + /** + * Issued when all executionContexts were cleared in browser + */ + prependListener(event: 'Runtime.executionContextsCleared', listener: () => void): this; + /** + * Issued when exception was thrown and unhandled. + */ + prependListener(event: 'Runtime.exceptionThrown', listener: (message: InspectorNotification) => void): this; + /** + * Issued when unhandled exception was revoked. + */ + prependListener(event: 'Runtime.exceptionRevoked', listener: (message: InspectorNotification) => void): this; + /** + * Issued when console API was called. + */ + prependListener(event: 'Runtime.consoleAPICalled', listener: (message: InspectorNotification) => void): this; + /** + * Issued when object should be inspected (for example, as a result of inspect() command line API call). + */ + prependListener(event: 'Runtime.inspectRequested', listener: (message: InspectorNotification) => void): this; + /** + * Fired when virtual machine parses script. This event is also fired for all known and uncollected scripts upon enabling debugger. + */ + prependListener(event: 'Debugger.scriptParsed', listener: (message: InspectorNotification) => void): this; + /** + * Fired when virtual machine fails to parse the script. + */ + prependListener(event: 'Debugger.scriptFailedToParse', listener: (message: InspectorNotification) => void): this; + /** + * Fired when breakpoint is resolved to an actual script and location. + */ + prependListener(event: 'Debugger.breakpointResolved', listener: (message: InspectorNotification) => void): this; + /** + * Fired when the virtual machine stopped on breakpoint or exception or any other stop criteria. + */ + prependListener(event: 'Debugger.paused', listener: (message: InspectorNotification) => void): this; + /** + * Fired when the virtual machine resumed execution. + */ + prependListener(event: 'Debugger.resumed', listener: () => void): this; + /** + * Issued when new console message is added. + */ + prependListener(event: 'Console.messageAdded', listener: (message: InspectorNotification) => void): this; + /** + * Sent when new profile recording is started using console.profile() call. + */ + prependListener(event: 'Profiler.consoleProfileStarted', listener: (message: InspectorNotification) => void): this; + prependListener(event: 'Profiler.consoleProfileFinished', listener: (message: InspectorNotification) => void): this; + prependListener(event: 'HeapProfiler.addHeapSnapshotChunk', listener: (message: InspectorNotification) => void): this; + prependListener(event: 'HeapProfiler.resetProfiles', listener: () => void): this; + prependListener(event: 'HeapProfiler.reportHeapSnapshotProgress', listener: (message: InspectorNotification) => void): this; + /** + * If heap objects tracking has been started then backend regularly sends a current value for last seen object id and corresponding timestamp. If the were changes in the heap since last event then one or more heapStatsUpdate events will be sent before a new lastSeenObjectId event. + */ + prependListener(event: 'HeapProfiler.lastSeenObjectId', listener: (message: InspectorNotification) => void): this; + /** + * If heap objects tracking has been started then backend may send update for one or more fragments + */ + prependListener(event: 'HeapProfiler.heapStatsUpdate', listener: (message: InspectorNotification) => void): this; + /** + * Contains an bucket of collected trace events. + */ + prependListener(event: 'NodeTracing.dataCollected', listener: (message: InspectorNotification) => void): this; + /** + * Signals that tracing is stopped and there is no trace buffers pending flush, all data were + * delivered via dataCollected events. + */ + prependListener(event: 'NodeTracing.tracingComplete', listener: () => void): this; + /** + * Issued when attached to a worker. + */ + prependListener(event: 'NodeWorker.attachedToWorker', listener: (message: InspectorNotification) => void): this; + /** + * Issued when detached from the worker. + */ + prependListener(event: 'NodeWorker.detachedFromWorker', listener: (message: InspectorNotification) => void): this; + /** + * Notifies about a new protocol message received from the session + * (session ID is provided in attachedToWorker notification). + */ + prependListener(event: 'NodeWorker.receivedMessageFromWorker', listener: (message: InspectorNotification) => void): this; + /** + * This event is fired instead of `Runtime.executionContextDestroyed` when + * enabled. + * It is fired when the Node process finished all code execution and is + * waiting for all frontends to disconnect. + */ + prependListener(event: 'NodeRuntime.waitingForDisconnect', listener: () => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + /** + * Emitted when any notification from the V8 Inspector is received. + */ + prependOnceListener(event: 'inspectorNotification', listener: (message: InspectorNotification<{}>) => void): this; + /** + * Issued when new execution context is created. + */ + prependOnceListener(event: 'Runtime.executionContextCreated', listener: (message: InspectorNotification) => void): this; + /** + * Issued when execution context is destroyed. + */ + prependOnceListener(event: 'Runtime.executionContextDestroyed', listener: (message: InspectorNotification) => void): this; + /** + * Issued when all executionContexts were cleared in browser + */ + prependOnceListener(event: 'Runtime.executionContextsCleared', listener: () => void): this; + /** + * Issued when exception was thrown and unhandled. + */ + prependOnceListener(event: 'Runtime.exceptionThrown', listener: (message: InspectorNotification) => void): this; + /** + * Issued when unhandled exception was revoked. + */ + prependOnceListener(event: 'Runtime.exceptionRevoked', listener: (message: InspectorNotification) => void): this; + /** + * Issued when console API was called. + */ + prependOnceListener(event: 'Runtime.consoleAPICalled', listener: (message: InspectorNotification) => void): this; + /** + * Issued when object should be inspected (for example, as a result of inspect() command line API call). + */ + prependOnceListener(event: 'Runtime.inspectRequested', listener: (message: InspectorNotification) => void): this; + /** + * Fired when virtual machine parses script. This event is also fired for all known and uncollected scripts upon enabling debugger. + */ + prependOnceListener(event: 'Debugger.scriptParsed', listener: (message: InspectorNotification) => void): this; + /** + * Fired when virtual machine fails to parse the script. + */ + prependOnceListener(event: 'Debugger.scriptFailedToParse', listener: (message: InspectorNotification) => void): this; + /** + * Fired when breakpoint is resolved to an actual script and location. + */ + prependOnceListener(event: 'Debugger.breakpointResolved', listener: (message: InspectorNotification) => void): this; + /** + * Fired when the virtual machine stopped on breakpoint or exception or any other stop criteria. + */ + prependOnceListener(event: 'Debugger.paused', listener: (message: InspectorNotification) => void): this; + /** + * Fired when the virtual machine resumed execution. + */ + prependOnceListener(event: 'Debugger.resumed', listener: () => void): this; + /** + * Issued when new console message is added. + */ + prependOnceListener(event: 'Console.messageAdded', listener: (message: InspectorNotification) => void): this; + /** + * Sent when new profile recording is started using console.profile() call. + */ + prependOnceListener(event: 'Profiler.consoleProfileStarted', listener: (message: InspectorNotification) => void): this; + prependOnceListener(event: 'Profiler.consoleProfileFinished', listener: (message: InspectorNotification) => void): this; + prependOnceListener(event: 'HeapProfiler.addHeapSnapshotChunk', listener: (message: InspectorNotification) => void): this; + prependOnceListener(event: 'HeapProfiler.resetProfiles', listener: () => void): this; + prependOnceListener(event: 'HeapProfiler.reportHeapSnapshotProgress', listener: (message: InspectorNotification) => void): this; + /** + * If heap objects tracking has been started then backend regularly sends a current value for last seen object id and corresponding timestamp. If the were changes in the heap since last event then one or more heapStatsUpdate events will be sent before a new lastSeenObjectId event. + */ + prependOnceListener(event: 'HeapProfiler.lastSeenObjectId', listener: (message: InspectorNotification) => void): this; + /** + * If heap objects tracking has been started then backend may send update for one or more fragments + */ + prependOnceListener(event: 'HeapProfiler.heapStatsUpdate', listener: (message: InspectorNotification) => void): this; + /** + * Contains an bucket of collected trace events. + */ + prependOnceListener(event: 'NodeTracing.dataCollected', listener: (message: InspectorNotification) => void): this; + /** + * Signals that tracing is stopped and there is no trace buffers pending flush, all data were + * delivered via dataCollected events. + */ + prependOnceListener(event: 'NodeTracing.tracingComplete', listener: () => void): this; + /** + * Issued when attached to a worker. + */ + prependOnceListener(event: 'NodeWorker.attachedToWorker', listener: (message: InspectorNotification) => void): this; + /** + * Issued when detached from the worker. + */ + prependOnceListener(event: 'NodeWorker.detachedFromWorker', listener: (message: InspectorNotification) => void): this; + /** + * Notifies about a new protocol message received from the session + * (session ID is provided in attachedToWorker notification). + */ + prependOnceListener(event: 'NodeWorker.receivedMessageFromWorker', listener: (message: InspectorNotification) => void): this; + /** + * This event is fired instead of `Runtime.executionContextDestroyed` when + * enabled. + * It is fired when the Node process finished all code execution and is + * waiting for all frontends to disconnect. + */ + prependOnceListener(event: 'NodeRuntime.waitingForDisconnect', listener: () => void): this; + } + /** + * Activate inspector on host and port. Equivalent to`node --inspect=[[host:]port]`, but can be done programmatically after node has + * 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` regarding the `host`parameter usage. + * @param [port='what was specified on the CLI'] Port to listen on for inspector connections. Optional. + * @param [host='what was specified on the CLI'] Host to listen on for inspector connections. Optional. + * @param [wait=false] Block until a client has connected. Optional. + * @returns Disposable that calls `inspector.close()`. + */ + function open(port?: number, host?: string, wait?: boolean): Disposable; + /** + * Deactivate the inspector. Blocks until there are no active connections. + */ + function close(): void; + /** + * Return the URL of the active inspector, or `undefined` if there is none. + * + * ```console + * $ node --inspect -p 'inspector.url()' + * Debugger listening on ws://127.0.0.1:9229/166e272e-7a30-4d09-97ce-f1c012b43c34 + * For help, see: https://nodejs.org/en/docs/inspector + * ws://127.0.0.1:9229/166e272e-7a30-4d09-97ce-f1c012b43c34 + * + * $ node --inspect=localhost:3000 -p 'inspector.url()' + * Debugger listening on ws://localhost:3000/51cf8d0e-3c36-4c59-8efd-54519839e56a + * For help, see: https://nodejs.org/en/docs/inspector + * ws://localhost:3000/51cf8d0e-3c36-4c59-8efd-54519839e56a + * + * $ node -p 'inspector.url()' + * undefined + * ``` + */ + function url(): string | undefined; + /** + * Blocks until a client (existing or connected later) has sent`Runtime.runIfWaitingForDebugger` command. + * + * An exception will be thrown if there is no active inspector. + * @since v12.7.0 + */ + function waitForDebugger(): void; +} +/** + * The inspector module provides an API for interacting with the V8 inspector. + */ +declare module 'node:inspector' { + import inspector = require('inspector'); + export = inspector; +} diff --git a/task/node_modules/@types/node/ts4.8/module.d.ts b/task/node_modules/@types/node/ts4.8/module.d.ts new file mode 100644 index 0000000..68d59c7 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/module.d.ts @@ -0,0 +1,301 @@ +/** + * @since v0.3.7 + * @experimental + */ +declare module "module" { + import { URL } from "node:url"; + import { MessagePort } from "node:worker_threads"; + namespace Module { + /** + * The `module.syncBuiltinESMExports()` method updates all the live bindings for + * builtin `ES Modules` to match the properties of the `CommonJS` exports. It + * does not add or remove exported names from the `ES Modules`. + * + * ```js + * const fs = require('node:fs'); + * const assert = require('node:assert'); + * const { syncBuiltinESMExports } = require('node:module'); + * + * fs.readFile = newAPI; + * + * delete fs.readFileSync; + * + * function newAPI() { + * // ... + * } + * + * fs.newAPI = newAPI; + * + * syncBuiltinESMExports(); + * + * import('node:fs').then((esmFS) => { + * // It syncs the existing readFile property with the new value + * assert.strictEqual(esmFS.readFile, newAPI); + * // readFileSync has been deleted from the required fs + * assert.strictEqual('readFileSync' in fs, false); + * // syncBuiltinESMExports() does not remove readFileSync from esmFS + * assert.strictEqual('readFileSync' in esmFS, true); + * // syncBuiltinESMExports() does not add names + * assert.strictEqual(esmFS.newAPI, undefined); + * }); + * ``` + * @since v12.12.0 + */ + function syncBuiltinESMExports(): void; + /** + * `path` is the resolved path for the file for which a corresponding source map + * should be fetched. + * @since v13.7.0, v12.17.0 + * @return Returns `module.SourceMap` if a source map is found, `undefined` otherwise. + */ + function findSourceMap(path: string, error?: Error): SourceMap; + interface SourceMapPayload { + file: string; + version: number; + sources: string[]; + sourcesContent: string[]; + names: string[]; + mappings: string; + sourceRoot: string; + } + interface SourceMapping { + generatedLine: number; + generatedColumn: number; + originalSource: string; + originalLine: number; + originalColumn: number; + } + interface SourceOrigin { + /** + * The name of the range in the source map, if one was provided + */ + name?: string; + /** + * The file name of the original source, as reported in the SourceMap + */ + fileName: string; + /** + * The 1-indexed lineNumber of the corresponding call site in the original source + */ + lineNumber: number; + /** + * The 1-indexed columnNumber of the corresponding call site in the original source + */ + columnNumber: number; + } + /** + * @since v13.7.0, v12.17.0 + */ + class SourceMap { + /** + * Getter for the payload used to construct the `SourceMap` instance. + */ + readonly payload: SourceMapPayload; + constructor(payload: SourceMapPayload); + /** + * Given a line offset and column offset in the generated source + * file, returns an object representing the SourceMap range in the + * original file if found, or an empty object if not. + * + * The object returned contains the following keys: + * + * The returned value represents the raw range as it appears in the + * SourceMap, based on zero-indexed offsets, _not_ 1-indexed line and + * column numbers as they appear in Error messages and CallSite + * objects. + * + * To get the corresponding 1-indexed line and column numbers from a + * lineNumber and columnNumber as they are reported by Error stacks + * and CallSite objects, use `sourceMap.findOrigin(lineNumber, columnNumber)` + * @param lineOffset The zero-indexed line number offset in the generated source + * @param columnOffset The zero-indexed column number offset in the generated source + */ + findEntry(lineOffset: number, columnOffset: number): SourceMapping; + /** + * Given a 1-indexed `lineNumber` and `columnNumber` from a call site in the generated source, + * find the corresponding call site location in the original source. + * + * If the `lineNumber` and `columnNumber` provided are not found in any source map, + * then an empty object is returned. + * @param lineNumber The 1-indexed line number of the call site in the generated source + * @param columnNumber The 1-indexed column number of the call site in the generated source + */ + findOrigin(lineNumber: number, columnNumber: number): SourceOrigin | {}; + } + /** @deprecated Use `ImportAttributes` instead */ + interface ImportAssertions extends ImportAttributes {} + interface ImportAttributes extends NodeJS.Dict { + type?: string | undefined; + } + type ModuleFormat = "builtin" | "commonjs" | "json" | "module" | "wasm"; + type ModuleSource = string | ArrayBuffer | NodeJS.TypedArray; + interface GlobalPreloadContext { + port: MessagePort; + } + /** + * @deprecated This hook will be removed in a future version. + * Use `initialize` instead. When a loader has an `initialize` export, `globalPreload` will be ignored. + * + * 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. + * + * @param context Information to assist the preload code + * @return Code to run before application startup + */ + type GlobalPreloadHook = (context: GlobalPreloadContext) => string; + /** + * The `initialize` hook provides a way to define a custom function that runs in the hooks thread + * when the hooks module is initialized. Initialization happens when the hooks module is registered via `register`. + * + * This hook can receive data from a `register` invocation, including ports and other transferrable objects. + * The return value of `initialize` can be a `Promise`, in which case it will be awaited before the main application thread execution resumes. + */ + type InitializeHook = (data: Data) => void | Promise; + interface ResolveHookContext { + /** + * Export conditions of the relevant `package.json` + */ + conditions: string[]; + /** + * @deprecated Use `importAttributes` instead + */ + importAssertions: ImportAttributes; + /** + * An object whose key-value pairs represent the assertions for the module to import + */ + importAttributes: ImportAttributes; + /** + * The module importing this one, or undefined if this is the Node.js entry point + */ + parentURL: string | undefined; + } + interface ResolveFnOutput { + /** + * A hint to the load hook (it might be ignored) + */ + format?: ModuleFormat | null | undefined; + /** + * @deprecated Use `importAttributes` instead + */ + importAssertions?: ImportAttributes | undefined; + /** + * The import attributes to use when caching the module (optional; if excluded the input will be used) + */ + importAttributes?: ImportAttributes | undefined; + /** + * A signal that this hook intends to terminate the chain of `resolve` hooks. + * @default false + */ + shortCircuit?: boolean | undefined; + /** + * The absolute URL to which this input resolves + */ + url: string; + } + /** + * The `resolve` hook chain is responsible for resolving file URL for a given module specifier 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. + * + * @param specifier The specified URL path of the module to be resolved + * @param context + * @param nextResolve The subsequent `resolve` hook in the chain, or the Node.js default `resolve` hook after the last user-supplied resolve hook + */ + type ResolveHook = ( + specifier: string, + context: ResolveHookContext, + nextResolve: ( + specifier: string, + context?: ResolveHookContext, + ) => ResolveFnOutput | Promise, + ) => ResolveFnOutput | Promise; + interface LoadHookContext { + /** + * Export conditions of the relevant `package.json` + */ + conditions: string[]; + /** + * The format optionally supplied by the `resolve` hook chain + */ + format: ModuleFormat; + /** + * @deprecated Use `importAttributes` instead + */ + importAssertions: ImportAttributes; + /** + * An object whose key-value pairs represent the assertions for the module to import + */ + importAttributes: ImportAttributes; + } + interface LoadFnOutput { + format: ModuleFormat; + /** + * A signal that this hook intends to terminate the chain of `resolve` hooks. + * @default false + */ + shortCircuit?: boolean | undefined; + /** + * The source for Node.js to evaluate + */ + source?: ModuleSource; + } + /** + * The `load` hook provides a way to define a custom method of determining how a URL should be interpreted, retrieved, and parsed. + * It is also in charge of validating the import assertion. + * + * @param url The URL/path of the module to be loaded + * @param context Metadata about the module + * @param nextLoad The subsequent `load` hook in the chain, or the Node.js default `load` hook after the last user-supplied `load` hook + */ + type LoadHook = ( + url: string, + context: LoadHookContext, + nextLoad: (url: string, context?: LoadHookContext) => LoadFnOutput | Promise, + ) => LoadFnOutput | Promise; + } + interface RegisterOptions { + parentURL: string | URL; + data?: Data | undefined; + transferList?: any[] | undefined; + } + interface Module extends NodeModule {} + class Module { + static runMain(): void; + static wrap(code: string): string; + static createRequire(path: string | URL): NodeRequire; + static builtinModules: string[]; + static isBuiltin(moduleName: string): boolean; + static Module: typeof Module; + static register( + specifier: string | URL, + parentURL?: string | URL, + options?: RegisterOptions, + ): void; + static register(specifier: string | URL, options?: RegisterOptions): void; + constructor(id: string, parent?: Module); + } + global { + interface ImportMeta { + url: string; + /** + * Provides a module-relative resolution function scoped to each module, returning + * the URL string. + * + * Second `parent` parameter is only used when the `--experimental-import-meta-resolve` + * command flag enabled. + * + * @since v20.6.0 + * + * @param specifier The module specifier to resolve relative to `parent`. + * @param parent The absolute parent module URL to resolve from. + * @returns The absolute (`file:`) URL string for the resolved module. + */ + resolve(specifier: string, parent?: string | URL | undefined): string; + } + } + export = Module; +} +declare module "node:module" { + import module = require("module"); + export = module; +} diff --git a/task/node_modules/@types/node/ts4.8/net.d.ts b/task/node_modules/@types/node/ts4.8/net.d.ts new file mode 100644 index 0000000..70789e1 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/net.d.ts @@ -0,0 +1,949 @@ +/** + * > Stability: 2 - Stable + * + * The `node:net` module provides an asynchronous network API for creating stream-based + * TCP or `IPC` servers ({@link createServer}) and clients + * ({@link createConnection}). + * + * It can be accessed using: + * + * ```js + * const net = require('node:net'); + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/net.js) + */ +declare module "net" { + import * as stream from "node:stream"; + import { Abortable, EventEmitter } from "node:events"; + import * as dns from "node:dns"; + type LookupFunction = ( + hostname: string, + options: dns.LookupAllOptions, + callback: (err: NodeJS.ErrnoException | null, addresses: dns.LookupAddress[]) => void, + ) => void; + interface AddressInfo { + address: string; + family: string; + port: number; + } + interface SocketConstructorOpts { + fd?: number | undefined; + allowHalfOpen?: boolean | undefined; + readable?: boolean | undefined; + writable?: boolean | undefined; + signal?: AbortSignal; + } + interface OnReadOpts { + buffer: Uint8Array | (() => Uint8Array); + /** + * This function is called for every chunk of incoming data. + * Two arguments are passed to it: the number of bytes written to buffer and a reference to buffer. + * Return false from this function to implicitly pause() the socket. + */ + callback(bytesWritten: number, buf: Uint8Array): boolean; + } + interface ConnectOpts { + /** + * If specified, incoming data is stored in a single buffer and passed to the supplied callback when data arrives on the socket. + * Note: this will cause the streaming functionality to not provide any data, however events like 'error', 'end', and 'close' will + * still be emitted as normal and methods like pause() and resume() will also behave as expected. + */ + onread?: OnReadOpts | undefined; + } + interface TcpSocketConnectOpts extends ConnectOpts { + port: number; + host?: string | undefined; + localAddress?: string | undefined; + localPort?: number | undefined; + hints?: number | undefined; + family?: number | undefined; + lookup?: LookupFunction | undefined; + noDelay?: boolean | undefined; + keepAlive?: boolean | undefined; + keepAliveInitialDelay?: number | undefined; + /** + * @since v18.13.0 + */ + autoSelectFamily?: boolean | undefined; + /** + * @since v18.13.0 + */ + autoSelectFamilyAttemptTimeout?: number | undefined; + } + interface IpcSocketConnectOpts extends ConnectOpts { + path: string; + } + type SocketConnectOpts = TcpSocketConnectOpts | IpcSocketConnectOpts; + type SocketReadyState = "opening" | "open" | "readOnly" | "writeOnly" | "closed"; + /** + * This class is an abstraction of a TCP socket or a streaming `IPC` endpoint + * (uses named pipes on Windows, and Unix domain sockets otherwise). It is also + * an `EventEmitter`. + * + * A `net.Socket` can be created by the user and used directly to interact with + * a server. For example, it is returned by {@link createConnection}, + * so the user can use it to talk to the server. + * + * It can also be created by Node.js and passed to the user when a connection + * is received. For example, it is passed to the listeners of a `'connection'` event emitted on a {@link Server}, so the user can use + * it to interact with the client. + * @since v0.3.4 + */ + class Socket extends stream.Duplex { + constructor(options?: SocketConstructorOpts); + /** + * Destroys the socket after all data is written. If the `finish` event was already emitted the socket is destroyed immediately. + * If the socket is still writable it implicitly calls `socket.end()`. + * @since v0.3.4 + */ + destroySoon(): void; + /** + * Sends data on the socket. The second parameter specifies the encoding in the + * case of a string. It defaults to UTF8 encoding. + * + * Returns `true` if the entire data was flushed successfully to the kernel + * buffer. Returns `false` if all or part of the data was queued in user memory.`'drain'` will be emitted when the buffer is again free. + * + * The optional `callback` parameter will be executed when the data is finally + * written out, which may not be immediately. + * + * See `Writable` stream `write()` method for more + * information. + * @since v0.1.90 + * @param [encoding='utf8'] Only used when data is `string`. + */ + write(buffer: Uint8Array | string, cb?: (err?: Error) => void): boolean; + write(str: Uint8Array | string, encoding?: BufferEncoding, cb?: (err?: Error) => void): boolean; + /** + * Initiate a connection on a given socket. + * + * Possible signatures: + * + * * `socket.connect(options[, connectListener])` + * * `socket.connect(path[, connectListener])` for `IPC` connections. + * * `socket.connect(port[, host][, connectListener])` for TCP connections. + * * Returns: `net.Socket` The socket itself. + * + * This function is asynchronous. When the connection is established, the `'connect'` event will be emitted. If there is a problem connecting, + * instead of a `'connect'` event, an `'error'` event will be emitted with + * the error passed to the `'error'` listener. + * The last parameter `connectListener`, if supplied, will be added as a listener + * for the `'connect'` event **once**. + * + * This function should only be used for reconnecting a socket after`'close'` has been emitted or otherwise it may lead to undefined + * behavior. + */ + connect(options: SocketConnectOpts, connectionListener?: () => void): this; + connect(port: number, host: string, connectionListener?: () => void): this; + connect(port: number, connectionListener?: () => void): this; + connect(path: string, connectionListener?: () => void): this; + /** + * Set the encoding for the socket as a `Readable Stream`. See `readable.setEncoding()` for more information. + * @since v0.1.90 + * @return The socket itself. + */ + setEncoding(encoding?: BufferEncoding): this; + /** + * Pauses the reading of data. That is, `'data'` events will not be emitted. + * Useful to throttle back an upload. + * @return The socket itself. + */ + pause(): this; + /** + * Close the TCP connection by sending an RST packet and destroy the stream. + * If this TCP socket is in connecting status, it will send an RST packet and destroy this TCP socket once it is connected. + * Otherwise, it will call `socket.destroy` with an `ERR_SOCKET_CLOSED` Error. + * If this is not a TCP socket (for example, a pipe), calling this method will immediately throw an `ERR_INVALID_HANDLE_TYPE` Error. + * @since v18.3.0, v16.17.0 + */ + resetAndDestroy(): this; + /** + * Resumes reading after a call to `socket.pause()`. + * @return The socket itself. + */ + resume(): this; + /** + * Sets the socket to timeout after `timeout` milliseconds of inactivity on + * the socket. By default `net.Socket` do not have a timeout. + * + * When an idle timeout is triggered the socket will receive a `'timeout'` event but the connection will not be severed. The user must manually call `socket.end()` or `socket.destroy()` to + * end the connection. + * + * ```js + * socket.setTimeout(3000); + * socket.on('timeout', () => { + * console.log('socket timeout'); + * socket.end(); + * }); + * ``` + * + * If `timeout` is 0, then the existing idle timeout is disabled. + * + * The optional `callback` parameter will be added as a one-time listener for the `'timeout'` event. + * @since v0.1.90 + * @return The socket itself. + */ + setTimeout(timeout: number, callback?: () => void): this; + /** + * Enable/disable the use of Nagle's algorithm. + * + * When a TCP connection is created, it will have Nagle's algorithm enabled. + * + * Nagle's algorithm delays data before it is sent via the network. It attempts + * to optimize throughput at the expense of latency. + * + * Passing `true` for `noDelay` or not passing an argument will disable Nagle's + * algorithm for the socket. Passing `false` for `noDelay` will enable Nagle's + * algorithm. + * @since v0.1.90 + * @param [noDelay=true] + * @return The socket itself. + */ + setNoDelay(noDelay?: boolean): this; + /** + * Enable/disable keep-alive functionality, and optionally set the initial + * delay before the first keepalive probe is sent on an idle socket. + * + * Set `initialDelay` (in milliseconds) to set the delay between the last + * data packet received and the first keepalive probe. Setting `0` for`initialDelay` will leave the value unchanged from the default + * (or previous) setting. + * + * Enabling the keep-alive functionality will set the following socket options: + * + * * `SO_KEEPALIVE=1` + * * `TCP_KEEPIDLE=initialDelay` + * * `TCP_KEEPCNT=10` + * * `TCP_KEEPINTVL=1` + * @since v0.1.92 + * @param [enable=false] + * @param [initialDelay=0] + * @return The socket itself. + */ + setKeepAlive(enable?: boolean, initialDelay?: number): this; + /** + * Returns the bound `address`, the address `family` name and `port` of the + * socket as reported by the operating system:`{ port: 12346, family: 'IPv4', address: '127.0.0.1' }` + * @since v0.1.90 + */ + address(): AddressInfo | {}; + /** + * Calling `unref()` on a socket will allow the program to exit if this is the only + * active socket in the event system. If the socket is already `unref`ed calling`unref()` again will have no effect. + * @since v0.9.1 + * @return The socket itself. + */ + unref(): this; + /** + * Opposite of `unref()`, calling `ref()` on a previously `unref`ed socket will _not_ let the program exit if it's the only socket left (the default behavior). + * If the socket is `ref`ed calling `ref` again will have no effect. + * @since v0.9.1 + * @return The socket itself. + */ + ref(): this; + /** + * This property is only present if the family autoselection algorithm is enabled in `socket.connect(options)` + * and it is an array of the addresses that have been attempted. + * + * Each address is a string in the form of `$IP:$PORT`. + * If the connection was successful, then the last address is the one that the socket is currently connected to. + * @since v19.4.0 + */ + readonly autoSelectFamilyAttemptedAddresses: string[]; + /** + * This property shows the number of characters buffered for writing. The buffer + * may contain strings whose length after encoding is not yet known. So this number + * is only an approximation of the number of bytes in the buffer. + * + * `net.Socket` has the property that `socket.write()` always works. This is to + * help users get up and running quickly. The computer cannot always keep up + * with the amount of data that is written to a socket. The network connection + * simply might be too slow. Node.js will internally queue up the data written to a + * socket and send it out over the wire when it is possible. + * + * The consequence of this internal buffering is that memory may grow. + * Users who experience large or growing `bufferSize` should attempt to + * "throttle" the data flows in their program with `socket.pause()` and `socket.resume()`. + * @since v0.3.8 + * @deprecated Since v14.6.0 - Use `writableLength` instead. + */ + readonly bufferSize: number; + /** + * The amount of received bytes. + * @since v0.5.3 + */ + readonly bytesRead: number; + /** + * The amount of bytes sent. + * @since v0.5.3 + */ + readonly bytesWritten: number; + /** + * If `true`,`socket.connect(options[, connectListener])` was + * called and has not yet finished. It will stay `true` until the socket becomes + * connected, then it is set to `false` and the `'connect'` event is emitted. Note + * that the `socket.connect(options[, connectListener])` callback is a listener for the `'connect'` event. + * @since v6.1.0 + */ + readonly connecting: boolean; + /** + * This is `true` if the socket is not connected yet, either because `.connect()`has not yet been called or because it is still in the process of connecting + * (see `socket.connecting`). + * @since v11.2.0, v10.16.0 + */ + readonly pending: boolean; + /** + * See `writable.destroyed` for further details. + */ + readonly destroyed: boolean; + /** + * The string representation of the local IP address the remote client is + * connecting on. For example, in a server listening on `'0.0.0.0'`, if a client + * connects on `'192.168.1.1'`, the value of `socket.localAddress` would be`'192.168.1.1'`. + * @since v0.9.6 + */ + readonly localAddress?: string; + /** + * The numeric representation of the local port. For example, `80` or `21`. + * @since v0.9.6 + */ + readonly localPort?: number; + /** + * The string representation of the local IP family. `'IPv4'` or `'IPv6'`. + * @since v18.8.0, v16.18.0 + */ + readonly localFamily?: string; + /** + * This property represents the state of the connection as a string. + * + * * If the stream is connecting `socket.readyState` is `opening`. + * * If the stream is readable and writable, it is `open`. + * * If the stream is readable and not writable, it is `readOnly`. + * * If the stream is not readable and writable, it is `writeOnly`. + * @since v0.5.0 + */ + readonly readyState: SocketReadyState; + /** + * The string representation of the remote IP address. For example,`'74.125.127.100'` or `'2001:4860:a005::68'`. Value may be `undefined` if + * the socket is destroyed (for example, if the client disconnected). + * @since v0.5.10 + */ + readonly remoteAddress?: string | undefined; + /** + * The string representation of the remote IP family. `'IPv4'` or `'IPv6'`. Value may be `undefined` if + * the socket is destroyed (for example, if the client disconnected). + * @since v0.11.14 + */ + readonly remoteFamily?: string | undefined; + /** + * The numeric representation of the remote port. For example, `80` or `21`. Value may be `undefined` if + * the socket is destroyed (for example, if the client disconnected). + * @since v0.5.10 + */ + readonly remotePort?: number | undefined; + /** + * The socket timeout in milliseconds as set by `socket.setTimeout()`. + * It is `undefined` if a timeout has not been set. + * @since v10.7.0 + */ + readonly timeout?: number | undefined; + /** + * Half-closes the socket. i.e., it sends a FIN packet. It is possible the + * server will still send some data. + * + * See `writable.end()` for further details. + * @since v0.1.90 + * @param [encoding='utf8'] Only used when data is `string`. + * @param callback Optional callback for when the socket is finished. + * @return The socket itself. + */ + end(callback?: () => void): this; + end(buffer: Uint8Array | string, callback?: () => void): this; + end(str: Uint8Array | string, encoding?: BufferEncoding, callback?: () => void): this; + /** + * events.EventEmitter + * 1. close + * 2. connect + * 3. data + * 4. drain + * 5. end + * 6. error + * 7. lookup + * 8. ready + * 9. timeout + */ + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "close", listener: (hadError: boolean) => void): this; + addListener(event: "connect", listener: () => void): this; + addListener(event: "data", listener: (data: Buffer) => void): this; + addListener(event: "drain", listener: () => void): this; + addListener(event: "end", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener( + event: "lookup", + listener: (err: Error, address: string, family: string | number, host: string) => void, + ): this; + addListener(event: "ready", listener: () => void): this; + addListener(event: "timeout", listener: () => void): this; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close", hadError: boolean): boolean; + emit(event: "connect"): boolean; + emit(event: "data", data: Buffer): boolean; + emit(event: "drain"): boolean; + emit(event: "end"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "lookup", err: Error, address: string, family: string | number, host: string): boolean; + emit(event: "ready"): boolean; + emit(event: "timeout"): boolean; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "close", listener: (hadError: boolean) => void): this; + on(event: "connect", listener: () => void): this; + on(event: "data", listener: (data: Buffer) => void): this; + on(event: "drain", listener: () => void): this; + on(event: "end", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on( + event: "lookup", + listener: (err: Error, address: string, family: string | number, host: string) => void, + ): this; + on(event: "ready", listener: () => void): this; + on(event: "timeout", listener: () => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "close", listener: (hadError: boolean) => void): this; + once(event: "connect", listener: () => void): this; + once(event: "data", listener: (data: Buffer) => void): this; + once(event: "drain", listener: () => void): this; + once(event: "end", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once( + event: "lookup", + listener: (err: Error, address: string, family: string | number, host: string) => void, + ): this; + once(event: "ready", listener: () => void): this; + once(event: "timeout", listener: () => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: (hadError: boolean) => void): this; + prependListener(event: "connect", listener: () => void): this; + prependListener(event: "data", listener: (data: Buffer) => void): this; + prependListener(event: "drain", listener: () => void): this; + prependListener(event: "end", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener( + event: "lookup", + listener: (err: Error, address: string, family: string | number, host: string) => void, + ): this; + prependListener(event: "ready", listener: () => void): this; + prependListener(event: "timeout", listener: () => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: (hadError: boolean) => void): this; + prependOnceListener(event: "connect", listener: () => void): this; + prependOnceListener(event: "data", listener: (data: Buffer) => void): this; + prependOnceListener(event: "drain", listener: () => void): this; + prependOnceListener(event: "end", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener( + event: "lookup", + listener: (err: Error, address: string, family: string | number, host: string) => void, + ): this; + prependOnceListener(event: "ready", listener: () => void): this; + prependOnceListener(event: "timeout", listener: () => void): this; + } + interface ListenOptions extends Abortable { + port?: number | undefined; + host?: string | undefined; + backlog?: number | undefined; + path?: string | undefined; + exclusive?: boolean | undefined; + readableAll?: boolean | undefined; + writableAll?: boolean | undefined; + /** + * @default false + */ + ipv6Only?: boolean | undefined; + } + interface ServerOpts { + /** + * Indicates whether half-opened TCP connections are allowed. + * @default false + */ + allowHalfOpen?: boolean | undefined; + /** + * Indicates whether the socket should be paused on incoming connections. + * @default false + */ + pauseOnConnect?: boolean | undefined; + /** + * If set to `true`, it disables the use of Nagle's algorithm immediately after a new incoming connection is received. + * @default false + * @since v16.5.0 + */ + noDelay?: boolean | undefined; + /** + * If set to `true`, it enables keep-alive functionality on the socket immediately after a new incoming connection is received, + * similarly on what is done in `socket.setKeepAlive([enable][, initialDelay])`. + * @default false + * @since v16.5.0 + */ + keepAlive?: boolean | undefined; + /** + * If set to a positive number, it sets the initial delay before the first keepalive probe is sent on an idle socket. + * @default 0 + * @since v16.5.0 + */ + keepAliveInitialDelay?: number | undefined; + } + interface DropArgument { + localAddress?: string; + localPort?: number; + localFamily?: string; + remoteAddress?: string; + remotePort?: number; + remoteFamily?: string; + } + /** + * This class is used to create a TCP or `IPC` server. + * @since v0.1.90 + */ + class Server extends EventEmitter { + constructor(connectionListener?: (socket: Socket) => void); + constructor(options?: ServerOpts, connectionListener?: (socket: Socket) => void); + /** + * Start a server listening for connections. A `net.Server` can be a TCP or + * an `IPC` server depending on what it listens to. + * + * Possible signatures: + * + * * `server.listen(handle[, backlog][, callback])` + * * `server.listen(options[, callback])` + * * `server.listen(path[, backlog][, callback])` for `IPC` servers + * * `server.listen([port[, host[, backlog]]][, callback])` for TCP servers + * + * This function is asynchronous. When the server starts listening, the `'listening'` event will be emitted. The last parameter `callback`will be added as a listener for the `'listening'` + * event. + * + * All `listen()` methods can take a `backlog` parameter to specify the maximum + * length of the queue of pending connections. The actual length will be determined + * by the OS through sysctl settings such as `tcp_max_syn_backlog` and `somaxconn`on Linux. The default value of this parameter is 511 (not 512). + * + * All {@link Socket} are set to `SO_REUSEADDR` (see [`socket(7)`](https://man7.org/linux/man-pages/man7/socket.7.html) for + * details). + * + * The `server.listen()` method can be called again if and only if there was an + * error during the first `server.listen()` call or `server.close()` has been + * called. Otherwise, an `ERR_SERVER_ALREADY_LISTEN` error will be thrown. + * + * One of the most common errors raised when listening is `EADDRINUSE`. + * This happens when another server is already listening on the requested`port`/`path`/`handle`. One way to handle this would be to retry + * after a certain amount of time: + * + * ```js + * server.on('error', (e) => { + * if (e.code === 'EADDRINUSE') { + * console.error('Address in use, retrying...'); + * setTimeout(() => { + * server.close(); + * server.listen(PORT, HOST); + * }, 1000); + * } + * }); + * ``` + */ + listen(port?: number, hostname?: string, backlog?: number, listeningListener?: () => void): this; + listen(port?: number, hostname?: string, listeningListener?: () => void): this; + listen(port?: number, backlog?: number, listeningListener?: () => void): this; + listen(port?: number, listeningListener?: () => void): this; + listen(path: string, backlog?: number, listeningListener?: () => void): this; + listen(path: string, listeningListener?: () => void): this; + listen(options: ListenOptions, listeningListener?: () => void): this; + listen(handle: any, backlog?: number, listeningListener?: () => void): this; + listen(handle: any, listeningListener?: () => void): this; + /** + * Stops the server from accepting new connections and keeps existing + * connections. This function is asynchronous, the server is finally closed + * when all connections are ended and the server emits a `'close'` event. + * The optional `callback` will be called once the `'close'` event occurs. Unlike + * that event, it will be called with an `Error` as its only argument if the server + * was not open when it was closed. + * @since v0.1.90 + * @param callback Called when the server is closed. + */ + close(callback?: (err?: Error) => void): this; + /** + * Returns the bound `address`, the address `family` name, and `port` of the server + * as reported by the operating system if listening on an IP socket + * (useful to find which port was assigned when getting an OS-assigned address):`{ port: 12346, family: 'IPv4', address: '127.0.0.1' }`. + * + * For a server listening on a pipe or Unix domain socket, the name is returned + * as a string. + * + * ```js + * const server = net.createServer((socket) => { + * socket.end('goodbye\n'); + * }).on('error', (err) => { + * // Handle errors here. + * throw err; + * }); + * + * // Grab an arbitrary unused port. + * server.listen(() => { + * console.log('opened server on', server.address()); + * }); + * ``` + * + * `server.address()` returns `null` before the `'listening'` event has been + * emitted or after calling `server.close()`. + * @since v0.1.90 + */ + address(): AddressInfo | string | null; + /** + * Asynchronously get the number of concurrent connections on the server. Works + * when sockets were sent to forks. + * + * Callback should take two arguments `err` and `count`. + * @since v0.9.7 + */ + getConnections(cb: (error: Error | null, count: number) => void): void; + /** + * Opposite of `unref()`, calling `ref()` on a previously `unref`ed server will _not_ let the program exit if it's the only server left (the default behavior). + * If the server is `ref`ed calling `ref()` again will have no effect. + * @since v0.9.1 + */ + ref(): this; + /** + * Calling `unref()` on a server will allow the program to exit if this is the only + * active server in the event system. If the server is already `unref`ed calling`unref()` again will have no effect. + * @since v0.9.1 + */ + unref(): this; + /** + * Set this property to reject connections when the server's connection count gets + * high. + * + * It is not recommended to use this option once a socket has been sent to a child + * with `child_process.fork()`. + * @since v0.2.0 + */ + maxConnections: number; + connections: number; + /** + * Indicates whether or not the server is listening for connections. + * @since v5.7.0 + */ + listening: boolean; + /** + * events.EventEmitter + * 1. close + * 2. connection + * 3. error + * 4. listening + * 5. drop + */ + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "connection", listener: (socket: Socket) => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "listening", listener: () => void): this; + addListener(event: "drop", listener: (data?: DropArgument) => void): this; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close"): boolean; + emit(event: "connection", socket: Socket): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "listening"): boolean; + emit(event: "drop", data?: DropArgument): boolean; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "close", listener: () => void): this; + on(event: "connection", listener: (socket: Socket) => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "listening", listener: () => void): this; + on(event: "drop", listener: (data?: DropArgument) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "connection", listener: (socket: Socket) => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "listening", listener: () => void): this; + once(event: "drop", listener: (data?: DropArgument) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "connection", listener: (socket: Socket) => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "listening", listener: () => void): this; + prependListener(event: "drop", listener: (data?: DropArgument) => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "connection", listener: (socket: Socket) => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "listening", listener: () => void): this; + prependOnceListener(event: "drop", listener: (data?: DropArgument) => void): this; + /** + * Calls {@link Server.close()} and returns a promise that fulfills when the server has closed. + * @since v20.5.0 + */ + [Symbol.asyncDispose](): Promise; + } + type IPVersion = "ipv4" | "ipv6"; + /** + * The `BlockList` object can be used with some network APIs to specify rules for + * disabling inbound or outbound access to specific IP addresses, IP ranges, or + * IP subnets. + * @since v15.0.0, v14.18.0 + */ + class BlockList { + /** + * Adds a rule to block the given IP address. + * @since v15.0.0, v14.18.0 + * @param address An IPv4 or IPv6 address. + * @param [type='ipv4'] Either `'ipv4'` or `'ipv6'`. + */ + addAddress(address: string, type?: IPVersion): void; + addAddress(address: SocketAddress): void; + /** + * Adds a rule to block a range of IP addresses from `start` (inclusive) to`end` (inclusive). + * @since v15.0.0, v14.18.0 + * @param start The starting IPv4 or IPv6 address in the range. + * @param end The ending IPv4 or IPv6 address in the range. + * @param [type='ipv4'] Either `'ipv4'` or `'ipv6'`. + */ + addRange(start: string, end: string, type?: IPVersion): void; + addRange(start: SocketAddress, end: SocketAddress): void; + /** + * Adds a rule to block a range of IP addresses specified as a subnet mask. + * @since v15.0.0, v14.18.0 + * @param net The network IPv4 or IPv6 address. + * @param prefix The number of CIDR prefix bits. For IPv4, this must be a value between `0` and `32`. For IPv6, this must be between `0` and `128`. + * @param [type='ipv4'] Either `'ipv4'` or `'ipv6'`. + */ + addSubnet(net: SocketAddress, prefix: number): void; + addSubnet(net: string, prefix: number, type?: IPVersion): void; + /** + * Returns `true` if the given IP address matches any of the rules added to the`BlockList`. + * + * ```js + * const blockList = new net.BlockList(); + * blockList.addAddress('123.123.123.123'); + * blockList.addRange('10.0.0.1', '10.0.0.10'); + * blockList.addSubnet('8592:757c:efae:4e45::', 64, 'ipv6'); + * + * console.log(blockList.check('123.123.123.123')); // Prints: true + * console.log(blockList.check('10.0.0.3')); // Prints: true + * console.log(blockList.check('222.111.111.222')); // Prints: false + * + * // IPv6 notation for IPv4 addresses works: + * console.log(blockList.check('::ffff:7b7b:7b7b', 'ipv6')); // Prints: true + * console.log(blockList.check('::ffff:123.123.123.123', 'ipv6')); // Prints: true + * ``` + * @since v15.0.0, v14.18.0 + * @param address The IP address to check + * @param [type='ipv4'] Either `'ipv4'` or `'ipv6'`. + */ + check(address: SocketAddress): boolean; + check(address: string, type?: IPVersion): boolean; + } + interface TcpNetConnectOpts extends TcpSocketConnectOpts, SocketConstructorOpts { + timeout?: number | undefined; + } + interface IpcNetConnectOpts extends IpcSocketConnectOpts, SocketConstructorOpts { + timeout?: number | undefined; + } + type NetConnectOpts = TcpNetConnectOpts | IpcNetConnectOpts; + /** + * Creates a new TCP or `IPC` server. + * + * If `allowHalfOpen` is set to `true`, when the other end of the socket + * signals the end of transmission, the server will only send back the end of + * transmission when `socket.end()` is explicitly called. For example, in the + * context of TCP, when a FIN packed is received, a FIN packed is sent + * back only when `socket.end()` is explicitly called. Until then the + * connection is half-closed (non-readable but still writable). See `'end'` event and [RFC 1122](https://tools.ietf.org/html/rfc1122) (section 4.2.2.13) for more information. + * + * If `pauseOnConnect` is set to `true`, then the socket associated with each + * incoming connection will be paused, and no data will be read from its handle. + * This allows connections to be passed between processes without any data being + * read by the original process. To begin reading data from a paused socket, call `socket.resume()`. + * + * The server can be a TCP server or an `IPC` server, depending on what it `listen()` to. + * + * Here is an example of a TCP echo server which listens for connections + * on port 8124: + * + * ```js + * const net = require('node:net'); + * const server = net.createServer((c) => { + * // 'connection' listener. + * console.log('client connected'); + * c.on('end', () => { + * console.log('client disconnected'); + * }); + * c.write('hello\r\n'); + * c.pipe(c); + * }); + * server.on('error', (err) => { + * throw err; + * }); + * server.listen(8124, () => { + * console.log('server bound'); + * }); + * ``` + * + * Test this by using `telnet`: + * + * ```bash + * telnet localhost 8124 + * ``` + * + * To listen on the socket `/tmp/echo.sock`: + * + * ```js + * server.listen('/tmp/echo.sock', () => { + * console.log('server bound'); + * }); + * ``` + * + * Use `nc` to connect to a Unix domain socket server: + * + * ```bash + * nc -U /tmp/echo.sock + * ``` + * @since v0.5.0 + * @param connectionListener Automatically set as a listener for the {@link 'connection'} event. + */ + function createServer(connectionListener?: (socket: Socket) => void): Server; + function createServer(options?: ServerOpts, connectionListener?: (socket: Socket) => void): Server; + /** + * Aliases to {@link createConnection}. + * + * Possible signatures: + * + * * {@link connect} + * * {@link connect} for `IPC` connections. + * * {@link connect} for TCP connections. + */ + function connect(options: NetConnectOpts, connectionListener?: () => void): Socket; + function connect(port: number, host?: string, connectionListener?: () => void): Socket; + function connect(path: string, connectionListener?: () => void): Socket; + /** + * A factory function, which creates a new {@link Socket}, + * immediately initiates connection with `socket.connect()`, + * then returns the `net.Socket` that starts the connection. + * + * When the connection is established, a `'connect'` event will be emitted + * on the returned socket. The last parameter `connectListener`, if supplied, + * will be added as a listener for the `'connect'` event **once**. + * + * Possible signatures: + * + * * {@link createConnection} + * * {@link createConnection} for `IPC` connections. + * * {@link createConnection} for TCP connections. + * + * The {@link connect} function is an alias to this function. + */ + function createConnection(options: NetConnectOpts, connectionListener?: () => void): Socket; + function createConnection(port: number, host?: string, connectionListener?: () => void): Socket; + function createConnection(path: string, connectionListener?: () => void): Socket; + /** + * Gets the current default value of the `autoSelectFamily` option of `socket.connect(options)`. + * The initial default value is `true`, unless the command line option`--no-network-family-autoselection` is provided. + * @since v19.4.0 + */ + function getDefaultAutoSelectFamily(): boolean; + /** + * Sets the default value of the `autoSelectFamily` option of `socket.connect(options)`. + * @since v19.4.0 + */ + function setDefaultAutoSelectFamily(value: boolean): void; + /** + * Gets the current default value of the `autoSelectFamilyAttemptTimeout` option of `socket.connect(options)`. + * The initial default value is `250`. + * @since v19.8.0 + */ + function getDefaultAutoSelectFamilyAttemptTimeout(): number; + /** + * Sets the default value of the `autoSelectFamilyAttemptTimeout` option of `socket.connect(options)`. + * @since v19.8.0 + */ + function setDefaultAutoSelectFamilyAttemptTimeout(value: number): void; + /** + * Returns `6` if `input` is an IPv6 address. Returns `4` if `input` is an IPv4 + * address in [dot-decimal notation](https://en.wikipedia.org/wiki/Dot-decimal_notation) with no leading zeroes. Otherwise, returns`0`. + * + * ```js + * net.isIP('::1'); // returns 6 + * net.isIP('127.0.0.1'); // returns 4 + * net.isIP('127.000.000.001'); // returns 0 + * net.isIP('127.0.0.1/24'); // returns 0 + * net.isIP('fhqwhgads'); // returns 0 + * ``` + * @since v0.3.0 + */ + function isIP(input: string): number; + /** + * Returns `true` if `input` is an IPv4 address in [dot-decimal notation](https://en.wikipedia.org/wiki/Dot-decimal_notation) with no + * leading zeroes. Otherwise, returns `false`. + * + * ```js + * net.isIPv4('127.0.0.1'); // returns true + * net.isIPv4('127.000.000.001'); // returns false + * net.isIPv4('127.0.0.1/24'); // returns false + * net.isIPv4('fhqwhgads'); // returns false + * ``` + * @since v0.3.0 + */ + function isIPv4(input: string): boolean; + /** + * Returns `true` if `input` is an IPv6 address. Otherwise, returns `false`. + * + * ```js + * net.isIPv6('::1'); // returns true + * net.isIPv6('fhqwhgads'); // returns false + * ``` + * @since v0.3.0 + */ + function isIPv6(input: string): boolean; + interface SocketAddressInitOptions { + /** + * The network address as either an IPv4 or IPv6 string. + * @default 127.0.0.1 + */ + address?: string | undefined; + /** + * @default `'ipv4'` + */ + family?: IPVersion | undefined; + /** + * An IPv6 flow-label used only if `family` is `'ipv6'`. + * @default 0 + */ + flowlabel?: number | undefined; + /** + * An IP port. + * @default 0 + */ + port?: number | undefined; + } + /** + * @since v15.14.0, v14.18.0 + */ + class SocketAddress { + constructor(options: SocketAddressInitOptions); + /** + * Either \`'ipv4'\` or \`'ipv6'\`. + * @since v15.14.0, v14.18.0 + */ + readonly address: string; + /** + * Either \`'ipv4'\` or \`'ipv6'\`. + * @since v15.14.0, v14.18.0 + */ + readonly family: IPVersion; + /** + * @since v15.14.0, v14.18.0 + */ + readonly port: number; + /** + * @since v15.14.0, v14.18.0 + */ + readonly flowlabel: number; + } +} +declare module "node:net" { + export * from "net"; +} diff --git a/task/node_modules/@types/node/ts4.8/os.d.ts b/task/node_modules/@types/node/ts4.8/os.d.ts new file mode 100644 index 0000000..39a33f7 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/os.d.ts @@ -0,0 +1,478 @@ +/** + * The `node:os` module provides operating system-related utility methods and + * properties. It can be accessed using: + * + * ```js + * const os = require('node:os'); + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/os.js) + */ +declare module "os" { + interface CpuInfo { + model: string; + speed: number; + times: { + user: number; + nice: number; + sys: number; + idle: number; + irq: number; + }; + } + interface NetworkInterfaceBase { + address: string; + netmask: string; + mac: string; + internal: boolean; + cidr: string | null; + } + interface NetworkInterfaceInfoIPv4 extends NetworkInterfaceBase { + family: "IPv4"; + scopeid?: undefined; + } + interface NetworkInterfaceInfoIPv6 extends NetworkInterfaceBase { + family: "IPv6"; + scopeid: number; + } + interface UserInfo { + username: T; + uid: number; + gid: number; + shell: T | null; + homedir: T; + } + type NetworkInterfaceInfo = NetworkInterfaceInfoIPv4 | NetworkInterfaceInfoIPv6; + /** + * Returns the host name of the operating system as a string. + * @since v0.3.3 + */ + function hostname(): string; + /** + * Returns an array containing the 1, 5, and 15 minute load averages. + * + * The load average is a measure of system activity calculated by the operating + * system and expressed as a fractional number. + * + * The load average is a Unix-specific concept. On Windows, the return value is + * always `[0, 0, 0]`. + * @since v0.3.3 + */ + function loadavg(): number[]; + /** + * Returns the system uptime in number of seconds. + * @since v0.3.3 + */ + function uptime(): number; + /** + * Returns the amount of free system memory in bytes as an integer. + * @since v0.3.3 + */ + function freemem(): number; + /** + * Returns the total amount of system memory in bytes as an integer. + * @since v0.3.3 + */ + function totalmem(): number; + /** + * Returns an array of objects containing information about each logical CPU core. + * The array will be empty if no CPU information is available, such as if the`/proc` file system is unavailable. + * + * The properties included on each object include: + * + * ```js + * [ + * { + * model: 'Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz', + * speed: 2926, + * times: { + * user: 252020, + * nice: 0, + * sys: 30340, + * idle: 1070356870, + * irq: 0, + * }, + * }, + * { + * model: 'Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz', + * speed: 2926, + * times: { + * user: 306960, + * nice: 0, + * sys: 26980, + * idle: 1071569080, + * irq: 0, + * }, + * }, + * { + * model: 'Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz', + * speed: 2926, + * times: { + * user: 248450, + * nice: 0, + * sys: 21750, + * idle: 1070919370, + * irq: 0, + * }, + * }, + * { + * model: 'Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz', + * speed: 2926, + * times: { + * user: 256880, + * nice: 0, + * sys: 19430, + * idle: 1070905480, + * irq: 20, + * }, + * }, + * ] + * ``` + * + * `nice` values are POSIX-only. On Windows, the `nice` values of all processors + * are always 0. + * + * `os.cpus().length` should not be used to calculate the amount of parallelism + * available to an application. Use {@link availableParallelism} for this purpose. + * @since v0.3.3 + */ + function cpus(): CpuInfo[]; + /** + * Returns an estimate of the default amount of parallelism a program should use. + * Always returns a value greater than zero. + * + * This function is a small wrapper about libuv's [`uv_available_parallelism()`](https://docs.libuv.org/en/v1.x/misc.html#c.uv_available_parallelism). + * @since v19.4.0, v18.14.0 + */ + function availableParallelism(): number; + /** + * Returns the operating system name as returned by [`uname(3)`](https://linux.die.net/man/3/uname). For example, it + * returns `'Linux'` on Linux, `'Darwin'` on macOS, and `'Windows_NT'` on Windows. + * + * See [https://en.wikipedia.org/wiki/Uname#Examples](https://en.wikipedia.org/wiki/Uname#Examples) for additional information + * about the output of running [`uname(3)`](https://linux.die.net/man/3/uname) on various operating systems. + * @since v0.3.3 + */ + function type(): string; + /** + * Returns the operating system as a string. + * + * On POSIX systems, the operating system release is determined by calling [`uname(3)`](https://linux.die.net/man/3/uname). On Windows, `GetVersionExW()` is used. See + * [https://en.wikipedia.org/wiki/Uname#Examples](https://en.wikipedia.org/wiki/Uname#Examples) for more information. + * @since v0.3.3 + */ + function release(): string; + /** + * Returns an object containing network interfaces that have been assigned a + * network address. + * + * Each key on the returned object identifies a network interface. The associated + * value is an array of objects that each describe an assigned network address. + * + * The properties available on the assigned network address object include: + * + * ```js + * { + * lo: [ + * { + * address: '127.0.0.1', + * netmask: '255.0.0.0', + * family: 'IPv4', + * mac: '00:00:00:00:00:00', + * internal: true, + * cidr: '127.0.0.1/8' + * }, + * { + * address: '::1', + * netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', + * family: 'IPv6', + * mac: '00:00:00:00:00:00', + * scopeid: 0, + * internal: true, + * cidr: '::1/128' + * } + * ], + * eth0: [ + * { + * address: '192.168.1.108', + * netmask: '255.255.255.0', + * family: 'IPv4', + * mac: '01:02:03:0a:0b:0c', + * internal: false, + * cidr: '192.168.1.108/24' + * }, + * { + * address: 'fe80::a00:27ff:fe4e:66a1', + * netmask: 'ffff:ffff:ffff:ffff::', + * family: 'IPv6', + * mac: '01:02:03:0a:0b:0c', + * scopeid: 1, + * internal: false, + * cidr: 'fe80::a00:27ff:fe4e:66a1/64' + * } + * ] + * } + * ``` + * @since v0.6.0 + */ + function networkInterfaces(): NodeJS.Dict; + /** + * Returns the string path of the current user's home directory. + * + * On POSIX, it uses the `$HOME` environment variable if defined. Otherwise it + * uses the [effective UID](https://en.wikipedia.org/wiki/User_identifier#Effective_user_ID) to look up the user's home directory. + * + * On Windows, it uses the `USERPROFILE` environment variable if defined. + * Otherwise it uses the path to the profile directory of the current user. + * @since v2.3.0 + */ + function homedir(): string; + /** + * Returns information about the currently effective user. On POSIX platforms, + * this is typically a subset of the password file. The returned object includes + * the `username`, `uid`, `gid`, `shell`, and `homedir`. On Windows, the `uid` and`gid` fields are `-1`, and `shell` is `null`. + * + * The value of `homedir` returned by `os.userInfo()` is provided by the operating + * system. This differs from the result of `os.homedir()`, which queries + * environment variables for the home directory before falling back to the + * operating system response. + * + * Throws a `SystemError` if a user has no `username` or `homedir`. + * @since v6.0.0 + */ + function userInfo(options: { encoding: "buffer" }): UserInfo; + function userInfo(options?: { encoding: BufferEncoding }): UserInfo; + type SignalConstants = { + [key in NodeJS.Signals]: number; + }; + namespace constants { + const UV_UDP_REUSEADDR: number; + namespace signals {} + const signals: SignalConstants; + namespace errno { + const E2BIG: number; + const EACCES: number; + const EADDRINUSE: number; + const EADDRNOTAVAIL: number; + const EAFNOSUPPORT: number; + const EAGAIN: number; + const EALREADY: number; + const EBADF: number; + const EBADMSG: number; + const EBUSY: number; + const ECANCELED: number; + const ECHILD: number; + const ECONNABORTED: number; + const ECONNREFUSED: number; + const ECONNRESET: number; + const EDEADLK: number; + const EDESTADDRREQ: number; + const EDOM: number; + const EDQUOT: number; + const EEXIST: number; + const EFAULT: number; + const EFBIG: number; + const EHOSTUNREACH: number; + const EIDRM: number; + const EILSEQ: number; + const EINPROGRESS: number; + const EINTR: number; + const EINVAL: number; + const EIO: number; + const EISCONN: number; + const EISDIR: number; + const ELOOP: number; + const EMFILE: number; + const EMLINK: number; + const EMSGSIZE: number; + const EMULTIHOP: number; + const ENAMETOOLONG: number; + const ENETDOWN: number; + const ENETRESET: number; + const ENETUNREACH: number; + const ENFILE: number; + const ENOBUFS: number; + const ENODATA: number; + const ENODEV: number; + const ENOENT: number; + const ENOEXEC: number; + const ENOLCK: number; + const ENOLINK: number; + const ENOMEM: number; + const ENOMSG: number; + const ENOPROTOOPT: number; + const ENOSPC: number; + const ENOSR: number; + const ENOSTR: number; + const ENOSYS: number; + const ENOTCONN: number; + const ENOTDIR: number; + const ENOTEMPTY: number; + const ENOTSOCK: number; + const ENOTSUP: number; + const ENOTTY: number; + const ENXIO: number; + const EOPNOTSUPP: number; + const EOVERFLOW: number; + const EPERM: number; + const EPIPE: number; + const EPROTO: number; + const EPROTONOSUPPORT: number; + const EPROTOTYPE: number; + const ERANGE: number; + const EROFS: number; + const ESPIPE: number; + const ESRCH: number; + const ESTALE: number; + const ETIME: number; + const ETIMEDOUT: number; + const ETXTBSY: number; + const EWOULDBLOCK: number; + const EXDEV: number; + const WSAEINTR: number; + const WSAEBADF: number; + const WSAEACCES: number; + const WSAEFAULT: number; + const WSAEINVAL: number; + const WSAEMFILE: number; + const WSAEWOULDBLOCK: number; + const WSAEINPROGRESS: number; + const WSAEALREADY: number; + const WSAENOTSOCK: number; + const WSAEDESTADDRREQ: number; + const WSAEMSGSIZE: number; + const WSAEPROTOTYPE: number; + const WSAENOPROTOOPT: number; + const WSAEPROTONOSUPPORT: number; + const WSAESOCKTNOSUPPORT: number; + const WSAEOPNOTSUPP: number; + const WSAEPFNOSUPPORT: number; + const WSAEAFNOSUPPORT: number; + const WSAEADDRINUSE: number; + const WSAEADDRNOTAVAIL: number; + const WSAENETDOWN: number; + const WSAENETUNREACH: number; + const WSAENETRESET: number; + const WSAECONNABORTED: number; + const WSAECONNRESET: number; + const WSAENOBUFS: number; + const WSAEISCONN: number; + const WSAENOTCONN: number; + const WSAESHUTDOWN: number; + const WSAETOOMANYREFS: number; + const WSAETIMEDOUT: number; + const WSAECONNREFUSED: number; + const WSAELOOP: number; + const WSAENAMETOOLONG: number; + const WSAEHOSTDOWN: number; + const WSAEHOSTUNREACH: number; + const WSAENOTEMPTY: number; + const WSAEPROCLIM: number; + const WSAEUSERS: number; + const WSAEDQUOT: number; + const WSAESTALE: number; + const WSAEREMOTE: number; + const WSASYSNOTREADY: number; + const WSAVERNOTSUPPORTED: number; + const WSANOTINITIALISED: number; + const WSAEDISCON: number; + const WSAENOMORE: number; + const WSAECANCELLED: number; + const WSAEINVALIDPROCTABLE: number; + const WSAEINVALIDPROVIDER: number; + const WSAEPROVIDERFAILEDINIT: number; + const WSASYSCALLFAILURE: number; + const WSASERVICE_NOT_FOUND: number; + const WSATYPE_NOT_FOUND: number; + const WSA_E_NO_MORE: number; + const WSA_E_CANCELLED: number; + const WSAEREFUSED: number; + } + namespace priority { + const PRIORITY_LOW: number; + const PRIORITY_BELOW_NORMAL: number; + const PRIORITY_NORMAL: number; + const PRIORITY_ABOVE_NORMAL: number; + const PRIORITY_HIGH: number; + const PRIORITY_HIGHEST: number; + } + } + const devNull: string; + const EOL: string; + /** + * Returns the operating system CPU architecture for which the Node.js binary was + * compiled. Possible values are `'arm'`, `'arm64'`, `'ia32'`, `'loong64'`,`'mips'`, `'mipsel'`, `'ppc'`, `'ppc64'`, `'riscv64'`, `'s390'`, `'s390x'`, + * and `'x64'`. + * + * The return value is equivalent to `process.arch`. + * @since v0.5.0 + */ + function arch(): string; + /** + * Returns a string identifying the kernel version. + * + * On POSIX systems, the operating system release is determined by calling [`uname(3)`](https://linux.die.net/man/3/uname). On Windows, `RtlGetVersion()` is used, and if it is not + * available, `GetVersionExW()` will be used. See [https://en.wikipedia.org/wiki/Uname#Examples](https://en.wikipedia.org/wiki/Uname#Examples) for more information. + * @since v13.11.0, v12.17.0 + */ + function version(): string; + /** + * Returns a string identifying the operating system platform for which + * the Node.js binary was compiled. The value is set at compile time. + * Possible values are `'aix'`, `'darwin'`, `'freebsd'`,`'linux'`,`'openbsd'`, `'sunos'`, and `'win32'`. + * + * The return value is equivalent to `process.platform`. + * + * The value `'android'` may also be returned if Node.js is built on the Android + * operating system. [Android support is experimental](https://github.com/nodejs/node/blob/HEAD/BUILDING.md#androidandroid-based-devices-eg-firefox-os). + * @since v0.5.0 + */ + function platform(): NodeJS.Platform; + /** + * Returns the machine type as a string, such as `arm`, `arm64`, `aarch64`,`mips`, `mips64`, `ppc64`, `ppc64le`, `s390`, `s390x`, `i386`, `i686`, `x86_64`. + * + * On POSIX systems, the machine type is determined by calling [`uname(3)`](https://linux.die.net/man/3/uname). On Windows, `RtlGetVersion()` is used, and if it is not + * available, `GetVersionExW()` will be used. See [https://en.wikipedia.org/wiki/Uname#Examples](https://en.wikipedia.org/wiki/Uname#Examples) for more information. + * @since v18.9.0, v16.18.0 + */ + function machine(): string; + /** + * Returns the operating system's default directory for temporary files as a + * string. + * @since v0.9.9 + */ + function tmpdir(): string; + /** + * Returns a string identifying the endianness of the CPU for which the Node.js + * binary was compiled. + * + * Possible values are `'BE'` for big endian and `'LE'` for little endian. + * @since v0.9.4 + */ + function endianness(): "BE" | "LE"; + /** + * Returns the scheduling priority for the process specified by `pid`. If `pid` is + * not provided or is `0`, the priority of the current process is returned. + * @since v10.10.0 + * @param [pid=0] The process ID to retrieve scheduling priority for. + */ + function getPriority(pid?: number): number; + /** + * Attempts to set the scheduling priority for the process specified by `pid`. If`pid` is not provided or is `0`, the process ID of the current process is used. + * + * The `priority` input must be an integer between `-20` (high priority) and `19`(low priority). Due to differences between Unix priority levels and Windows + * priority classes, `priority` is mapped to one of six priority constants in`os.constants.priority`. When retrieving a process priority level, this range + * mapping may cause the return value to be slightly different on Windows. To avoid + * confusion, set `priority` to one of the priority constants. + * + * On Windows, setting priority to `PRIORITY_HIGHEST` requires elevated user + * privileges. Otherwise the set priority will be silently reduced to`PRIORITY_HIGH`. + * @since v10.10.0 + * @param [pid=0] The process ID to set scheduling priority for. + * @param priority The scheduling priority to assign to the process. + */ + function setPriority(priority: number): void; + function setPriority(pid: number, priority: number): void; +} +declare module "node:os" { + export * from "os"; +} diff --git a/task/node_modules/@types/node/ts4.8/path.d.ts b/task/node_modules/@types/node/ts4.8/path.d.ts new file mode 100644 index 0000000..6f07681 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/path.d.ts @@ -0,0 +1,191 @@ +declare module "path/posix" { + import path = require("path"); + export = path; +} +declare module "path/win32" { + import path = require("path"); + export = path; +} +/** + * The `node:path` module provides utilities for working with file and directory + * paths. It can be accessed using: + * + * ```js + * const path = require('node:path'); + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/path.js) + */ +declare module "path" { + namespace path { + /** + * A parsed path object generated by path.parse() or consumed by path.format(). + */ + interface ParsedPath { + /** + * The root of the path such as '/' or 'c:\' + */ + root: string; + /** + * The full directory path such as '/home/user/dir' or 'c:\path\dir' + */ + dir: string; + /** + * The file name including extension (if any) such as 'index.html' + */ + base: string; + /** + * The file extension (if any) such as '.html' + */ + ext: string; + /** + * The file name without extension (if any) such as 'index' + */ + name: string; + } + interface FormatInputPathObject { + /** + * The root of the path such as '/' or 'c:\' + */ + root?: string | undefined; + /** + * The full directory path such as '/home/user/dir' or 'c:\path\dir' + */ + dir?: string | undefined; + /** + * The file name including extension (if any) such as 'index.html' + */ + base?: string | undefined; + /** + * The file extension (if any) such as '.html' + */ + ext?: string | undefined; + /** + * The file name without extension (if any) such as 'index' + */ + name?: string | undefined; + } + interface PlatformPath { + /** + * Normalize a string path, reducing '..' and '.' parts. + * When multiple slashes are found, they're replaced by a single one; when the path contains a trailing slash, it is preserved. On Windows backslashes are used. + * + * @param path string path to normalize. + * @throws {TypeError} if `path` is not a string. + */ + normalize(path: string): string; + /** + * Join all arguments together and normalize the resulting path. + * + * @param paths paths to join. + * @throws {TypeError} if any of the path segments is not a string. + */ + join(...paths: string[]): string; + /** + * The right-most parameter is considered {to}. Other parameters are considered an array of {from}. + * + * Starting from leftmost {from} parameter, resolves {to} to an absolute path. + * + * If {to} isn't already absolute, {from} arguments are prepended in right to left order, + * until an absolute path is found. If after using all {from} paths still no absolute path is found, + * the current working directory is used as well. The resulting path is normalized, + * and trailing slashes are removed unless the path gets resolved to the root directory. + * + * @param paths A sequence of paths or path segments. + * @throws {TypeError} if any of the arguments is not a string. + */ + resolve(...paths: string[]): string; + /** + * Determines whether {path} is an absolute path. An absolute path will always resolve to the same location, regardless of the working directory. + * + * If the given {path} is a zero-length string, `false` will be returned. + * + * @param path path to test. + * @throws {TypeError} if `path` is not a string. + */ + isAbsolute(path: string): boolean; + /** + * Solve the relative path from {from} to {to} based on the current working directory. + * At times we have two absolute paths, and we need to derive the relative path from one to the other. This is actually the reverse transform of path.resolve. + * + * @throws {TypeError} if either `from` or `to` is not a string. + */ + relative(from: string, to: string): string; + /** + * Return the directory name of a path. Similar to the Unix dirname command. + * + * @param path the path to evaluate. + * @throws {TypeError} if `path` is not a string. + */ + dirname(path: string): string; + /** + * Return the last portion of a path. Similar to the Unix basename command. + * Often used to extract the file name from a fully qualified path. + * + * @param path the path to evaluate. + * @param suffix optionally, an extension to remove from the result. + * @throws {TypeError} if `path` is not a string or if `ext` is given and is not a string. + */ + basename(path: string, suffix?: string): string; + /** + * Return the extension of the path, from the last '.' to end of string in the last portion of the path. + * If there is no '.' in the last portion of the path or the first character of it is '.', then it returns an empty string. + * + * @param path the path to evaluate. + * @throws {TypeError} if `path` is not a string. + */ + extname(path: string): string; + /** + * The platform-specific file separator. '\\' or '/'. + */ + readonly sep: "\\" | "/"; + /** + * The platform-specific file delimiter. ';' or ':'. + */ + readonly delimiter: ";" | ":"; + /** + * Returns an object from a path string - the opposite of format(). + * + * @param path path to evaluate. + * @throws {TypeError} if `path` is not a string. + */ + parse(path: string): ParsedPath; + /** + * Returns a path string from an object - the opposite of parse(). + * + * @param pathObject path to evaluate. + */ + format(pathObject: FormatInputPathObject): string; + /** + * On Windows systems only, returns an equivalent namespace-prefixed path for the given path. + * If path is not a string, path will be returned without modifications. + * This method is meaningful only on Windows system. + * On POSIX systems, the method is non-operational and always returns path without modifications. + */ + toNamespacedPath(path: string): string; + /** + * Posix specific pathing. + * Same as parent object on posix. + */ + readonly posix: PlatformPath; + /** + * Windows specific pathing. + * Same as parent object on windows + */ + readonly win32: PlatformPath; + } + } + const path: path.PlatformPath; + export = path; +} +declare module "node:path" { + import path = require("path"); + export = path; +} +declare module "node:path/posix" { + import path = require("path/posix"); + export = path; +} +declare module "node:path/win32" { + import path = require("path/win32"); + export = path; +} diff --git a/task/node_modules/@types/node/ts4.8/perf_hooks.d.ts b/task/node_modules/@types/node/ts4.8/perf_hooks.d.ts new file mode 100644 index 0000000..0e16e58 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/perf_hooks.d.ts @@ -0,0 +1,639 @@ +/** + * This module provides an implementation of a subset of the W3C [Web Performance APIs](https://w3c.github.io/perf-timing-primer/) as well as additional APIs for + * Node.js-specific performance measurements. + * + * Node.js supports the following [Web Performance APIs](https://w3c.github.io/perf-timing-primer/): + * + * * [High Resolution Time](https://www.w3.org/TR/hr-time-2) + * * [Performance Timeline](https://w3c.github.io/performance-timeline/) + * * [User Timing](https://www.w3.org/TR/user-timing/) + * * [Resource Timing](https://www.w3.org/TR/resource-timing-2/) + * + * ```js + * const { PerformanceObserver, performance } = require('node:perf_hooks'); + * + * const obs = new PerformanceObserver((items) => { + * console.log(items.getEntries()[0].duration); + * performance.clearMarks(); + * }); + * obs.observe({ type: 'measure' }); + * performance.measure('Start to Now'); + * + * performance.mark('A'); + * doSomeLongRunningProcess(() => { + * performance.measure('A to Now', 'A'); + * + * performance.mark('B'); + * performance.measure('A to B', 'A', 'B'); + * }); + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/perf_hooks.js) + */ +declare module "perf_hooks" { + import { AsyncResource } from "node:async_hooks"; + type EntryType = "node" | "mark" | "measure" | "gc" | "function" | "http2" | "http"; + interface NodeGCPerformanceDetail { + /** + * When `performanceEntry.entryType` is equal to 'gc', `the performance.kind` property identifies + * the type of garbage collection operation that occurred. + * See perf_hooks.constants for valid values. + */ + readonly kind?: number | undefined; + /** + * When `performanceEntry.entryType` is equal to 'gc', the `performance.flags` + * property contains additional information about garbage collection operation. + * See perf_hooks.constants for valid values. + */ + readonly flags?: number | undefined; + } + /** + * The constructor of this class is not exposed to users directly. + * @since v8.5.0 + */ + class PerformanceEntry { + protected constructor(); + /** + * The total number of milliseconds elapsed for this entry. This value will not + * be meaningful for all Performance Entry types. + * @since v8.5.0 + */ + readonly duration: number; + /** + * The name of the performance entry. + * @since v8.5.0 + */ + readonly name: string; + /** + * The high resolution millisecond timestamp marking the starting time of the + * Performance Entry. + * @since v8.5.0 + */ + readonly startTime: number; + /** + * The type of the performance entry. It may be one of: + * + * * `'node'` (Node.js only) + * * `'mark'` (available on the Web) + * * `'measure'` (available on the Web) + * * `'gc'` (Node.js only) + * * `'function'` (Node.js only) + * * `'http2'` (Node.js only) + * * `'http'` (Node.js only) + * @since v8.5.0 + */ + readonly entryType: EntryType; + /** + * Additional detail specific to the `entryType`. + * @since v16.0.0 + */ + readonly detail?: NodeGCPerformanceDetail | unknown | undefined; // TODO: Narrow this based on entry type. + toJSON(): any; + } + /** + * Exposes marks created via the `Performance.mark()` method. + * @since v18.2.0, v16.17.0 + */ + class PerformanceMark extends PerformanceEntry { + readonly duration: 0; + readonly entryType: "mark"; + } + /** + * Exposes measures created via the `Performance.measure()` method. + * + * The constructor of this class is not exposed to users directly. + * @since v18.2.0, v16.17.0 + */ + class PerformanceMeasure extends PerformanceEntry { + readonly entryType: "measure"; + } + /** + * _This property is an extension by Node.js. It is not available in Web browsers._ + * + * Provides timing details for Node.js itself. The constructor of this class + * is not exposed to users. + * @since v8.5.0 + */ + class PerformanceNodeTiming extends PerformanceEntry { + /** + * The high resolution millisecond timestamp at which the Node.js process + * completed bootstrapping. If bootstrapping has not yet finished, the property + * has the value of -1. + * @since v8.5.0 + */ + readonly bootstrapComplete: number; + /** + * The high resolution millisecond timestamp at which the Node.js environment was + * initialized. + * @since v8.5.0 + */ + readonly environment: number; + /** + * The high resolution millisecond timestamp of the amount of time the event loop + * has been idle within the event loop's event provider (e.g. `epoll_wait`). This + * does not take CPU usage into consideration. If the event loop has not yet + * started (e.g., in the first tick of the main script), the property has the + * value of 0. + * @since v14.10.0, v12.19.0 + */ + readonly idleTime: number; + /** + * The high resolution millisecond timestamp at which the Node.js event loop + * exited. If the event loop has not yet exited, the property has the value of -1\. + * It can only have a value of not -1 in a handler of the `'exit'` event. + * @since v8.5.0 + */ + readonly loopExit: number; + /** + * The high resolution millisecond timestamp at which the Node.js event loop + * started. If the event loop has not yet started (e.g., in the first tick of the + * main script), the property has the value of -1. + * @since v8.5.0 + */ + readonly loopStart: number; + /** + * The high resolution millisecond timestamp at which the V8 platform was + * initialized. + * @since v8.5.0 + */ + readonly v8Start: number; + } + interface EventLoopUtilization { + idle: number; + active: number; + utilization: number; + } + /** + * @param util1 The result of a previous call to eventLoopUtilization() + * @param util2 The result of a previous call to eventLoopUtilization() prior to util1 + */ + type EventLoopUtilityFunction = ( + util1?: EventLoopUtilization, + util2?: EventLoopUtilization, + ) => EventLoopUtilization; + interface MarkOptions { + /** + * Additional optional detail to include with the mark. + */ + detail?: unknown | undefined; + /** + * An optional timestamp to be used as the mark time. + * @default `performance.now()`. + */ + startTime?: number | undefined; + } + interface MeasureOptions { + /** + * Additional optional detail to include with the mark. + */ + detail?: unknown | undefined; + /** + * Duration between start and end times. + */ + duration?: number | undefined; + /** + * Timestamp to be used as the end time, or a string identifying a previously recorded mark. + */ + end?: number | string | undefined; + /** + * Timestamp to be used as the start time, or a string identifying a previously recorded mark. + */ + start?: number | string | undefined; + } + interface TimerifyOptions { + /** + * A histogram object created using + * `perf_hooks.createHistogram()` that will record runtime durations in + * nanoseconds. + */ + histogram?: RecordableHistogram | undefined; + } + interface Performance { + /** + * If name is not provided, removes all PerformanceMark objects from the Performance Timeline. + * If name is provided, removes only the named mark. + * @param name + */ + clearMarks(name?: string): void; + /** + * If name is not provided, removes all PerformanceMeasure objects from the Performance Timeline. + * If name is provided, removes only the named measure. + * @param name + * @since v16.7.0 + */ + clearMeasures(name?: string): void; + /** + * Returns a list of `PerformanceEntry` objects in chronological order with respect to `performanceEntry.startTime`. + * If you are only interested in performance entries of certain types or that have certain names, see + * `performance.getEntriesByType()` and `performance.getEntriesByName()`. + * @since v16.7.0 + */ + getEntries(): PerformanceEntry[]; + /** + * Returns a list of `PerformanceEntry` objects in chronological order with respect to `performanceEntry.startTime` + * whose `performanceEntry.name` is equal to `name`, and optionally, whose `performanceEntry.entryType` is equal to `type`. + * @param name + * @param type + * @since v16.7.0 + */ + getEntriesByName(name: string, type?: EntryType): PerformanceEntry[]; + /** + * Returns a list of `PerformanceEntry` objects in chronological order with respect to `performanceEntry.startTime` + * whose `performanceEntry.entryType` is equal to `type`. + * @param type + * @since v16.7.0 + */ + getEntriesByType(type: EntryType): PerformanceEntry[]; + /** + * Creates a new PerformanceMark entry in the Performance Timeline. + * A PerformanceMark is a subclass of PerformanceEntry whose performanceEntry.entryType is always 'mark', + * and whose performanceEntry.duration is always 0. + * Performance marks are used to mark specific significant moments in the Performance Timeline. + * @param name + * @return The PerformanceMark entry that was created + */ + mark(name?: string, options?: MarkOptions): PerformanceMark; + /** + * Creates a new PerformanceMeasure entry in the Performance Timeline. + * A PerformanceMeasure is a subclass of PerformanceEntry whose performanceEntry.entryType is always 'measure', + * and whose performanceEntry.duration measures the number of milliseconds elapsed since startMark and endMark. + * + * The startMark argument may identify any existing PerformanceMark in the the Performance Timeline, or may identify + * any of the timestamp properties provided by the PerformanceNodeTiming class. If the named startMark does not exist, + * then startMark is set to timeOrigin by default. + * + * The endMark argument must identify any existing PerformanceMark in the the Performance Timeline or any of the timestamp + * properties provided by the PerformanceNodeTiming class. If the named endMark does not exist, an error will be thrown. + * @param name + * @param startMark + * @param endMark + * @return The PerformanceMeasure entry that was created + */ + measure(name: string, startMark?: string, endMark?: string): PerformanceMeasure; + measure(name: string, options: MeasureOptions): PerformanceMeasure; + /** + * An instance of the PerformanceNodeTiming class that provides performance metrics for specific Node.js operational milestones. + */ + readonly nodeTiming: PerformanceNodeTiming; + /** + * @return the current high resolution millisecond timestamp + */ + now(): number; + /** + * The timeOrigin specifies the high resolution millisecond timestamp from which all performance metric durations are measured. + */ + readonly timeOrigin: number; + /** + * Wraps a function within a new function that measures the running time of the wrapped function. + * A PerformanceObserver must be subscribed to the 'function' event type in order for the timing details to be accessed. + * @param fn + */ + timerify any>(fn: T, options?: TimerifyOptions): T; + /** + * eventLoopUtilization is similar to CPU utilization except that it is calculated using high precision wall-clock time. + * It represents the percentage of time the event loop has spent outside the event loop's event provider (e.g. epoll_wait). + * No other CPU idle time is taken into consideration. + */ + eventLoopUtilization: EventLoopUtilityFunction; + } + interface PerformanceObserverEntryList { + /** + * Returns a list of `PerformanceEntry` objects in chronological order + * with respect to `performanceEntry.startTime`. + * + * ```js + * const { + * performance, + * PerformanceObserver, + * } = require('node:perf_hooks'); + * + * const obs = new PerformanceObserver((perfObserverList, observer) => { + * console.log(perfObserverList.getEntries()); + * + * * [ + * * PerformanceEntry { + * * name: 'test', + * * entryType: 'mark', + * * startTime: 81.465639, + * * duration: 0 + * * }, + * * PerformanceEntry { + * * name: 'meow', + * * entryType: 'mark', + * * startTime: 81.860064, + * * duration: 0 + * * } + * * ] + * + * performance.clearMarks(); + * performance.clearMeasures(); + * observer.disconnect(); + * }); + * obs.observe({ type: 'mark' }); + * + * performance.mark('test'); + * performance.mark('meow'); + * ``` + * @since v8.5.0 + */ + getEntries(): PerformanceEntry[]; + /** + * Returns a list of `PerformanceEntry` objects in chronological order + * with respect to `performanceEntry.startTime` whose `performanceEntry.name` is + * equal to `name`, and optionally, whose `performanceEntry.entryType` is equal to`type`. + * + * ```js + * const { + * performance, + * PerformanceObserver, + * } = require('node:perf_hooks'); + * + * const obs = new PerformanceObserver((perfObserverList, observer) => { + * console.log(perfObserverList.getEntriesByName('meow')); + * + * * [ + * * PerformanceEntry { + * * name: 'meow', + * * entryType: 'mark', + * * startTime: 98.545991, + * * duration: 0 + * * } + * * ] + * + * console.log(perfObserverList.getEntriesByName('nope')); // [] + * + * console.log(perfObserverList.getEntriesByName('test', 'mark')); + * + * * [ + * * PerformanceEntry { + * * name: 'test', + * * entryType: 'mark', + * * startTime: 63.518931, + * * duration: 0 + * * } + * * ] + * + * console.log(perfObserverList.getEntriesByName('test', 'measure')); // [] + * + * performance.clearMarks(); + * performance.clearMeasures(); + * observer.disconnect(); + * }); + * obs.observe({ entryTypes: ['mark', 'measure'] }); + * + * performance.mark('test'); + * performance.mark('meow'); + * ``` + * @since v8.5.0 + */ + getEntriesByName(name: string, type?: EntryType): PerformanceEntry[]; + /** + * Returns a list of `PerformanceEntry` objects in chronological order + * with respect to `performanceEntry.startTime` whose `performanceEntry.entryType`is equal to `type`. + * + * ```js + * const { + * performance, + * PerformanceObserver, + * } = require('node:perf_hooks'); + * + * const obs = new PerformanceObserver((perfObserverList, observer) => { + * console.log(perfObserverList.getEntriesByType('mark')); + * + * * [ + * * PerformanceEntry { + * * name: 'test', + * * entryType: 'mark', + * * startTime: 55.897834, + * * duration: 0 + * * }, + * * PerformanceEntry { + * * name: 'meow', + * * entryType: 'mark', + * * startTime: 56.350146, + * * duration: 0 + * * } + * * ] + * + * performance.clearMarks(); + * performance.clearMeasures(); + * observer.disconnect(); + * }); + * obs.observe({ type: 'mark' }); + * + * performance.mark('test'); + * performance.mark('meow'); + * ``` + * @since v8.5.0 + */ + getEntriesByType(type: EntryType): PerformanceEntry[]; + } + type PerformanceObserverCallback = (list: PerformanceObserverEntryList, observer: PerformanceObserver) => void; + /** + * @since v8.5.0 + */ + class PerformanceObserver extends AsyncResource { + constructor(callback: PerformanceObserverCallback); + /** + * Disconnects the `PerformanceObserver` instance from all notifications. + * @since v8.5.0 + */ + disconnect(): void; + /** + * Subscribes the `PerformanceObserver` instance to notifications of new `PerformanceEntry` instances identified either by `options.entryTypes`or `options.type`: + * + * ```js + * const { + * performance, + * PerformanceObserver, + * } = require('node:perf_hooks'); + * + * const obs = new PerformanceObserver((list, observer) => { + * // Called once asynchronously. `list` contains three items. + * }); + * obs.observe({ type: 'mark' }); + * + * for (let n = 0; n < 3; n++) + * performance.mark(`test${n}`); + * ``` + * @since v8.5.0 + */ + observe( + options: + | { + entryTypes: readonly EntryType[]; + buffered?: boolean | undefined; + } + | { + type: EntryType; + buffered?: boolean | undefined; + }, + ): void; + } + namespace constants { + const NODE_PERFORMANCE_GC_MAJOR: number; + const NODE_PERFORMANCE_GC_MINOR: number; + const NODE_PERFORMANCE_GC_INCREMENTAL: number; + const NODE_PERFORMANCE_GC_WEAKCB: number; + const NODE_PERFORMANCE_GC_FLAGS_NO: number; + const NODE_PERFORMANCE_GC_FLAGS_CONSTRUCT_RETAINED: number; + const NODE_PERFORMANCE_GC_FLAGS_FORCED: number; + const NODE_PERFORMANCE_GC_FLAGS_SYNCHRONOUS_PHANTOM_PROCESSING: number; + const NODE_PERFORMANCE_GC_FLAGS_ALL_AVAILABLE_GARBAGE: number; + const NODE_PERFORMANCE_GC_FLAGS_ALL_EXTERNAL_MEMORY: number; + const NODE_PERFORMANCE_GC_FLAGS_SCHEDULE_IDLE: number; + } + const performance: Performance; + interface EventLoopMonitorOptions { + /** + * The sampling rate in milliseconds. + * Must be greater than zero. + * @default 10 + */ + resolution?: number | undefined; + } + interface Histogram { + /** + * Returns a `Map` object detailing the accumulated percentile distribution. + * @since v11.10.0 + */ + readonly percentiles: Map; + /** + * The number of times the event loop delay exceeded the maximum 1 hour event + * loop delay threshold. + * @since v11.10.0 + */ + readonly exceeds: number; + /** + * The minimum recorded event loop delay. + * @since v11.10.0 + */ + readonly min: number; + /** + * The maximum recorded event loop delay. + * @since v11.10.0 + */ + readonly max: number; + /** + * The mean of the recorded event loop delays. + * @since v11.10.0 + */ + readonly mean: number; + /** + * The standard deviation of the recorded event loop delays. + * @since v11.10.0 + */ + readonly stddev: number; + /** + * Resets the collected histogram data. + * @since v11.10.0 + */ + reset(): void; + /** + * Returns the value at the given percentile. + * @since v11.10.0 + * @param percentile A percentile value in the range (0, 100]. + */ + percentile(percentile: number): number; + } + interface IntervalHistogram extends Histogram { + /** + * Enables the update interval timer. Returns `true` if the timer was + * started, `false` if it was already started. + * @since v11.10.0 + */ + enable(): boolean; + /** + * Disables the update interval timer. Returns `true` if the timer was + * stopped, `false` if it was already stopped. + * @since v11.10.0 + */ + disable(): boolean; + } + interface RecordableHistogram extends Histogram { + /** + * @since v15.9.0, v14.18.0 + * @param val The amount to record in the histogram. + */ + record(val: number | bigint): void; + /** + * Calculates the amount of time (in nanoseconds) that has passed since the + * previous call to `recordDelta()` and records that amount in the histogram. + * + * ## Examples + * @since v15.9.0, v14.18.0 + */ + recordDelta(): void; + /** + * Adds the values from `other` to this histogram. + * @since v17.4.0, v16.14.0 + */ + add(other: RecordableHistogram): void; + } + /** + * _This property is an extension by Node.js. It is not available in Web browsers._ + * + * Creates an `IntervalHistogram` object that samples and reports the event loop + * delay over time. The delays will be reported in nanoseconds. + * + * Using a timer to detect approximate event loop delay works because the + * execution of timers is tied specifically to the lifecycle of the libuv + * event loop. That is, a delay in the loop will cause a delay in the execution + * of the timer, and those delays are specifically what this API is intended to + * detect. + * + * ```js + * const { monitorEventLoopDelay } = require('node:perf_hooks'); + * const h = monitorEventLoopDelay({ resolution: 20 }); + * h.enable(); + * // Do something. + * h.disable(); + * console.log(h.min); + * console.log(h.max); + * console.log(h.mean); + * console.log(h.stddev); + * console.log(h.percentiles); + * console.log(h.percentile(50)); + * console.log(h.percentile(99)); + * ``` + * @since v11.10.0 + */ + function monitorEventLoopDelay(options?: EventLoopMonitorOptions): IntervalHistogram; + interface CreateHistogramOptions { + /** + * The minimum recordable value. Must be an integer value greater than 0. + * @default 1 + */ + min?: number | bigint | undefined; + /** + * The maximum recordable value. Must be an integer value greater than min. + * @default Number.MAX_SAFE_INTEGER + */ + max?: number | bigint | undefined; + /** + * The number of accuracy digits. Must be a number between 1 and 5. + * @default 3 + */ + figures?: number | undefined; + } + /** + * Returns a `RecordableHistogram`. + * @since v15.9.0, v14.18.0 + */ + function createHistogram(options?: CreateHistogramOptions): RecordableHistogram; + import { performance as _performance } from "perf_hooks"; + global { + /** + * `performance` is a global reference for `require('perf_hooks').performance` + * https://nodejs.org/api/globals.html#performance + * @since v16.0.0 + */ + var performance: typeof globalThis extends { + onmessage: any; + performance: infer T; + } ? T + : typeof _performance; + } +} +declare module "node:perf_hooks" { + export * from "perf_hooks"; +} diff --git a/task/node_modules/@types/node/ts4.8/process.d.ts b/task/node_modules/@types/node/ts4.8/process.d.ts new file mode 100644 index 0000000..0e27473 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/process.d.ts @@ -0,0 +1,1539 @@ +declare module "process" { + import * as tty from "node:tty"; + import { Worker } from "node:worker_threads"; + global { + var process: NodeJS.Process; + namespace NodeJS { + // this namespace merge is here because these are specifically used + // as the type for process.stdin, process.stdout, and process.stderr. + // they can't live in tty.d.ts because we need to disambiguate the imported name. + interface ReadStream extends tty.ReadStream {} + interface WriteStream extends tty.WriteStream {} + interface MemoryUsageFn { + /** + * The `process.memoryUsage()` method iterate over each page to gather informations about memory + * usage which can be slow depending on the program memory allocations. + */ + (): MemoryUsage; + /** + * method returns an integer representing the Resident Set Size (RSS) in bytes. + */ + rss(): number; + } + interface MemoryUsage { + rss: number; + heapTotal: number; + heapUsed: number; + external: number; + arrayBuffers: number; + } + interface CpuUsage { + user: number; + system: number; + } + interface ProcessRelease { + name: string; + sourceUrl?: string | undefined; + headersUrl?: string | undefined; + libUrl?: string | undefined; + lts?: string | undefined; + } + interface ProcessVersions extends Dict { + http_parser: string; + node: string; + v8: string; + ares: string; + uv: string; + zlib: string; + modules: string; + openssl: string; + } + type Platform = + | "aix" + | "android" + | "darwin" + | "freebsd" + | "haiku" + | "linux" + | "openbsd" + | "sunos" + | "win32" + | "cygwin" + | "netbsd"; + type Architecture = + | "arm" + | "arm64" + | "ia32" + | "mips" + | "mipsel" + | "ppc" + | "ppc64" + | "riscv64" + | "s390" + | "s390x" + | "x64"; + type Signals = + | "SIGABRT" + | "SIGALRM" + | "SIGBUS" + | "SIGCHLD" + | "SIGCONT" + | "SIGFPE" + | "SIGHUP" + | "SIGILL" + | "SIGINT" + | "SIGIO" + | "SIGIOT" + | "SIGKILL" + | "SIGPIPE" + | "SIGPOLL" + | "SIGPROF" + | "SIGPWR" + | "SIGQUIT" + | "SIGSEGV" + | "SIGSTKFLT" + | "SIGSTOP" + | "SIGSYS" + | "SIGTERM" + | "SIGTRAP" + | "SIGTSTP" + | "SIGTTIN" + | "SIGTTOU" + | "SIGUNUSED" + | "SIGURG" + | "SIGUSR1" + | "SIGUSR2" + | "SIGVTALRM" + | "SIGWINCH" + | "SIGXCPU" + | "SIGXFSZ" + | "SIGBREAK" + | "SIGLOST" + | "SIGINFO"; + type UncaughtExceptionOrigin = "uncaughtException" | "unhandledRejection"; + type MultipleResolveType = "resolve" | "reject"; + type BeforeExitListener = (code: number) => void; + type DisconnectListener = () => void; + type ExitListener = (code: number) => void; + type RejectionHandledListener = (promise: Promise) => void; + type UncaughtExceptionListener = (error: Error, origin: UncaughtExceptionOrigin) => void; + /** + * Most of the time the unhandledRejection will be an Error, but this should not be relied upon + * as *anything* can be thrown/rejected, it is therefore unsafe to assume that the value is an Error. + */ + type UnhandledRejectionListener = (reason: unknown, promise: Promise) => void; + type WarningListener = (warning: Error) => void; + type MessageListener = (message: unknown, sendHandle: unknown) => void; + type SignalsListener = (signal: Signals) => void; + type MultipleResolveListener = ( + type: MultipleResolveType, + promise: Promise, + value: unknown, + ) => void; + type WorkerListener = (worker: Worker) => void; + interface Socket extends ReadWriteStream { + isTTY?: true | undefined; + } + // Alias for compatibility + interface ProcessEnv extends Dict { + /** + * Can be used to change the default timezone at runtime + */ + TZ?: string; + } + interface HRTime { + (time?: [number, number]): [number, number]; + bigint(): bigint; + } + interface ProcessReport { + /** + * Directory where the report is written. + * working directory of the Node.js process. + * @default '' indicating that reports are written to the current + */ + directory: string; + /** + * Filename where the report is written. + * The default value is the empty string. + * @default '' the output filename will be comprised of a timestamp, + * PID, and sequence number. + */ + filename: string; + /** + * Returns a JSON-formatted diagnostic report for the running process. + * The report's JavaScript stack trace is taken from err, if present. + */ + getReport(err?: Error): string; + /** + * If true, a diagnostic report is generated on fatal errors, + * such as out of memory errors or failed C++ assertions. + * @default false + */ + reportOnFatalError: boolean; + /** + * If true, a diagnostic report is generated when the process + * receives the signal specified by process.report.signal. + * @default false + */ + reportOnSignal: boolean; + /** + * If true, a diagnostic report is generated on uncaught exception. + * @default false + */ + reportOnUncaughtException: boolean; + /** + * The signal used to trigger the creation of a diagnostic report. + * @default 'SIGUSR2' + */ + signal: Signals; + /** + * Writes a diagnostic report to a file. If filename is not provided, the default filename + * includes the date, time, PID, and a sequence number. + * The report's JavaScript stack trace is taken from err, if present. + * + * @param fileName Name of the file where the report is written. + * This should be a relative path, that will be appended to the directory specified in + * `process.report.directory`, or the current working directory of the Node.js process, + * if unspecified. + * @param error A custom error used for reporting the JavaScript stack. + * @return Filename of the generated report. + */ + writeReport(fileName?: string): string; + writeReport(error?: Error): string; + writeReport(fileName?: string, err?: Error): string; + } + interface ResourceUsage { + fsRead: number; + fsWrite: number; + involuntaryContextSwitches: number; + ipcReceived: number; + ipcSent: number; + majorPageFault: number; + maxRSS: number; + minorPageFault: number; + sharedMemorySize: number; + signalsCount: number; + swappedOut: number; + systemCPUTime: number; + unsharedDataSize: number; + unsharedStackSize: number; + userCPUTime: number; + voluntaryContextSwitches: number; + } + interface EmitWarningOptions { + /** + * When `warning` is a `string`, `type` is the name to use for the _type_ of warning being emitted. + * + * @default 'Warning' + */ + type?: string | undefined; + /** + * A unique identifier for the warning instance being emitted. + */ + code?: string | undefined; + /** + * When `warning` is a `string`, `ctor` is an optional function used to limit the generated stack trace. + * + * @default process.emitWarning + */ + ctor?: Function | undefined; + /** + * Additional text to include with the error. + */ + detail?: string | undefined; + } + interface ProcessConfig { + readonly target_defaults: { + readonly cflags: any[]; + readonly default_configuration: string; + readonly defines: string[]; + readonly include_dirs: string[]; + readonly libraries: string[]; + }; + readonly variables: { + readonly clang: number; + readonly host_arch: string; + readonly node_install_npm: boolean; + readonly node_install_waf: boolean; + readonly node_prefix: string; + readonly node_shared_openssl: boolean; + readonly node_shared_v8: boolean; + readonly node_shared_zlib: boolean; + readonly node_use_dtrace: boolean; + readonly node_use_etw: boolean; + readonly node_use_openssl: boolean; + readonly target_arch: string; + readonly v8_no_strict_aliasing: number; + readonly v8_use_snapshot: boolean; + readonly visibility: string; + }; + } + interface Process extends EventEmitter { + /** + * The `process.stdout` property returns a stream connected to`stdout` (fd `1`). It is a `net.Socket` (which is a `Duplex` stream) unless fd `1` refers to a file, in which case it is + * a `Writable` stream. + * + * For example, to copy `process.stdin` to `process.stdout`: + * + * ```js + * import { stdin, stdout } from 'node:process'; + * + * stdin.pipe(stdout); + * ``` + * + * `process.stdout` differs from other Node.js streams in important ways. See `note on process I/O` for more information. + */ + stdout: WriteStream & { + fd: 1; + }; + /** + * The `process.stderr` property returns a stream connected to`stderr` (fd `2`). It is a `net.Socket` (which is a `Duplex` stream) unless fd `2` refers to a file, in which case it is + * a `Writable` stream. + * + * `process.stderr` differs from other Node.js streams in important ways. See `note on process I/O` for more information. + */ + stderr: WriteStream & { + fd: 2; + }; + /** + * The `process.stdin` property returns a stream connected to`stdin` (fd `0`). It is a `net.Socket` (which is a `Duplex` stream) unless fd `0` refers to a file, in which case it is + * a `Readable` stream. + * + * For details of how to read from `stdin` see `readable.read()`. + * + * As a `Duplex` stream, `process.stdin` can also be used in "old" mode that + * is compatible with scripts written for Node.js prior to v0.10\. + * For more information see `Stream compatibility`. + * + * In "old" streams mode the `stdin` stream is paused by default, so one + * must call `process.stdin.resume()` to read from it. Note also that calling`process.stdin.resume()` itself would switch stream to "old" mode. + */ + stdin: ReadStream & { + fd: 0; + }; + openStdin(): Socket; + /** + * The `process.argv` property returns an array containing the command-line + * arguments passed when the Node.js process was launched. The first element will + * be {@link execPath}. See `process.argv0` if access to the original value + * of `argv[0]` is needed. The second element will be the path to the JavaScript + * file being executed. The remaining elements will be any additional command-line + * arguments. + * + * For example, assuming the following script for `process-args.js`: + * + * ```js + * import { argv } from 'node:process'; + * + * // print process.argv + * argv.forEach((val, index) => { + * console.log(`${index}: ${val}`); + * }); + * ``` + * + * Launching the Node.js process as: + * + * ```bash + * node process-args.js one two=three four + * ``` + * + * Would generate the output: + * + * ```text + * 0: /usr/local/bin/node + * 1: /Users/mjr/work/node/process-args.js + * 2: one + * 3: two=three + * 4: four + * ``` + * @since v0.1.27 + */ + argv: string[]; + /** + * The `process.argv0` property stores a read-only copy of the original value of`argv[0]` passed when Node.js starts. + * + * ```console + * $ bash -c 'exec -a customArgv0 ./node' + * > process.argv[0] + * '/Volumes/code/external/node/out/Release/node' + * > process.argv0 + * 'customArgv0' + * ``` + * @since v6.4.0 + */ + argv0: string; + /** + * The `process.execArgv` property returns the set of Node.js-specific command-line + * options passed when the Node.js process was launched. These options do not + * appear in the array returned by the {@link argv} property, and do not + * include the Node.js executable, the name of the script, or any options following + * the script name. These options are useful in order to spawn child processes with + * the same execution environment as the parent. + * + * ```bash + * node --harmony script.js --version + * ``` + * + * Results in `process.execArgv`: + * + * ```js + * ['--harmony'] + * ``` + * + * And `process.argv`: + * + * ```js + * ['/usr/local/bin/node', 'script.js', '--version'] + * ``` + * + * Refer to `Worker constructor` for the detailed behavior of worker + * threads with this property. + * @since v0.7.7 + */ + execArgv: string[]; + /** + * The `process.execPath` property returns the absolute pathname of the executable + * that started the Node.js process. Symbolic links, if any, are resolved. + * + * ```js + * '/usr/local/bin/node' + * ``` + * @since v0.1.100 + */ + execPath: string; + /** + * The `process.abort()` method causes the Node.js process to exit immediately and + * generate a core file. + * + * This feature is not available in `Worker` threads. + * @since v0.7.0 + */ + abort(): never; + /** + * The `process.chdir()` method changes the current working directory of the + * Node.js process or throws an exception if doing so fails (for instance, if + * the specified `directory` does not exist). + * + * ```js + * import { chdir, cwd } from 'node:process'; + * + * console.log(`Starting directory: ${cwd()}`); + * try { + * chdir('/tmp'); + * console.log(`New directory: ${cwd()}`); + * } catch (err) { + * console.error(`chdir: ${err}`); + * } + * ``` + * + * This feature is not available in `Worker` threads. + * @since v0.1.17 + */ + chdir(directory: string): void; + /** + * The `process.cwd()` method returns the current working directory of the Node.js + * process. + * + * ```js + * import { cwd } from 'node:process'; + * + * console.log(`Current directory: ${cwd()}`); + * ``` + * @since v0.1.8 + */ + cwd(): string; + /** + * The port used by the Node.js debugger when enabled. + * + * ```js + * import process from 'node:process'; + * + * process.debugPort = 5858; + * ``` + * @since v0.7.2 + */ + debugPort: number; + /** + * The `process.emitWarning()` method can be used to emit custom or application + * specific process warnings. These can be listened for by adding a handler to the `'warning'` event. + * + * ```js + * import { emitWarning } from 'node:process'; + * + * // Emit a warning with a code and additional detail. + * emitWarning('Something happened!', { + * code: 'MY_WARNING', + * detail: 'This is some additional information', + * }); + * // Emits: + * // (node:56338) [MY_WARNING] Warning: Something happened! + * // This is some additional information + * ``` + * + * In this example, an `Error` object is generated internally by`process.emitWarning()` and passed through to the `'warning'` handler. + * + * ```js + * import process from 'node:process'; + * + * process.on('warning', (warning) => { + * console.warn(warning.name); // 'Warning' + * console.warn(warning.message); // 'Something happened!' + * console.warn(warning.code); // 'MY_WARNING' + * console.warn(warning.stack); // Stack trace + * console.warn(warning.detail); // 'This is some additional information' + * }); + * ``` + * + * If `warning` is passed as an `Error` object, the `options` argument is ignored. + * @since v8.0.0 + * @param warning The warning to emit. + */ + emitWarning(warning: string | Error, ctor?: Function): void; + emitWarning(warning: string | Error, type?: string, ctor?: Function): void; + emitWarning(warning: string | Error, type?: string, code?: string, ctor?: Function): void; + emitWarning(warning: string | Error, options?: EmitWarningOptions): void; + /** + * The `process.env` property returns an object containing the user environment. + * See [`environ(7)`](http://man7.org/linux/man-pages/man7/environ.7.html). + * + * An example of this object looks like: + * + * ```js + * { + * TERM: 'xterm-256color', + * SHELL: '/usr/local/bin/bash', + * USER: 'maciej', + * PATH: '~/.bin/:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin', + * PWD: '/Users/maciej', + * EDITOR: 'vim', + * SHLVL: '1', + * HOME: '/Users/maciej', + * LOGNAME: 'maciej', + * _: '/usr/local/bin/node' + * } + * ``` + * + * It is possible to modify this object, but such modifications will not be + * reflected outside the Node.js process, or (unless explicitly requested) + * to other `Worker` threads. + * In other words, the following example would not work: + * + * ```bash + * node -e 'process.env.foo = "bar"' && echo $foo + * ``` + * + * While the following will: + * + * ```js + * import { env } from 'node:process'; + * + * env.foo = 'bar'; + * console.log(env.foo); + * ``` + * + * Assigning a property on `process.env` will implicitly convert the value + * to a string. **This behavior is deprecated.** Future versions of Node.js may + * throw an error when the value is not a string, number, or boolean. + * + * ```js + * import { env } from 'node:process'; + * + * env.test = null; + * console.log(env.test); + * // => 'null' + * env.test = undefined; + * console.log(env.test); + * // => 'undefined' + * ``` + * + * Use `delete` to delete a property from `process.env`. + * + * ```js + * import { env } from 'node:process'; + * + * env.TEST = 1; + * delete env.TEST; + * console.log(env.TEST); + * // => undefined + * ``` + * + * On Windows operating systems, environment variables are case-insensitive. + * + * ```js + * import { env } from 'node:process'; + * + * env.TEST = 1; + * console.log(env.test); + * // => 1 + * ``` + * + * Unless explicitly specified when creating a `Worker` instance, + * each `Worker` thread has its own copy of `process.env`, based on its + * parent thread's `process.env`, or whatever was specified as the `env` option + * to the `Worker` constructor. Changes to `process.env` will not be visible + * across `Worker` threads, and only the main thread can make changes that + * are visible to the operating system or to native add-ons. On Windows, a copy of`process.env` on a `Worker` instance operates in a case-sensitive manner + * unlike the main thread. + * @since v0.1.27 + */ + env: ProcessEnv; + /** + * The `process.exit()` method instructs Node.js to terminate the process + * synchronously with an exit status of `code`. If `code` is omitted, exit uses + * either the 'success' code `0` or the value of `process.exitCode` if it has been + * set. Node.js will not terminate until all the `'exit'` event listeners are + * called. + * + * To exit with a 'failure' code: + * + * ```js + * import { exit } from 'node:process'; + * + * exit(1); + * ``` + * + * The shell that executed Node.js should see the exit code as `1`. + * + * Calling `process.exit()` will force the process to exit as quickly as possible + * even if there are still asynchronous operations pending that have not yet + * completed fully, including I/O operations to `process.stdout` and`process.stderr`. + * + * In most situations, it is not actually necessary to call `process.exit()`explicitly. The Node.js process will exit on its own _if there is no additional_ + * _work pending_ in the event loop. The `process.exitCode` property can be set to + * tell the process which exit code to use when the process exits gracefully. + * + * For instance, the following example illustrates a _misuse_ of the`process.exit()` method that could lead to data printed to stdout being + * truncated and lost: + * + * ```js + * import { exit } from 'node:process'; + * + * // This is an example of what *not* to do: + * if (someConditionNotMet()) { + * printUsageToStdout(); + * exit(1); + * } + * ``` + * + * The reason this is problematic is because writes to `process.stdout` in Node.js + * are sometimes _asynchronous_ and may occur over multiple ticks of the Node.js + * event loop. Calling `process.exit()`, however, forces the process to exit _before_ those additional writes to `stdout` can be performed. + * + * Rather than calling `process.exit()` directly, the code _should_ set the`process.exitCode` and allow the process to exit naturally by avoiding + * scheduling any additional work for the event loop: + * + * ```js + * import process from 'node:process'; + * + * // How to properly set the exit code while letting + * // the process exit gracefully. + * if (someConditionNotMet()) { + * printUsageToStdout(); + * process.exitCode = 1; + * } + * ``` + * + * If it is necessary to terminate the Node.js process due to an error condition, + * throwing an _uncaught_ error and allowing the process to terminate accordingly + * is safer than calling `process.exit()`. + * + * In `Worker` threads, this function stops the current thread rather + * than the current process. + * @since v0.1.13 + * @param [code=0] The exit code. For string type, only integer strings (e.g.,'1') are allowed. + */ + exit(code?: number): never; + /** + * A number which will be the process exit code, when the process either + * exits gracefully, or is exited via {@link exit} without specifying + * a code. + * + * Specifying a code to {@link exit} will override any + * previous setting of `process.exitCode`. + * @since v0.11.8 + */ + exitCode?: number | undefined; + /** + * The `process.getgid()` method returns the numerical group identity of the + * process. (See [`getgid(2)`](http://man7.org/linux/man-pages/man2/getgid.2.html).) + * + * ```js + * import process from 'process'; + * + * if (process.getgid) { + * console.log(`Current gid: ${process.getgid()}`); + * } + * ``` + * + * This function is only available on POSIX platforms (i.e. not Windows or + * Android). + * @since v0.1.31 + */ + getgid?: () => number; + /** + * The `process.setgid()` method sets the group identity of the process. (See [`setgid(2)`](http://man7.org/linux/man-pages/man2/setgid.2.html).) The `id` can be passed as either a + * numeric ID or a group name + * string. If a group name is specified, this method blocks while resolving the + * associated numeric ID. + * + * ```js + * import process from 'process'; + * + * if (process.getgid && process.setgid) { + * console.log(`Current gid: ${process.getgid()}`); + * try { + * process.setgid(501); + * console.log(`New gid: ${process.getgid()}`); + * } catch (err) { + * console.log(`Failed to set gid: ${err}`); + * } + * } + * ``` + * + * This function is only available on POSIX platforms (i.e. not Windows or + * Android). + * This feature is not available in `Worker` threads. + * @since v0.1.31 + * @param id The group name or ID + */ + setgid?: (id: number | string) => void; + /** + * The `process.getuid()` method returns the numeric user identity of the process. + * (See [`getuid(2)`](http://man7.org/linux/man-pages/man2/getuid.2.html).) + * + * ```js + * import process from 'process'; + * + * if (process.getuid) { + * console.log(`Current uid: ${process.getuid()}`); + * } + * ``` + * + * This function is only available on POSIX platforms (i.e. not Windows or + * Android). + * @since v0.1.28 + */ + getuid?: () => number; + /** + * The `process.setuid(id)` method sets the user identity of the process. (See [`setuid(2)`](http://man7.org/linux/man-pages/man2/setuid.2.html).) The `id` can be passed as either a + * numeric ID or a username string. + * If a username is specified, the method blocks while resolving the associated + * numeric ID. + * + * ```js + * import process from 'process'; + * + * if (process.getuid && process.setuid) { + * console.log(`Current uid: ${process.getuid()}`); + * try { + * process.setuid(501); + * console.log(`New uid: ${process.getuid()}`); + * } catch (err) { + * console.log(`Failed to set uid: ${err}`); + * } + * } + * ``` + * + * This function is only available on POSIX platforms (i.e. not Windows or + * Android). + * This feature is not available in `Worker` threads. + * @since v0.1.28 + */ + setuid?: (id: number | string) => void; + /** + * The `process.geteuid()` method returns the numerical effective user identity of + * the process. (See [`geteuid(2)`](http://man7.org/linux/man-pages/man2/geteuid.2.html).) + * + * ```js + * import process from 'process'; + * + * if (process.geteuid) { + * console.log(`Current uid: ${process.geteuid()}`); + * } + * ``` + * + * This function is only available on POSIX platforms (i.e. not Windows or + * Android). + * @since v2.0.0 + */ + geteuid?: () => number; + /** + * The `process.seteuid()` method sets the effective user identity of the process. + * (See [`seteuid(2)`](http://man7.org/linux/man-pages/man2/seteuid.2.html).) The `id` can be passed as either a numeric ID or a username + * string. If a username is specified, the method blocks while resolving the + * associated numeric ID. + * + * ```js + * import process from 'process'; + * + * if (process.geteuid && process.seteuid) { + * console.log(`Current uid: ${process.geteuid()}`); + * try { + * process.seteuid(501); + * console.log(`New uid: ${process.geteuid()}`); + * } catch (err) { + * console.log(`Failed to set uid: ${err}`); + * } + * } + * ``` + * + * This function is only available on POSIX platforms (i.e. not Windows or + * Android). + * This feature is not available in `Worker` threads. + * @since v2.0.0 + * @param id A user name or ID + */ + seteuid?: (id: number | string) => void; + /** + * The `process.getegid()` method returns the numerical effective group identity + * of the Node.js process. (See [`getegid(2)`](http://man7.org/linux/man-pages/man2/getegid.2.html).) + * + * ```js + * import process from 'process'; + * + * if (process.getegid) { + * console.log(`Current gid: ${process.getegid()}`); + * } + * ``` + * + * This function is only available on POSIX platforms (i.e. not Windows or + * Android). + * @since v2.0.0 + */ + getegid?: () => number; + /** + * The `process.setegid()` method sets the effective group identity of the process. + * (See [`setegid(2)`](http://man7.org/linux/man-pages/man2/setegid.2.html).) The `id` can be passed as either a numeric ID or a group + * name string. If a group name is specified, this method blocks while resolving + * the associated a numeric ID. + * + * ```js + * import process from 'process'; + * + * if (process.getegid && process.setegid) { + * console.log(`Current gid: ${process.getegid()}`); + * try { + * process.setegid(501); + * console.log(`New gid: ${process.getegid()}`); + * } catch (err) { + * console.log(`Failed to set gid: ${err}`); + * } + * } + * ``` + * + * This function is only available on POSIX platforms (i.e. not Windows or + * Android). + * This feature is not available in `Worker` threads. + * @since v2.0.0 + * @param id A group name or ID + */ + setegid?: (id: number | string) => void; + /** + * The `process.getgroups()` method returns an array with the supplementary group + * IDs. POSIX leaves it unspecified if the effective group ID is included but + * Node.js ensures it always is. + * + * ```js + * import process from 'process'; + * + * if (process.getgroups) { + * console.log(process.getgroups()); // [ 16, 21, 297 ] + * } + * ``` + * + * This function is only available on POSIX platforms (i.e. not Windows or + * Android). + * @since v0.9.4 + */ + getgroups?: () => number[]; + /** + * The `process.setgroups()` method sets the supplementary group IDs for the + * Node.js process. This is a privileged operation that requires the Node.js + * process to have `root` or the `CAP_SETGID` capability. + * + * The `groups` array can contain numeric group IDs, group names, or both. + * + * ```js + * import process from 'process'; + * + * if (process.getgroups && process.setgroups) { + * try { + * process.setgroups([501]); + * console.log(process.getgroups()); // new groups + * } catch (err) { + * console.log(`Failed to set groups: ${err}`); + * } + * } + * ``` + * + * This function is only available on POSIX platforms (i.e. not Windows or + * Android). + * This feature is not available in `Worker` threads. + * @since v0.9.4 + */ + setgroups?: (groups: ReadonlyArray) => void; + /** + * The `process.setUncaughtExceptionCaptureCallback()` function sets a function + * that will be invoked when an uncaught exception occurs, which will receive the + * exception value itself as its first argument. + * + * If such a function is set, the `'uncaughtException'` event will + * not be emitted. If `--abort-on-uncaught-exception` was passed from the + * command line or set through `v8.setFlagsFromString()`, the process will + * not abort. Actions configured to take place on exceptions such as report + * generations will be affected too + * + * To unset the capture function,`process.setUncaughtExceptionCaptureCallback(null)` may be used. Calling this + * method with a non-`null` argument while another capture function is set will + * throw an error. + * + * Using this function is mutually exclusive with using the deprecated `domain` built-in module. + * @since v9.3.0 + */ + setUncaughtExceptionCaptureCallback(cb: ((err: Error) => void) | null): void; + /** + * Indicates whether a callback has been set using {@link setUncaughtExceptionCaptureCallback}. + * @since v9.3.0 + */ + hasUncaughtExceptionCaptureCallback(): boolean; + /** + * The `process.sourceMapsEnabled` property returns whether the [Source Map v3](https://sourcemaps.info/spec.html) support for stack traces is enabled. + * @since v20.7.0 + * @experimental + */ + readonly sourceMapsEnabled: boolean; + /** + * This function enables or disables the Source Map v3 support for stack traces. + * It provides same features as launching Node.js process with commandline options --enable-source-maps. + * @since v16.6.0 + * @experimental + */ + setSourceMapsEnabled(value: boolean): void; + /** + * The `process.version` property contains the Node.js version string. + * + * ```js + * import { version } from 'node:process'; + * + * console.log(`Version: ${version}`); + * // Version: v14.8.0 + * ``` + * + * To get the version string without the prepended _v_, use`process.versions.node`. + * @since v0.1.3 + */ + readonly version: string; + /** + * The `process.versions` property returns an object listing the version strings of + * Node.js and its dependencies. `process.versions.modules` indicates the current + * ABI version, which is increased whenever a C++ API changes. Node.js will refuse + * to load modules that were compiled against a different module ABI version. + * + * ```js + * import { versions } from 'node:process'; + * + * console.log(versions); + * ``` + * + * Will generate an object similar to: + * + * ```console + * { node: '20.2.0', + * acorn: '8.8.2', + * ada: '2.4.0', + * ares: '1.19.0', + * base64: '0.5.0', + * brotli: '1.0.9', + * cjs_module_lexer: '1.2.2', + * cldr: '43.0', + * icu: '73.1', + * llhttp: '8.1.0', + * modules: '115', + * napi: '8', + * nghttp2: '1.52.0', + * nghttp3: '0.7.0', + * ngtcp2: '0.8.1', + * openssl: '3.0.8+quic', + * simdutf: '3.2.9', + * tz: '2023c', + * undici: '5.22.0', + * unicode: '15.0', + * uv: '1.44.2', + * uvwasi: '0.0.16', + * v8: '11.3.244.8-node.9', + * zlib: '1.2.13' } + * ``` + * @since v0.2.0 + */ + readonly versions: ProcessVersions; + /** + * The `process.config` property returns a frozen `Object` containing the + * JavaScript representation of the configure options used to compile the current + * Node.js executable. This is the same as the `config.gypi` file that was produced + * when running the `./configure` script. + * + * An example of the possible output looks like: + * + * ```js + * { + * target_defaults: + * { cflags: [], + * default_configuration: 'Release', + * defines: [], + * include_dirs: [], + * libraries: [] }, + * variables: + * { + * host_arch: 'x64', + * napi_build_version: 5, + * node_install_npm: 'true', + * node_prefix: '', + * node_shared_cares: 'false', + * node_shared_http_parser: 'false', + * node_shared_libuv: 'false', + * node_shared_zlib: 'false', + * node_use_openssl: 'true', + * node_shared_openssl: 'false', + * strict_aliasing: 'true', + * target_arch: 'x64', + * v8_use_snapshot: 1 + * } + * } + * ``` + * @since v0.7.7 + */ + readonly config: ProcessConfig; + /** + * The `process.kill()` method sends the `signal` to the process identified by`pid`. + * + * Signal names are strings such as `'SIGINT'` or `'SIGHUP'`. See `Signal Events` and [`kill(2)`](http://man7.org/linux/man-pages/man2/kill.2.html) for more information. + * + * This method will throw an error if the target `pid` does not exist. As a special + * case, a signal of `0` can be used to test for the existence of a process. + * Windows platforms will throw an error if the `pid` is used to kill a process + * group. + * + * Even though the name of this function is `process.kill()`, it is really just a + * signal sender, like the `kill` system call. The signal sent may do something + * other than kill the target process. + * + * ```js + * import process, { kill } from 'node:process'; + * + * process.on('SIGHUP', () => { + * console.log('Got SIGHUP signal.'); + * }); + * + * setTimeout(() => { + * console.log('Exiting.'); + * process.exit(0); + * }, 100); + * + * kill(process.pid, 'SIGHUP'); + * ``` + * + * When `SIGUSR1` is received by a Node.js process, Node.js will start the + * debugger. See `Signal Events`. + * @since v0.0.6 + * @param pid A process ID + * @param [signal='SIGTERM'] The signal to send, either as a string or number. + */ + kill(pid: number, signal?: string | number): true; + /** + * The `process.pid` property returns the PID of the process. + * + * ```js + * import { pid } from 'node:process'; + * + * console.log(`This process is pid ${pid}`); + * ``` + * @since v0.1.15 + */ + readonly pid: number; + /** + * The `process.ppid` property returns the PID of the parent of the + * current process. + * + * ```js + * import { ppid } from 'node:process'; + * + * console.log(`The parent process is pid ${ppid}`); + * ``` + * @since v9.2.0, v8.10.0, v6.13.0 + */ + readonly ppid: number; + /** + * The `process.title` property returns the current process title (i.e. returns + * the current value of `ps`). Assigning a new value to `process.title` modifies + * the current value of `ps`. + * + * When a new value is assigned, different platforms will impose different maximum + * length restrictions on the title. Usually such restrictions are quite limited. + * For instance, on Linux and macOS, `process.title` is limited to the size of the + * binary name plus the length of the command-line arguments because setting the`process.title` overwrites the `argv` memory of the process. Node.js v0.8 + * allowed for longer process title strings by also overwriting the `environ`memory but that was potentially insecure and confusing in some (rather obscure) + * cases. + * + * Assigning a value to `process.title` might not result in an accurate label + * within process manager applications such as macOS Activity Monitor or Windows + * Services Manager. + * @since v0.1.104 + */ + title: string; + /** + * The operating system CPU architecture for which the Node.js binary was compiled. + * Possible values are: `'arm'`, `'arm64'`, `'ia32'`, `'loong64'`, `'mips'`,`'mipsel'`, `'ppc'`, `'ppc64'`, `'riscv64'`, `'s390'`, `'s390x'`, and `'x64'`. + * + * ```js + * import { arch } from 'node:process'; + * + * console.log(`This processor architecture is ${arch}`); + * ``` + * @since v0.5.0 + */ + readonly arch: Architecture; + /** + * The `process.platform` property returns a string identifying the operating + * system platform for which the Node.js binary was compiled. + * + * Currently possible values are: + * + * * `'aix'` + * * `'darwin'` + * * `'freebsd'` + * * `'linux'` + * * `'openbsd'` + * * `'sunos'` + * * `'win32'` + * + * ```js + * import { platform } from 'node:process'; + * + * console.log(`This platform is ${platform}`); + * ``` + * + * The value `'android'` may also be returned if the Node.js is built on the + * Android operating system. However, Android support in Node.js [is experimental](https://github.com/nodejs/node/blob/HEAD/BUILDING.md#androidandroid-based-devices-eg-firefox-os). + * @since v0.1.16 + */ + readonly platform: Platform; + /** + * The `process.mainModule` property provides an alternative way of retrieving `require.main`. The difference is that if the main module changes at + * runtime, `require.main` may still refer to the original main module in + * modules that were required before the change occurred. Generally, it's + * safe to assume that the two refer to the same module. + * + * As with `require.main`, `process.mainModule` will be `undefined` if there + * is no entry script. + * @since v0.1.17 + * @deprecated Since v14.0.0 - Use `main` instead. + */ + mainModule?: Module | undefined; + memoryUsage: MemoryUsageFn; + /** + * Gets the amount of memory available to the process (in bytes) based on + * limits imposed by the OS. If there is no such constraint, or the constraint + * is unknown, `undefined` is returned. + * + * See [`uv_get_constrained_memory`](https://docs.libuv.org/en/v1.x/misc.html#c.uv_get_constrained_memory) for more + * information. + * @since v19.6.0, v18.15.0 + * @experimental + */ + constrainedMemory(): number | undefined; + /** + * The `process.cpuUsage()` method returns the user and system CPU time usage of + * the current process, in an object with properties `user` and `system`, whose + * values are microsecond values (millionth of a second). These values measure time + * spent in user and system code respectively, and may end up being greater than + * actual elapsed time if multiple CPU cores are performing work for this process. + * + * The result of a previous call to `process.cpuUsage()` can be passed as the + * argument to the function, to get a diff reading. + * + * ```js + * import { cpuUsage } from 'node:process'; + * + * const startUsage = cpuUsage(); + * // { user: 38579, system: 6986 } + * + * // spin the CPU for 500 milliseconds + * const now = Date.now(); + * while (Date.now() - now < 500); + * + * console.log(cpuUsage(startUsage)); + * // { user: 514883, system: 11226 } + * ``` + * @since v6.1.0 + * @param previousValue A previous return value from calling `process.cpuUsage()` + */ + cpuUsage(previousValue?: CpuUsage): CpuUsage; + /** + * `process.nextTick()` adds `callback` to the "next tick queue". This queue is + * fully drained after the current operation on the JavaScript stack runs to + * completion and before the event loop is allowed to continue. It's possible to + * create an infinite loop if one were to recursively call `process.nextTick()`. + * See the [Event Loop](https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/#process-nexttick) guide for more background. + * + * ```js + * import { nextTick } from 'node:process'; + * + * console.log('start'); + * nextTick(() => { + * console.log('nextTick callback'); + * }); + * console.log('scheduled'); + * // Output: + * // start + * // scheduled + * // nextTick callback + * ``` + * + * This is important when developing APIs in order to give users the opportunity + * to assign event handlers _after_ an object has been constructed but before any + * I/O has occurred: + * + * ```js + * import { nextTick } from 'node:process'; + * + * function MyThing(options) { + * this.setupOptions(options); + * + * nextTick(() => { + * this.startDoingStuff(); + * }); + * } + * + * const thing = new MyThing(); + * thing.getReadyForStuff(); + * + * // thing.startDoingStuff() gets called now, not before. + * ``` + * + * It is very important for APIs to be either 100% synchronous or 100% + * asynchronous. Consider this example: + * + * ```js + * // WARNING! DO NOT USE! BAD UNSAFE HAZARD! + * function maybeSync(arg, cb) { + * if (arg) { + * cb(); + * return; + * } + * + * fs.stat('file', cb); + * } + * ``` + * + * This API is hazardous because in the following case: + * + * ```js + * const maybeTrue = Math.random() > 0.5; + * + * maybeSync(maybeTrue, () => { + * foo(); + * }); + * + * bar(); + * ``` + * + * It is not clear whether `foo()` or `bar()` will be called first. + * + * The following approach is much better: + * + * ```js + * import { nextTick } from 'node:process'; + * + * function definitelyAsync(arg, cb) { + * if (arg) { + * nextTick(cb); + * return; + * } + * + * fs.stat('file', cb); + * } + * ``` + * @since v0.1.26 + * @param args Additional arguments to pass when invoking the `callback` + */ + nextTick(callback: Function, ...args: any[]): void; + /** + * The `process.release` property returns an `Object` containing metadata related + * to the current release, including URLs for the source tarball and headers-only + * tarball. + * + * `process.release` contains the following properties: + * + * ```js + * { + * name: 'node', + * lts: 'Hydrogen', + * sourceUrl: 'https://nodejs.org/download/release/v18.12.0/node-v18.12.0.tar.gz', + * headersUrl: 'https://nodejs.org/download/release/v18.12.0/node-v18.12.0-headers.tar.gz', + * libUrl: 'https://nodejs.org/download/release/v18.12.0/win-x64/node.lib' + * } + * ``` + * + * In custom builds from non-release versions of the source tree, only the`name` property may be present. The additional properties should not be + * relied upon to exist. + * @since v3.0.0 + */ + readonly release: ProcessRelease; + features: { + inspector: boolean; + debug: boolean; + uv: boolean; + ipv6: boolean; + tls_alpn: boolean; + tls_sni: boolean; + tls_ocsp: boolean; + tls: boolean; + }; + /** + * `process.umask()` returns the Node.js process's file mode creation mask. Child + * processes inherit the mask from the parent process. + * @since v0.1.19 + * @deprecated Calling `process.umask()` with no argument causes the process-wide umask to be written twice. This introduces a race condition between threads, and is a potential * + * security vulnerability. There is no safe, cross-platform alternative API. + */ + umask(): number; + /** + * Can only be set if not in worker thread. + */ + umask(mask: string | number): number; + /** + * The `process.uptime()` method returns the number of seconds the current Node.js + * process has been running. + * + * The return value includes fractions of a second. Use `Math.floor()` to get whole + * seconds. + * @since v0.5.0 + */ + uptime(): number; + hrtime: HRTime; + /** + * If Node.js is spawned with an IPC channel, the `process.send()` method can be + * used to send messages to the parent process. Messages will be received as a `'message'` event on the parent's `ChildProcess` object. + * + * If Node.js was not spawned with an IPC channel, `process.send` will be `undefined`. + * + * The message goes through serialization and parsing. The resulting message might + * not be the same as what is originally sent. + * @since v0.5.9 + * @param options used to parameterize the sending of certain types of handles.`options` supports the following properties: + */ + send?( + message: any, + sendHandle?: any, + options?: { + swallowErrors?: boolean | undefined; + }, + callback?: (error: Error | null) => void, + ): boolean; + /** + * If the Node.js process is spawned with an IPC channel (see the `Child Process` and `Cluster` documentation), the `process.disconnect()` method will close the + * IPC channel to the parent process, allowing the child process to exit gracefully + * once there are no other connections keeping it alive. + * + * The effect of calling `process.disconnect()` is the same as calling `ChildProcess.disconnect()` from the parent process. + * + * If the Node.js process was not spawned with an IPC channel,`process.disconnect()` will be `undefined`. + * @since v0.7.2 + */ + disconnect(): void; + /** + * If the Node.js process is spawned with an IPC channel (see the `Child Process` and `Cluster` documentation), the `process.connected` property will return`true` so long as the IPC + * channel is connected and will return `false` after`process.disconnect()` is called. + * + * Once `process.connected` is `false`, it is no longer possible to send messages + * over the IPC channel using `process.send()`. + * @since v0.7.2 + */ + connected: boolean; + /** + * The `process.allowedNodeEnvironmentFlags` property is a special, + * read-only `Set` of flags allowable within the `NODE_OPTIONS` environment variable. + * + * `process.allowedNodeEnvironmentFlags` extends `Set`, but overrides`Set.prototype.has` to recognize several different possible flag + * representations. `process.allowedNodeEnvironmentFlags.has()` will + * return `true` in the following cases: + * + * * Flags may omit leading single (`-`) or double (`--`) dashes; e.g.,`inspect-brk` for `--inspect-brk`, or `r` for `-r`. + * * Flags passed through to V8 (as listed in `--v8-options`) may replace + * one or more _non-leading_ dashes for an underscore, or vice-versa; + * e.g., `--perf_basic_prof`, `--perf-basic-prof`, `--perf_basic-prof`, + * etc. + * * Flags may contain one or more equals (`=`) characters; all + * characters after and including the first equals will be ignored; + * e.g., `--stack-trace-limit=100`. + * * Flags _must_ be allowable within `NODE_OPTIONS`. + * + * When iterating over `process.allowedNodeEnvironmentFlags`, flags will + * appear only _once_; each will begin with one or more dashes. Flags + * passed through to V8 will contain underscores instead of non-leading + * dashes: + * + * ```js + * import { allowedNodeEnvironmentFlags } from 'node:process'; + * + * allowedNodeEnvironmentFlags.forEach((flag) => { + * // -r + * // --inspect-brk + * // --abort_on_uncaught_exception + * // ... + * }); + * ``` + * + * The methods `add()`, `clear()`, and `delete()` of`process.allowedNodeEnvironmentFlags` do nothing, and will fail + * silently. + * + * If Node.js was compiled _without_ `NODE_OPTIONS` support (shown in {@link config}), `process.allowedNodeEnvironmentFlags` will + * contain what _would have_ been allowable. + * @since v10.10.0 + */ + allowedNodeEnvironmentFlags: ReadonlySet; + /** + * `process.report` is an object whose methods are used to generate diagnostic + * reports for the current process. Additional documentation is available in the `report documentation`. + * @since v11.8.0 + */ + report?: ProcessReport | undefined; + /** + * ```js + * import { resourceUsage } from 'node:process'; + * + * console.log(resourceUsage()); + * /* + * Will output: + * { + * userCPUTime: 82872, + * systemCPUTime: 4143, + * maxRSS: 33164, + * sharedMemorySize: 0, + * unsharedDataSize: 0, + * unsharedStackSize: 0, + * minorPageFault: 2469, + * majorPageFault: 0, + * swappedOut: 0, + * fsRead: 0, + * fsWrite: 8, + * ipcSent: 0, + * ipcReceived: 0, + * signalsCount: 0, + * voluntaryContextSwitches: 79, + * involuntaryContextSwitches: 1 + * } + * + * ``` + * @since v12.6.0 + * @return the resource usage for the current process. All of these values come from the `uv_getrusage` call which returns a [`uv_rusage_t` struct][uv_rusage_t]. + */ + resourceUsage(): ResourceUsage; + /** + * The `process.traceDeprecation` property indicates whether the`--trace-deprecation` flag is set on the current Node.js process. See the + * documentation for the `'warning' event` and the `emitWarning() method` for more information about this + * flag's behavior. + * @since v0.8.0 + */ + traceDeprecation: boolean; + /* EventEmitter */ + addListener(event: "beforeExit", listener: BeforeExitListener): this; + addListener(event: "disconnect", listener: DisconnectListener): this; + addListener(event: "exit", listener: ExitListener): this; + addListener(event: "rejectionHandled", listener: RejectionHandledListener): this; + addListener(event: "uncaughtException", listener: UncaughtExceptionListener): this; + addListener(event: "uncaughtExceptionMonitor", listener: UncaughtExceptionListener): this; + addListener(event: "unhandledRejection", listener: UnhandledRejectionListener): this; + addListener(event: "warning", listener: WarningListener): this; + addListener(event: "message", listener: MessageListener): this; + addListener(event: Signals, listener: SignalsListener): this; + addListener(event: "multipleResolves", listener: MultipleResolveListener): this; + addListener(event: "worker", listener: WorkerListener): this; + emit(event: "beforeExit", code: number): boolean; + emit(event: "disconnect"): boolean; + emit(event: "exit", code: number): boolean; + emit(event: "rejectionHandled", promise: Promise): boolean; + emit(event: "uncaughtException", error: Error): boolean; + emit(event: "uncaughtExceptionMonitor", error: Error): boolean; + emit(event: "unhandledRejection", reason: unknown, promise: Promise): boolean; + emit(event: "warning", warning: Error): boolean; + emit(event: "message", message: unknown, sendHandle: unknown): this; + emit(event: Signals, signal?: Signals): boolean; + emit( + event: "multipleResolves", + type: MultipleResolveType, + promise: Promise, + value: unknown, + ): this; + emit(event: "worker", listener: WorkerListener): this; + on(event: "beforeExit", listener: BeforeExitListener): this; + on(event: "disconnect", listener: DisconnectListener): this; + on(event: "exit", listener: ExitListener): this; + on(event: "rejectionHandled", listener: RejectionHandledListener): this; + on(event: "uncaughtException", listener: UncaughtExceptionListener): this; + on(event: "uncaughtExceptionMonitor", listener: UncaughtExceptionListener): this; + on(event: "unhandledRejection", listener: UnhandledRejectionListener): this; + on(event: "warning", listener: WarningListener): this; + on(event: "message", listener: MessageListener): this; + on(event: Signals, listener: SignalsListener): this; + on(event: "multipleResolves", listener: MultipleResolveListener): this; + on(event: "worker", listener: WorkerListener): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: "beforeExit", listener: BeforeExitListener): this; + once(event: "disconnect", listener: DisconnectListener): this; + once(event: "exit", listener: ExitListener): this; + once(event: "rejectionHandled", listener: RejectionHandledListener): this; + once(event: "uncaughtException", listener: UncaughtExceptionListener): this; + once(event: "uncaughtExceptionMonitor", listener: UncaughtExceptionListener): this; + once(event: "unhandledRejection", listener: UnhandledRejectionListener): this; + once(event: "warning", listener: WarningListener): this; + once(event: "message", listener: MessageListener): this; + once(event: Signals, listener: SignalsListener): this; + once(event: "multipleResolves", listener: MultipleResolveListener): this; + once(event: "worker", listener: WorkerListener): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener(event: "beforeExit", listener: BeforeExitListener): this; + prependListener(event: "disconnect", listener: DisconnectListener): this; + prependListener(event: "exit", listener: ExitListener): this; + prependListener(event: "rejectionHandled", listener: RejectionHandledListener): this; + prependListener(event: "uncaughtException", listener: UncaughtExceptionListener): this; + prependListener(event: "uncaughtExceptionMonitor", listener: UncaughtExceptionListener): this; + prependListener(event: "unhandledRejection", listener: UnhandledRejectionListener): this; + prependListener(event: "warning", listener: WarningListener): this; + prependListener(event: "message", listener: MessageListener): this; + prependListener(event: Signals, listener: SignalsListener): this; + prependListener(event: "multipleResolves", listener: MultipleResolveListener): this; + prependListener(event: "worker", listener: WorkerListener): this; + prependOnceListener(event: "beforeExit", listener: BeforeExitListener): this; + prependOnceListener(event: "disconnect", listener: DisconnectListener): this; + prependOnceListener(event: "exit", listener: ExitListener): this; + prependOnceListener(event: "rejectionHandled", listener: RejectionHandledListener): this; + prependOnceListener(event: "uncaughtException", listener: UncaughtExceptionListener): this; + prependOnceListener(event: "uncaughtExceptionMonitor", listener: UncaughtExceptionListener): this; + prependOnceListener(event: "unhandledRejection", listener: UnhandledRejectionListener): this; + prependOnceListener(event: "warning", listener: WarningListener): this; + prependOnceListener(event: "message", listener: MessageListener): this; + prependOnceListener(event: Signals, listener: SignalsListener): this; + prependOnceListener(event: "multipleResolves", listener: MultipleResolveListener): this; + prependOnceListener(event: "worker", listener: WorkerListener): this; + listeners(event: "beforeExit"): BeforeExitListener[]; + listeners(event: "disconnect"): DisconnectListener[]; + listeners(event: "exit"): ExitListener[]; + listeners(event: "rejectionHandled"): RejectionHandledListener[]; + listeners(event: "uncaughtException"): UncaughtExceptionListener[]; + listeners(event: "uncaughtExceptionMonitor"): UncaughtExceptionListener[]; + listeners(event: "unhandledRejection"): UnhandledRejectionListener[]; + listeners(event: "warning"): WarningListener[]; + listeners(event: "message"): MessageListener[]; + listeners(event: Signals): SignalsListener[]; + listeners(event: "multipleResolves"): MultipleResolveListener[]; + listeners(event: "worker"): WorkerListener[]; + } + } + } + export = process; +} +declare module "node:process" { + import process = require("process"); + export = process; +} diff --git a/task/node_modules/@types/node/ts4.8/punycode.d.ts b/task/node_modules/@types/node/ts4.8/punycode.d.ts new file mode 100644 index 0000000..d2fc9f9 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/punycode.d.ts @@ -0,0 +1,117 @@ +/** + * **The version of the punycode module bundled in Node.js is being deprecated.**In a future major version of Node.js this module will be removed. Users + * currently depending on the `punycode` module should switch to using the + * userland-provided [Punycode.js](https://github.com/bestiejs/punycode.js) module instead. For punycode-based URL + * encoding, see `url.domainToASCII` or, more generally, the `WHATWG URL API`. + * + * The `punycode` module is a bundled version of the [Punycode.js](https://github.com/bestiejs/punycode.js) module. It + * can be accessed using: + * + * ```js + * const punycode = require('punycode'); + * ``` + * + * [Punycode](https://tools.ietf.org/html/rfc3492) is a character encoding scheme defined by RFC 3492 that is + * primarily intended for use in Internationalized Domain Names. Because host + * names in URLs are limited to ASCII characters only, Domain Names that contain + * non-ASCII characters must be converted into ASCII using the Punycode scheme. + * For instance, the Japanese character that translates into the English word,`'example'` is `'例'`. The Internationalized Domain Name, `'例.com'` (equivalent + * to `'example.com'`) is represented by Punycode as the ASCII string`'xn--fsq.com'`. + * + * The `punycode` module provides a simple implementation of the Punycode standard. + * + * The `punycode` module is a third-party dependency used by Node.js and + * made available to developers as a convenience. Fixes or other modifications to + * the module must be directed to the [Punycode.js](https://github.com/bestiejs/punycode.js) project. + * @deprecated Since v7.0.0 - Deprecated + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/punycode.js) + */ +declare module "punycode" { + /** + * The `punycode.decode()` method converts a [Punycode](https://tools.ietf.org/html/rfc3492) string of ASCII-only + * characters to the equivalent string of Unicode codepoints. + * + * ```js + * punycode.decode('maana-pta'); // 'mañana' + * punycode.decode('--dqo34k'); // '☃-⌘' + * ``` + * @since v0.5.1 + */ + function decode(string: string): string; + /** + * The `punycode.encode()` method converts a string of Unicode codepoints to a [Punycode](https://tools.ietf.org/html/rfc3492) string of ASCII-only characters. + * + * ```js + * punycode.encode('mañana'); // 'maana-pta' + * punycode.encode('☃-⌘'); // '--dqo34k' + * ``` + * @since v0.5.1 + */ + function encode(string: string): string; + /** + * The `punycode.toUnicode()` method converts a string representing a domain name + * containing [Punycode](https://tools.ietf.org/html/rfc3492) encoded characters into Unicode. Only the [Punycode](https://tools.ietf.org/html/rfc3492) encoded parts of the domain name are be + * converted. + * + * ```js + * // decode domain names + * punycode.toUnicode('xn--maana-pta.com'); // 'mañana.com' + * punycode.toUnicode('xn----dqo34k.com'); // '☃-⌘.com' + * punycode.toUnicode('example.com'); // 'example.com' + * ``` + * @since v0.6.1 + */ + function toUnicode(domain: string): string; + /** + * The `punycode.toASCII()` method converts a Unicode string representing an + * Internationalized Domain Name to [Punycode](https://tools.ietf.org/html/rfc3492). Only the non-ASCII parts of the + * domain name will be converted. Calling `punycode.toASCII()` on a string that + * already only contains ASCII characters will have no effect. + * + * ```js + * // encode domain names + * punycode.toASCII('mañana.com'); // 'xn--maana-pta.com' + * punycode.toASCII('☃-⌘.com'); // 'xn----dqo34k.com' + * punycode.toASCII('example.com'); // 'example.com' + * ``` + * @since v0.6.1 + */ + function toASCII(domain: string): string; + /** + * @deprecated since v7.0.0 + * The version of the punycode module bundled in Node.js is being deprecated. + * In a future major version of Node.js this module will be removed. + * Users currently depending on the punycode module should switch to using + * the userland-provided Punycode.js module instead. + */ + const ucs2: ucs2; + interface ucs2 { + /** + * @deprecated since v7.0.0 + * The version of the punycode module bundled in Node.js is being deprecated. + * In a future major version of Node.js this module will be removed. + * Users currently depending on the punycode module should switch to using + * the userland-provided Punycode.js module instead. + */ + decode(string: string): number[]; + /** + * @deprecated since v7.0.0 + * The version of the punycode module bundled in Node.js is being deprecated. + * In a future major version of Node.js this module will be removed. + * Users currently depending on the punycode module should switch to using + * the userland-provided Punycode.js module instead. + */ + encode(codePoints: readonly number[]): string; + } + /** + * @deprecated since v7.0.0 + * The version of the punycode module bundled in Node.js is being deprecated. + * In a future major version of Node.js this module will be removed. + * Users currently depending on the punycode module should switch to using + * the userland-provided Punycode.js module instead. + */ + const version: string; +} +declare module "node:punycode" { + export * from "punycode"; +} diff --git a/task/node_modules/@types/node/ts4.8/querystring.d.ts b/task/node_modules/@types/node/ts4.8/querystring.d.ts new file mode 100644 index 0000000..54ecc96 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/querystring.d.ts @@ -0,0 +1,141 @@ +/** + * The `node:querystring` module provides utilities for parsing and formatting URL + * query strings. It can be accessed using: + * + * ```js + * const querystring = require('node:querystring'); + * ``` + * + * `querystring` is more performant than `URLSearchParams` but is not a + * standardized API. Use `URLSearchParams` when performance is not critical or + * when compatibility with browser code is desirable. + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/querystring.js) + */ +declare module "querystring" { + interface StringifyOptions { + encodeURIComponent?: ((str: string) => string) | undefined; + } + interface ParseOptions { + maxKeys?: number | undefined; + decodeURIComponent?: ((str: string) => string) | undefined; + } + interface ParsedUrlQuery extends NodeJS.Dict {} + interface ParsedUrlQueryInput extends + NodeJS.Dict< + | string + | number + | boolean + | readonly string[] + | readonly number[] + | readonly boolean[] + | null + > + {} + /** + * The `querystring.stringify()` method produces a URL query string from a + * given `obj` by iterating through the object's "own properties". + * + * It serializes the following types of values passed in `obj`:[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) | + * [number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) | + * [bigint](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt) | + * [boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) | + * [string\[\]](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) | + * [number\[\]](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) | + * [bigint\[\]](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt) | + * [boolean\[\]](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) The numeric values must be finite. Any other input values will be coerced to + * empty strings. + * + * ```js + * querystring.stringify({ foo: 'bar', baz: ['qux', 'quux'], corge: '' }); + * // Returns 'foo=bar&baz=qux&baz=quux&corge=' + * + * querystring.stringify({ foo: 'bar', baz: 'qux' }, ';', ':'); + * // Returns 'foo:bar;baz:qux' + * ``` + * + * By default, characters requiring percent-encoding within the query string will + * be encoded as UTF-8\. If an alternative encoding is required, then an alternative`encodeURIComponent` option will need to be specified: + * + * ```js + * // Assuming gbkEncodeURIComponent function already exists, + * + * querystring.stringify({ w: '中文', foo: 'bar' }, null, null, + * { encodeURIComponent: gbkEncodeURIComponent }); + * ``` + * @since v0.1.25 + * @param obj The object to serialize into a URL query string + * @param [sep='&'] The substring used to delimit key and value pairs in the query string. + * @param [eq='='] . The substring used to delimit keys and values in the query string. + */ + function stringify(obj?: ParsedUrlQueryInput, sep?: string, eq?: string, options?: StringifyOptions): string; + /** + * The `querystring.parse()` method parses a URL query string (`str`) into a + * collection of key and value pairs. + * + * For example, the query string `'foo=bar&abc=xyz&abc=123'` is parsed into: + * + * ```js + * { + * foo: 'bar', + * abc: ['xyz', '123'] + * } + * ``` + * + * The object returned by the `querystring.parse()` method _does not_prototypically inherit from the JavaScript `Object`. This means that typical`Object` methods such as `obj.toString()`, + * `obj.hasOwnProperty()`, and others + * are not defined and _will not work_. + * + * By default, percent-encoded characters within the query string will be assumed + * to use UTF-8 encoding. If an alternative character encoding is used, then an + * alternative `decodeURIComponent` option will need to be specified: + * + * ```js + * // Assuming gbkDecodeURIComponent function already exists... + * + * querystring.parse('w=%D6%D0%CE%C4&foo=bar', null, null, + * { decodeURIComponent: gbkDecodeURIComponent }); + * ``` + * @since v0.1.25 + * @param str The URL query string to parse + * @param [sep='&'] The substring used to delimit key and value pairs in the query string. + * @param [eq='='] . The substring used to delimit keys and values in the query string. + */ + function parse(str: string, sep?: string, eq?: string, options?: ParseOptions): ParsedUrlQuery; + /** + * The querystring.encode() function is an alias for querystring.stringify(). + */ + const encode: typeof stringify; + /** + * The querystring.decode() function is an alias for querystring.parse(). + */ + const decode: typeof parse; + /** + * The `querystring.escape()` method performs URL percent-encoding on the given`str` in a manner that is optimized for the specific requirements of URL + * query strings. + * + * The `querystring.escape()` method is used by `querystring.stringify()` and is + * generally not expected to be used directly. It is exported primarily to allow + * application code to provide a replacement percent-encoding implementation if + * necessary by assigning `querystring.escape` to an alternative function. + * @since v0.1.25 + */ + function escape(str: string): string; + /** + * The `querystring.unescape()` method performs decoding of URL percent-encoded + * characters on the given `str`. + * + * The `querystring.unescape()` method is used by `querystring.parse()` and is + * generally not expected to be used directly. It is exported primarily to allow + * application code to provide a replacement decoding implementation if + * necessary by assigning `querystring.unescape` to an alternative function. + * + * By default, the `querystring.unescape()` method will attempt to use the + * JavaScript built-in `decodeURIComponent()` method to decode. If that fails, + * a safer equivalent that does not throw on malformed URLs will be used. + * @since v0.1.25 + */ + function unescape(str: string): string; +} +declare module "node:querystring" { + export * from "querystring"; +} diff --git a/task/node_modules/@types/node/ts4.8/readline.d.ts b/task/node_modules/@types/node/ts4.8/readline.d.ts new file mode 100644 index 0000000..b06d58b --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/readline.d.ts @@ -0,0 +1,539 @@ +/** + * The `node:readline` module provides an interface for reading data from a `Readable` stream (such as `process.stdin`) one line at a time. + * + * To use the promise-based APIs: + * + * ```js + * import * as readline from 'node:readline/promises'; + * ``` + * + * To use the callback and sync APIs: + * + * ```js + * import * as readline from 'node:readline'; + * ``` + * + * The following simple example illustrates the basic use of the `node:readline`module. + * + * ```js + * import * as readline from 'node:readline/promises'; + * import { stdin as input, stdout as output } from 'node:process'; + * + * const rl = readline.createInterface({ input, output }); + * + * const answer = await rl.question('What do you think of Node.js? '); + * + * console.log(`Thank you for your valuable feedback: ${answer}`); + * + * rl.close(); + * ``` + * + * Once this code is invoked, the Node.js application will not terminate until the`readline.Interface` is closed because the interface waits for data to be + * received on the `input` stream. + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/readline.js) + */ +declare module "readline" { + import { Abortable, EventEmitter } from "node:events"; + import * as promises from "node:readline/promises"; + export { promises }; + export interface Key { + sequence?: string | undefined; + name?: string | undefined; + ctrl?: boolean | undefined; + meta?: boolean | undefined; + shift?: boolean | undefined; + } + /** + * Instances of the `readline.Interface` class are constructed using the`readline.createInterface()` method. Every instance is associated with a + * single `input` `Readable` stream and a single `output` `Writable` stream. + * The `output` stream is used to print prompts for user input that arrives on, + * and is read from, the `input` stream. + * @since v0.1.104 + */ + export class Interface extends EventEmitter { + readonly terminal: boolean; + /** + * The current input data being processed by node. + * + * This can be used when collecting input from a TTY stream to retrieve the + * current value that has been processed thus far, prior to the `line` event + * being emitted. Once the `line` event has been emitted, this property will + * be an empty string. + * + * Be aware that modifying the value during the instance runtime may have + * unintended consequences if `rl.cursor` is not also controlled. + * + * **If not using a TTY stream for input, use the `'line'` event.** + * + * One possible use case would be as follows: + * + * ```js + * const values = ['lorem ipsum', 'dolor sit amet']; + * const rl = readline.createInterface(process.stdin); + * const showResults = debounce(() => { + * console.log( + * '\n', + * values.filter((val) => val.startsWith(rl.line)).join(' '), + * ); + * }, 300); + * process.stdin.on('keypress', (c, k) => { + * showResults(); + * }); + * ``` + * @since v0.1.98 + */ + readonly line: string; + /** + * The cursor position relative to `rl.line`. + * + * This will track where the current cursor lands in the input string, when + * reading input from a TTY stream. The position of cursor determines the + * portion of the input string that will be modified as input is processed, + * as well as the column where the terminal caret will be rendered. + * @since v0.1.98 + */ + readonly cursor: number; + /** + * NOTE: According to the documentation: + * + * > Instances of the `readline.Interface` class are constructed using the + * > `readline.createInterface()` method. + * + * @see https://nodejs.org/dist/latest-v20.x/docs/api/readline.html#class-interfaceconstructor + */ + protected constructor( + input: NodeJS.ReadableStream, + output?: NodeJS.WritableStream, + completer?: Completer | AsyncCompleter, + terminal?: boolean, + ); + /** + * NOTE: According to the documentation: + * + * > Instances of the `readline.Interface` class are constructed using the + * > `readline.createInterface()` method. + * + * @see https://nodejs.org/dist/latest-v20.x/docs/api/readline.html#class-interfaceconstructor + */ + protected constructor(options: ReadLineOptions); + /** + * The `rl.getPrompt()` method returns the current prompt used by `rl.prompt()`. + * @since v15.3.0, v14.17.0 + * @return the current prompt string + */ + getPrompt(): string; + /** + * The `rl.setPrompt()` method sets the prompt that will be written to `output`whenever `rl.prompt()` is called. + * @since v0.1.98 + */ + setPrompt(prompt: string): void; + /** + * The `rl.prompt()` method writes the `Interface` instances configured`prompt` to a new line in `output` in order to provide a user with a new + * location at which to provide input. + * + * When called, `rl.prompt()` will resume the `input` stream if it has been + * paused. + * + * If the `Interface` was created with `output` set to `null` or`undefined` the prompt is not written. + * @since v0.1.98 + * @param preserveCursor If `true`, prevents the cursor placement from being reset to `0`. + */ + prompt(preserveCursor?: boolean): void; + /** + * The `rl.question()` method displays the `query` by writing it to the `output`, + * waits for user input to be provided on `input`, then invokes the `callback`function passing the provided input as the first argument. + * + * When called, `rl.question()` will resume the `input` stream if it has been + * paused. + * + * If the `Interface` was created with `output` set to `null` or`undefined` the `query` is not written. + * + * The `callback` function passed to `rl.question()` does not follow the typical + * pattern of accepting an `Error` object or `null` as the first argument. + * The `callback` is called with the provided answer as the only argument. + * + * An error will be thrown if calling `rl.question()` after `rl.close()`. + * + * Example usage: + * + * ```js + * rl.question('What is your favorite food? ', (answer) => { + * console.log(`Oh, so your favorite food is ${answer}`); + * }); + * ``` + * + * Using an `AbortController` to cancel a question. + * + * ```js + * const ac = new AbortController(); + * const signal = ac.signal; + * + * rl.question('What is your favorite food? ', { signal }, (answer) => { + * console.log(`Oh, so your favorite food is ${answer}`); + * }); + * + * signal.addEventListener('abort', () => { + * console.log('The food question timed out'); + * }, { once: true }); + * + * setTimeout(() => ac.abort(), 10000); + * ``` + * @since v0.3.3 + * @param query A statement or query to write to `output`, prepended to the prompt. + * @param callback A callback function that is invoked with the user's input in response to the `query`. + */ + question(query: string, callback: (answer: string) => void): void; + question(query: string, options: Abortable, callback: (answer: string) => void): void; + /** + * The `rl.pause()` method pauses the `input` stream, allowing it to be resumed + * later if necessary. + * + * Calling `rl.pause()` does not immediately pause other events (including`'line'`) from being emitted by the `Interface` instance. + * @since v0.3.4 + */ + pause(): this; + /** + * The `rl.resume()` method resumes the `input` stream if it has been paused. + * @since v0.3.4 + */ + resume(): this; + /** + * The `rl.close()` method closes the `Interface` instance and + * relinquishes control over the `input` and `output` streams. When called, + * the `'close'` event will be emitted. + * + * Calling `rl.close()` does not immediately stop other events (including `'line'`) + * from being emitted by the `Interface` instance. + * @since v0.1.98 + */ + close(): void; + /** + * The `rl.write()` method will write either `data` or a key sequence identified + * by `key` to the `output`. The `key` argument is supported only if `output` is + * a `TTY` text terminal. See `TTY keybindings` for a list of key + * combinations. + * + * If `key` is specified, `data` is ignored. + * + * When called, `rl.write()` will resume the `input` stream if it has been + * paused. + * + * If the `Interface` was created with `output` set to `null` or`undefined` the `data` and `key` are not written. + * + * ```js + * rl.write('Delete this!'); + * // Simulate Ctrl+U to delete the line written previously + * rl.write(null, { ctrl: true, name: 'u' }); + * ``` + * + * The `rl.write()` method will write the data to the `readline` `Interface`'s`input`_as if it were provided by the user_. + * @since v0.1.98 + */ + write(data: string | Buffer, key?: Key): void; + write(data: undefined | null | string | Buffer, key: Key): void; + /** + * Returns the real position of the cursor in relation to the input + * prompt + string. Long input (wrapping) strings, as well as multiple + * line prompts are included in the calculations. + * @since v13.5.0, v12.16.0 + */ + getCursorPos(): CursorPos; + /** + * events.EventEmitter + * 1. close + * 2. line + * 3. pause + * 4. resume + * 5. SIGCONT + * 6. SIGINT + * 7. SIGTSTP + * 8. history + */ + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "line", listener: (input: string) => void): this; + addListener(event: "pause", listener: () => void): this; + addListener(event: "resume", listener: () => void): this; + addListener(event: "SIGCONT", listener: () => void): this; + addListener(event: "SIGINT", listener: () => void): this; + addListener(event: "SIGTSTP", listener: () => void): this; + addListener(event: "history", listener: (history: string[]) => void): this; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close"): boolean; + emit(event: "line", input: string): boolean; + emit(event: "pause"): boolean; + emit(event: "resume"): boolean; + emit(event: "SIGCONT"): boolean; + emit(event: "SIGINT"): boolean; + emit(event: "SIGTSTP"): boolean; + emit(event: "history", history: string[]): boolean; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "close", listener: () => void): this; + on(event: "line", listener: (input: string) => void): this; + on(event: "pause", listener: () => void): this; + on(event: "resume", listener: () => void): this; + on(event: "SIGCONT", listener: () => void): this; + on(event: "SIGINT", listener: () => void): this; + on(event: "SIGTSTP", listener: () => void): this; + on(event: "history", listener: (history: string[]) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "line", listener: (input: string) => void): this; + once(event: "pause", listener: () => void): this; + once(event: "resume", listener: () => void): this; + once(event: "SIGCONT", listener: () => void): this; + once(event: "SIGINT", listener: () => void): this; + once(event: "SIGTSTP", listener: () => void): this; + once(event: "history", listener: (history: string[]) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "line", listener: (input: string) => void): this; + prependListener(event: "pause", listener: () => void): this; + prependListener(event: "resume", listener: () => void): this; + prependListener(event: "SIGCONT", listener: () => void): this; + prependListener(event: "SIGINT", listener: () => void): this; + prependListener(event: "SIGTSTP", listener: () => void): this; + prependListener(event: "history", listener: (history: string[]) => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "line", listener: (input: string) => void): this; + prependOnceListener(event: "pause", listener: () => void): this; + prependOnceListener(event: "resume", listener: () => void): this; + prependOnceListener(event: "SIGCONT", listener: () => void): this; + prependOnceListener(event: "SIGINT", listener: () => void): this; + prependOnceListener(event: "SIGTSTP", listener: () => void): this; + prependOnceListener(event: "history", listener: (history: string[]) => void): this; + [Symbol.asyncIterator](): AsyncIterableIterator; + } + export type ReadLine = Interface; // type forwarded for backwards compatibility + export type Completer = (line: string) => CompleterResult; + export type AsyncCompleter = ( + line: string, + callback: (err?: null | Error, result?: CompleterResult) => void, + ) => void; + export type CompleterResult = [string[], string]; + export interface ReadLineOptions { + input: NodeJS.ReadableStream; + output?: NodeJS.WritableStream | undefined; + completer?: Completer | AsyncCompleter | undefined; + terminal?: boolean | undefined; + /** + * Initial list of history lines. This option makes sense + * only if `terminal` is set to `true` by the user or by an internal `output` + * check, otherwise the history caching mechanism is not initialized at all. + * @default [] + */ + history?: string[] | undefined; + historySize?: number | undefined; + prompt?: string | undefined; + crlfDelay?: number | undefined; + /** + * If `true`, when a new input line added + * to the history list duplicates an older one, this removes the older line + * from the list. + * @default false + */ + removeHistoryDuplicates?: boolean | undefined; + escapeCodeTimeout?: number | undefined; + tabSize?: number | undefined; + } + /** + * The `readline.createInterface()` method creates a new `readline.Interface`instance. + * + * ```js + * const readline = require('node:readline'); + * const rl = readline.createInterface({ + * input: process.stdin, + * output: process.stdout, + * }); + * ``` + * + * Once the `readline.Interface` instance is created, the most common case is to + * listen for the `'line'` event: + * + * ```js + * rl.on('line', (line) => { + * console.log(`Received: ${line}`); + * }); + * ``` + * + * If `terminal` is `true` for this instance then the `output` stream will get + * the best compatibility if it defines an `output.columns` property and emits + * a `'resize'` event on the `output` if or when the columns ever change + * (`process.stdout` does this automatically when it is a TTY). + * + * When creating a `readline.Interface` using `stdin` as input, the program + * will not terminate until it receives an [EOF character](https://en.wikipedia.org/wiki/End-of-file#EOF_character). To exit without + * waiting for user input, call `process.stdin.unref()`. + * @since v0.1.98 + */ + export function createInterface( + input: NodeJS.ReadableStream, + output?: NodeJS.WritableStream, + completer?: Completer | AsyncCompleter, + terminal?: boolean, + ): Interface; + export function createInterface(options: ReadLineOptions): Interface; + /** + * The `readline.emitKeypressEvents()` method causes the given `Readable` stream to begin emitting `'keypress'` events corresponding to received input. + * + * Optionally, `interface` specifies a `readline.Interface` instance for which + * autocompletion is disabled when copy-pasted input is detected. + * + * If the `stream` is a `TTY`, then it must be in raw mode. + * + * This is automatically called by any readline instance on its `input` if the`input` is a terminal. Closing the `readline` instance does not stop + * the `input` from emitting `'keypress'` events. + * + * ```js + * readline.emitKeypressEvents(process.stdin); + * if (process.stdin.isTTY) + * process.stdin.setRawMode(true); + * ``` + * + * ## Example: Tiny CLI + * + * The following example illustrates the use of `readline.Interface` class to + * implement a small command-line interface: + * + * ```js + * const readline = require('node:readline'); + * const rl = readline.createInterface({ + * input: process.stdin, + * output: process.stdout, + * prompt: 'OHAI> ', + * }); + * + * rl.prompt(); + * + * rl.on('line', (line) => { + * switch (line.trim()) { + * case 'hello': + * console.log('world!'); + * break; + * default: + * console.log(`Say what? I might have heard '${line.trim()}'`); + * break; + * } + * rl.prompt(); + * }).on('close', () => { + * console.log('Have a great day!'); + * process.exit(0); + * }); + * ``` + * + * ## Example: Read file stream line-by-Line + * + * A common use case for `readline` is to consume an input file one line at a + * time. The easiest way to do so is leveraging the `fs.ReadStream` API as + * well as a `for await...of` loop: + * + * ```js + * const fs = require('node:fs'); + * const readline = require('node:readline'); + * + * async function processLineByLine() { + * const fileStream = fs.createReadStream('input.txt'); + * + * const rl = readline.createInterface({ + * input: fileStream, + * crlfDelay: Infinity, + * }); + * // Note: we use the crlfDelay option to recognize all instances of CR LF + * // ('\r\n') in input.txt as a single line break. + * + * for await (const line of rl) { + * // Each line in input.txt will be successively available here as `line`. + * console.log(`Line from file: ${line}`); + * } + * } + * + * processLineByLine(); + * ``` + * + * Alternatively, one could use the `'line'` event: + * + * ```js + * const fs = require('node:fs'); + * const readline = require('node:readline'); + * + * const rl = readline.createInterface({ + * input: fs.createReadStream('sample.txt'), + * crlfDelay: Infinity, + * }); + * + * rl.on('line', (line) => { + * console.log(`Line from file: ${line}`); + * }); + * ``` + * + * Currently, `for await...of` loop can be a bit slower. If `async` / `await`flow and speed are both essential, a mixed approach can be applied: + * + * ```js + * const { once } = require('node:events'); + * const { createReadStream } = require('node:fs'); + * const { createInterface } = require('node:readline'); + * + * (async function processLineByLine() { + * try { + * const rl = createInterface({ + * input: createReadStream('big-file.txt'), + * crlfDelay: Infinity, + * }); + * + * rl.on('line', (line) => { + * // Process the line. + * }); + * + * await once(rl, 'close'); + * + * console.log('File processed.'); + * } catch (err) { + * console.error(err); + * } + * })(); + * ``` + * @since v0.7.7 + */ + export function emitKeypressEvents(stream: NodeJS.ReadableStream, readlineInterface?: Interface): void; + export type Direction = -1 | 0 | 1; + export interface CursorPos { + rows: number; + cols: number; + } + /** + * The `readline.clearLine()` method clears current line of given `TTY` stream + * in a specified direction identified by `dir`. + * @since v0.7.7 + * @param callback Invoked once the operation completes. + * @return `false` if `stream` wishes for the calling code to wait for the `'drain'` event to be emitted before continuing to write additional data; otherwise `true`. + */ + export function clearLine(stream: NodeJS.WritableStream, dir: Direction, callback?: () => void): boolean; + /** + * The `readline.clearScreenDown()` method clears the given `TTY` stream from + * the current position of the cursor down. + * @since v0.7.7 + * @param callback Invoked once the operation completes. + * @return `false` if `stream` wishes for the calling code to wait for the `'drain'` event to be emitted before continuing to write additional data; otherwise `true`. + */ + export function clearScreenDown(stream: NodeJS.WritableStream, callback?: () => void): boolean; + /** + * The `readline.cursorTo()` method moves cursor to the specified position in a + * given `TTY` `stream`. + * @since v0.7.7 + * @param callback Invoked once the operation completes. + * @return `false` if `stream` wishes for the calling code to wait for the `'drain'` event to be emitted before continuing to write additional data; otherwise `true`. + */ + export function cursorTo(stream: NodeJS.WritableStream, x: number, y?: number, callback?: () => void): boolean; + /** + * The `readline.moveCursor()` method moves the cursor _relative_ to its current + * position in a given `TTY` `stream`. + * @since v0.7.7 + * @param callback Invoked once the operation completes. + * @return `false` if `stream` wishes for the calling code to wait for the `'drain'` event to be emitted before continuing to write additional data; otherwise `true`. + */ + export function moveCursor(stream: NodeJS.WritableStream, dx: number, dy: number, callback?: () => void): boolean; +} +declare module "node:readline" { + export * from "readline"; +} diff --git a/task/node_modules/@types/node/ts4.8/readline/promises.d.ts b/task/node_modules/@types/node/ts4.8/readline/promises.d.ts new file mode 100644 index 0000000..73fb111 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/readline/promises.d.ts @@ -0,0 +1,150 @@ +/** + * @since v17.0.0 + * @experimental + */ +declare module "readline/promises" { + import { AsyncCompleter, Completer, Direction, Interface as _Interface, ReadLineOptions } from "node:readline"; + import { Abortable } from "node:events"; + /** + * Instances of the `readlinePromises.Interface` class are constructed using the`readlinePromises.createInterface()` method. Every instance is associated with a + * single `input` `Readable` stream and a single `output` `Writable` stream. + * The `output` stream is used to print prompts for user input that arrives on, + * and is read from, the `input` stream. + * @since v17.0.0 + */ + class Interface extends _Interface { + /** + * The `rl.question()` method displays the `query` by writing it to the `output`, + * waits for user input to be provided on `input`, then invokes the `callback`function passing the provided input as the first argument. + * + * When called, `rl.question()` will resume the `input` stream if it has been + * paused. + * + * If the `Interface` was created with `output` set to `null` or`undefined` the `query` is not written. + * + * If the question is called after `rl.close()`, it returns a rejected promise. + * + * Example usage: + * + * ```js + * const answer = await rl.question('What is your favorite food? '); + * console.log(`Oh, so your favorite food is ${answer}`); + * ``` + * + * Using an `AbortSignal` to cancel a question. + * + * ```js + * const signal = AbortSignal.timeout(10_000); + * + * signal.addEventListener('abort', () => { + * console.log('The food question timed out'); + * }, { once: true }); + * + * const answer = await rl.question('What is your favorite food? ', { signal }); + * console.log(`Oh, so your favorite food is ${answer}`); + * ``` + * @since v17.0.0 + * @param query A statement or query to write to `output`, prepended to the prompt. + * @return A promise that is fulfilled with the user's input in response to the `query`. + */ + question(query: string): Promise; + question(query: string, options: Abortable): Promise; + } + /** + * @since v17.0.0 + */ + class Readline { + /** + * @param stream A TTY stream. + */ + constructor( + stream: NodeJS.WritableStream, + options?: { + autoCommit?: boolean; + }, + ); + /** + * The `rl.clearLine()` method adds to the internal list of pending action an + * action that clears current line of the associated `stream` in a specified + * direction identified by `dir`. + * Call `rl.commit()` to see the effect of this method, unless `autoCommit: true`was passed to the constructor. + * @since v17.0.0 + * @return this + */ + clearLine(dir: Direction): this; + /** + * The `rl.clearScreenDown()` method adds to the internal list of pending action an + * action that clears the associated stream from the current position of the + * cursor down. + * Call `rl.commit()` to see the effect of this method, unless `autoCommit: true`was passed to the constructor. + * @since v17.0.0 + * @return this + */ + clearScreenDown(): this; + /** + * The `rl.commit()` method sends all the pending actions to the associated`stream` and clears the internal list of pending actions. + * @since v17.0.0 + */ + commit(): Promise; + /** + * The `rl.cursorTo()` method adds to the internal list of pending action an action + * that moves cursor to the specified position in the associated `stream`. + * Call `rl.commit()` to see the effect of this method, unless `autoCommit: true`was passed to the constructor. + * @since v17.0.0 + * @return this + */ + cursorTo(x: number, y?: number): this; + /** + * The `rl.moveCursor()` method adds to the internal list of pending action an + * action that moves the cursor _relative_ to its current position in the + * associated `stream`. + * Call `rl.commit()` to see the effect of this method, unless `autoCommit: true`was passed to the constructor. + * @since v17.0.0 + * @return this + */ + moveCursor(dx: number, dy: number): this; + /** + * The `rl.rollback` methods clears the internal list of pending actions without + * sending it to the associated `stream`. + * @since v17.0.0 + * @return this + */ + rollback(): this; + } + /** + * The `readlinePromises.createInterface()` method creates a new `readlinePromises.Interface`instance. + * + * ```js + * const readlinePromises = require('node:readline/promises'); + * const rl = readlinePromises.createInterface({ + * input: process.stdin, + * output: process.stdout, + * }); + * ``` + * + * Once the `readlinePromises.Interface` instance is created, the most common case + * is to listen for the `'line'` event: + * + * ```js + * rl.on('line', (line) => { + * console.log(`Received: ${line}`); + * }); + * ``` + * + * If `terminal` is `true` for this instance then the `output` stream will get + * the best compatibility if it defines an `output.columns` property and emits + * a `'resize'` event on the `output` if or when the columns ever change + * (`process.stdout` does this automatically when it is a TTY). + * @since v17.0.0 + */ + function createInterface( + input: NodeJS.ReadableStream, + output?: NodeJS.WritableStream, + completer?: Completer | AsyncCompleter, + terminal?: boolean, + ): Interface; + function createInterface(options: ReadLineOptions): Interface; +} +declare module "node:readline/promises" { + export * from "readline/promises"; +} diff --git a/task/node_modules/@types/node/ts4.8/repl.d.ts b/task/node_modules/@types/node/ts4.8/repl.d.ts new file mode 100644 index 0000000..6c5f81b --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/repl.d.ts @@ -0,0 +1,430 @@ +/** + * The `node:repl` module provides a Read-Eval-Print-Loop (REPL) implementation + * that is available both as a standalone program or includible in other + * applications. It can be accessed using: + * + * ```js + * const repl = require('node:repl'); + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/repl.js) + */ +declare module "repl" { + import { AsyncCompleter, Completer, Interface } from "node:readline"; + import { Context } from "node:vm"; + import { InspectOptions } from "node:util"; + interface ReplOptions { + /** + * The input prompt to display. + * @default "> " + */ + prompt?: string | undefined; + /** + * The `Readable` stream from which REPL input will be read. + * @default process.stdin + */ + input?: NodeJS.ReadableStream | undefined; + /** + * The `Writable` stream to which REPL output will be written. + * @default process.stdout + */ + output?: NodeJS.WritableStream | undefined; + /** + * If `true`, specifies that the output should be treated as a TTY terminal, and have + * ANSI/VT100 escape codes written to it. + * Default: checking the value of the `isTTY` property on the output stream upon + * instantiation. + */ + terminal?: boolean | undefined; + /** + * The function to be used when evaluating each given line of input. + * Default: an async wrapper for the JavaScript `eval()` function. An `eval` function can + * error with `repl.Recoverable` to indicate the input was incomplete and prompt for + * additional lines. + * + * @see https://nodejs.org/dist/latest-v20.x/docs/api/repl.html#repl_default_evaluation + * @see https://nodejs.org/dist/latest-v20.x/docs/api/repl.html#repl_custom_evaluation_functions + */ + eval?: REPLEval | undefined; + /** + * Defines if the repl prints output previews or not. + * @default `true` Always `false` in case `terminal` is falsy. + */ + preview?: boolean | undefined; + /** + * If `true`, specifies that the default `writer` function should include ANSI color + * styling to REPL output. If a custom `writer` function is provided then this has no + * effect. + * Default: the REPL instance's `terminal` value. + */ + useColors?: boolean | undefined; + /** + * If `true`, specifies that the default evaluation function will use the JavaScript + * `global` as the context as opposed to creating a new separate context for the REPL + * instance. The node CLI REPL sets this value to `true`. + * Default: `false`. + */ + useGlobal?: boolean | undefined; + /** + * If `true`, specifies that the default writer will not output the return value of a + * command if it evaluates to `undefined`. + * Default: `false`. + */ + ignoreUndefined?: boolean | undefined; + /** + * The function to invoke to format the output of each command before writing to `output`. + * Default: a wrapper for `util.inspect`. + * + * @see https://nodejs.org/dist/latest-v20.x/docs/api/repl.html#repl_customizing_repl_output + */ + writer?: REPLWriter | undefined; + /** + * An optional function used for custom Tab auto completion. + * + * @see https://nodejs.org/dist/latest-v20.x/docs/api/readline.html#readline_use_of_the_completer_function + */ + completer?: Completer | AsyncCompleter | undefined; + /** + * A flag that specifies whether the default evaluator executes all JavaScript commands in + * strict mode or default (sloppy) mode. + * Accepted values are: + * - `repl.REPL_MODE_SLOPPY` - evaluates expressions in sloppy mode. + * - `repl.REPL_MODE_STRICT` - evaluates expressions in strict mode. This is equivalent to + * prefacing every repl statement with `'use strict'`. + */ + replMode?: typeof REPL_MODE_SLOPPY | typeof REPL_MODE_STRICT | undefined; + /** + * Stop evaluating the current piece of code when `SIGINT` is received, i.e. `Ctrl+C` is + * pressed. This cannot be used together with a custom `eval` function. + * Default: `false`. + */ + breakEvalOnSigint?: boolean | undefined; + } + type REPLEval = ( + this: REPLServer, + evalCmd: string, + context: Context, + file: string, + cb: (err: Error | null, result: any) => void, + ) => void; + type REPLWriter = (this: REPLServer, obj: any) => string; + /** + * This is the default "writer" value, if none is passed in the REPL options, + * and it can be overridden by custom print functions. + */ + const writer: REPLWriter & { + options: InspectOptions; + }; + type REPLCommandAction = (this: REPLServer, text: string) => void; + interface REPLCommand { + /** + * Help text to be displayed when `.help` is entered. + */ + help?: string | undefined; + /** + * The function to execute, optionally accepting a single string argument. + */ + action: REPLCommandAction; + } + /** + * Instances of `repl.REPLServer` are created using the {@link start} method + * or directly using the JavaScript `new` keyword. + * + * ```js + * const repl = require('node:repl'); + * + * const options = { useColors: true }; + * + * const firstInstance = repl.start(options); + * const secondInstance = new repl.REPLServer(options); + * ``` + * @since v0.1.91 + */ + class REPLServer extends Interface { + /** + * The `vm.Context` provided to the `eval` function to be used for JavaScript + * evaluation. + */ + readonly context: Context; + /** + * @deprecated since v14.3.0 - Use `input` instead. + */ + readonly inputStream: NodeJS.ReadableStream; + /** + * @deprecated since v14.3.0 - Use `output` instead. + */ + readonly outputStream: NodeJS.WritableStream; + /** + * The `Readable` stream from which REPL input will be read. + */ + readonly input: NodeJS.ReadableStream; + /** + * The `Writable` stream to which REPL output will be written. + */ + readonly output: NodeJS.WritableStream; + /** + * The commands registered via `replServer.defineCommand()`. + */ + readonly commands: NodeJS.ReadOnlyDict; + /** + * A value indicating whether the REPL is currently in "editor mode". + * + * @see https://nodejs.org/dist/latest-v20.x/docs/api/repl.html#repl_commands_and_special_keys + */ + readonly editorMode: boolean; + /** + * A value indicating whether the `_` variable has been assigned. + * + * @see https://nodejs.org/dist/latest-v20.x/docs/api/repl.html#repl_assignment_of_the_underscore_variable + */ + readonly underscoreAssigned: boolean; + /** + * The last evaluation result from the REPL (assigned to the `_` variable inside of the REPL). + * + * @see https://nodejs.org/dist/latest-v20.x/docs/api/repl.html#repl_assignment_of_the_underscore_variable + */ + readonly last: any; + /** + * A value indicating whether the `_error` variable has been assigned. + * + * @since v9.8.0 + * @see https://nodejs.org/dist/latest-v20.x/docs/api/repl.html#repl_assignment_of_the_underscore_variable + */ + readonly underscoreErrAssigned: boolean; + /** + * The last error raised inside the REPL (assigned to the `_error` variable inside of the REPL). + * + * @since v9.8.0 + * @see https://nodejs.org/dist/latest-v20.x/docs/api/repl.html#repl_assignment_of_the_underscore_variable + */ + readonly lastError: any; + /** + * Specified in the REPL options, this is the function to be used when evaluating each + * given line of input. If not specified in the REPL options, this is an async wrapper + * for the JavaScript `eval()` function. + */ + readonly eval: REPLEval; + /** + * Specified in the REPL options, this is a value indicating whether the default + * `writer` function should include ANSI color styling to REPL output. + */ + readonly useColors: boolean; + /** + * Specified in the REPL options, this is a value indicating whether the default `eval` + * function will use the JavaScript `global` as the context as opposed to creating a new + * separate context for the REPL instance. + */ + readonly useGlobal: boolean; + /** + * Specified in the REPL options, this is a value indicating whether the default `writer` + * function should output the result of a command if it evaluates to `undefined`. + */ + readonly ignoreUndefined: boolean; + /** + * Specified in the REPL options, this is the function to invoke to format the output of + * each command before writing to `outputStream`. If not specified in the REPL options, + * this will be a wrapper for `util.inspect`. + */ + readonly writer: REPLWriter; + /** + * Specified in the REPL options, this is the function to use for custom Tab auto-completion. + */ + readonly completer: Completer | AsyncCompleter; + /** + * Specified in the REPL options, this is a flag that specifies whether the default `eval` + * function should execute all JavaScript commands in strict mode or default (sloppy) mode. + * Possible values are: + * - `repl.REPL_MODE_SLOPPY` - evaluates expressions in sloppy mode. + * - `repl.REPL_MODE_STRICT` - evaluates expressions in strict mode. This is equivalent to + * prefacing every repl statement with `'use strict'`. + */ + readonly replMode: typeof REPL_MODE_SLOPPY | typeof REPL_MODE_STRICT; + /** + * NOTE: According to the documentation: + * + * > Instances of `repl.REPLServer` are created using the `repl.start()` method and + * > _should not_ be created directly using the JavaScript `new` keyword. + * + * `REPLServer` cannot be subclassed due to implementation specifics in NodeJS. + * + * @see https://nodejs.org/dist/latest-v20.x/docs/api/repl.html#repl_class_replserver + */ + private constructor(); + /** + * The `replServer.defineCommand()` method is used to add new `.`\-prefixed commands + * to the REPL instance. Such commands are invoked by typing a `.` followed by the`keyword`. The `cmd` is either a `Function` or an `Object` with the following + * properties: + * + * The following example shows two new commands added to the REPL instance: + * + * ```js + * const repl = require('node:repl'); + * + * const replServer = repl.start({ prompt: '> ' }); + * replServer.defineCommand('sayhello', { + * help: 'Say hello', + * action(name) { + * this.clearBufferedCommand(); + * console.log(`Hello, ${name}!`); + * this.displayPrompt(); + * }, + * }); + * replServer.defineCommand('saybye', function saybye() { + * console.log('Goodbye!'); + * this.close(); + * }); + * ``` + * + * The new commands can then be used from within the REPL instance: + * + * ```console + * > .sayhello Node.js User + * Hello, Node.js User! + * > .saybye + * Goodbye! + * ``` + * @since v0.3.0 + * @param keyword The command keyword (_without_ a leading `.` character). + * @param cmd The function to invoke when the command is processed. + */ + defineCommand(keyword: string, cmd: REPLCommandAction | REPLCommand): void; + /** + * The `replServer.displayPrompt()` method readies the REPL instance for input + * from the user, printing the configured `prompt` to a new line in the `output`and resuming the `input` to accept new input. + * + * When multi-line input is being entered, an ellipsis is printed rather than the + * 'prompt'. + * + * When `preserveCursor` is `true`, the cursor placement will not be reset to `0`. + * + * The `replServer.displayPrompt` method is primarily intended to be called from + * within the action function for commands registered using the`replServer.defineCommand()` method. + * @since v0.1.91 + */ + displayPrompt(preserveCursor?: boolean): void; + /** + * The `replServer.clearBufferedCommand()` method clears any command that has been + * buffered but not yet executed. This method is primarily intended to be + * called from within the action function for commands registered using the`replServer.defineCommand()` method. + * @since v9.0.0 + */ + clearBufferedCommand(): void; + /** + * Initializes a history log file for the REPL instance. When executing the + * Node.js binary and using the command-line REPL, a history file is initialized + * by default. However, this is not the case when creating a REPL + * programmatically. Use this method to initialize a history log file when working + * with REPL instances programmatically. + * @since v11.10.0 + * @param historyPath the path to the history file + * @param callback called when history writes are ready or upon error + */ + setupHistory(path: string, callback: (err: Error | null, repl: this) => void): void; + /** + * events.EventEmitter + * 1. close - inherited from `readline.Interface` + * 2. line - inherited from `readline.Interface` + * 3. pause - inherited from `readline.Interface` + * 4. resume - inherited from `readline.Interface` + * 5. SIGCONT - inherited from `readline.Interface` + * 6. SIGINT - inherited from `readline.Interface` + * 7. SIGTSTP - inherited from `readline.Interface` + * 8. exit + * 9. reset + */ + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "line", listener: (input: string) => void): this; + addListener(event: "pause", listener: () => void): this; + addListener(event: "resume", listener: () => void): this; + addListener(event: "SIGCONT", listener: () => void): this; + addListener(event: "SIGINT", listener: () => void): this; + addListener(event: "SIGTSTP", listener: () => void): this; + addListener(event: "exit", listener: () => void): this; + addListener(event: "reset", listener: (context: Context) => void): this; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close"): boolean; + emit(event: "line", input: string): boolean; + emit(event: "pause"): boolean; + emit(event: "resume"): boolean; + emit(event: "SIGCONT"): boolean; + emit(event: "SIGINT"): boolean; + emit(event: "SIGTSTP"): boolean; + emit(event: "exit"): boolean; + emit(event: "reset", context: Context): boolean; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "close", listener: () => void): this; + on(event: "line", listener: (input: string) => void): this; + on(event: "pause", listener: () => void): this; + on(event: "resume", listener: () => void): this; + on(event: "SIGCONT", listener: () => void): this; + on(event: "SIGINT", listener: () => void): this; + on(event: "SIGTSTP", listener: () => void): this; + on(event: "exit", listener: () => void): this; + on(event: "reset", listener: (context: Context) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "line", listener: (input: string) => void): this; + once(event: "pause", listener: () => void): this; + once(event: "resume", listener: () => void): this; + once(event: "SIGCONT", listener: () => void): this; + once(event: "SIGINT", listener: () => void): this; + once(event: "SIGTSTP", listener: () => void): this; + once(event: "exit", listener: () => void): this; + once(event: "reset", listener: (context: Context) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "line", listener: (input: string) => void): this; + prependListener(event: "pause", listener: () => void): this; + prependListener(event: "resume", listener: () => void): this; + prependListener(event: "SIGCONT", listener: () => void): this; + prependListener(event: "SIGINT", listener: () => void): this; + prependListener(event: "SIGTSTP", listener: () => void): this; + prependListener(event: "exit", listener: () => void): this; + prependListener(event: "reset", listener: (context: Context) => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "line", listener: (input: string) => void): this; + prependOnceListener(event: "pause", listener: () => void): this; + prependOnceListener(event: "resume", listener: () => void): this; + prependOnceListener(event: "SIGCONT", listener: () => void): this; + prependOnceListener(event: "SIGINT", listener: () => void): this; + prependOnceListener(event: "SIGTSTP", listener: () => void): this; + prependOnceListener(event: "exit", listener: () => void): this; + prependOnceListener(event: "reset", listener: (context: Context) => void): this; + } + /** + * A flag passed in the REPL options. Evaluates expressions in sloppy mode. + */ + const REPL_MODE_SLOPPY: unique symbol; + /** + * A flag passed in the REPL options. Evaluates expressions in strict mode. + * This is equivalent to prefacing every repl statement with `'use strict'`. + */ + const REPL_MODE_STRICT: unique symbol; + /** + * The `repl.start()` method creates and starts a {@link REPLServer} instance. + * + * If `options` is a string, then it specifies the input prompt: + * + * ```js + * const repl = require('node:repl'); + * + * // a Unix style prompt + * repl.start('$ '); + * ``` + * @since v0.1.91 + */ + function start(options?: string | ReplOptions): REPLServer; + /** + * Indicates a recoverable error that a `REPLServer` can use to support multi-line input. + * + * @see https://nodejs.org/dist/latest-v20.x/docs/api/repl.html#repl_recoverable_errors + */ + class Recoverable extends SyntaxError { + err: Error; + constructor(err: Error); + } +} +declare module "node:repl" { + export * from "repl"; +} diff --git a/task/node_modules/@types/node/ts4.8/stream.d.ts b/task/node_modules/@types/node/ts4.8/stream.d.ts new file mode 100644 index 0000000..15c633f --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/stream.d.ts @@ -0,0 +1,1701 @@ +/** + * A stream is an abstract interface for working with streaming data in Node.js. + * The `node:stream` module provides an API for implementing the stream interface. + * + * There are many stream objects provided by Node.js. For instance, a `request to an HTTP server` and `process.stdout` are both stream instances. + * + * Streams can be readable, writable, or both. All streams are instances of `EventEmitter`. + * + * To access the `node:stream` module: + * + * ```js + * const stream = require('node:stream'); + * ``` + * + * The `node:stream` module is useful for creating new types of stream instances. + * It is usually not necessary to use the `node:stream` module to consume streams. + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/stream.js) + */ +declare module "stream" { + import { Abortable, EventEmitter } from "node:events"; + import { Blob as NodeBlob } from "node:buffer"; + import * as streamPromises from "node:stream/promises"; + import * as streamConsumers from "node:stream/consumers"; + import * as streamWeb from "node:stream/web"; + + type ComposeFnParam = (source: any) => void; + + class internal extends EventEmitter { + pipe( + destination: T, + options?: { + end?: boolean | undefined; + }, + ): T; + compose( + stream: T | ComposeFnParam | Iterable | AsyncIterable, + options?: { signal: AbortSignal }, + ): T; + } + import Stream = internal.Stream; + import Readable = internal.Readable; + import ReadableOptions = internal.ReadableOptions; + interface ArrayOptions { + /** the maximum concurrent invocations of `fn` to call on the stream at once. **Default: 1**. */ + concurrency?: number; + /** allows destroying the stream if the signal is aborted. */ + signal?: AbortSignal; + } + class ReadableBase extends Stream implements NodeJS.ReadableStream { + /** + * A utility method for creating Readable Streams out of iterators. + */ + static from(iterable: Iterable | AsyncIterable, options?: ReadableOptions): Readable; + /** + * Returns whether the stream has been read from or cancelled. + * @since v16.8.0 + */ + static isDisturbed(stream: Readable | NodeJS.ReadableStream): boolean; + /** + * Returns whether the stream was destroyed or errored before emitting `'end'`. + * @since v16.8.0 + * @experimental + */ + readonly readableAborted: boolean; + /** + * Is `true` if it is safe to call `readable.read()`, which means + * the stream has not been destroyed or emitted `'error'` or `'end'`. + * @since v11.4.0 + */ + readable: boolean; + /** + * Returns whether `'data'` has been emitted. + * @since v16.7.0, v14.18.0 + * @experimental + */ + readonly readableDidRead: boolean; + /** + * Getter for the property `encoding` of a given `Readable` stream. The `encoding`property can be set using the `readable.setEncoding()` method. + * @since v12.7.0 + */ + readonly readableEncoding: BufferEncoding | null; + /** + * Becomes `true` when `'end'` event is emitted. + * @since v12.9.0 + */ + readonly readableEnded: boolean; + /** + * This property reflects the current state of a `Readable` stream as described + * in the `Three states` section. + * @since v9.4.0 + */ + readonly readableFlowing: boolean | null; + /** + * Returns the value of `highWaterMark` passed when creating this `Readable`. + * @since v9.3.0 + */ + readonly readableHighWaterMark: number; + /** + * This property contains the number of bytes (or objects) in the queue + * ready to be read. The value provides introspection data regarding + * the status of the `highWaterMark`. + * @since v9.4.0 + */ + readonly readableLength: number; + /** + * Getter for the property `objectMode` of a given `Readable` stream. + * @since v12.3.0 + */ + readonly readableObjectMode: boolean; + /** + * Is `true` after `readable.destroy()` has been called. + * @since v8.0.0 + */ + destroyed: boolean; + /** + * Is `true` after `'close'` has been emitted. + * @since v18.0.0 + */ + readonly closed: boolean; + /** + * Returns error if the stream has been destroyed with an error. + * @since v18.0.0 + */ + readonly errored: Error | null; + constructor(opts?: ReadableOptions); + _construct?(callback: (error?: Error | null) => void): void; + _read(size: number): void; + /** + * The `readable.read()` method reads data out of the internal buffer and + * returns it. If no data is available to be read, `null` is returned. By default, + * the data is returned as a `Buffer` object unless an encoding has been + * specified using the `readable.setEncoding()` method or the stream is operating + * in object mode. + * + * The optional `size` argument specifies a specific number of bytes to read. If`size` bytes are not available to be read, `null` will be returned _unless_the stream has ended, in which + * case all of the data remaining in the internal + * buffer will be returned. + * + * If the `size` argument is not specified, all of the data contained in the + * internal buffer will be returned. + * + * The `size` argument must be less than or equal to 1 GiB. + * + * The `readable.read()` method should only be called on `Readable` streams + * operating in paused mode. In flowing mode, `readable.read()` is called + * automatically until the internal buffer is fully drained. + * + * ```js + * const readable = getReadableStreamSomehow(); + * + * // 'readable' may be triggered multiple times as data is buffered in + * readable.on('readable', () => { + * let chunk; + * console.log('Stream is readable (new data received in buffer)'); + * // Use a loop to make sure we read all currently available data + * while (null !== (chunk = readable.read())) { + * console.log(`Read ${chunk.length} bytes of data...`); + * } + * }); + * + * // 'end' will be triggered once when there is no more data available + * readable.on('end', () => { + * console.log('Reached end of stream.'); + * }); + * ``` + * + * Each call to `readable.read()` returns a chunk of data, or `null`. The chunks + * are not concatenated. A `while` loop is necessary to consume all data + * currently in the buffer. When reading a large file `.read()` may return `null`, + * having consumed all buffered content so far, but there is still more data to + * come not yet buffered. In this case a new `'readable'` event will be emitted + * when there is more data in the buffer. Finally the `'end'` event will be + * emitted when there is no more data to come. + * + * Therefore to read a file's whole contents from a `readable`, it is necessary + * to collect chunks across multiple `'readable'` events: + * + * ```js + * const chunks = []; + * + * readable.on('readable', () => { + * let chunk; + * while (null !== (chunk = readable.read())) { + * chunks.push(chunk); + * } + * }); + * + * readable.on('end', () => { + * const content = chunks.join(''); + * }); + * ``` + * + * A `Readable` stream in object mode will always return a single item from + * a call to `readable.read(size)`, regardless of the value of the`size` argument. + * + * If the `readable.read()` method returns a chunk of data, a `'data'` event will + * also be emitted. + * + * Calling {@link read} after the `'end'` event has + * been emitted will return `null`. No runtime error will be raised. + * @since v0.9.4 + * @param size Optional argument to specify how much data to read. + */ + read(size?: number): any; + /** + * The `readable.setEncoding()` method sets the character encoding for + * data read from the `Readable` stream. + * + * By default, no encoding is assigned and stream data will be returned as`Buffer` objects. Setting an encoding causes the stream data + * to be returned as strings of the specified encoding rather than as `Buffer`objects. For instance, calling `readable.setEncoding('utf8')` will cause the + * output data to be interpreted as UTF-8 data, and passed as strings. Calling`readable.setEncoding('hex')` will cause the data to be encoded in hexadecimal + * string format. + * + * The `Readable` stream will properly handle multi-byte characters delivered + * through the stream that would otherwise become improperly decoded if simply + * pulled from the stream as `Buffer` objects. + * + * ```js + * const readable = getReadableStreamSomehow(); + * readable.setEncoding('utf8'); + * readable.on('data', (chunk) => { + * assert.equal(typeof chunk, 'string'); + * console.log('Got %d characters of string data:', chunk.length); + * }); + * ``` + * @since v0.9.4 + * @param encoding The encoding to use. + */ + setEncoding(encoding: BufferEncoding): this; + /** + * The `readable.pause()` method will cause a stream in flowing mode to stop + * emitting `'data'` events, switching out of flowing mode. Any data that + * becomes available will remain in the internal buffer. + * + * ```js + * const readable = getReadableStreamSomehow(); + * readable.on('data', (chunk) => { + * console.log(`Received ${chunk.length} bytes of data.`); + * readable.pause(); + * console.log('There will be no additional data for 1 second.'); + * setTimeout(() => { + * console.log('Now data will start flowing again.'); + * readable.resume(); + * }, 1000); + * }); + * ``` + * + * The `readable.pause()` method has no effect if there is a `'readable'`event listener. + * @since v0.9.4 + */ + pause(): this; + /** + * The `readable.resume()` method causes an explicitly paused `Readable` stream to + * resume emitting `'data'` events, switching the stream into flowing mode. + * + * The `readable.resume()` method can be used to fully consume the data from a + * stream without actually processing any of that data: + * + * ```js + * getReadableStreamSomehow() + * .resume() + * .on('end', () => { + * console.log('Reached the end, but did not read anything.'); + * }); + * ``` + * + * The `readable.resume()` method has no effect if there is a `'readable'`event listener. + * @since v0.9.4 + */ + resume(): this; + /** + * The `readable.isPaused()` method returns the current operating state of the`Readable`. This is used primarily by the mechanism that underlies the`readable.pipe()` method. In most + * typical cases, there will be no reason to + * use this method directly. + * + * ```js + * const readable = new stream.Readable(); + * + * readable.isPaused(); // === false + * readable.pause(); + * readable.isPaused(); // === true + * readable.resume(); + * readable.isPaused(); // === false + * ``` + * @since v0.11.14 + */ + isPaused(): boolean; + /** + * The `readable.unpipe()` method detaches a `Writable` stream previously attached + * using the {@link pipe} method. + * + * If the `destination` is not specified, then _all_ pipes are detached. + * + * If the `destination` is specified, but no pipe is set up for it, then + * the method does nothing. + * + * ```js + * const fs = require('node:fs'); + * const readable = getReadableStreamSomehow(); + * const writable = fs.createWriteStream('file.txt'); + * // All the data from readable goes into 'file.txt', + * // but only for the first second. + * readable.pipe(writable); + * setTimeout(() => { + * console.log('Stop writing to file.txt.'); + * readable.unpipe(writable); + * console.log('Manually close the file stream.'); + * writable.end(); + * }, 1000); + * ``` + * @since v0.9.4 + * @param destination Optional specific stream to unpipe + */ + unpipe(destination?: NodeJS.WritableStream): this; + /** + * Passing `chunk` as `null` signals the end of the stream (EOF) and behaves the + * same as `readable.push(null)`, after which no more data can be written. The EOF + * signal is put at the end of the buffer and any buffered data will still be + * flushed. + * + * The `readable.unshift()` method pushes a chunk of data back into the internal + * buffer. This is useful in certain situations where a stream is being consumed by + * code that needs to "un-consume" some amount of data that it has optimistically + * pulled out of the source, so that the data can be passed on to some other party. + * + * The `stream.unshift(chunk)` method cannot be called after the `'end'` event + * has been emitted or a runtime error will be thrown. + * + * Developers using `stream.unshift()` often should consider switching to + * use of a `Transform` stream instead. See the `API for stream implementers` section for more information. + * + * ```js + * // Pull off a header delimited by \n\n. + * // Use unshift() if we get too much. + * // Call the callback with (error, header, stream). + * const { StringDecoder } = require('node:string_decoder'); + * function parseHeader(stream, callback) { + * stream.on('error', callback); + * stream.on('readable', onReadable); + * const decoder = new StringDecoder('utf8'); + * let header = ''; + * function onReadable() { + * let chunk; + * while (null !== (chunk = stream.read())) { + * const str = decoder.write(chunk); + * if (str.includes('\n\n')) { + * // Found the header boundary. + * const split = str.split(/\n\n/); + * header += split.shift(); + * const remaining = split.join('\n\n'); + * const buf = Buffer.from(remaining, 'utf8'); + * stream.removeListener('error', callback); + * // Remove the 'readable' listener before unshifting. + * stream.removeListener('readable', onReadable); + * if (buf.length) + * stream.unshift(buf); + * // Now the body of the message can be read from the stream. + * callback(null, header, stream); + * return; + * } + * // Still reading the header. + * header += str; + * } + * } + * } + * ``` + * + * Unlike {@link push}, `stream.unshift(chunk)` will not + * end the reading process by resetting the internal reading state of the stream. + * This can cause unexpected results if `readable.unshift()` is called during a + * read (i.e. from within a {@link _read} implementation on a + * custom stream). Following the call to `readable.unshift()` with an immediate {@link push} will reset the reading state appropriately, + * however it is best to simply avoid calling `readable.unshift()` while in the + * process of performing a read. + * @since v0.9.11 + * @param chunk Chunk of data to unshift onto the read queue. For streams not operating in object mode, `chunk` must be a string, `Buffer`, `Uint8Array`, or `null`. For object mode + * streams, `chunk` may be any JavaScript value. + * @param encoding Encoding of string chunks. Must be a valid `Buffer` encoding, such as `'utf8'` or `'ascii'`. + */ + unshift(chunk: any, encoding?: BufferEncoding): void; + /** + * Prior to Node.js 0.10, streams did not implement the entire `node:stream`module API as it is currently defined. (See `Compatibility` for more + * information.) + * + * When using an older Node.js library that emits `'data'` events and has a {@link pause} method that is advisory only, the`readable.wrap()` method can be used to create a `Readable` + * stream that uses + * the old stream as its data source. + * + * It will rarely be necessary to use `readable.wrap()` but the method has been + * provided as a convenience for interacting with older Node.js applications and + * libraries. + * + * ```js + * const { OldReader } = require('./old-api-module.js'); + * const { Readable } = require('node:stream'); + * const oreader = new OldReader(); + * const myReader = new Readable().wrap(oreader); + * + * myReader.on('readable', () => { + * myReader.read(); // etc. + * }); + * ``` + * @since v0.9.4 + * @param stream An "old style" readable stream + */ + wrap(stream: NodeJS.ReadableStream): this; + push(chunk: any, encoding?: BufferEncoding): boolean; + /** + * The iterator created by this method gives users the option to cancel the destruction + * of the stream if the `for await...of` loop is exited by `return`, `break`, or `throw`, + * or if the iterator should destroy the stream if the stream emitted an error during iteration. + * @since v16.3.0 + * @param options.destroyOnReturn When set to `false`, calling `return` on the async iterator, + * or exiting a `for await...of` iteration using a `break`, `return`, or `throw` will not destroy the stream. + * **Default: `true`**. + */ + iterator(options?: { destroyOnReturn?: boolean }): AsyncIterableIterator; + /** + * This method allows mapping over the stream. The *fn* function will be called for every chunk in the stream. + * If the *fn* function returns a promise - that promise will be `await`ed before being passed to the result stream. + * @since v17.4.0, v16.14.0 + * @param fn a function to map over every chunk in the stream. Async or not. + * @returns a stream mapped with the function *fn*. + */ + map(fn: (data: any, options?: Pick) => any, options?: ArrayOptions): Readable; + /** + * This method allows filtering the stream. For each chunk in the stream the *fn* function will be called + * and if it returns a truthy value, the chunk will be passed to the result stream. + * If the *fn* function returns a promise - that promise will be `await`ed. + * @since v17.4.0, v16.14.0 + * @param fn a function to filter chunks from the stream. Async or not. + * @returns a stream filtered with the predicate *fn*. + */ + filter( + fn: (data: any, options?: Pick) => boolean | Promise, + options?: ArrayOptions, + ): Readable; + /** + * This method allows iterating a stream. For each chunk in the stream the *fn* function will be called. + * If the *fn* function returns a promise - that promise will be `await`ed. + * + * This method is different from `for await...of` loops in that it can optionally process chunks concurrently. + * In addition, a `forEach` iteration can only be stopped by having passed a `signal` option + * and aborting the related AbortController while `for await...of` can be stopped with `break` or `return`. + * In either case the stream will be destroyed. + * + * This method is different from listening to the `'data'` event in that it uses the `readable` event + * in the underlying machinary and can limit the number of concurrent *fn* calls. + * @since v17.5.0 + * @param fn a function to call on each chunk of the stream. Async or not. + * @returns a promise for when the stream has finished. + */ + forEach( + fn: (data: any, options?: Pick) => void | Promise, + options?: ArrayOptions, + ): Promise; + /** + * This method allows easily obtaining the contents of a stream. + * + * As this method reads the entire stream into memory, it negates the benefits of streams. It's intended + * for interoperability and convenience, not as the primary way to consume streams. + * @since v17.5.0 + * @returns a promise containing an array with the contents of the stream. + */ + toArray(options?: Pick): Promise; + /** + * This method is similar to `Array.prototype.some` and calls *fn* on each chunk in the stream + * until the awaited return value is `true` (or any truthy value). Once an *fn* call on a chunk + * `await`ed return value is truthy, the stream is destroyed and the promise is fulfilled with `true`. + * If none of the *fn* calls on the chunks return a truthy value, the promise is fulfilled with `false`. + * @since v17.5.0 + * @param fn a function to call on each chunk of the stream. Async or not. + * @returns a promise evaluating to `true` if *fn* returned a truthy value for at least one of the chunks. + */ + some( + fn: (data: any, options?: Pick) => boolean | Promise, + options?: ArrayOptions, + ): Promise; + /** + * This method is similar to `Array.prototype.find` and calls *fn* on each chunk in the stream + * to find a chunk with a truthy value for *fn*. Once an *fn* call's awaited return value is truthy, + * the stream is destroyed and the promise is fulfilled with value for which *fn* returned a truthy value. + * If all of the *fn* calls on the chunks return a falsy value, the promise is fulfilled with `undefined`. + * @since v17.5.0 + * @param fn a function to call on each chunk of the stream. Async or not. + * @returns a promise evaluating to the first chunk for which *fn* evaluated with a truthy value, + * or `undefined` if no element was found. + */ + find( + fn: (data: any, options?: Pick) => data is T, + options?: ArrayOptions, + ): Promise; + find( + fn: (data: any, options?: Pick) => boolean | Promise, + options?: ArrayOptions, + ): Promise; + /** + * This method is similar to `Array.prototype.every` and calls *fn* on each chunk in the stream + * to check if all awaited return values are truthy value for *fn*. Once an *fn* call on a chunk + * `await`ed return value is falsy, the stream is destroyed and the promise is fulfilled with `false`. + * If all of the *fn* calls on the chunks return a truthy value, the promise is fulfilled with `true`. + * @since v17.5.0 + * @param fn a function to call on each chunk of the stream. Async or not. + * @returns a promise evaluating to `true` if *fn* returned a truthy value for every one of the chunks. + */ + every( + fn: (data: any, options?: Pick) => boolean | Promise, + options?: ArrayOptions, + ): Promise; + /** + * This method returns a new stream by applying the given callback to each chunk of the stream + * and then flattening the result. + * + * It is possible to return a stream or another iterable or async iterable from *fn* and the result streams + * will be merged (flattened) into the returned stream. + * @since v17.5.0 + * @param fn a function to map over every chunk in the stream. May be async. May be a stream or generator. + * @returns a stream flat-mapped with the function *fn*. + */ + flatMap(fn: (data: any, options?: Pick) => any, options?: ArrayOptions): Readable; + /** + * This method returns a new stream with the first *limit* chunks dropped from the start. + * @since v17.5.0 + * @param limit the number of chunks to drop from the readable. + * @returns a stream with *limit* chunks dropped from the start. + */ + drop(limit: number, options?: Pick): Readable; + /** + * This method returns a new stream with the first *limit* chunks. + * @since v17.5.0 + * @param limit the number of chunks to take from the readable. + * @returns a stream with *limit* chunks taken. + */ + take(limit: number, options?: Pick): Readable; + /** + * This method returns a new stream with chunks of the underlying stream paired with a counter + * in the form `[index, chunk]`. The first index value is `0` and it increases by 1 for each chunk produced. + * @since v17.5.0 + * @returns a stream of indexed pairs. + */ + asIndexedPairs(options?: Pick): Readable; + /** + * This method calls *fn* on each chunk of the stream in order, passing it the result from the calculation + * on the previous element. It returns a promise for the final value of the reduction. + * + * If no *initial* value is supplied the first chunk of the stream is used as the initial value. + * If the stream is empty, the promise is rejected with a `TypeError` with the `ERR_INVALID_ARGS` code property. + * + * The reducer function iterates the stream element-by-element which means that there is no *concurrency* parameter + * or parallelism. To perform a reduce concurrently, you can extract the async function to `readable.map` method. + * @since v17.5.0 + * @param fn a reducer function to call over every chunk in the stream. Async or not. + * @param initial the initial value to use in the reduction. + * @returns a promise for the final value of the reduction. + */ + reduce( + fn: (previous: any, data: any, options?: Pick) => T, + initial?: undefined, + options?: Pick, + ): Promise; + reduce( + fn: (previous: T, data: any, options?: Pick) => T, + initial: T, + options?: Pick, + ): Promise; + _destroy(error: Error | null, callback: (error?: Error | null) => void): void; + /** + * Destroy the stream. Optionally emit an `'error'` event, and emit a `'close'`event (unless `emitClose` is set to `false`). After this call, the readable + * stream will release any internal resources and subsequent calls to `push()`will be ignored. + * + * Once `destroy()` has been called any further calls will be a no-op and no + * further errors except from `_destroy()` may be emitted as `'error'`. + * + * Implementors should not override this method, but instead implement `readable._destroy()`. + * @since v8.0.0 + * @param error Error which will be passed as payload in `'error'` event + */ + destroy(error?: Error): this; + /** + * Event emitter + * The defined events on documents including: + * 1. close + * 2. data + * 3. end + * 4. error + * 5. pause + * 6. readable + * 7. resume + */ + addListener(event: "close", listener: () => void): this; + addListener(event: "data", listener: (chunk: any) => void): this; + addListener(event: "end", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "pause", listener: () => void): this; + addListener(event: "readable", listener: () => void): this; + addListener(event: "resume", listener: () => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + emit(event: "close"): boolean; + emit(event: "data", chunk: any): boolean; + emit(event: "end"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "pause"): boolean; + emit(event: "readable"): boolean; + emit(event: "resume"): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on(event: "close", listener: () => void): this; + on(event: "data", listener: (chunk: any) => void): this; + on(event: "end", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "pause", listener: () => void): this; + on(event: "readable", listener: () => void): this; + on(event: "resume", listener: () => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "data", listener: (chunk: any) => void): this; + once(event: "end", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "pause", listener: () => void): this; + once(event: "readable", listener: () => void): this; + once(event: "resume", listener: () => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "data", listener: (chunk: any) => void): this; + prependListener(event: "end", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "pause", listener: () => void): this; + prependListener(event: "readable", listener: () => void): this; + prependListener(event: "resume", listener: () => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "data", listener: (chunk: any) => void): this; + prependOnceListener(event: "end", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "pause", listener: () => void): this; + prependOnceListener(event: "readable", listener: () => void): this; + prependOnceListener(event: "resume", listener: () => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + removeListener(event: "close", listener: () => void): this; + removeListener(event: "data", listener: (chunk: any) => void): this; + removeListener(event: "end", listener: () => void): this; + removeListener(event: "error", listener: (err: Error) => void): this; + removeListener(event: "pause", listener: () => void): this; + removeListener(event: "readable", listener: () => void): this; + removeListener(event: "resume", listener: () => void): this; + removeListener(event: string | symbol, listener: (...args: any[]) => void): this; + [Symbol.asyncIterator](): AsyncIterableIterator; + /** + * Calls `readable.destroy()` with an `AbortError` and returns a promise that fulfills when the stream is finished. + * @since v20.4.0 + */ + [Symbol.asyncDispose](): Promise; + } + import WritableOptions = internal.WritableOptions; + class WritableBase extends Stream implements NodeJS.WritableStream { + /** + * Is `true` if it is safe to call `writable.write()`, which means + * the stream has not been destroyed, errored, or ended. + * @since v11.4.0 + */ + readonly writable: boolean; + /** + * Is `true` after `writable.end()` has been called. This property + * does not indicate whether the data has been flushed, for this use `writable.writableFinished` instead. + * @since v12.9.0 + */ + readonly writableEnded: boolean; + /** + * Is set to `true` immediately before the `'finish'` event is emitted. + * @since v12.6.0 + */ + readonly writableFinished: boolean; + /** + * Return the value of `highWaterMark` passed when creating this `Writable`. + * @since v9.3.0 + */ + readonly writableHighWaterMark: number; + /** + * This property contains the number of bytes (or objects) in the queue + * ready to be written. The value provides introspection data regarding + * the status of the `highWaterMark`. + * @since v9.4.0 + */ + readonly writableLength: number; + /** + * Getter for the property `objectMode` of a given `Writable` stream. + * @since v12.3.0 + */ + readonly writableObjectMode: boolean; + /** + * Number of times `writable.uncork()` needs to be + * called in order to fully uncork the stream. + * @since v13.2.0, v12.16.0 + */ + readonly writableCorked: number; + /** + * Is `true` after `writable.destroy()` has been called. + * @since v8.0.0 + */ + destroyed: boolean; + /** + * Is `true` after `'close'` has been emitted. + * @since v18.0.0 + */ + readonly closed: boolean; + /** + * Returns error if the stream has been destroyed with an error. + * @since v18.0.0 + */ + readonly errored: Error | null; + /** + * Is `true` if the stream's buffer has been full and stream will emit `'drain'`. + * @since v15.2.0, v14.17.0 + */ + readonly writableNeedDrain: boolean; + constructor(opts?: WritableOptions); + _write(chunk: any, encoding: BufferEncoding, callback: (error?: Error | null) => void): void; + _writev?( + chunks: Array<{ + chunk: any; + encoding: BufferEncoding; + }>, + callback: (error?: Error | null) => void, + ): void; + _construct?(callback: (error?: Error | null) => void): void; + _destroy(error: Error | null, callback: (error?: Error | null) => void): void; + _final(callback: (error?: Error | null) => void): void; + /** + * The `writable.write()` method writes some data to the stream, and calls the + * supplied `callback` once the data has been fully handled. If an error + * occurs, the `callback` will be called with the error as its + * first argument. The `callback` is called asynchronously and before `'error'` is + * emitted. + * + * The return value is `true` if the internal buffer is less than the`highWaterMark` configured when the stream was created after admitting `chunk`. + * If `false` is returned, further attempts to write data to the stream should + * stop until the `'drain'` event is emitted. + * + * While a stream is not draining, calls to `write()` will buffer `chunk`, and + * return false. Once all currently buffered chunks are drained (accepted for + * delivery by the operating system), the `'drain'` event will be emitted. + * Once `write()` returns false, do not write more chunks + * until the `'drain'` event is emitted. While calling `write()` on a stream that + * is not draining is allowed, Node.js will buffer all written chunks until + * maximum memory usage occurs, at which point it will abort unconditionally. + * Even before it aborts, high memory usage will cause poor garbage collector + * performance and high RSS (which is not typically released back to the system, + * even after the memory is no longer required). Since TCP sockets may never + * drain if the remote peer does not read the data, writing a socket that is + * not draining may lead to a remotely exploitable vulnerability. + * + * Writing data while the stream is not draining is particularly + * problematic for a `Transform`, because the `Transform` streams are paused + * by default until they are piped or a `'data'` or `'readable'` event handler + * is added. + * + * If the data to be written can be generated or fetched on demand, it is + * recommended to encapsulate the logic into a `Readable` and use {@link pipe}. However, if calling `write()` is preferred, it is + * possible to respect backpressure and avoid memory issues using the `'drain'` event: + * + * ```js + * function write(data, cb) { + * if (!stream.write(data)) { + * stream.once('drain', cb); + * } else { + * process.nextTick(cb); + * } + * } + * + * // Wait for cb to be called before doing any other write. + * write('hello', () => { + * console.log('Write completed, do more writes now.'); + * }); + * ``` + * + * A `Writable` stream in object mode will always ignore the `encoding` argument. + * @since v0.9.4 + * @param chunk Optional data to write. For streams not operating in object mode, `chunk` must be a string, `Buffer` or `Uint8Array`. For object mode streams, `chunk` may be any + * JavaScript value other than `null`. + * @param [encoding='utf8'] The encoding, if `chunk` is a string. + * @param callback Callback for when this chunk of data is flushed. + * @return `false` if the stream wishes for the calling code to wait for the `'drain'` event to be emitted before continuing to write additional data; otherwise `true`. + */ + write(chunk: any, callback?: (error: Error | null | undefined) => void): boolean; + write(chunk: any, encoding: BufferEncoding, callback?: (error: Error | null | undefined) => void): boolean; + /** + * The `writable.setDefaultEncoding()` method sets the default `encoding` for a `Writable` stream. + * @since v0.11.15 + * @param encoding The new default encoding + */ + setDefaultEncoding(encoding: BufferEncoding): this; + /** + * Calling the `writable.end()` method signals that no more data will be written + * to the `Writable`. The optional `chunk` and `encoding` arguments allow one + * final additional chunk of data to be written immediately before closing the + * stream. + * + * Calling the {@link write} method after calling {@link end} will raise an error. + * + * ```js + * // Write 'hello, ' and then end with 'world!'. + * const fs = require('node:fs'); + * const file = fs.createWriteStream('example.txt'); + * file.write('hello, '); + * file.end('world!'); + * // Writing more now is not allowed! + * ``` + * @since v0.9.4 + * @param chunk Optional data to write. For streams not operating in object mode, `chunk` must be a string, `Buffer` or `Uint8Array`. For object mode streams, `chunk` may be any + * JavaScript value other than `null`. + * @param encoding The encoding if `chunk` is a string + * @param callback Callback for when the stream is finished. + */ + end(cb?: () => void): this; + end(chunk: any, cb?: () => void): this; + end(chunk: any, encoding: BufferEncoding, cb?: () => void): this; + /** + * The `writable.cork()` method forces all written data to be buffered in memory. + * The buffered data will be flushed when either the {@link uncork} or {@link end} methods are called. + * + * The primary intent of `writable.cork()` is to accommodate a situation in which + * several small chunks are written to the stream in rapid succession. Instead of + * immediately forwarding them to the underlying destination, `writable.cork()`buffers all the chunks until `writable.uncork()` is called, which will pass them + * all to `writable._writev()`, if present. This prevents a head-of-line blocking + * situation where data is being buffered while waiting for the first small chunk + * to be processed. However, use of `writable.cork()` without implementing`writable._writev()` may have an adverse effect on throughput. + * + * See also: `writable.uncork()`, `writable._writev()`. + * @since v0.11.2 + */ + cork(): void; + /** + * The `writable.uncork()` method flushes all data buffered since {@link cork} was called. + * + * When using `writable.cork()` and `writable.uncork()` to manage the buffering + * of writes to a stream, defer calls to `writable.uncork()` using`process.nextTick()`. Doing so allows batching of all`writable.write()` calls that occur within a given Node.js event + * loop phase. + * + * ```js + * stream.cork(); + * stream.write('some '); + * stream.write('data '); + * process.nextTick(() => stream.uncork()); + * ``` + * + * If the `writable.cork()` method is called multiple times on a stream, the + * same number of calls to `writable.uncork()` must be called to flush the buffered + * data. + * + * ```js + * stream.cork(); + * stream.write('some '); + * stream.cork(); + * stream.write('data '); + * process.nextTick(() => { + * stream.uncork(); + * // The data will not be flushed until uncork() is called a second time. + * stream.uncork(); + * }); + * ``` + * + * See also: `writable.cork()`. + * @since v0.11.2 + */ + uncork(): void; + /** + * Destroy the stream. Optionally emit an `'error'` event, and emit a `'close'`event (unless `emitClose` is set to `false`). After this call, the writable + * stream has ended and subsequent calls to `write()` or `end()` will result in + * an `ERR_STREAM_DESTROYED` error. + * This is a destructive and immediate way to destroy a stream. Previous calls to`write()` may not have drained, and may trigger an `ERR_STREAM_DESTROYED` error. + * Use `end()` instead of destroy if data should flush before close, or wait for + * the `'drain'` event before destroying the stream. + * + * Once `destroy()` has been called any further calls will be a no-op and no + * further errors except from `_destroy()` may be emitted as `'error'`. + * + * Implementors should not override this method, + * but instead implement `writable._destroy()`. + * @since v8.0.0 + * @param error Optional, an error to emit with `'error'` event. + */ + destroy(error?: Error): this; + /** + * Event emitter + * The defined events on documents including: + * 1. close + * 2. drain + * 3. error + * 4. finish + * 5. pipe + * 6. unpipe + */ + addListener(event: "close", listener: () => void): this; + addListener(event: "drain", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "finish", listener: () => void): this; + addListener(event: "pipe", listener: (src: Readable) => void): this; + addListener(event: "unpipe", listener: (src: Readable) => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + emit(event: "close"): boolean; + emit(event: "drain"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "finish"): boolean; + emit(event: "pipe", src: Readable): boolean; + emit(event: "unpipe", src: Readable): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on(event: "close", listener: () => void): this; + on(event: "drain", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "finish", listener: () => void): this; + on(event: "pipe", listener: (src: Readable) => void): this; + on(event: "unpipe", listener: (src: Readable) => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "drain", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "finish", listener: () => void): this; + once(event: "pipe", listener: (src: Readable) => void): this; + once(event: "unpipe", listener: (src: Readable) => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "drain", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "finish", listener: () => void): this; + prependListener(event: "pipe", listener: (src: Readable) => void): this; + prependListener(event: "unpipe", listener: (src: Readable) => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "drain", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "finish", listener: () => void): this; + prependOnceListener(event: "pipe", listener: (src: Readable) => void): this; + prependOnceListener(event: "unpipe", listener: (src: Readable) => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + removeListener(event: "close", listener: () => void): this; + removeListener(event: "drain", listener: () => void): this; + removeListener(event: "error", listener: (err: Error) => void): this; + removeListener(event: "finish", listener: () => void): this; + removeListener(event: "pipe", listener: (src: Readable) => void): this; + removeListener(event: "unpipe", listener: (src: Readable) => void): this; + removeListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + namespace internal { + class Stream extends internal { + constructor(opts?: ReadableOptions); + } + interface StreamOptions extends Abortable { + emitClose?: boolean | undefined; + highWaterMark?: number | undefined; + objectMode?: boolean | undefined; + construct?(this: T, callback: (error?: Error | null) => void): void; + destroy?(this: T, error: Error | null, callback: (error: Error | null) => void): void; + autoDestroy?: boolean | undefined; + } + interface ReadableOptions extends StreamOptions { + encoding?: BufferEncoding | undefined; + read?(this: Readable, size: number): void; + } + /** + * @since v0.9.4 + */ + class Readable extends ReadableBase { + /** + * A utility method for creating a `Readable` from a web `ReadableStream`. + * @since v17.0.0 + * @experimental + */ + static fromWeb( + readableStream: streamWeb.ReadableStream, + options?: Pick, + ): Readable; + /** + * A utility method for creating a web `ReadableStream` from a `Readable`. + * @since v17.0.0 + * @experimental + */ + static toWeb(streamReadable: Readable): streamWeb.ReadableStream; + } + interface WritableOptions extends StreamOptions { + decodeStrings?: boolean | undefined; + defaultEncoding?: BufferEncoding | undefined; + write?( + this: Writable, + chunk: any, + encoding: BufferEncoding, + callback: (error?: Error | null) => void, + ): void; + writev?( + this: Writable, + chunks: Array<{ + chunk: any; + encoding: BufferEncoding; + }>, + callback: (error?: Error | null) => void, + ): void; + final?(this: Writable, callback: (error?: Error | null) => void): void; + } + /** + * @since v0.9.4 + */ + class Writable extends WritableBase { + /** + * A utility method for creating a `Writable` from a web `WritableStream`. + * @since v17.0.0 + * @experimental + */ + static fromWeb( + writableStream: streamWeb.WritableStream, + options?: Pick, + ): Writable; + /** + * A utility method for creating a web `WritableStream` from a `Writable`. + * @since v17.0.0 + * @experimental + */ + static toWeb(streamWritable: Writable): streamWeb.WritableStream; + } + interface DuplexOptions extends ReadableOptions, WritableOptions { + allowHalfOpen?: boolean | undefined; + readableObjectMode?: boolean | undefined; + writableObjectMode?: boolean | undefined; + readableHighWaterMark?: number | undefined; + writableHighWaterMark?: number | undefined; + writableCorked?: number | undefined; + construct?(this: Duplex, callback: (error?: Error | null) => void): void; + read?(this: Duplex, size: number): void; + write?(this: Duplex, chunk: any, encoding: BufferEncoding, callback: (error?: Error | null) => void): void; + writev?( + this: Duplex, + chunks: Array<{ + chunk: any; + encoding: BufferEncoding; + }>, + callback: (error?: Error | null) => void, + ): void; + final?(this: Duplex, callback: (error?: Error | null) => void): void; + destroy?(this: Duplex, error: Error | null, callback: (error: Error | null) => void): void; + } + /** + * Duplex streams are streams that implement both the `Readable` and `Writable` interfaces. + * + * Examples of `Duplex` streams include: + * + * * `TCP sockets` + * * `zlib streams` + * * `crypto streams` + * @since v0.9.4 + */ + class Duplex extends ReadableBase implements WritableBase { + readonly writable: boolean; + readonly writableEnded: boolean; + readonly writableFinished: boolean; + readonly writableHighWaterMark: number; + readonly writableLength: number; + readonly writableObjectMode: boolean; + readonly writableCorked: number; + readonly writableNeedDrain: boolean; + readonly closed: boolean; + readonly errored: Error | null; + /** + * If `false` then the stream will automatically end the writable side when the + * readable side ends. Set initially by the `allowHalfOpen` constructor option, + * which defaults to `true`. + * + * This can be changed manually to change the half-open behavior of an existing`Duplex` stream instance, but must be changed before the `'end'` event is + * emitted. + * @since v0.9.4 + */ + allowHalfOpen: boolean; + constructor(opts?: DuplexOptions); + /** + * A utility method for creating duplex streams. + * + * - `Stream` converts writable stream into writable `Duplex` and readable stream + * to `Duplex`. + * - `Blob` converts into readable `Duplex`. + * - `string` converts into readable `Duplex`. + * - `ArrayBuffer` converts into readable `Duplex`. + * - `AsyncIterable` converts into a readable `Duplex`. Cannot yield `null`. + * - `AsyncGeneratorFunction` converts into a readable/writable transform + * `Duplex`. Must take a source `AsyncIterable` as first parameter. Cannot yield + * `null`. + * - `AsyncFunction` converts into a writable `Duplex`. Must return + * either `null` or `undefined` + * - `Object ({ writable, readable })` converts `readable` and + * `writable` into `Stream` and then combines them into `Duplex` where the + * `Duplex` will write to the `writable` and read from the `readable`. + * - `Promise` converts into readable `Duplex`. Value `null` is ignored. + * + * @since v16.8.0 + */ + static from( + src: + | Stream + | NodeBlob + | ArrayBuffer + | string + | Iterable + | AsyncIterable + | AsyncGeneratorFunction + | Promise + | Object, + ): Duplex; + _write(chunk: any, encoding: BufferEncoding, callback: (error?: Error | null) => void): void; + _writev?( + chunks: Array<{ + chunk: any; + encoding: BufferEncoding; + }>, + callback: (error?: Error | null) => void, + ): void; + _destroy(error: Error | null, callback: (error: Error | null) => void): void; + _final(callback: (error?: Error | null) => void): void; + write(chunk: any, encoding?: BufferEncoding, cb?: (error: Error | null | undefined) => void): boolean; + write(chunk: any, cb?: (error: Error | null | undefined) => void): boolean; + setDefaultEncoding(encoding: BufferEncoding): this; + end(cb?: () => void): this; + end(chunk: any, cb?: () => void): this; + end(chunk: any, encoding?: BufferEncoding, cb?: () => void): this; + cork(): void; + uncork(): void; + /** + * A utility method for creating a web `ReadableStream` and `WritableStream` from a `Duplex`. + * @since v17.0.0 + * @experimental + */ + static toWeb(streamDuplex: Duplex): { + readable: streamWeb.ReadableStream; + writable: streamWeb.WritableStream; + }; + /** + * A utility method for creating a `Duplex` from a web `ReadableStream` and `WritableStream`. + * @since v17.0.0 + * @experimental + */ + static fromWeb( + duplexStream: { + readable: streamWeb.ReadableStream; + writable: streamWeb.WritableStream; + }, + options?: Pick< + DuplexOptions, + "allowHalfOpen" | "decodeStrings" | "encoding" | "highWaterMark" | "objectMode" | "signal" + >, + ): Duplex; + /** + * Event emitter + * The defined events on documents including: + * 1. close + * 2. data + * 3. drain + * 4. end + * 5. error + * 6. finish + * 7. pause + * 8. pipe + * 9. readable + * 10. resume + * 11. unpipe + */ + addListener(event: "close", listener: () => void): this; + addListener(event: "data", listener: (chunk: any) => void): this; + addListener(event: "drain", listener: () => void): this; + addListener(event: "end", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "finish", listener: () => void): this; + addListener(event: "pause", listener: () => void): this; + addListener(event: "pipe", listener: (src: Readable) => void): this; + addListener(event: "readable", listener: () => void): this; + addListener(event: "resume", listener: () => void): this; + addListener(event: "unpipe", listener: (src: Readable) => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + emit(event: "close"): boolean; + emit(event: "data", chunk: any): boolean; + emit(event: "drain"): boolean; + emit(event: "end"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "finish"): boolean; + emit(event: "pause"): boolean; + emit(event: "pipe", src: Readable): boolean; + emit(event: "readable"): boolean; + emit(event: "resume"): boolean; + emit(event: "unpipe", src: Readable): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on(event: "close", listener: () => void): this; + on(event: "data", listener: (chunk: any) => void): this; + on(event: "drain", listener: () => void): this; + on(event: "end", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "finish", listener: () => void): this; + on(event: "pause", listener: () => void): this; + on(event: "pipe", listener: (src: Readable) => void): this; + on(event: "readable", listener: () => void): this; + on(event: "resume", listener: () => void): this; + on(event: "unpipe", listener: (src: Readable) => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "data", listener: (chunk: any) => void): this; + once(event: "drain", listener: () => void): this; + once(event: "end", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "finish", listener: () => void): this; + once(event: "pause", listener: () => void): this; + once(event: "pipe", listener: (src: Readable) => void): this; + once(event: "readable", listener: () => void): this; + once(event: "resume", listener: () => void): this; + once(event: "unpipe", listener: (src: Readable) => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "data", listener: (chunk: any) => void): this; + prependListener(event: "drain", listener: () => void): this; + prependListener(event: "end", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "finish", listener: () => void): this; + prependListener(event: "pause", listener: () => void): this; + prependListener(event: "pipe", listener: (src: Readable) => void): this; + prependListener(event: "readable", listener: () => void): this; + prependListener(event: "resume", listener: () => void): this; + prependListener(event: "unpipe", listener: (src: Readable) => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "data", listener: (chunk: any) => void): this; + prependOnceListener(event: "drain", listener: () => void): this; + prependOnceListener(event: "end", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "finish", listener: () => void): this; + prependOnceListener(event: "pause", listener: () => void): this; + prependOnceListener(event: "pipe", listener: (src: Readable) => void): this; + prependOnceListener(event: "readable", listener: () => void): this; + prependOnceListener(event: "resume", listener: () => void): this; + prependOnceListener(event: "unpipe", listener: (src: Readable) => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + removeListener(event: "close", listener: () => void): this; + removeListener(event: "data", listener: (chunk: any) => void): this; + removeListener(event: "drain", listener: () => void): this; + removeListener(event: "end", listener: () => void): this; + removeListener(event: "error", listener: (err: Error) => void): this; + removeListener(event: "finish", listener: () => void): this; + removeListener(event: "pause", listener: () => void): this; + removeListener(event: "pipe", listener: (src: Readable) => void): this; + removeListener(event: "readable", listener: () => void): this; + removeListener(event: "resume", listener: () => void): this; + removeListener(event: "unpipe", listener: (src: Readable) => void): this; + removeListener(event: string | symbol, listener: (...args: any[]) => void): this; + } + type TransformCallback = (error?: Error | null, data?: any) => void; + interface TransformOptions extends DuplexOptions { + construct?(this: Transform, callback: (error?: Error | null) => void): void; + read?(this: Transform, size: number): void; + write?( + this: Transform, + chunk: any, + encoding: BufferEncoding, + callback: (error?: Error | null) => void, + ): void; + writev?( + this: Transform, + chunks: Array<{ + chunk: any; + encoding: BufferEncoding; + }>, + callback: (error?: Error | null) => void, + ): void; + final?(this: Transform, callback: (error?: Error | null) => void): void; + destroy?(this: Transform, error: Error | null, callback: (error: Error | null) => void): void; + transform?(this: Transform, chunk: any, encoding: BufferEncoding, callback: TransformCallback): void; + flush?(this: Transform, callback: TransformCallback): void; + } + /** + * Transform streams are `Duplex` streams where the output is in some way + * related to the input. Like all `Duplex` streams, `Transform` streams + * implement both the `Readable` and `Writable` interfaces. + * + * Examples of `Transform` streams include: + * + * * `zlib streams` + * * `crypto streams` + * @since v0.9.4 + */ + class Transform extends Duplex { + constructor(opts?: TransformOptions); + _transform(chunk: any, encoding: BufferEncoding, callback: TransformCallback): void; + _flush(callback: TransformCallback): void; + } + /** + * The `stream.PassThrough` class is a trivial implementation of a `Transform` stream that simply passes the input bytes across to the output. Its purpose is + * primarily for examples and testing, but there are some use cases where`stream.PassThrough` is useful as a building block for novel sorts of streams. + */ + class PassThrough extends Transform {} + /** + * A stream to attach a signal to. + * + * Attaches an AbortSignal to a readable or writeable stream. This lets code + * control stream destruction using an `AbortController`. + * + * Calling `abort` on the `AbortController` corresponding to the passed`AbortSignal` will behave the same way as calling `.destroy(new AbortError())`on the stream, and `controller.error(new + * AbortError())` for webstreams. + * + * ```js + * const fs = require('node:fs'); + * + * const controller = new AbortController(); + * const read = addAbortSignal( + * controller.signal, + * fs.createReadStream(('object.json')), + * ); + * // Later, abort the operation closing the stream + * controller.abort(); + * ``` + * + * Or using an `AbortSignal` with a readable stream as an async iterable: + * + * ```js + * const controller = new AbortController(); + * setTimeout(() => controller.abort(), 10_000); // set a timeout + * const stream = addAbortSignal( + * controller.signal, + * fs.createReadStream(('object.json')), + * ); + * (async () => { + * try { + * for await (const chunk of stream) { + * await process(chunk); + * } + * } catch (e) { + * if (e.name === 'AbortError') { + * // The operation was cancelled + * } else { + * throw e; + * } + * } + * })(); + * ``` + * + * Or using an `AbortSignal` with a ReadableStream: + * + * ```js + * const controller = new AbortController(); + * const rs = new ReadableStream({ + * start(controller) { + * controller.enqueue('hello'); + * controller.enqueue('world'); + * controller.close(); + * }, + * }); + * + * addAbortSignal(controller.signal, rs); + * + * finished(rs, (err) => { + * if (err) { + * if (err.name === 'AbortError') { + * // The operation was cancelled + * } + * } + * }); + * + * const reader = rs.getReader(); + * + * reader.read().then(({ value, done }) => { + * console.log(value); // hello + * console.log(done); // false + * controller.abort(); + * }); + * ``` + * @since v15.4.0 + * @param signal A signal representing possible cancellation + * @param stream a stream to attach a signal to + */ + function addAbortSignal(signal: AbortSignal, stream: T): T; + /** + * Returns the default highWaterMark used by streams. + * Defaults to `16384` (16 KiB), or `16` for `objectMode`. + * @since v19.9.0 + * @param objectMode + */ + function getDefaultHighWaterMark(objectMode: boolean): number; + /** + * Sets the default highWaterMark used by streams. + * @since v19.9.0 + * @param objectMode + * @param value highWaterMark value + */ + function setDefaultHighWaterMark(objectMode: boolean, value: number): void; + interface FinishedOptions extends Abortable { + error?: boolean | undefined; + readable?: boolean | undefined; + writable?: boolean | undefined; + } + /** + * A readable and/or writable stream/webstream. + * + * A function to get notified when a stream is no longer readable, writable + * or has experienced an error or a premature close event. + * + * ```js + * const { finished } = require('node:stream'); + * const fs = require('node:fs'); + * + * const rs = fs.createReadStream('archive.tar'); + * + * finished(rs, (err) => { + * if (err) { + * console.error('Stream failed.', err); + * } else { + * console.log('Stream is done reading.'); + * } + * }); + * + * rs.resume(); // Drain the stream. + * ``` + * + * Especially useful in error handling scenarios where a stream is destroyed + * prematurely (like an aborted HTTP request), and will not emit `'end'`or `'finish'`. + * + * The `finished` API provides `promise version`. + * + * `stream.finished()` leaves dangling event listeners (in particular`'error'`, `'end'`, `'finish'` and `'close'`) after `callback` has been + * invoked. The reason for this is so that unexpected `'error'` events (due to + * incorrect stream implementations) do not cause unexpected crashes. + * If this is unwanted behavior then the returned cleanup function needs to be + * invoked in the callback: + * + * ```js + * const cleanup = finished(rs, (err) => { + * cleanup(); + * // ... + * }); + * ``` + * @since v10.0.0 + * @param stream A readable and/or writable stream. + * @param callback A callback function that takes an optional error argument. + * @return A cleanup function which removes all registered listeners. + */ + function finished( + stream: NodeJS.ReadableStream | NodeJS.WritableStream | NodeJS.ReadWriteStream, + options: FinishedOptions, + callback: (err?: NodeJS.ErrnoException | null) => void, + ): () => void; + function finished( + stream: NodeJS.ReadableStream | NodeJS.WritableStream | NodeJS.ReadWriteStream, + callback: (err?: NodeJS.ErrnoException | null) => void, + ): () => void; + namespace finished { + function __promisify__( + stream: NodeJS.ReadableStream | NodeJS.WritableStream | NodeJS.ReadWriteStream, + options?: FinishedOptions, + ): Promise; + } + type PipelineSourceFunction = () => Iterable | AsyncIterable; + type PipelineSource = Iterable | AsyncIterable | NodeJS.ReadableStream | PipelineSourceFunction; + type PipelineTransform, U> = + | NodeJS.ReadWriteStream + | (( + source: S extends (...args: any[]) => Iterable | AsyncIterable ? AsyncIterable + : S, + ) => AsyncIterable); + type PipelineTransformSource = PipelineSource | PipelineTransform; + type PipelineDestinationIterableFunction = (source: AsyncIterable) => AsyncIterable; + type PipelineDestinationPromiseFunction = (source: AsyncIterable) => Promise

; + type PipelineDestination, P> = S extends + PipelineTransformSource ? + | NodeJS.WritableStream + | PipelineDestinationIterableFunction + | PipelineDestinationPromiseFunction + : never; + type PipelineCallback> = S extends + PipelineDestinationPromiseFunction ? (err: NodeJS.ErrnoException | null, value: P) => void + : (err: NodeJS.ErrnoException | null) => void; + type PipelinePromise> = S extends + PipelineDestinationPromiseFunction ? Promise

: Promise; + interface PipelineOptions { + signal?: AbortSignal | undefined; + end?: boolean | undefined; + } + /** + * A module method to pipe between streams and generators forwarding errors and + * properly cleaning up and provide a callback when the pipeline is complete. + * + * ```js + * const { pipeline } = require('node:stream'); + * const fs = require('node:fs'); + * const zlib = require('node:zlib'); + * + * // Use the pipeline API to easily pipe a series of streams + * // together and get notified when the pipeline is fully done. + * + * // A pipeline to gzip a potentially huge tar file efficiently: + * + * pipeline( + * fs.createReadStream('archive.tar'), + * zlib.createGzip(), + * fs.createWriteStream('archive.tar.gz'), + * (err) => { + * if (err) { + * console.error('Pipeline failed.', err); + * } else { + * console.log('Pipeline succeeded.'); + * } + * }, + * ); + * ``` + * + * The `pipeline` API provides a `promise version`. + * + * `stream.pipeline()` will call `stream.destroy(err)` on all streams except: + * + * * `Readable` streams which have emitted `'end'` or `'close'`. + * * `Writable` streams which have emitted `'finish'` or `'close'`. + * + * `stream.pipeline()` leaves dangling event listeners on the streams + * after the `callback` has been invoked. In the case of reuse of streams after + * failure, this can cause event listener leaks and swallowed errors. If the last + * stream is readable, dangling event listeners will be removed so that the last + * stream can be consumed later. + * + * `stream.pipeline()` closes all the streams when an error is raised. + * The `IncomingRequest` usage with `pipeline` could lead to an unexpected behavior + * once it would destroy the socket without sending the expected response. + * See the example below: + * + * ```js + * const fs = require('node:fs'); + * const http = require('node:http'); + * const { pipeline } = require('node:stream'); + * + * const server = http.createServer((req, res) => { + * const fileStream = fs.createReadStream('./fileNotExist.txt'); + * pipeline(fileStream, res, (err) => { + * if (err) { + * console.log(err); // No such file + * // this message can't be sent once `pipeline` already destroyed the socket + * return res.end('error!!!'); + * } + * }); + * }); + * ``` + * @since v10.0.0 + * @param callback Called when the pipeline is fully done. + */ + function pipeline, B extends PipelineDestination>( + source: A, + destination: B, + callback?: PipelineCallback, + ): B extends NodeJS.WritableStream ? B : NodeJS.WritableStream; + function pipeline< + A extends PipelineSource, + T1 extends PipelineTransform, + B extends PipelineDestination, + >( + source: A, + transform1: T1, + destination: B, + callback?: PipelineCallback, + ): B extends NodeJS.WritableStream ? B : NodeJS.WritableStream; + function pipeline< + A extends PipelineSource, + T1 extends PipelineTransform, + T2 extends PipelineTransform, + B extends PipelineDestination, + >( + source: A, + transform1: T1, + transform2: T2, + destination: B, + callback?: PipelineCallback, + ): B extends NodeJS.WritableStream ? B : NodeJS.WritableStream; + function pipeline< + A extends PipelineSource, + T1 extends PipelineTransform, + T2 extends PipelineTransform, + T3 extends PipelineTransform, + B extends PipelineDestination, + >( + source: A, + transform1: T1, + transform2: T2, + transform3: T3, + destination: B, + callback?: PipelineCallback, + ): B extends NodeJS.WritableStream ? B : NodeJS.WritableStream; + function pipeline< + A extends PipelineSource, + T1 extends PipelineTransform, + T2 extends PipelineTransform, + T3 extends PipelineTransform, + T4 extends PipelineTransform, + B extends PipelineDestination, + >( + source: A, + transform1: T1, + transform2: T2, + transform3: T3, + transform4: T4, + destination: B, + callback?: PipelineCallback, + ): B extends NodeJS.WritableStream ? B : NodeJS.WritableStream; + function pipeline( + streams: ReadonlyArray, + callback?: (err: NodeJS.ErrnoException | null) => void, + ): NodeJS.WritableStream; + function pipeline( + stream1: NodeJS.ReadableStream, + stream2: NodeJS.ReadWriteStream | NodeJS.WritableStream, + ...streams: Array< + NodeJS.ReadWriteStream | NodeJS.WritableStream | ((err: NodeJS.ErrnoException | null) => void) + > + ): NodeJS.WritableStream; + namespace pipeline { + function __promisify__, B extends PipelineDestination>( + source: A, + destination: B, + options?: PipelineOptions, + ): PipelinePromise; + function __promisify__< + A extends PipelineSource, + T1 extends PipelineTransform, + B extends PipelineDestination, + >( + source: A, + transform1: T1, + destination: B, + options?: PipelineOptions, + ): PipelinePromise; + function __promisify__< + A extends PipelineSource, + T1 extends PipelineTransform, + T2 extends PipelineTransform, + B extends PipelineDestination, + >( + source: A, + transform1: T1, + transform2: T2, + destination: B, + options?: PipelineOptions, + ): PipelinePromise; + function __promisify__< + A extends PipelineSource, + T1 extends PipelineTransform, + T2 extends PipelineTransform, + T3 extends PipelineTransform, + B extends PipelineDestination, + >( + source: A, + transform1: T1, + transform2: T2, + transform3: T3, + destination: B, + options?: PipelineOptions, + ): PipelinePromise; + function __promisify__< + A extends PipelineSource, + T1 extends PipelineTransform, + T2 extends PipelineTransform, + T3 extends PipelineTransform, + T4 extends PipelineTransform, + B extends PipelineDestination, + >( + source: A, + transform1: T1, + transform2: T2, + transform3: T3, + transform4: T4, + destination: B, + options?: PipelineOptions, + ): PipelinePromise; + function __promisify__( + streams: ReadonlyArray, + options?: PipelineOptions, + ): Promise; + function __promisify__( + stream1: NodeJS.ReadableStream, + stream2: NodeJS.ReadWriteStream | NodeJS.WritableStream, + ...streams: Array + ): Promise; + } + interface Pipe { + close(): void; + hasRef(): boolean; + ref(): void; + unref(): void; + } + /** + * Returns whether the stream has encountered an error. + * @since v17.3.0, v16.14.0 + * @experimental + */ + function isErrored(stream: Readable | Writable | NodeJS.ReadableStream | NodeJS.WritableStream): boolean; + /** + * Returns whether the stream is readable. + * @since v17.4.0, v16.14.0 + * @experimental + */ + function isReadable(stream: Readable | NodeJS.ReadableStream): boolean; + const promises: typeof streamPromises; + const consumers: typeof streamConsumers; + } + export = internal; +} +declare module "node:stream" { + import stream = require("stream"); + export = stream; +} diff --git a/task/node_modules/@types/node/ts4.8/stream/consumers.d.ts b/task/node_modules/@types/node/ts4.8/stream/consumers.d.ts new file mode 100644 index 0000000..5ad9cba --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/stream/consumers.d.ts @@ -0,0 +1,12 @@ +declare module "stream/consumers" { + import { Blob as NodeBlob } from "node:buffer"; + import { Readable } from "node:stream"; + function buffer(stream: NodeJS.ReadableStream | Readable | AsyncIterable): Promise; + function text(stream: NodeJS.ReadableStream | Readable | AsyncIterable): Promise; + function arrayBuffer(stream: NodeJS.ReadableStream | Readable | AsyncIterable): Promise; + function blob(stream: NodeJS.ReadableStream | Readable | AsyncIterable): Promise; + function json(stream: NodeJS.ReadableStream | Readable | AsyncIterable): Promise; +} +declare module "node:stream/consumers" { + export * from "stream/consumers"; +} diff --git a/task/node_modules/@types/node/ts4.8/stream/promises.d.ts b/task/node_modules/@types/node/ts4.8/stream/promises.d.ts new file mode 100644 index 0000000..6eac5b7 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/stream/promises.d.ts @@ -0,0 +1,83 @@ +declare module "stream/promises" { + import { + FinishedOptions, + PipelineDestination, + PipelineOptions, + PipelinePromise, + PipelineSource, + PipelineTransform, + } from "node:stream"; + function finished( + stream: NodeJS.ReadableStream | NodeJS.WritableStream | NodeJS.ReadWriteStream, + options?: FinishedOptions, + ): Promise; + function pipeline, B extends PipelineDestination>( + source: A, + destination: B, + options?: PipelineOptions, + ): PipelinePromise; + function pipeline< + A extends PipelineSource, + T1 extends PipelineTransform, + B extends PipelineDestination, + >( + source: A, + transform1: T1, + destination: B, + options?: PipelineOptions, + ): PipelinePromise; + function pipeline< + A extends PipelineSource, + T1 extends PipelineTransform, + T2 extends PipelineTransform, + B extends PipelineDestination, + >( + source: A, + transform1: T1, + transform2: T2, + destination: B, + options?: PipelineOptions, + ): PipelinePromise; + function pipeline< + A extends PipelineSource, + T1 extends PipelineTransform, + T2 extends PipelineTransform, + T3 extends PipelineTransform, + B extends PipelineDestination, + >( + source: A, + transform1: T1, + transform2: T2, + transform3: T3, + destination: B, + options?: PipelineOptions, + ): PipelinePromise; + function pipeline< + A extends PipelineSource, + T1 extends PipelineTransform, + T2 extends PipelineTransform, + T3 extends PipelineTransform, + T4 extends PipelineTransform, + B extends PipelineDestination, + >( + source: A, + transform1: T1, + transform2: T2, + transform3: T3, + transform4: T4, + destination: B, + options?: PipelineOptions, + ): PipelinePromise; + function pipeline( + streams: ReadonlyArray, + options?: PipelineOptions, + ): Promise; + function pipeline( + stream1: NodeJS.ReadableStream, + stream2: NodeJS.ReadWriteStream | NodeJS.WritableStream, + ...streams: Array + ): Promise; +} +declare module "node:stream/promises" { + export * from "stream/promises"; +} diff --git a/task/node_modules/@types/node/ts4.8/stream/web.d.ts b/task/node_modules/@types/node/ts4.8/stream/web.d.ts new file mode 100644 index 0000000..0d91613 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/stream/web.d.ts @@ -0,0 +1,350 @@ +declare module "stream/web" { + // stub module, pending copy&paste from .d.ts or manual impl + // copy from lib.dom.d.ts + interface ReadableWritablePair { + readable: ReadableStream; + /** + * Provides a convenient, chainable way of piping this readable stream + * through a transform stream (or any other { writable, readable } + * pair). It simply pipes the stream into the writable side of the + * supplied pair, and returns the readable side for further use. + * + * Piping a stream will lock it for the duration of the pipe, preventing + * any other consumer from acquiring a reader. + */ + writable: WritableStream; + } + interface StreamPipeOptions { + preventAbort?: boolean; + preventCancel?: boolean; + /** + * Pipes this readable stream to a given writable stream destination. + * The way in which the piping process behaves under various error + * conditions can be customized with a number of passed options. It + * returns a promise that fulfills when the piping process completes + * successfully, or rejects if any errors were encountered. + * + * Piping a stream will lock it for the duration of the pipe, preventing + * any other consumer from acquiring a reader. + * + * Errors and closures of the source and destination streams propagate + * as follows: + * + * An error in this source readable stream will abort destination, + * unless preventAbort is truthy. The returned promise will be rejected + * with the source's error, or with any error that occurs during + * aborting the destination. + * + * An error in destination will cancel this source readable stream, + * unless preventCancel is truthy. The returned promise will be rejected + * with the destination's error, or with any error that occurs during + * canceling the source. + * + * When this source readable stream closes, destination will be closed, + * unless preventClose is truthy. The returned promise will be fulfilled + * once this process completes, unless an error is encountered while + * closing the destination, in which case it will be rejected with that + * error. + * + * If destination starts out closed or closing, this source readable + * stream will be canceled, unless preventCancel is true. The returned + * promise will be rejected with an error indicating piping to a closed + * stream failed, or with any error that occurs during canceling the + * source. + * + * The signal option can be set to an AbortSignal to allow aborting an + * ongoing pipe operation via the corresponding AbortController. In this + * case, this source readable stream will be canceled, and destination + * aborted, unless the respective options preventCancel or preventAbort + * are set. + */ + preventClose?: boolean; + signal?: AbortSignal; + } + interface ReadableStreamGenericReader { + readonly closed: Promise; + cancel(reason?: any): Promise; + } + interface ReadableStreamDefaultReadValueResult { + done: false; + value: T; + } + interface ReadableStreamDefaultReadDoneResult { + done: true; + value?: undefined; + } + type ReadableStreamController = ReadableStreamDefaultController; + type ReadableStreamDefaultReadResult = + | ReadableStreamDefaultReadValueResult + | ReadableStreamDefaultReadDoneResult; + interface ReadableStreamReadValueResult { + done: false; + value: T; + } + interface ReadableStreamReadDoneResult { + done: true; + value?: T; + } + type ReadableStreamReadResult = ReadableStreamReadValueResult | ReadableStreamReadDoneResult; + interface ReadableByteStreamControllerCallback { + (controller: ReadableByteStreamController): void | PromiseLike; + } + interface UnderlyingSinkAbortCallback { + (reason?: any): void | PromiseLike; + } + interface UnderlyingSinkCloseCallback { + (): void | PromiseLike; + } + interface UnderlyingSinkStartCallback { + (controller: WritableStreamDefaultController): any; + } + interface UnderlyingSinkWriteCallback { + (chunk: W, controller: WritableStreamDefaultController): void | PromiseLike; + } + interface UnderlyingSourceCancelCallback { + (reason?: any): void | PromiseLike; + } + interface UnderlyingSourcePullCallback { + (controller: ReadableStreamController): void | PromiseLike; + } + interface UnderlyingSourceStartCallback { + (controller: ReadableStreamController): any; + } + interface TransformerFlushCallback { + (controller: TransformStreamDefaultController): void | PromiseLike; + } + interface TransformerStartCallback { + (controller: TransformStreamDefaultController): any; + } + interface TransformerTransformCallback { + (chunk: I, controller: TransformStreamDefaultController): void | PromiseLike; + } + interface UnderlyingByteSource { + autoAllocateChunkSize?: number; + cancel?: ReadableStreamErrorCallback; + pull?: ReadableByteStreamControllerCallback; + start?: ReadableByteStreamControllerCallback; + type: "bytes"; + } + interface UnderlyingSource { + cancel?: UnderlyingSourceCancelCallback; + pull?: UnderlyingSourcePullCallback; + start?: UnderlyingSourceStartCallback; + type?: undefined; + } + interface UnderlyingSink { + abort?: UnderlyingSinkAbortCallback; + close?: UnderlyingSinkCloseCallback; + start?: UnderlyingSinkStartCallback; + type?: undefined; + write?: UnderlyingSinkWriteCallback; + } + interface ReadableStreamErrorCallback { + (reason: any): void | PromiseLike; + } + /** This Streams API interface represents a readable stream of byte data. */ + interface ReadableStream { + readonly locked: boolean; + cancel(reason?: any): Promise; + getReader(): ReadableStreamDefaultReader; + getReader(options: { mode: "byob" }): ReadableStreamBYOBReader; + pipeThrough(transform: ReadableWritablePair, options?: StreamPipeOptions): ReadableStream; + pipeTo(destination: WritableStream, options?: StreamPipeOptions): Promise; + tee(): [ReadableStream, ReadableStream]; + values(options?: { preventCancel?: boolean }): AsyncIterableIterator; + [Symbol.asyncIterator](): AsyncIterableIterator; + } + const ReadableStream: { + prototype: ReadableStream; + new(underlyingSource: UnderlyingByteSource, strategy?: QueuingStrategy): ReadableStream; + new(underlyingSource?: UnderlyingSource, strategy?: QueuingStrategy): ReadableStream; + }; + interface ReadableStreamDefaultReader extends ReadableStreamGenericReader { + read(): Promise>; + releaseLock(): void; + } + interface ReadableStreamBYOBReader extends ReadableStreamGenericReader { + read(view: T): Promise>; + releaseLock(): void; + } + const ReadableStreamDefaultReader: { + prototype: ReadableStreamDefaultReader; + new(stream: ReadableStream): ReadableStreamDefaultReader; + }; + const ReadableStreamBYOBReader: any; + const ReadableStreamBYOBRequest: any; + interface ReadableByteStreamController { + readonly byobRequest: undefined; + readonly desiredSize: number | null; + close(): void; + enqueue(chunk: ArrayBufferView): void; + error(error?: any): void; + } + const ReadableByteStreamController: { + prototype: ReadableByteStreamController; + new(): ReadableByteStreamController; + }; + interface ReadableStreamDefaultController { + readonly desiredSize: number | null; + close(): void; + enqueue(chunk?: R): void; + error(e?: any): void; + } + const ReadableStreamDefaultController: { + prototype: ReadableStreamDefaultController; + new(): ReadableStreamDefaultController; + }; + interface Transformer { + flush?: TransformerFlushCallback; + readableType?: undefined; + start?: TransformerStartCallback; + transform?: TransformerTransformCallback; + writableType?: undefined; + } + interface TransformStream { + readonly readable: ReadableStream; + readonly writable: WritableStream; + } + const TransformStream: { + prototype: TransformStream; + new( + transformer?: Transformer, + writableStrategy?: QueuingStrategy, + readableStrategy?: QueuingStrategy, + ): TransformStream; + }; + interface TransformStreamDefaultController { + readonly desiredSize: number | null; + enqueue(chunk?: O): void; + error(reason?: any): void; + terminate(): void; + } + const TransformStreamDefaultController: { + prototype: TransformStreamDefaultController; + new(): TransformStreamDefaultController; + }; + /** + * This Streams API interface provides a standard abstraction for writing + * streaming data to a destination, known as a sink. This object comes with + * built-in back pressure and queuing. + */ + interface WritableStream { + readonly locked: boolean; + abort(reason?: any): Promise; + close(): Promise; + getWriter(): WritableStreamDefaultWriter; + } + const WritableStream: { + prototype: WritableStream; + new(underlyingSink?: UnderlyingSink, strategy?: QueuingStrategy): WritableStream; + }; + /** + * This Streams API interface is the object returned by + * WritableStream.getWriter() and once created locks the < writer to the + * WritableStream ensuring that no other streams can write to the underlying + * sink. + */ + interface WritableStreamDefaultWriter { + readonly closed: Promise; + readonly desiredSize: number | null; + readonly ready: Promise; + abort(reason?: any): Promise; + close(): Promise; + releaseLock(): void; + write(chunk?: W): Promise; + } + const WritableStreamDefaultWriter: { + prototype: WritableStreamDefaultWriter; + new(stream: WritableStream): WritableStreamDefaultWriter; + }; + /** + * This Streams API interface represents a controller allowing control of a + * WritableStream's state. When constructing a WritableStream, the + * underlying sink is given a corresponding WritableStreamDefaultController + * instance to manipulate. + */ + interface WritableStreamDefaultController { + error(e?: any): void; + } + const WritableStreamDefaultController: { + prototype: WritableStreamDefaultController; + new(): WritableStreamDefaultController; + }; + interface QueuingStrategy { + highWaterMark?: number; + size?: QueuingStrategySize; + } + interface QueuingStrategySize { + (chunk?: T): number; + } + interface QueuingStrategyInit { + /** + * Creates a new ByteLengthQueuingStrategy with the provided high water + * mark. + * + * Note that the provided high water mark will not be validated ahead of + * time. Instead, if it is negative, NaN, or not a number, the resulting + * ByteLengthQueuingStrategy will cause the corresponding stream + * constructor to throw. + */ + highWaterMark: number; + } + /** + * This Streams API interface provides a built-in byte length queuing + * strategy that can be used when constructing streams. + */ + interface ByteLengthQueuingStrategy extends QueuingStrategy { + readonly highWaterMark: number; + readonly size: QueuingStrategySize; + } + const ByteLengthQueuingStrategy: { + prototype: ByteLengthQueuingStrategy; + new(init: QueuingStrategyInit): ByteLengthQueuingStrategy; + }; + /** + * This Streams API interface provides a built-in byte length queuing + * strategy that can be used when constructing streams. + */ + interface CountQueuingStrategy extends QueuingStrategy { + readonly highWaterMark: number; + readonly size: QueuingStrategySize; + } + const CountQueuingStrategy: { + prototype: CountQueuingStrategy; + new(init: QueuingStrategyInit): CountQueuingStrategy; + }; + interface TextEncoderStream { + /** Returns "utf-8". */ + readonly encoding: "utf-8"; + readonly readable: ReadableStream; + readonly writable: WritableStream; + readonly [Symbol.toStringTag]: string; + } + const TextEncoderStream: { + prototype: TextEncoderStream; + new(): TextEncoderStream; + }; + interface TextDecoderOptions { + fatal?: boolean; + ignoreBOM?: boolean; + } + type BufferSource = ArrayBufferView | ArrayBuffer; + interface TextDecoderStream { + /** Returns encoding's name, lower cased. */ + readonly encoding: string; + /** Returns `true` if error mode is "fatal", and `false` otherwise. */ + readonly fatal: boolean; + /** Returns `true` if ignore BOM flag is set, and `false` otherwise. */ + readonly ignoreBOM: boolean; + readonly readable: ReadableStream; + readonly writable: WritableStream; + readonly [Symbol.toStringTag]: string; + } + const TextDecoderStream: { + prototype: TextDecoderStream; + new(label?: string, options?: TextDecoderOptions): TextDecoderStream; + }; +} +declare module "node:stream/web" { + export * from "stream/web"; +} diff --git a/task/node_modules/@types/node/ts4.8/string_decoder.d.ts b/task/node_modules/@types/node/ts4.8/string_decoder.d.ts new file mode 100644 index 0000000..b8691e1 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/string_decoder.d.ts @@ -0,0 +1,67 @@ +/** + * The `node:string_decoder` module provides an API for decoding `Buffer` objects + * into strings in a manner that preserves encoded multi-byte UTF-8 and UTF-16 + * characters. It can be accessed using: + * + * ```js + * const { StringDecoder } = require('node:string_decoder'); + * ``` + * + * The following example shows the basic use of the `StringDecoder` class. + * + * ```js + * const { StringDecoder } = require('node:string_decoder'); + * const decoder = new StringDecoder('utf8'); + * + * const cent = Buffer.from([0xC2, 0xA2]); + * console.log(decoder.write(cent)); // Prints: ¢ + * + * const euro = Buffer.from([0xE2, 0x82, 0xAC]); + * console.log(decoder.write(euro)); // Prints: € + * ``` + * + * When a `Buffer` instance is written to the `StringDecoder` instance, an + * internal buffer is used to ensure that the decoded string does not contain + * any incomplete multibyte characters. These are held in the buffer until the + * next call to `stringDecoder.write()` or until `stringDecoder.end()` is called. + * + * In the following example, the three UTF-8 encoded bytes of the European Euro + * symbol (`€`) are written over three separate operations: + * + * ```js + * const { StringDecoder } = require('node:string_decoder'); + * const decoder = new StringDecoder('utf8'); + * + * decoder.write(Buffer.from([0xE2])); + * decoder.write(Buffer.from([0x82])); + * console.log(decoder.end(Buffer.from([0xAC]))); // Prints: € + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/string_decoder.js) + */ +declare module "string_decoder" { + class StringDecoder { + constructor(encoding?: BufferEncoding); + /** + * Returns a decoded string, ensuring that any incomplete multibyte characters at + * the end of the `Buffer`, or `TypedArray`, or `DataView` are omitted from the + * returned string and stored in an internal buffer for the next call to`stringDecoder.write()` or `stringDecoder.end()`. + * @since v0.1.99 + * @param buffer The bytes to decode. + */ + write(buffer: Buffer): string; + /** + * Returns any remaining input stored in the internal buffer as a string. Bytes + * representing incomplete UTF-8 and UTF-16 characters will be replaced with + * substitution characters appropriate for the character encoding. + * + * If the `buffer` argument is provided, one final call to `stringDecoder.write()`is performed before returning the remaining input. + * After `end()` is called, the `stringDecoder` object can be reused for new input. + * @since v0.9.3 + * @param buffer The bytes to decode. + */ + end(buffer?: Buffer): string; + } +} +declare module "node:string_decoder" { + export * from "string_decoder"; +} diff --git a/task/node_modules/@types/node/ts4.8/test.d.ts b/task/node_modules/@types/node/ts4.8/test.d.ts new file mode 100644 index 0000000..44b6a96 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/test.d.ts @@ -0,0 +1,1382 @@ +/** + * The `node:test` module facilitates the creation of JavaScript tests. + * To access it: + * + * ```js + * import test from 'node:test'; + * ``` + * + * This module is only available under the `node:` scheme. The following will not + * work: + * + * ```js + * import test from 'test'; + * ``` + * + * Tests created via the `test` module consist of a single function that is + * processed in one of three ways: + * + * 1. A synchronous function that is considered failing if it throws an exception, + * and is considered passing otherwise. + * 2. A function that returns a `Promise` that is considered failing if the`Promise` rejects, and is considered passing if the `Promise` fulfills. + * 3. A function that receives a callback function. If the callback receives any + * truthy value as its first argument, the test is considered failing. If a + * falsy value is passed as the first argument to the callback, the test is + * considered passing. If the test function receives a callback function and + * also returns a `Promise`, the test will fail. + * + * The following example illustrates how tests are written using the`test` module. + * + * ```js + * test('synchronous passing test', (t) => { + * // This test passes because it does not throw an exception. + * assert.strictEqual(1, 1); + * }); + * + * test('synchronous failing test', (t) => { + * // This test fails because it throws an exception. + * assert.strictEqual(1, 2); + * }); + * + * test('asynchronous passing test', async (t) => { + * // This test passes because the Promise returned by the async + * // function is settled and not rejected. + * assert.strictEqual(1, 1); + * }); + * + * test('asynchronous failing test', async (t) => { + * // This test fails because the Promise returned by the async + * // function is rejected. + * assert.strictEqual(1, 2); + * }); + * + * test('failing test using Promises', (t) => { + * // Promises can be used directly as well. + * return new Promise((resolve, reject) => { + * setImmediate(() => { + * reject(new Error('this will cause the test to fail')); + * }); + * }); + * }); + * + * test('callback passing test', (t, done) => { + * // done() is the callback function. When the setImmediate() runs, it invokes + * // done() with no arguments. + * setImmediate(done); + * }); + * + * test('callback failing test', (t, done) => { + * // When the setImmediate() runs, done() is invoked with an Error object and + * // the test fails. + * setImmediate(() => { + * done(new Error('callback failure')); + * }); + * }); + * ``` + * + * If any tests fail, the process exit code is set to `1`. + * @since v18.0.0, v16.17.0 + * @see [source](https://github.com/nodejs/node/blob/v20.4.0/lib/test.js) + */ +declare module "node:test" { + import { Readable } from "node:stream"; + import { AsyncResource } from "node:async_hooks"; + /** + * ```js + * import { tap } from 'node:test/reporters'; + * import { run } from 'node:test'; + * import process from 'node:process'; + * import path from 'node:path'; + * + * run({ files: [path.resolve('./tests/test.js')] }) + * .compose(tap) + * .pipe(process.stdout); + * ``` + * @since v18.9.0, v16.19.0 + * @param options Configuration options for running tests. The following properties are supported: + */ + function run(options?: RunOptions): TestsStream; + /** + * The `test()` function is the value imported from the `test` module. Each + * invocation of this function results in reporting the test to the `TestsStream`. + * + * The `TestContext` object passed to the `fn` argument can be used to perform + * actions related to the current test. Examples include skipping the test, adding + * additional diagnostic information, or creating subtests. + * + * `test()` returns a `Promise` that fulfills once the test completes. + * if `test()` is called within a `describe()` block, it fulfills immediately. + * The return value can usually be discarded for top level tests. + * However, the return value from subtests should be used to prevent the parent + * test from finishing first and cancelling the subtest + * as shown in the following example. + * + * ```js + * test('top level test', async (t) => { + * // The setTimeout() in the following subtest would cause it to outlive its + * // parent test if 'await' is removed on the next line. Once the parent test + * // completes, it will cancel any outstanding subtests. + * await t.test('longer running subtest', async (t) => { + * return new Promise((resolve, reject) => { + * setTimeout(resolve, 1000); + * }); + * }); + * }); + * ``` + * + * The `timeout` option can be used to fail the test if it takes longer than`timeout` milliseconds to complete. However, it is not a reliable mechanism for + * canceling tests because a running test might block the application thread and + * thus prevent the scheduled cancellation. + * @since v18.0.0, v16.17.0 + * @param [name='The name'] The name of the test, which is displayed when reporting test results. + * @param options Configuration options for the test. The following properties are supported: + * @param [fn='A no-op function'] The function under test. The first argument to this function is a {@link TestContext} object. If the test uses callbacks, the callback function is passed as the + * second argument. + * @return Fulfilled with `undefined` once the test completes, or immediately if the test runs within {@link describe}. + */ + function test(name?: string, fn?: TestFn): Promise; + function test(name?: string, options?: TestOptions, fn?: TestFn): Promise; + function test(options?: TestOptions, fn?: TestFn): Promise; + function test(fn?: TestFn): Promise; + namespace test { + export { after, afterEach, before, beforeEach, describe, it, mock, only, run, skip, test, todo }; + } + /** + * The `describe()` function imported from the `node:test` module. Each + * invocation of this function results in the creation of a Subtest. + * After invocation of top level `describe` functions, + * all top level tests and suites will execute. + * @param [name='The name'] The name of the suite, which is displayed when reporting test results. + * @param options Configuration options for the suite. supports the same options as `test([name][, options][, fn])`. + * @param [fn='A no-op function'] The function under suite declaring all subtests and subsuites. The first argument to this function is a {@link SuiteContext} object. + * @return Immediately fulfilled with `undefined`. + */ + function describe(name?: string, options?: TestOptions, fn?: SuiteFn): Promise; + function describe(name?: string, fn?: SuiteFn): Promise; + function describe(options?: TestOptions, fn?: SuiteFn): Promise; + function describe(fn?: SuiteFn): Promise; + namespace describe { + /** + * Shorthand for skipping a suite, same as `describe([name], { skip: true }[, fn])`. + */ + function skip(name?: string, options?: TestOptions, fn?: SuiteFn): Promise; + function skip(name?: string, fn?: SuiteFn): Promise; + function skip(options?: TestOptions, fn?: SuiteFn): Promise; + function skip(fn?: SuiteFn): Promise; + /** + * Shorthand for marking a suite as `TODO`, same as `describe([name], { todo: true }[, fn])`. + */ + function todo(name?: string, options?: TestOptions, fn?: SuiteFn): Promise; + function todo(name?: string, fn?: SuiteFn): Promise; + function todo(options?: TestOptions, fn?: SuiteFn): Promise; + function todo(fn?: SuiteFn): Promise; + /** + * Shorthand for marking a suite as `only`, same as `describe([name], { only: true }[, fn])`. + * @since v18.15.0 + */ + function only(name?: string, options?: TestOptions, fn?: SuiteFn): Promise; + function only(name?: string, fn?: SuiteFn): Promise; + function only(options?: TestOptions, fn?: SuiteFn): Promise; + function only(fn?: SuiteFn): Promise; + } + /** + * Shorthand for `test()`. + * + * The `it()` function is imported from the `node:test` module. + * @since v18.6.0, v16.17.0 + */ + function it(name?: string, options?: TestOptions, fn?: TestFn): Promise; + function it(name?: string, fn?: TestFn): Promise; + function it(options?: TestOptions, fn?: TestFn): Promise; + function it(fn?: TestFn): Promise; + namespace it { + /** + * Shorthand for skipping a test, same as `it([name], { skip: true }[, fn])`. + */ + function skip(name?: string, options?: TestOptions, fn?: TestFn): Promise; + function skip(name?: string, fn?: TestFn): Promise; + function skip(options?: TestOptions, fn?: TestFn): Promise; + function skip(fn?: TestFn): Promise; + /** + * Shorthand for marking a test as `TODO`, same as `it([name], { todo: true }[, fn])`. + */ + function todo(name?: string, options?: TestOptions, fn?: TestFn): Promise; + function todo(name?: string, fn?: TestFn): Promise; + function todo(options?: TestOptions, fn?: TestFn): Promise; + function todo(fn?: TestFn): Promise; + /** + * Shorthand for marking a test as `only`, same as `it([name], { only: true }[, fn])`. + * @since v18.15.0 + */ + function only(name?: string, options?: TestOptions, fn?: TestFn): Promise; + function only(name?: string, fn?: TestFn): Promise; + function only(options?: TestOptions, fn?: TestFn): Promise; + function only(fn?: TestFn): Promise; + } + /** + * Shorthand for skipping a test, same as `test([name], { skip: true }[, fn])`. + * @since v20.2.0 + */ + function skip(name?: string, options?: TestOptions, fn?: TestFn): Promise; + function skip(name?: string, fn?: TestFn): Promise; + function skip(options?: TestOptions, fn?: TestFn): Promise; + function skip(fn?: TestFn): Promise; + /** + * Shorthand for marking a test as `TODO`, same as `test([name], { todo: true }[, fn])`. + * @since v20.2.0 + */ + function todo(name?: string, options?: TestOptions, fn?: TestFn): Promise; + function todo(name?: string, fn?: TestFn): Promise; + function todo(options?: TestOptions, fn?: TestFn): Promise; + function todo(fn?: TestFn): Promise; + /** + * Shorthand for marking a test as `only`, same as `test([name], { only: true }[, fn])`. + * @since v20.2.0 + */ + function only(name?: string, options?: TestOptions, fn?: TestFn): Promise; + function only(name?: string, fn?: TestFn): Promise; + function only(options?: TestOptions, fn?: TestFn): Promise; + function only(fn?: TestFn): Promise; + /** + * The type of a function under test. The first argument to this function is a + * {@link TestContext} object. If the test uses callbacks, the callback function is passed as + * the second argument. + */ + type TestFn = (t: TestContext, done: (result?: any) => void) => void | Promise; + /** + * The type of a function under Suite. + */ + type SuiteFn = (s: SuiteContext) => void | Promise; + interface TestShard { + /** + * A positive integer between 1 and `` that specifies the index of the shard to run. + */ + index: number; + /** + * A positive integer that specifies the total number of shards to split the test files to. + */ + total: number; + } + interface RunOptions { + /** + * If a number is provided, then that many files would run in parallel. + * If truthy, it would run (number of cpu cores - 1) files in parallel. + * If falsy, it would only run one file at a time. + * If unspecified, subtests inherit this value from their parent. + * @default true + */ + concurrency?: number | boolean | undefined; + /** + * An array containing the list of files to run. + * If unspecified, the test runner execution model will be used. + */ + files?: readonly string[] | undefined; + /** + * Allows aborting an in-progress test execution. + * @default undefined + */ + signal?: AbortSignal | undefined; + /** + * A number of milliseconds the test will fail after. + * If unspecified, subtests inherit this value from their parent. + * @default Infinity + */ + timeout?: number | undefined; + /** + * Sets inspector port of test child process. + * If a nullish value is provided, each process gets its own port, + * incremented from the primary's `process.debugPort`. + */ + inspectPort?: number | (() => number) | undefined; + /** + * That can be used to only run tests whose name matches the provided pattern. + * Test name patterns are interpreted as JavaScript regular expressions. + * For each test that is executed, any corresponding test hooks, such as `beforeEach()`, are also run. + */ + testNamePatterns?: string | RegExp | string[] | RegExp[]; + /** + * If truthy, the test context will only run tests that have the `only` option set + */ + only?: boolean; + /** + * A function that accepts the TestsStream instance and can be used to setup listeners before any tests are run. + */ + setup?: (root: Test) => void | Promise; + /** + * Whether to run in watch mode or not. + * @default false + */ + watch?: boolean | undefined; + /** + * Running tests in a specific shard. + * @default undefined + */ + shard?: TestShard | undefined; + } + class Test extends AsyncResource { + concurrency: number; + nesting: number; + only: boolean; + reporter: TestsStream; + runOnlySubtests: boolean; + testNumber: number; + timeout: number | null; + } + /** + * A successful call to `run()` method will return a new `TestsStream` object, streaming a series of events representing the execution of the tests.`TestsStream` will emit events, in the + * order of the tests definition + * @since v18.9.0, v16.19.0 + */ + class TestsStream extends Readable implements NodeJS.ReadableStream { + addListener(event: "test:diagnostic", listener: (data: DiagnosticData) => void): this; + addListener(event: "test:fail", listener: (data: TestFail) => void): this; + addListener(event: "test:pass", listener: (data: TestPass) => void): this; + addListener(event: "test:plan", listener: (data: TestPlan) => void): this; + addListener(event: "test:start", listener: (data: TestStart) => void): this; + addListener(event: "test:stderr", listener: (data: TestStderr) => void): this; + addListener(event: "test:stdout", listener: (data: TestStdout) => void): this; + addListener(event: string, listener: (...args: any[]) => void): this; + emit(event: "test:diagnostic", data: DiagnosticData): boolean; + emit(event: "test:fail", data: TestFail): boolean; + emit(event: "test:pass", data: TestPass): boolean; + emit(event: "test:plan", data: TestPlan): boolean; + emit(event: "test:start", data: TestStart): boolean; + emit(event: "test:stderr", data: TestStderr): boolean; + emit(event: "test:stdout", data: TestStdout): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on(event: "test:diagnostic", listener: (data: DiagnosticData) => void): this; + on(event: "test:fail", listener: (data: TestFail) => void): this; + on(event: "test:pass", listener: (data: TestPass) => void): this; + on(event: "test:plan", listener: (data: TestPlan) => void): this; + on(event: "test:start", listener: (data: TestStart) => void): this; + on(event: "test:stderr", listener: (data: TestStderr) => void): this; + on(event: "test:stdout", listener: (data: TestStdout) => void): this; + on(event: string, listener: (...args: any[]) => void): this; + once(event: "test:diagnostic", listener: (data: DiagnosticData) => void): this; + once(event: "test:fail", listener: (data: TestFail) => void): this; + once(event: "test:pass", listener: (data: TestPass) => void): this; + once(event: "test:plan", listener: (data: TestPlan) => void): this; + once(event: "test:start", listener: (data: TestStart) => void): this; + once(event: "test:stderr", listener: (data: TestStderr) => void): this; + once(event: "test:stdout", listener: (data: TestStdout) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "test:diagnostic", listener: (data: DiagnosticData) => void): this; + prependListener(event: "test:fail", listener: (data: TestFail) => void): this; + prependListener(event: "test:pass", listener: (data: TestPass) => void): this; + prependListener(event: "test:plan", listener: (data: TestPlan) => void): this; + prependListener(event: "test:start", listener: (data: TestStart) => void): this; + prependListener(event: "test:stderr", listener: (data: TestStderr) => void): this; + prependListener(event: "test:stdout", listener: (data: TestStdout) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "test:diagnostic", listener: (data: DiagnosticData) => void): this; + prependOnceListener(event: "test:fail", listener: (data: TestFail) => void): this; + prependOnceListener(event: "test:pass", listener: (data: TestPass) => void): this; + prependOnceListener(event: "test:plan", listener: (data: TestPlan) => void): this; + prependOnceListener(event: "test:start", listener: (data: TestStart) => void): this; + prependOnceListener(event: "test:stderr", listener: (data: TestStderr) => void): this; + prependOnceListener(event: "test:stdout", listener: (data: TestStdout) => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + } + /** + * An instance of `TestContext` is passed to each test function in order to + * interact with the test runner. However, the `TestContext` constructor is not + * exposed as part of the API. + * @since v18.0.0, v16.17.0 + */ + class TestContext { + /** + * This function is used to create a hook running before subtest of the current test. + * @param fn The hook function. If the hook uses callbacks, the callback function is passed as + * the second argument. Default: A no-op function. + * @param options Configuration options for the hook. + * @since v20.1.0 + */ + before: typeof before; + /** + * This function is used to create a hook running before each subtest of the current test. + * @param fn The hook function. If the hook uses callbacks, the callback function is passed as + * the second argument. Default: A no-op function. + * @param options Configuration options for the hook. + * @since v18.8.0 + */ + beforeEach: typeof beforeEach; + /** + * This function is used to create a hook that runs after the current test finishes. + * @param fn The hook function. If the hook uses callbacks, the callback function is passed as + * the second argument. Default: A no-op function. + * @param options Configuration options for the hook. + * @since v18.13.0 + */ + after: typeof after; + /** + * This function is used to create a hook running after each subtest of the current test. + * @param fn The hook function. If the hook uses callbacks, the callback function is passed as + * the second argument. Default: A no-op function. + * @param options Configuration options for the hook. + * @since v18.8.0 + */ + afterEach: typeof afterEach; + /** + * This function is used to write diagnostics to the output. Any diagnostic + * information is included at the end of the test's results. This function does + * not return a value. + * + * ```js + * test('top level test', (t) => { + * t.diagnostic('A diagnostic message'); + * }); + * ``` + * @since v18.0.0, v16.17.0 + * @param message Message to be reported. + */ + diagnostic(message: string): void; + /** + * The name of the test. + * @since v18.8.0, v16.18.0 + */ + readonly name: string; + /** + * If `shouldRunOnlyTests` is truthy, the test context will only run tests that + * have the `only` option set. Otherwise, all tests are run. If Node.js was not + * started with the `--test-only` command-line option, this function is a + * no-op. + * + * ```js + * test('top level test', (t) => { + * // The test context can be set to run subtests with the 'only' option. + * t.runOnly(true); + * return Promise.all([ + * t.test('this subtest is now skipped'), + * t.test('this subtest is run', { only: true }), + * ]); + * }); + * ``` + * @since v18.0.0, v16.17.0 + * @param shouldRunOnlyTests Whether or not to run `only` tests. + */ + runOnly(shouldRunOnlyTests: boolean): void; + /** + * ```js + * test('top level test', async (t) => { + * await fetch('some/uri', { signal: t.signal }); + * }); + * ``` + * @since v18.7.0, v16.17.0 + */ + readonly signal: AbortSignal; + /** + * This function causes the test's output to indicate the test as skipped. If`message` is provided, it is included in the output. Calling `skip()` does + * not terminate execution of the test function. This function does not return a + * value. + * + * ```js + * test('top level test', (t) => { + * // Make sure to return here as well if the test contains additional logic. + * t.skip('this is skipped'); + * }); + * ``` + * @since v18.0.0, v16.17.0 + * @param message Optional skip message. + */ + skip(message?: string): void; + /** + * This function adds a `TODO` directive to the test's output. If `message` is + * provided, it is included in the output. Calling `todo()` does not terminate + * execution of the test function. This function does not return a value. + * + * ```js + * test('top level test', (t) => { + * // This test is marked as `TODO` + * t.todo('this is a todo'); + * }); + * ``` + * @since v18.0.0, v16.17.0 + * @param message Optional `TODO` message. + */ + todo(message?: string): void; + /** + * This function is used to create subtests under the current test. This function behaves in + * the same fashion as the top level {@link test} function. + * @since v18.0.0 + * @param name The name of the test, which is displayed when reporting test results. + * Default: The `name` property of fn, or `''` if `fn` does not have a name. + * @param options Configuration options for the test + * @param fn The function under test. This first argument to this function is a + * {@link TestContext} object. If the test uses callbacks, the callback function is + * passed as the second argument. Default: A no-op function. + * @returns A {@link Promise} resolved with `undefined` once the test completes. + */ + test: typeof test; + /** + * Each test provides its own MockTracker instance. + */ + readonly mock: MockTracker; + } + /** + * An instance of `SuiteContext` is passed to each suite function in order to + * interact with the test runner. However, the `SuiteContext` constructor is not + * exposed as part of the API. + * @since v18.7.0, v16.17.0 + */ + class SuiteContext { + /** + * The name of the suite. + * @since v18.8.0, v16.18.0 + */ + readonly name: string; + /** + * Can be used to abort test subtasks when the test has been aborted. + * @since v18.7.0, v16.17.0 + */ + readonly signal: AbortSignal; + } + interface TestOptions { + /** + * If a number is provided, then that many tests would run in parallel. + * If truthy, it would run (number of cpu cores - 1) tests in parallel. + * For subtests, it will be `Infinity` tests in parallel. + * If falsy, it would only run one test at a time. + * If unspecified, subtests inherit this value from their parent. + * @default false + */ + concurrency?: number | boolean | undefined; + /** + * If truthy, and the test context is configured to run `only` tests, then this test will be + * run. Otherwise, the test is skipped. + * @default false + */ + only?: boolean | undefined; + /** + * Allows aborting an in-progress test. + * @since v18.8.0 + */ + signal?: AbortSignal | undefined; + /** + * If truthy, the test is skipped. If a string is provided, that string is displayed in the + * test results as the reason for skipping the test. + * @default false + */ + skip?: boolean | string | undefined; + /** + * A number of milliseconds the test will fail after. If unspecified, subtests inherit this + * value from their parent. + * @default Infinity + * @since v18.7.0 + */ + timeout?: number | undefined; + /** + * If truthy, the test marked as `TODO`. If a string is provided, that string is displayed in + * the test results as the reason why the test is `TODO`. + * @default false + */ + todo?: boolean | string | undefined; + } + /** + * This function is used to create a hook running before running a suite. + * + * ```js + * describe('tests', async () => { + * before(() => console.log('about to run some test')); + * it('is a subtest', () => { + * assert.ok('some relevant assertion here'); + * }); + * }); + * ``` + * @since v18.8.0, v16.18.0 + * @param [fn='A no-op function'] The hook function. If the hook uses callbacks, the callback function is passed as the second argument. + * @param options Configuration options for the hook. The following properties are supported: + */ + function before(fn?: HookFn, options?: HookOptions): void; + /** + * This function is used to create a hook running after running a suite. + * + * ```js + * describe('tests', async () => { + * after(() => console.log('finished running tests')); + * it('is a subtest', () => { + * assert.ok('some relevant assertion here'); + * }); + * }); + * ``` + * @since v18.8.0, v16.18.0 + * @param [fn='A no-op function'] The hook function. If the hook uses callbacks, the callback function is passed as the second argument. + * @param options Configuration options for the hook. The following properties are supported: + */ + function after(fn?: HookFn, options?: HookOptions): void; + /** + * This function is used to create a hook running + * before each subtest of the current suite. + * + * ```js + * describe('tests', async () => { + * beforeEach(() => console.log('about to run a test')); + * it('is a subtest', () => { + * assert.ok('some relevant assertion here'); + * }); + * }); + * ``` + * @since v18.8.0, v16.18.0 + * @param [fn='A no-op function'] The hook function. If the hook uses callbacks, the callback function is passed as the second argument. + * @param options Configuration options for the hook. The following properties are supported: + */ + function beforeEach(fn?: HookFn, options?: HookOptions): void; + /** + * This function is used to create a hook running + * after each subtest of the current test. + * + * ```js + * describe('tests', async () => { + * afterEach(() => console.log('finished running a test')); + * it('is a subtest', () => { + * assert.ok('some relevant assertion here'); + * }); + * }); + * ``` + * @since v18.8.0, v16.18.0 + * @param [fn='A no-op function'] The hook function. If the hook uses callbacks, the callback function is passed as the second argument. + * @param options Configuration options for the hook. The following properties are supported: + */ + function afterEach(fn?: HookFn, options?: HookOptions): void; + /** + * The hook function. If the hook uses callbacks, the callback function is passed as the + * second argument. + */ + type HookFn = (s: SuiteContext, done: (result?: any) => void) => any; + /** + * Configuration options for hooks. + * @since v18.8.0 + */ + interface HookOptions { + /** + * Allows aborting an in-progress hook. + */ + signal?: AbortSignal | undefined; + /** + * A number of milliseconds the hook will fail after. If unspecified, subtests inherit this + * value from their parent. + * @default Infinity + */ + timeout?: number | undefined; + } + interface MockFunctionOptions { + /** + * The number of times that the mock will use the behavior of `implementation`. + * Once the mock function has been called `times` times, + * it will automatically restore the behavior of `original`. + * This value must be an integer greater than zero. + * @default Infinity + */ + times?: number | undefined; + } + interface MockMethodOptions extends MockFunctionOptions { + /** + * If `true`, `object[methodName]` is treated as a getter. + * This option cannot be used with the `setter` option. + */ + getter?: boolean | undefined; + /** + * If `true`, `object[methodName]` is treated as a setter. + * This option cannot be used with the `getter` option. + */ + setter?: boolean | undefined; + } + type Mock = F & { + mock: MockFunctionContext; + }; + type NoOpFunction = (...args: any[]) => undefined; + type FunctionPropertyNames = { + [K in keyof T]: T[K] extends Function ? K : never; + }[keyof T]; + /** + * The `MockTracker` class is used to manage mocking functionality. The test runner + * module provides a top level `mock` export which is a `MockTracker` instance. + * Each test also provides its own `MockTracker` instance via the test context's`mock` property. + * @since v19.1.0, v18.13.0 + */ + class MockTracker { + /** + * This function is used to create a mock function. + * + * The following example creates a mock function that increments a counter by one + * on each invocation. The `times` option is used to modify the mock behavior such + * that the first two invocations add two to the counter instead of one. + * + * ```js + * test('mocks a counting function', (t) => { + * let cnt = 0; + * + * function addOne() { + * cnt++; + * return cnt; + * } + * + * function addTwo() { + * cnt += 2; + * return cnt; + * } + * + * const fn = t.mock.fn(addOne, addTwo, { times: 2 }); + * + * assert.strictEqual(fn(), 2); + * assert.strictEqual(fn(), 4); + * assert.strictEqual(fn(), 5); + * assert.strictEqual(fn(), 6); + * }); + * ``` + * @since v19.1.0, v18.13.0 + * @param [original='A no-op function'] An optional function to create a mock on. + * @param implementation An optional function used as the mock implementation for `original`. This is useful for creating mocks that exhibit one behavior for a specified number of calls and + * then restore the behavior of `original`. + * @param options Optional configuration options for the mock function. The following properties are supported: + * @return The mocked function. The mocked function contains a special `mock` property, which is an instance of {@link MockFunctionContext}, and can be used for inspecting and changing the + * behavior of the mocked function. + */ + fn(original?: F, options?: MockFunctionOptions): Mock; + fn( + original?: F, + implementation?: Implementation, + options?: MockFunctionOptions, + ): Mock; + /** + * This function is used to create a mock on an existing object method. The + * following example demonstrates how a mock is created on an existing object + * method. + * + * ```js + * test('spies on an object method', (t) => { + * const number = { + * value: 5, + * subtract(a) { + * return this.value - a; + * }, + * }; + * + * t.mock.method(number, 'subtract'); + * assert.strictEqual(number.subtract.mock.calls.length, 0); + * assert.strictEqual(number.subtract(3), 2); + * assert.strictEqual(number.subtract.mock.calls.length, 1); + * + * const call = number.subtract.mock.calls[0]; + * + * assert.deepStrictEqual(call.arguments, [3]); + * assert.strictEqual(call.result, 2); + * assert.strictEqual(call.error, undefined); + * assert.strictEqual(call.target, undefined); + * assert.strictEqual(call.this, number); + * }); + * ``` + * @since v19.1.0, v18.13.0 + * @param object The object whose method is being mocked. + * @param methodName The identifier of the method on `object` to mock. If `object[methodName]` is not a function, an error is thrown. + * @param implementation An optional function used as the mock implementation for `object[methodName]`. + * @param options Optional configuration options for the mock method. The following properties are supported: + * @return The mocked method. The mocked method contains a special `mock` property, which is an instance of {@link MockFunctionContext}, and can be used for inspecting and changing the + * behavior of the mocked method. + */ + method< + MockedObject extends object, + MethodName extends FunctionPropertyNames, + >( + object: MockedObject, + methodName: MethodName, + options?: MockFunctionOptions, + ): MockedObject[MethodName] extends Function ? Mock + : never; + method< + MockedObject extends object, + MethodName extends FunctionPropertyNames, + Implementation extends Function, + >( + object: MockedObject, + methodName: MethodName, + implementation: Implementation, + options?: MockFunctionOptions, + ): MockedObject[MethodName] extends Function ? Mock + : never; + method( + object: MockedObject, + methodName: keyof MockedObject, + options: MockMethodOptions, + ): Mock; + method( + object: MockedObject, + methodName: keyof MockedObject, + implementation: Function, + options: MockMethodOptions, + ): Mock; + + /** + * This function is syntax sugar for `MockTracker.method` with `options.getter`set to `true`. + * @since v19.3.0, v18.13.0 + */ + getter< + MockedObject extends object, + MethodName extends keyof MockedObject, + >( + object: MockedObject, + methodName: MethodName, + options?: MockFunctionOptions, + ): Mock<() => MockedObject[MethodName]>; + getter< + MockedObject extends object, + MethodName extends keyof MockedObject, + Implementation extends Function, + >( + object: MockedObject, + methodName: MethodName, + implementation?: Implementation, + options?: MockFunctionOptions, + ): Mock<(() => MockedObject[MethodName]) | Implementation>; + /** + * This function is syntax sugar for `MockTracker.method` with `options.setter`set to `true`. + * @since v19.3.0, v18.13.0 + */ + setter< + MockedObject extends object, + MethodName extends keyof MockedObject, + >( + object: MockedObject, + methodName: MethodName, + options?: MockFunctionOptions, + ): Mock<(value: MockedObject[MethodName]) => void>; + setter< + MockedObject extends object, + MethodName extends keyof MockedObject, + Implementation extends Function, + >( + object: MockedObject, + methodName: MethodName, + implementation?: Implementation, + options?: MockFunctionOptions, + ): Mock<((value: MockedObject[MethodName]) => void) | Implementation>; + /** + * This function restores the default behavior of all mocks that were previously + * created by this `MockTracker` and disassociates the mocks from the`MockTracker` instance. Once disassociated, the mocks can still be used, but the`MockTracker` instance can no longer be + * used to reset their behavior or + * otherwise interact with them. + * + * After each test completes, this function is called on the test context's`MockTracker`. If the global `MockTracker` is used extensively, calling this + * function manually is recommended. + * @since v19.1.0, v18.13.0 + */ + reset(): void; + /** + * This function restores the default behavior of all mocks that were previously + * created by this `MockTracker`. Unlike `mock.reset()`, `mock.restoreAll()` does + * not disassociate the mocks from the `MockTracker` instance. + * @since v19.1.0, v18.13.0 + */ + restoreAll(): void; + timers: MockTimers; + } + const mock: MockTracker; + interface MockFunctionCall< + F extends Function, + ReturnType = F extends (...args: any) => infer T ? T + : F extends abstract new(...args: any) => infer T ? T + : unknown, + Args = F extends (...args: infer Y) => any ? Y + : F extends abstract new(...args: infer Y) => any ? Y + : unknown[], + > { + /** + * An array of the arguments passed to the mock function. + */ + arguments: Args; + /** + * If the mocked function threw then this property contains the thrown value. + */ + error: unknown | undefined; + /** + * The value returned by the mocked function. + * + * If the mocked function threw, it will be `undefined`. + */ + result: ReturnType | undefined; + /** + * An `Error` object whose stack can be used to determine the callsite of the mocked function invocation. + */ + stack: Error; + /** + * If the mocked function is a constructor, this field contains the class being constructed. + * Otherwise this will be `undefined`. + */ + target: F extends abstract new(...args: any) => any ? F : undefined; + /** + * The mocked function's `this` value. + */ + this: unknown; + } + /** + * The `MockFunctionContext` class is used to inspect or manipulate the behavior of + * mocks created via the `MockTracker` APIs. + * @since v19.1.0, v18.13.0 + */ + class MockFunctionContext { + /** + * A getter that returns a copy of the internal array used to track calls to the + * mock. Each entry in the array is an object with the following properties. + * @since v19.1.0, v18.13.0 + */ + readonly calls: Array>; + /** + * This function returns the number of times that this mock has been invoked. This + * function is more efficient than checking `ctx.calls.length` because `ctx.calls`is a getter that creates a copy of the internal call tracking array. + * @since v19.1.0, v18.13.0 + * @return The number of times that this mock has been invoked. + */ + callCount(): number; + /** + * This function is used to change the behavior of an existing mock. + * + * The following example creates a mock function using `t.mock.fn()`, calls the + * mock function, and then changes the mock implementation to a different function. + * + * ```js + * test('changes a mock behavior', (t) => { + * let cnt = 0; + * + * function addOne() { + * cnt++; + * return cnt; + * } + * + * function addTwo() { + * cnt += 2; + * return cnt; + * } + * + * const fn = t.mock.fn(addOne); + * + * assert.strictEqual(fn(), 1); + * fn.mock.mockImplementation(addTwo); + * assert.strictEqual(fn(), 3); + * assert.strictEqual(fn(), 5); + * }); + * ``` + * @since v19.1.0, v18.13.0 + * @param implementation The function to be used as the mock's new implementation. + */ + mockImplementation(implementation: Function): void; + /** + * This function is used to change the behavior of an existing mock for a single + * invocation. Once invocation `onCall` has occurred, the mock will revert to + * whatever behavior it would have used had `mockImplementationOnce()` not been + * called. + * + * The following example creates a mock function using `t.mock.fn()`, calls the + * mock function, changes the mock implementation to a different function for the + * next invocation, and then resumes its previous behavior. + * + * ```js + * test('changes a mock behavior once', (t) => { + * let cnt = 0; + * + * function addOne() { + * cnt++; + * return cnt; + * } + * + * function addTwo() { + * cnt += 2; + * return cnt; + * } + * + * const fn = t.mock.fn(addOne); + * + * assert.strictEqual(fn(), 1); + * fn.mock.mockImplementationOnce(addTwo); + * assert.strictEqual(fn(), 3); + * assert.strictEqual(fn(), 4); + * }); + * ``` + * @since v19.1.0, v18.13.0 + * @param implementation The function to be used as the mock's implementation for the invocation number specified by `onCall`. + * @param onCall The invocation number that will use `implementation`. If the specified invocation has already occurred then an exception is thrown. + */ + mockImplementationOnce(implementation: Function, onCall?: number): void; + /** + * Resets the call history of the mock function. + * @since v19.3.0, v18.13.0 + */ + resetCalls(): void; + /** + * Resets the implementation of the mock function to its original behavior. The + * mock can still be used after calling this function. + * @since v19.1.0, v18.13.0 + */ + restore(): void; + } + type Timer = "setInterval" | "clearInterval" | "setTimeout" | "clearTimeout"; + /** + * Mocking timers is a technique commonly used in software testing to simulate and + * control the behavior of timers, such as `setInterval` and `setTimeout`, + * without actually waiting for the specified time intervals. + * + * The `MockTracker` provides a top-level `timers` export + * which is a `MockTimers` instance. + * @since v20.4.0 + * @experimental + */ + class MockTimers { + /** + * Enables timer mocking for the specified timers. + * + * **Note:** When you enable mocking for a specific timer, its associated + * clear function will also be implicitly mocked. + * + * Example usage: + * + * ```js + * import { mock } from 'node:test'; + * mock.timers.enable(['setInterval']); + * ``` + * + * The above example enables mocking for the `setInterval` timer and + * implicitly mocks the `clearInterval` function. Only the `setInterval`and `clearInterval` functions from `node:timers`,`node:timers/promises`, and`globalThis` will be mocked. + * + * Alternatively, if you call `mock.timers.enable()` without any parameters: + * + * All timers (`'setInterval'`, `'clearInterval'`, `'setTimeout'`, and `'clearTimeout'`) + * will be mocked. The `setInterval`, `clearInterval`, `setTimeout`, and `clearTimeout`functions from `node:timers`, `node:timers/promises`, + * and `globalThis` will be mocked. + * @since v20.4.0 + */ + enable(timers?: Timer[]): void; + /** + * This function restores the default behavior of all mocks that were previously + * created by this `MockTimers` instance and disassociates the mocks + * from the `MockTracker` instance. + * + * **Note:** After each test completes, this function is called on + * the test context's `MockTracker`. + * + * ```js + * import { mock } from 'node:test'; + * mock.timers.reset(); + * ``` + * @since v20.4.0 + */ + reset(): void; + /** + * Advances time for all mocked timers. + * + * **Note:** This diverges from how `setTimeout` in Node.js behaves and accepts + * only positive numbers. In Node.js, `setTimeout` with negative numbers is + * only supported for web compatibility reasons. + * + * The following example mocks a `setTimeout` function and + * by using `.tick` advances in + * time triggering all pending timers. + * + * ```js + * import assert from 'node:assert'; + * import { test } from 'node:test'; + * + * test('mocks setTimeout to be executed synchronously without having to actually wait for it', (context) => { + * const fn = context.mock.fn(); + * + * context.mock.timers.enable(['setTimeout']); + * + * setTimeout(fn, 9999); + * + * assert.strictEqual(fn.mock.callCount(), 0); + * + * // Advance in time + * context.mock.timers.tick(9999); + * + * assert.strictEqual(fn.mock.callCount(), 1); + * }); + * ``` + * + * Alternativelly, the `.tick` function can be called many times + * + * ```js + * import assert from 'node:assert'; + * import { test } from 'node:test'; + * + * test('mocks setTimeout to be executed synchronously without having to actually wait for it', (context) => { + * const fn = context.mock.fn(); + * context.mock.timers.enable(['setTimeout']); + * const nineSecs = 9000; + * setTimeout(fn, nineSecs); + * + * const twoSeconds = 3000; + * context.mock.timers.tick(twoSeconds); + * context.mock.timers.tick(twoSeconds); + * context.mock.timers.tick(twoSeconds); + * + * assert.strictEqual(fn.mock.callCount(), 1); + * }); + * ``` + * @since v20.4.0 + */ + tick(milliseconds: number): void; + /** + * Triggers all pending mocked timers immediately. + * + * The example below triggers all pending timers immediately, + * causing them to execute without any delay. + * + * ```js + * import assert from 'node:assert'; + * import { test } from 'node:test'; + * + * test('runAll functions following the given order', (context) => { + * context.mock.timers.enable(['setTimeout']); + * const results = []; + * setTimeout(() => results.push(1), 9999); + * + * // Notice that if both timers have the same timeout, + * // the order of execution is guaranteed + * setTimeout(() => results.push(3), 8888); + * setTimeout(() => results.push(2), 8888); + * + * assert.deepStrictEqual(results, []); + * + * context.mock.timers.runAll(); + * + * assert.deepStrictEqual(results, [3, 2, 1]); + * }); + * ``` + * + * **Note:** The `runAll()` function is specifically designed for + * triggering timers in the context of timer mocking. + * It does not have any effect on real-time system + * clocks or actual timers outside of the mocking environment. + * @since v20.4.0 + */ + runAll(): void; + /** + * Calls {@link MockTimers.reset()}. + */ + [Symbol.dispose](): void; + } + export { + after, + afterEach, + before, + beforeEach, + describe, + it, + Mock, + mock, + only, + run, + skip, + test, + test as default, + todo, + }; +} + +interface TestLocationInfo { + /** + * The column number where the test is defined, or + * `undefined` if the test was run through the REPL. + */ + column?: number; + /** + * The path of the test file, `undefined` if test is not ran through a file. + */ + file?: string; + /** + * The line number where the test is defined, or + * `undefined` if the test was run through the REPL. + */ + line?: number; +} +interface DiagnosticData extends TestLocationInfo { + /** + * The diagnostic message. + */ + message: string; + /** + * The nesting level of the test. + */ + nesting: number; +} +interface TestFail extends TestLocationInfo { + /** + * Additional execution metadata. + */ + details: { + /** + * The duration of the test in milliseconds. + */ + duration_ms: number; + /** + * The error thrown by the test. + */ + error: Error; + /** + * The type of the test, used to denote whether this is a suite. + * @since 20.0.0, 19.9.0, 18.17.0 + */ + type?: "suite"; + }; + /** + * The test name. + */ + name: string; + /** + * The nesting level of the test. + */ + nesting: number; + /** + * The ordinal number of the test. + */ + testNumber: number; + /** + * Present if `context.todo` is called. + */ + todo?: string | boolean; + /** + * Present if `context.skip` is called. + */ + skip?: string | boolean; +} +interface TestPass extends TestLocationInfo { + /** + * Additional execution metadata. + */ + details: { + /** + * The duration of the test in milliseconds. + */ + duration_ms: number; + /** + * The type of the test, used to denote whether this is a suite. + * @since 20.0.0, 19.9.0, 18.17.0 + */ + type?: "suite"; + }; + /** + * The test name. + */ + name: string; + /** + * The nesting level of the test. + */ + nesting: number; + /** + * The ordinal number of the test. + */ + testNumber: number; + /** + * Present if `context.todo` is called. + */ + todo?: string | boolean; + /** + * Present if `context.skip` is called. + */ + skip?: string | boolean; +} +interface TestPlan extends TestLocationInfo { + /** + * The nesting level of the test. + */ + nesting: number; + /** + * The number of subtests that have ran. + */ + count: number; +} +interface TestStart extends TestLocationInfo { + /** + * The test name. + */ + name: string; + /** + * The nesting level of the test. + */ + nesting: number; +} +interface TestStderr extends TestLocationInfo { + /** + * The message written to `stderr` + */ + message: string; +} +interface TestStdout extends TestLocationInfo { + /** + * The message written to `stdout` + */ + message: string; +} +interface TestEnqueue extends TestLocationInfo { + /** + * The test name + */ + name: string; + /** + * The nesting level of the test. + */ + nesting: number; +} +interface TestDequeue extends TestLocationInfo { + /** + * The test name + */ + name: string; + /** + * The nesting level of the test. + */ + nesting: number; +} + +/** + * The `node:test/reporters` module exposes the builtin-reporters for `node:test`. + * To access it: + * + * ```js + * import test from 'node:test/reporters'; + * ``` + * + * This module is only available under the `node:` scheme. The following will not + * work: + * + * ```js + * import test from 'test/reporters'; + * ``` + * @since v19.9.0 + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/test/reporters.js) + */ +declare module "node:test/reporters" { + import { Transform } from "node:stream"; + + type TestEvent = + | { type: "test:diagnostic"; data: DiagnosticData } + | { type: "test:fail"; data: TestFail } + | { type: "test:pass"; data: TestPass } + | { type: "test:plan"; data: TestPlan } + | { type: "test:start"; data: TestStart } + | { type: "test:stderr"; data: TestStderr } + | { type: "test:stdout"; data: TestStdout } + | { type: "test:enqueue"; data: TestEnqueue } + | { type: "test:dequeue"; data: TestDequeue } + | { type: "test:watch:drained" }; + type TestEventGenerator = AsyncGenerator; + + /** + * The `dot` reporter outputs the test results in a compact format, + * where each passing test is represented by a `.`, + * and each failing test is represented by a `X`. + */ + function dot(source: TestEventGenerator): AsyncGenerator<"\n" | "." | "X", void>; + /** + * The `tap` reporter outputs the test results in the [TAP](https://testanything.org/) format. + */ + function tap(source: TestEventGenerator): AsyncGenerator; + /** + * The `spec` reporter outputs the test results in a human-readable format. + */ + class Spec extends Transform { + constructor(); + } + /** + * The `junit` reporter outputs test results in a jUnit XML format + */ + function junit(source: TestEventGenerator): AsyncGenerator; + export { dot, junit, Spec as spec, tap, TestEvent }; +} diff --git a/task/node_modules/@types/node/ts4.8/timers.d.ts b/task/node_modules/@types/node/ts4.8/timers.d.ts new file mode 100644 index 0000000..039f31f --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/timers.d.ts @@ -0,0 +1,240 @@ +/** + * The `timer` module exposes a global API for scheduling functions to + * be called at some future period of time. Because the timer functions are + * globals, there is no need to call `require('node:timers')` to use the API. + * + * The timer functions within Node.js implement a similar API as the timers API + * provided by Web Browsers but use a different internal implementation that is + * built around the Node.js [Event Loop](https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/#setimmediate-vs-settimeout). + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/timers.js) + */ +declare module "timers" { + import { Abortable } from "node:events"; + import { + setImmediate as setImmediatePromise, + setInterval as setIntervalPromise, + setTimeout as setTimeoutPromise, + } from "node:timers/promises"; + interface TimerOptions extends Abortable { + /** + * Set to `false` to indicate that the scheduled `Timeout` + * should not require the Node.js event loop to remain active. + * @default true + */ + ref?: boolean | undefined; + } + let setTimeout: typeof global.setTimeout; + let clearTimeout: typeof global.clearTimeout; + let setInterval: typeof global.setInterval; + let clearInterval: typeof global.clearInterval; + let setImmediate: typeof global.setImmediate; + let clearImmediate: typeof global.clearImmediate; + global { + namespace NodeJS { + // compatibility with older typings + interface Timer extends RefCounted { + hasRef(): boolean; + refresh(): this; + [Symbol.toPrimitive](): number; + } + /** + * This object is created internally and is returned from `setImmediate()`. It + * can be passed to `clearImmediate()` in order to cancel the scheduled + * actions. + * + * By default, when an immediate is scheduled, the Node.js event loop will continue + * running as long as the immediate is active. The `Immediate` object returned by `setImmediate()` exports both `immediate.ref()` and `immediate.unref()`functions that can be used to + * control this default behavior. + */ + class Immediate implements RefCounted { + /** + * When called, requests that the Node.js event loop _not_ exit so long as the`Immediate` is active. Calling `immediate.ref()` multiple times will have no + * effect. + * + * By default, all `Immediate` objects are "ref'ed", making it normally unnecessary + * to call `immediate.ref()` unless `immediate.unref()` had been called previously. + * @since v9.7.0 + * @return a reference to `immediate` + */ + ref(): this; + /** + * When called, the active `Immediate` object will not require the Node.js event + * loop to remain active. If there is no other activity keeping the event loop + * running, the process may exit before the `Immediate` object's callback is + * invoked. Calling `immediate.unref()` multiple times will have no effect. + * @since v9.7.0 + * @return a reference to `immediate` + */ + unref(): this; + /** + * If true, the `Immediate` object will keep the Node.js event loop active. + * @since v11.0.0 + */ + hasRef(): boolean; + _onImmediate: Function; // to distinguish it from the Timeout class + /** + * Cancels the immediate. This is similar to calling `clearImmediate()`. + * @since v20.5.0 + */ + [Symbol.dispose](): void; + } + /** + * This object is created internally and is returned from `setTimeout()` and `setInterval()`. It can be passed to either `clearTimeout()` or `clearInterval()` in order to cancel the + * scheduled actions. + * + * By default, when a timer is scheduled using either `setTimeout()` or `setInterval()`, the Node.js event loop will continue running as long as the + * timer is active. Each of the `Timeout` objects returned by these functions + * export both `timeout.ref()` and `timeout.unref()` functions that can be used to + * control this default behavior. + */ + class Timeout implements Timer { + /** + * When called, requests that the Node.js event loop _not_ exit so long as the`Timeout` is active. Calling `timeout.ref()` multiple times will have no effect. + * + * By default, all `Timeout` objects are "ref'ed", making it normally unnecessary + * to call `timeout.ref()` unless `timeout.unref()` had been called previously. + * @since v0.9.1 + * @return a reference to `timeout` + */ + ref(): this; + /** + * When called, the active `Timeout` object will not require the Node.js event loop + * to remain active. If there is no other activity keeping the event loop running, + * the process may exit before the `Timeout` object's callback is invoked. Calling`timeout.unref()` multiple times will have no effect. + * @since v0.9.1 + * @return a reference to `timeout` + */ + unref(): this; + /** + * If true, the `Timeout` object will keep the Node.js event loop active. + * @since v11.0.0 + */ + hasRef(): boolean; + /** + * Sets the timer's start time to the current time, and reschedules the timer to + * call its callback at the previously specified duration adjusted to the current + * time. This is useful for refreshing a timer without allocating a new + * JavaScript object. + * + * Using this on a timer that has already called its callback will reactivate the + * timer. + * @since v10.2.0 + * @return a reference to `timeout` + */ + refresh(): this; + [Symbol.toPrimitive](): number; + /** + * Cancels the timeout. + * @since v20.5.0 + */ + [Symbol.dispose](): void; + } + } + /** + * Schedules execution of a one-time `callback` after `delay` milliseconds. + * + * The `callback` will likely not be invoked in precisely `delay` milliseconds. + * Node.js makes no guarantees about the exact timing of when callbacks will fire, + * nor of their ordering. The callback will be called as close as possible to the + * time specified. + * + * When `delay` is larger than `2147483647` or less than `1`, the `delay`will be set to `1`. Non-integer delays are truncated to an integer. + * + * If `callback` is not a function, a `TypeError` will be thrown. + * + * This method has a custom variant for promises that is available using `timersPromises.setTimeout()`. + * @since v0.0.1 + * @param callback The function to call when the timer elapses. + * @param [delay=1] The number of milliseconds to wait before calling the `callback`. + * @param args Optional arguments to pass when the `callback` is called. + * @return for use with {@link clearTimeout} + */ + function setTimeout( + callback: (...args: TArgs) => void, + ms?: number, + ...args: TArgs + ): NodeJS.Timeout; + // util.promisify no rest args compability + // eslint-disable-next-line @typescript-eslint/no-invalid-void-type + function setTimeout(callback: (args: void) => void, ms?: number): NodeJS.Timeout; + namespace setTimeout { + const __promisify__: typeof setTimeoutPromise; + } + /** + * Cancels a `Timeout` object created by `setTimeout()`. + * @since v0.0.1 + * @param timeout A `Timeout` object as returned by {@link setTimeout} or the `primitive` of the `Timeout` object as a string or a number. + */ + function clearTimeout(timeoutId: NodeJS.Timeout | string | number | undefined): void; + /** + * Schedules repeated execution of `callback` every `delay` milliseconds. + * + * When `delay` is larger than `2147483647` or less than `1`, the `delay` will be + * set to `1`. Non-integer delays are truncated to an integer. + * + * If `callback` is not a function, a `TypeError` will be thrown. + * + * This method has a custom variant for promises that is available using `timersPromises.setInterval()`. + * @since v0.0.1 + * @param callback The function to call when the timer elapses. + * @param [delay=1] The number of milliseconds to wait before calling the `callback`. + * @param args Optional arguments to pass when the `callback` is called. + * @return for use with {@link clearInterval} + */ + function setInterval( + callback: (...args: TArgs) => void, + ms?: number, + ...args: TArgs + ): NodeJS.Timeout; + // util.promisify no rest args compability + // eslint-disable-next-line @typescript-eslint/no-invalid-void-type + function setInterval(callback: (args: void) => void, ms?: number): NodeJS.Timeout; + namespace setInterval { + const __promisify__: typeof setIntervalPromise; + } + /** + * Cancels a `Timeout` object created by `setInterval()`. + * @since v0.0.1 + * @param timeout A `Timeout` object as returned by {@link setInterval} or the `primitive` of the `Timeout` object as a string or a number. + */ + function clearInterval(intervalId: NodeJS.Timeout | string | number | undefined): void; + /** + * Schedules the "immediate" execution of the `callback` after I/O events' + * callbacks. + * + * When multiple calls to `setImmediate()` are made, the `callback` functions are + * queued for execution in the order in which they are created. The entire callback + * queue is processed every event loop iteration. If an immediate timer is queued + * from inside an executing callback, that timer will not be triggered until the + * next event loop iteration. + * + * If `callback` is not a function, a `TypeError` will be thrown. + * + * This method has a custom variant for promises that is available using `timersPromises.setImmediate()`. + * @since v0.9.1 + * @param callback The function to call at the end of this turn of the Node.js `Event Loop` + * @param args Optional arguments to pass when the `callback` is called. + * @return for use with {@link clearImmediate} + */ + function setImmediate( + callback: (...args: TArgs) => void, + ...args: TArgs + ): NodeJS.Immediate; + // util.promisify no rest args compability + // eslint-disable-next-line @typescript-eslint/no-invalid-void-type + function setImmediate(callback: (args: void) => void): NodeJS.Immediate; + namespace setImmediate { + const __promisify__: typeof setImmediatePromise; + } + /** + * Cancels an `Immediate` object created by `setImmediate()`. + * @since v0.9.1 + * @param immediate An `Immediate` object as returned by {@link setImmediate}. + */ + function clearImmediate(immediateId: NodeJS.Immediate | undefined): void; + function queueMicrotask(callback: () => void): void; + } +} +declare module "node:timers" { + export * from "timers"; +} diff --git a/task/node_modules/@types/node/ts4.8/timers/promises.d.ts b/task/node_modules/@types/node/ts4.8/timers/promises.d.ts new file mode 100644 index 0000000..5a54dc7 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/timers/promises.d.ts @@ -0,0 +1,93 @@ +/** + * The `timers/promises` API provides an alternative set of timer functions + * that return `Promise` objects. The API is accessible via`require('node:timers/promises')`. + * + * ```js + * import { + * setTimeout, + * setImmediate, + * setInterval, + * } from 'timers/promises'; + * ``` + * @since v15.0.0 + */ +declare module "timers/promises" { + import { TimerOptions } from "node:timers"; + /** + * ```js + * import { + * setTimeout, + * } from 'timers/promises'; + * + * const res = await setTimeout(100, 'result'); + * + * console.log(res); // Prints 'result' + * ``` + * @since v15.0.0 + * @param [delay=1] The number of milliseconds to wait before fulfilling the promise. + * @param value A value with which the promise is fulfilled. + */ + function setTimeout(delay?: number, value?: T, options?: TimerOptions): Promise; + /** + * ```js + * import { + * setImmediate, + * } from 'timers/promises'; + * + * const res = await setImmediate('result'); + * + * console.log(res); // Prints 'result' + * ``` + * @since v15.0.0 + * @param value A value with which the promise is fulfilled. + */ + function setImmediate(value?: T, options?: TimerOptions): Promise; + /** + * Returns an async iterator that generates values in an interval of `delay` ms. + * If `ref` is `true`, you need to call `next()` of async iterator explicitly + * or implicitly to keep the event loop alive. + * + * ```js + * import { + * setInterval, + * } from 'timers/promises'; + * + * const interval = 100; + * for await (const startTime of setInterval(interval, Date.now())) { + * const now = Date.now(); + * console.log(now); + * if ((now - startTime) > 1000) + * break; + * } + * console.log(Date.now()); + * ``` + * @since v15.9.0 + */ + function setInterval(delay?: number, value?: T, options?: TimerOptions): AsyncIterable; + interface Scheduler { + /** + * ```js + * import { scheduler } from 'node:timers/promises'; + * + * await scheduler.wait(1000); // Wait one second before continuing + * ``` + * An experimental API defined by the Scheduling APIs draft specification being developed as a standard Web Platform API. + * Calling timersPromises.scheduler.wait(delay, options) is roughly equivalent to calling timersPromises.setTimeout(delay, undefined, options) except that the ref option is not supported. + * @since v16.14.0 + * @experimental + * @param [delay=1] The number of milliseconds to wait before fulfilling the promise. + */ + wait: (delay?: number, options?: TimerOptions) => Promise; + /** + * An experimental API defined by the Scheduling APIs draft specification being developed as a standard Web Platform API. + * Calling timersPromises.scheduler.yield() is equivalent to calling timersPromises.setImmediate() with no arguments. + * @since v16.14.0 + * @experimental + */ + yield: () => Promise; + } + const scheduler: Scheduler; +} +declare module "node:timers/promises" { + export * from "timers/promises"; +} diff --git a/task/node_modules/@types/node/ts4.8/tls.d.ts b/task/node_modules/@types/node/ts4.8/tls.d.ts new file mode 100644 index 0000000..b289e84 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/tls.d.ts @@ -0,0 +1,1210 @@ +/** + * The `node:tls` module provides an implementation of the Transport Layer Security + * (TLS) and Secure Socket Layer (SSL) protocols that is built on top of OpenSSL. + * The module can be accessed using: + * + * ```js + * const tls = require('node:tls'); + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/tls.js) + */ +declare module "tls" { + import { X509Certificate } from "node:crypto"; + import * as net from "node:net"; + import * as stream from "stream"; + const CLIENT_RENEG_LIMIT: number; + const CLIENT_RENEG_WINDOW: number; + interface Certificate { + /** + * Country code. + */ + C: string; + /** + * Street. + */ + ST: string; + /** + * Locality. + */ + L: string; + /** + * Organization. + */ + O: string; + /** + * Organizational unit. + */ + OU: string; + /** + * Common name. + */ + CN: string; + } + interface PeerCertificate { + /** + * `true` if a Certificate Authority (CA), `false` otherwise. + * @since v18.13.0 + */ + ca: boolean; + /** + * The DER encoded X.509 certificate data. + */ + raw: Buffer; + /** + * The certificate subject. + */ + subject: Certificate; + /** + * The certificate issuer, described in the same terms as the `subject`. + */ + issuer: Certificate; + /** + * The date-time the certificate is valid from. + */ + valid_from: string; + /** + * The date-time the certificate is valid to. + */ + valid_to: string; + /** + * The certificate serial number, as a hex string. + */ + serialNumber: string; + /** + * The SHA-1 digest of the DER encoded certificate. + * It is returned as a `:` separated hexadecimal string. + */ + fingerprint: string; + /** + * The SHA-256 digest of the DER encoded certificate. + * It is returned as a `:` separated hexadecimal string. + */ + fingerprint256: string; + /** + * The SHA-512 digest of the DER encoded certificate. + * It is returned as a `:` separated hexadecimal string. + */ + fingerprint512: string; + /** + * The extended key usage, a set of OIDs. + */ + ext_key_usage?: string[]; + /** + * A string containing concatenated names for the subject, + * an alternative to the `subject` names. + */ + subjectaltname?: string; + /** + * An array describing the AuthorityInfoAccess, used with OCSP. + */ + infoAccess?: NodeJS.Dict; + /** + * For RSA keys: The RSA bit size. + * + * For EC keys: The key size in bits. + */ + bits?: number; + /** + * The RSA exponent, as a string in hexadecimal number notation. + */ + exponent?: string; + /** + * The RSA modulus, as a hexadecimal string. + */ + modulus?: string; + /** + * The public key. + */ + pubkey?: Buffer; + /** + * The ASN.1 name of the OID of the elliptic curve. + * Well-known curves are identified by an OID. + * While it is unusual, it is possible that the curve + * is identified by its mathematical properties, + * in which case it will not have an OID. + */ + asn1Curve?: string; + /** + * The NIST name for the elliptic curve,if it has one + * (not all well-known curves have been assigned names by NIST). + */ + nistCurve?: string; + } + interface DetailedPeerCertificate extends PeerCertificate { + /** + * The issuer certificate object. + * For self-signed certificates, this may be a circular reference. + */ + issuerCertificate: DetailedPeerCertificate; + } + interface CipherNameAndProtocol { + /** + * The cipher name. + */ + name: string; + /** + * SSL/TLS protocol version. + */ + version: string; + /** + * IETF name for the cipher suite. + */ + standardName: string; + } + interface EphemeralKeyInfo { + /** + * The supported types are 'DH' and 'ECDH'. + */ + type: string; + /** + * The name property is available only when type is 'ECDH'. + */ + name?: string | undefined; + /** + * The size of parameter of an ephemeral key exchange. + */ + size: number; + } + interface KeyObject { + /** + * Private keys in PEM format. + */ + pem: string | Buffer; + /** + * Optional passphrase. + */ + passphrase?: string | undefined; + } + interface PxfObject { + /** + * PFX or PKCS12 encoded private key and certificate chain. + */ + buf: string | Buffer; + /** + * Optional passphrase. + */ + passphrase?: string | undefined; + } + interface TLSSocketOptions extends SecureContextOptions, CommonConnectionOptions { + /** + * If true the TLS socket will be instantiated in server-mode. + * Defaults to false. + */ + isServer?: boolean | undefined; + /** + * An optional net.Server instance. + */ + server?: net.Server | undefined; + /** + * An optional Buffer instance containing a TLS session. + */ + session?: Buffer | undefined; + /** + * If true, specifies that the OCSP status request extension will be + * added to the client hello and an 'OCSPResponse' event will be + * emitted on the socket before establishing a secure communication + */ + requestOCSP?: boolean | undefined; + } + /** + * Performs transparent encryption of written data and all required TLS + * negotiation. + * + * Instances of `tls.TLSSocket` implement the duplex `Stream` interface. + * + * Methods that return TLS connection metadata (e.g.{@link TLSSocket.getPeerCertificate}) will only return data while the + * connection is open. + * @since v0.11.4 + */ + class TLSSocket extends net.Socket { + /** + * Construct a new tls.TLSSocket object from an existing TCP socket. + */ + constructor(socket: net.Socket, options?: TLSSocketOptions); + /** + * This property is `true` if the peer certificate was signed by one of the CAs + * specified when creating the `tls.TLSSocket` instance, otherwise `false`. + * @since v0.11.4 + */ + authorized: boolean; + /** + * Returns the reason why the peer's certificate was not been verified. This + * property is set only when `tlsSocket.authorized === false`. + * @since v0.11.4 + */ + authorizationError: Error; + /** + * Always returns `true`. This may be used to distinguish TLS sockets from regular`net.Socket` instances. + * @since v0.11.4 + */ + encrypted: true; + /** + * String containing the selected ALPN protocol. + * Before a handshake has completed, this value is always null. + * When a handshake is completed but not ALPN protocol was selected, tlsSocket.alpnProtocol equals false. + */ + alpnProtocol: string | false | null; + /** + * Returns an object representing the local certificate. The returned object has + * some properties corresponding to the fields of the certificate. + * + * See {@link TLSSocket.getPeerCertificate} for an example of the certificate + * structure. + * + * If there is no local certificate, an empty object will be returned. If the + * socket has been destroyed, `null` will be returned. + * @since v11.2.0 + */ + getCertificate(): PeerCertificate | object | null; + /** + * Returns an object containing information on the negotiated cipher suite. + * + * For example, a TLSv1.2 protocol with AES256-SHA cipher: + * + * ```json + * { + * "name": "AES256-SHA", + * "standardName": "TLS_RSA_WITH_AES_256_CBC_SHA", + * "version": "SSLv3" + * } + * ``` + * + * See [SSL\_CIPHER\_get\_name](https://www.openssl.org/docs/man1.1.1/man3/SSL_CIPHER_get_name.html) for more information. + * @since v0.11.4 + */ + getCipher(): CipherNameAndProtocol; + /** + * Returns an object representing the type, name, and size of parameter of + * an ephemeral key exchange in `perfect forward secrecy` on a client + * connection. It returns an empty object when the key exchange is not + * ephemeral. As this is only supported on a client socket; `null` is returned + * if called on a server socket. The supported types are `'DH'` and `'ECDH'`. The`name` property is available only when type is `'ECDH'`. + * + * For example: `{ type: 'ECDH', name: 'prime256v1', size: 256 }`. + * @since v5.0.0 + */ + getEphemeralKeyInfo(): EphemeralKeyInfo | object | null; + /** + * As the `Finished` messages are message digests of the complete handshake + * (with a total of 192 bits for TLS 1.0 and more for SSL 3.0), they can + * be used for external authentication procedures when the authentication + * provided by SSL/TLS is not desired or is not enough. + * + * Corresponds to the `SSL_get_finished` routine in OpenSSL and may be used + * to implement the `tls-unique` channel binding from [RFC 5929](https://tools.ietf.org/html/rfc5929). + * @since v9.9.0 + * @return The latest `Finished` message that has been sent to the socket as part of a SSL/TLS handshake, or `undefined` if no `Finished` message has been sent yet. + */ + getFinished(): Buffer | undefined; + /** + * Returns an object representing the peer's certificate. If the peer does not + * provide a certificate, an empty object will be returned. If the socket has been + * destroyed, `null` will be returned. + * + * If the full certificate chain was requested, each certificate will include an`issuerCertificate` property containing an object representing its issuer's + * certificate. + * @since v0.11.4 + * @param detailed Include the full certificate chain if `true`, otherwise include just the peer's certificate. + * @return A certificate object. + */ + getPeerCertificate(detailed: true): DetailedPeerCertificate; + getPeerCertificate(detailed?: false): PeerCertificate; + getPeerCertificate(detailed?: boolean): PeerCertificate | DetailedPeerCertificate; + /** + * As the `Finished` messages are message digests of the complete handshake + * (with a total of 192 bits for TLS 1.0 and more for SSL 3.0), they can + * be used for external authentication procedures when the authentication + * provided by SSL/TLS is not desired or is not enough. + * + * Corresponds to the `SSL_get_peer_finished` routine in OpenSSL and may be used + * to implement the `tls-unique` channel binding from [RFC 5929](https://tools.ietf.org/html/rfc5929). + * @since v9.9.0 + * @return The latest `Finished` message that is expected or has actually been received from the socket as part of a SSL/TLS handshake, or `undefined` if there is no `Finished` message so + * far. + */ + getPeerFinished(): Buffer | undefined; + /** + * Returns a string containing the negotiated SSL/TLS protocol version of the + * current connection. The value `'unknown'` will be returned for connected + * sockets that have not completed the handshaking process. The value `null` will + * be returned for server sockets or disconnected client sockets. + * + * Protocol versions are: + * + * * `'SSLv3'` + * * `'TLSv1'` + * * `'TLSv1.1'` + * * `'TLSv1.2'` + * * `'TLSv1.3'` + * + * See the OpenSSL [`SSL_get_version`](https://www.openssl.org/docs/man1.1.1/man3/SSL_get_version.html) documentation for more information. + * @since v5.7.0 + */ + getProtocol(): string | null; + /** + * Returns the TLS session data or `undefined` if no session was + * negotiated. On the client, the data can be provided to the `session` option of {@link connect} to resume the connection. On the server, it may be useful + * for debugging. + * + * See `Session Resumption` for more information. + * + * Note: `getSession()` works only for TLSv1.2 and below. For TLSv1.3, applications + * must use the `'session'` event (it also works for TLSv1.2 and below). + * @since v0.11.4 + */ + getSession(): Buffer | undefined; + /** + * See [SSL\_get\_shared\_sigalgs](https://www.openssl.org/docs/man1.1.1/man3/SSL_get_shared_sigalgs.html) for more information. + * @since v12.11.0 + * @return List of signature algorithms shared between the server and the client in the order of decreasing preference. + */ + getSharedSigalgs(): string[]; + /** + * For a client, returns the TLS session ticket if one is available, or`undefined`. For a server, always returns `undefined`. + * + * It may be useful for debugging. + * + * See `Session Resumption` for more information. + * @since v0.11.4 + */ + getTLSTicket(): Buffer | undefined; + /** + * See `Session Resumption` for more information. + * @since v0.5.6 + * @return `true` if the session was reused, `false` otherwise. + */ + isSessionReused(): boolean; + /** + * The `tlsSocket.renegotiate()` method initiates a TLS renegotiation process. + * Upon completion, the `callback` function will be passed a single argument + * that is either an `Error` (if the request failed) or `null`. + * + * This method can be used to request a peer's certificate after the secure + * connection has been established. + * + * When running as the server, the socket will be destroyed with an error after`handshakeTimeout` timeout. + * + * For TLSv1.3, renegotiation cannot be initiated, it is not supported by the + * protocol. + * @since v0.11.8 + * @param callback If `renegotiate()` returned `true`, callback is attached once to the `'secure'` event. If `renegotiate()` returned `false`, `callback` will be called in the next tick with + * an error, unless the `tlsSocket` has been destroyed, in which case `callback` will not be called at all. + * @return `true` if renegotiation was initiated, `false` otherwise. + */ + renegotiate( + options: { + rejectUnauthorized?: boolean | undefined; + requestCert?: boolean | undefined; + }, + callback: (err: Error | null) => void, + ): undefined | boolean; + /** + * The `tlsSocket.setMaxSendFragment()` method sets the maximum TLS fragment size. + * Returns `true` if setting the limit succeeded; `false` otherwise. + * + * Smaller fragment sizes decrease the buffering latency on the client: larger + * fragments are buffered by the TLS layer until the entire fragment is received + * and its integrity is verified; large fragments can span multiple roundtrips + * and their processing can be delayed due to packet loss or reordering. However, + * smaller fragments add extra TLS framing bytes and CPU overhead, which may + * decrease overall server throughput. + * @since v0.11.11 + * @param [size=16384] The maximum TLS fragment size. The maximum value is `16384`. + */ + setMaxSendFragment(size: number): boolean; + /** + * Disables TLS renegotiation for this `TLSSocket` instance. Once called, attempts + * to renegotiate will trigger an `'error'` event on the `TLSSocket`. + * @since v8.4.0 + */ + disableRenegotiation(): void; + /** + * When enabled, TLS packet trace information is written to `stderr`. This can be + * used to debug TLS connection problems. + * + * The format of the output is identical to the output of`openssl s_client -trace` or `openssl s_server -trace`. While it is produced by + * OpenSSL's `SSL_trace()` function, the format is undocumented, can change + * without notice, and should not be relied on. + * @since v12.2.0 + */ + enableTrace(): void; + /** + * Returns the peer certificate as an `X509Certificate` object. + * + * If there is no peer certificate, or the socket has been destroyed,`undefined` will be returned. + * @since v15.9.0 + */ + getPeerX509Certificate(): X509Certificate | undefined; + /** + * Returns the local certificate as an `X509Certificate` object. + * + * If there is no local certificate, or the socket has been destroyed,`undefined` will be returned. + * @since v15.9.0 + */ + getX509Certificate(): X509Certificate | undefined; + /** + * Keying material is used for validations to prevent different kind of attacks in + * network protocols, for example in the specifications of IEEE 802.1X. + * + * Example + * + * ```js + * const keyingMaterial = tlsSocket.exportKeyingMaterial( + * 128, + * 'client finished'); + * + * /* + * Example return value of keyingMaterial: + * + * + * ``` + * + * See the OpenSSL [`SSL_export_keying_material`](https://www.openssl.org/docs/man1.1.1/man3/SSL_export_keying_material.html) documentation for more + * information. + * @since v13.10.0, v12.17.0 + * @param length number of bytes to retrieve from keying material + * @param label an application specific label, typically this will be a value from the [IANA Exporter Label + * Registry](https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#exporter-labels). + * @param context Optionally provide a context. + * @return requested bytes of the keying material + */ + exportKeyingMaterial(length: number, label: string, context: Buffer): Buffer; + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "OCSPResponse", listener: (response: Buffer) => void): this; + addListener(event: "secureConnect", listener: () => void): this; + addListener(event: "session", listener: (session: Buffer) => void): this; + addListener(event: "keylog", listener: (line: Buffer) => void): this; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "OCSPResponse", response: Buffer): boolean; + emit(event: "secureConnect"): boolean; + emit(event: "session", session: Buffer): boolean; + emit(event: "keylog", line: Buffer): boolean; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "OCSPResponse", listener: (response: Buffer) => void): this; + on(event: "secureConnect", listener: () => void): this; + on(event: "session", listener: (session: Buffer) => void): this; + on(event: "keylog", listener: (line: Buffer) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "OCSPResponse", listener: (response: Buffer) => void): this; + once(event: "secureConnect", listener: () => void): this; + once(event: "session", listener: (session: Buffer) => void): this; + once(event: "keylog", listener: (line: Buffer) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "OCSPResponse", listener: (response: Buffer) => void): this; + prependListener(event: "secureConnect", listener: () => void): this; + prependListener(event: "session", listener: (session: Buffer) => void): this; + prependListener(event: "keylog", listener: (line: Buffer) => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "OCSPResponse", listener: (response: Buffer) => void): this; + prependOnceListener(event: "secureConnect", listener: () => void): this; + prependOnceListener(event: "session", listener: (session: Buffer) => void): this; + prependOnceListener(event: "keylog", listener: (line: Buffer) => void): this; + } + interface CommonConnectionOptions { + /** + * An optional TLS context object from tls.createSecureContext() + */ + secureContext?: SecureContext | undefined; + /** + * When enabled, TLS packet trace information is written to `stderr`. This can be + * used to debug TLS connection problems. + * @default false + */ + enableTrace?: boolean | undefined; + /** + * If true the server will request a certificate from clients that + * connect and attempt to verify that certificate. Defaults to + * false. + */ + requestCert?: boolean | undefined; + /** + * An array of strings or a Buffer naming possible ALPN protocols. + * (Protocols should be ordered by their priority.) + */ + ALPNProtocols?: string[] | Uint8Array[] | Uint8Array | undefined; + /** + * SNICallback(servername, cb) A function that will be + * called if the client supports SNI TLS extension. Two arguments + * will be passed when called: servername and cb. SNICallback should + * invoke cb(null, ctx), where ctx is a SecureContext instance. + * (tls.createSecureContext(...) can be used to get a proper + * SecureContext.) If SNICallback wasn't provided the default callback + * with high-level API will be used (see below). + */ + SNICallback?: ((servername: string, cb: (err: Error | null, ctx?: SecureContext) => void) => void) | undefined; + /** + * If true the server will reject any connection which is not + * authorized with the list of supplied CAs. This option only has an + * effect if requestCert is true. + * @default true + */ + rejectUnauthorized?: boolean | undefined; + } + interface TlsOptions extends SecureContextOptions, CommonConnectionOptions, net.ServerOpts { + /** + * Abort the connection if the SSL/TLS handshake does not finish in the + * specified number of milliseconds. A 'tlsClientError' is emitted on + * the tls.Server object whenever a handshake times out. Default: + * 120000 (120 seconds). + */ + handshakeTimeout?: number | undefined; + /** + * The number of seconds after which a TLS session created by the + * server will no longer be resumable. See Session Resumption for more + * information. Default: 300. + */ + sessionTimeout?: number | undefined; + /** + * 48-bytes of cryptographically strong pseudo-random data. + */ + ticketKeys?: Buffer | undefined; + /** + * @param socket + * @param identity identity parameter sent from the client. + * @return pre-shared key that must either be + * a buffer or `null` to stop the negotiation process. Returned PSK must be + * compatible with the selected cipher's digest. + * + * When negotiating TLS-PSK (pre-shared keys), this function is called + * with the identity provided by the client. + * If the return value is `null` the negotiation process will stop and an + * "unknown_psk_identity" alert message will be sent to the other party. + * If the server wishes to hide the fact that the PSK identity was not known, + * the callback must provide some random data as `psk` to make the connection + * fail with "decrypt_error" before negotiation is finished. + * PSK ciphers are disabled by default, and using TLS-PSK thus + * requires explicitly specifying a cipher suite with the `ciphers` option. + * More information can be found in the RFC 4279. + */ + pskCallback?(socket: TLSSocket, identity: string): DataView | NodeJS.TypedArray | null; + /** + * hint to send to a client to help + * with selecting the identity during TLS-PSK negotiation. Will be ignored + * in TLS 1.3. Upon failing to set pskIdentityHint `tlsClientError` will be + * emitted with `ERR_TLS_PSK_SET_IDENTIY_HINT_FAILED` code. + */ + pskIdentityHint?: string | undefined; + } + interface PSKCallbackNegotation { + psk: DataView | NodeJS.TypedArray; + identity: string; + } + interface ConnectionOptions extends SecureContextOptions, CommonConnectionOptions { + host?: string | undefined; + port?: number | undefined; + path?: string | undefined; // Creates unix socket connection to path. If this option is specified, `host` and `port` are ignored. + socket?: stream.Duplex | undefined; // Establish secure connection on a given socket rather than creating a new socket + checkServerIdentity?: typeof checkServerIdentity | undefined; + servername?: string | undefined; // SNI TLS Extension + session?: Buffer | undefined; + minDHSize?: number | undefined; + lookup?: net.LookupFunction | undefined; + timeout?: number | undefined; + /** + * When negotiating TLS-PSK (pre-shared keys), this function is called + * with optional identity `hint` provided by the server or `null` + * in case of TLS 1.3 where `hint` was removed. + * It will be necessary to provide a custom `tls.checkServerIdentity()` + * for the connection as the default one will try to check hostname/IP + * of the server against the certificate but that's not applicable for PSK + * because there won't be a certificate present. + * More information can be found in the RFC 4279. + * + * @param hint message sent from the server to help client + * decide which identity to use during negotiation. + * Always `null` if TLS 1.3 is used. + * @returns Return `null` to stop the negotiation process. `psk` must be + * compatible with the selected cipher's digest. + * `identity` must use UTF-8 encoding. + */ + pskCallback?(hint: string | null): PSKCallbackNegotation | null; + } + /** + * Accepts encrypted connections using TLS or SSL. + * @since v0.3.2 + */ + class Server extends net.Server { + constructor(secureConnectionListener?: (socket: TLSSocket) => void); + constructor(options: TlsOptions, secureConnectionListener?: (socket: TLSSocket) => void); + /** + * The `server.addContext()` method adds a secure context that will be used if + * the client request's SNI name matches the supplied `hostname` (or wildcard). + * + * When there are multiple matching contexts, the most recently added one is + * used. + * @since v0.5.3 + * @param hostname A SNI host name or wildcard (e.g. `'*'`) + * @param context An object containing any of the possible properties from the {@link createSecureContext} `options` arguments (e.g. `key`, `cert`, `ca`, etc), or a TLS context object created + * with {@link createSecureContext} itself. + */ + addContext(hostname: string, context: SecureContextOptions): void; + /** + * Returns the session ticket keys. + * + * See `Session Resumption` for more information. + * @since v3.0.0 + * @return A 48-byte buffer containing the session ticket keys. + */ + getTicketKeys(): Buffer; + /** + * The `server.setSecureContext()` method replaces the secure context of an + * existing server. Existing connections to the server are not interrupted. + * @since v11.0.0 + * @param options An object containing any of the possible properties from the {@link createSecureContext} `options` arguments (e.g. `key`, `cert`, `ca`, etc). + */ + setSecureContext(options: SecureContextOptions): void; + /** + * Sets the session ticket keys. + * + * Changes to the ticket keys are effective only for future server connections. + * Existing or currently pending server connections will use the previous keys. + * + * See `Session Resumption` for more information. + * @since v3.0.0 + * @param keys A 48-byte buffer containing the session ticket keys. + */ + setTicketKeys(keys: Buffer): void; + /** + * events.EventEmitter + * 1. tlsClientError + * 2. newSession + * 3. OCSPRequest + * 4. resumeSession + * 5. secureConnection + * 6. keylog + */ + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; + addListener( + event: "newSession", + listener: (sessionId: Buffer, sessionData: Buffer, callback: () => void) => void, + ): this; + addListener( + event: "OCSPRequest", + listener: ( + certificate: Buffer, + issuer: Buffer, + callback: (err: Error | null, resp: Buffer) => void, + ) => void, + ): this; + addListener( + event: "resumeSession", + listener: (sessionId: Buffer, callback: (err: Error | null, sessionData: Buffer | null) => void) => void, + ): this; + addListener(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; + addListener(event: "keylog", listener: (line: Buffer, tlsSocket: TLSSocket) => void): this; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "tlsClientError", err: Error, tlsSocket: TLSSocket): boolean; + emit(event: "newSession", sessionId: Buffer, sessionData: Buffer, callback: () => void): boolean; + emit( + event: "OCSPRequest", + certificate: Buffer, + issuer: Buffer, + callback: (err: Error | null, resp: Buffer) => void, + ): boolean; + emit( + event: "resumeSession", + sessionId: Buffer, + callback: (err: Error | null, sessionData: Buffer | null) => void, + ): boolean; + emit(event: "secureConnection", tlsSocket: TLSSocket): boolean; + emit(event: "keylog", line: Buffer, tlsSocket: TLSSocket): boolean; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; + on(event: "newSession", listener: (sessionId: Buffer, sessionData: Buffer, callback: () => void) => void): this; + on( + event: "OCSPRequest", + listener: ( + certificate: Buffer, + issuer: Buffer, + callback: (err: Error | null, resp: Buffer) => void, + ) => void, + ): this; + on( + event: "resumeSession", + listener: (sessionId: Buffer, callback: (err: Error | null, sessionData: Buffer | null) => void) => void, + ): this; + on(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; + on(event: "keylog", listener: (line: Buffer, tlsSocket: TLSSocket) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; + once( + event: "newSession", + listener: (sessionId: Buffer, sessionData: Buffer, callback: () => void) => void, + ): this; + once( + event: "OCSPRequest", + listener: ( + certificate: Buffer, + issuer: Buffer, + callback: (err: Error | null, resp: Buffer) => void, + ) => void, + ): this; + once( + event: "resumeSession", + listener: (sessionId: Buffer, callback: (err: Error | null, sessionData: Buffer | null) => void) => void, + ): this; + once(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; + once(event: "keylog", listener: (line: Buffer, tlsSocket: TLSSocket) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; + prependListener( + event: "newSession", + listener: (sessionId: Buffer, sessionData: Buffer, callback: () => void) => void, + ): this; + prependListener( + event: "OCSPRequest", + listener: ( + certificate: Buffer, + issuer: Buffer, + callback: (err: Error | null, resp: Buffer) => void, + ) => void, + ): this; + prependListener( + event: "resumeSession", + listener: (sessionId: Buffer, callback: (err: Error | null, sessionData: Buffer | null) => void) => void, + ): this; + prependListener(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; + prependListener(event: "keylog", listener: (line: Buffer, tlsSocket: TLSSocket) => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; + prependOnceListener( + event: "newSession", + listener: (sessionId: Buffer, sessionData: Buffer, callback: () => void) => void, + ): this; + prependOnceListener( + event: "OCSPRequest", + listener: ( + certificate: Buffer, + issuer: Buffer, + callback: (err: Error | null, resp: Buffer) => void, + ) => void, + ): this; + prependOnceListener( + event: "resumeSession", + listener: (sessionId: Buffer, callback: (err: Error | null, sessionData: Buffer | null) => void) => void, + ): this; + prependOnceListener(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; + prependOnceListener(event: "keylog", listener: (line: Buffer, tlsSocket: TLSSocket) => void): this; + } + /** + * @deprecated since v0.11.3 Use `tls.TLSSocket` instead. + */ + interface SecurePair { + encrypted: TLSSocket; + cleartext: TLSSocket; + } + type SecureVersion = "TLSv1.3" | "TLSv1.2" | "TLSv1.1" | "TLSv1"; + interface SecureContextOptions { + /** + * If set, this will be called when a client opens a connection using the ALPN extension. + * One argument will be passed to the callback: an object containing `servername` and `protocols` fields, + * respectively containing the server name from the SNI extension (if any) and an array of + * ALPN protocol name strings. The callback must return either one of the strings listed in `protocols`, + * which will be returned to the client as the selected ALPN protocol, or `undefined`, + * to reject the connection with a fatal alert. If a string is returned that does not match one of + * the client's ALPN protocols, an error will be thrown. + * This option cannot be used with the `ALPNProtocols` option, and setting both options will throw an error. + */ + ALPNCallback?: ((arg: { servername: string; protocols: string[] }) => string | undefined) | undefined; + /** + * Optionally override the trusted CA certificates. Default is to trust + * the well-known CAs curated by Mozilla. Mozilla's CAs are completely + * replaced when CAs are explicitly specified using this option. + */ + ca?: string | Buffer | Array | undefined; + /** + * Cert chains in PEM format. One cert chain should be provided per + * private key. Each cert chain should consist of the PEM formatted + * certificate for a provided private key, followed by the PEM + * formatted intermediate certificates (if any), in order, and not + * including the root CA (the root CA must be pre-known to the peer, + * see ca). When providing multiple cert chains, they do not have to + * be in the same order as their private keys in key. If the + * intermediate certificates are not provided, the peer will not be + * able to validate the certificate, and the handshake will fail. + */ + cert?: string | Buffer | Array | undefined; + /** + * Colon-separated list of supported signature algorithms. The list + * can contain digest algorithms (SHA256, MD5 etc.), public key + * algorithms (RSA-PSS, ECDSA etc.), combination of both (e.g + * 'RSA+SHA384') or TLS v1.3 scheme names (e.g. rsa_pss_pss_sha512). + */ + sigalgs?: string | undefined; + /** + * Cipher suite specification, replacing the default. For more + * information, see modifying the default cipher suite. Permitted + * ciphers can be obtained via tls.getCiphers(). Cipher names must be + * uppercased in order for OpenSSL to accept them. + */ + ciphers?: string | undefined; + /** + * Name of an OpenSSL engine which can provide the client certificate. + */ + clientCertEngine?: string | undefined; + /** + * PEM formatted CRLs (Certificate Revocation Lists). + */ + crl?: string | Buffer | Array | undefined; + /** + * `'auto'` or custom Diffie-Hellman parameters, required for non-ECDHE perfect forward secrecy. + * If omitted or invalid, the parameters are silently discarded and DHE ciphers will not be available. + * ECDHE-based perfect forward secrecy will still be available. + */ + dhparam?: string | Buffer | undefined; + /** + * A string describing a named curve or a colon separated list of curve + * NIDs or names, for example P-521:P-384:P-256, to use for ECDH key + * agreement. Set to auto to select the curve automatically. Use + * crypto.getCurves() to obtain a list of available curve names. On + * recent releases, openssl ecparam -list_curves will also display the + * name and description of each available elliptic curve. Default: + * tls.DEFAULT_ECDH_CURVE. + */ + ecdhCurve?: string | undefined; + /** + * Attempt to use the server's cipher suite preferences instead of the + * client's. When true, causes SSL_OP_CIPHER_SERVER_PREFERENCE to be + * set in secureOptions + */ + honorCipherOrder?: boolean | undefined; + /** + * Private keys in PEM format. PEM allows the option of private keys + * being encrypted. Encrypted keys will be decrypted with + * options.passphrase. Multiple keys using different algorithms can be + * provided either as an array of unencrypted key strings or buffers, + * or an array of objects in the form {pem: [, + * passphrase: ]}. The object form can only occur in an array. + * object.passphrase is optional. Encrypted keys will be decrypted with + * object.passphrase if provided, or options.passphrase if it is not. + */ + key?: string | Buffer | Array | undefined; + /** + * Name of an OpenSSL engine to get private key from. Should be used + * together with privateKeyIdentifier. + */ + privateKeyEngine?: string | undefined; + /** + * Identifier of a private key managed by an OpenSSL engine. Should be + * used together with privateKeyEngine. Should not be set together with + * key, because both options define a private key in different ways. + */ + privateKeyIdentifier?: string | undefined; + /** + * Optionally set the maximum TLS version to allow. One + * of `'TLSv1.3'`, `'TLSv1.2'`, `'TLSv1.1'`, or `'TLSv1'`. Cannot be specified along with the + * `secureProtocol` option, use one or the other. + * **Default:** `'TLSv1.3'`, unless changed using CLI options. Using + * `--tls-max-v1.2` sets the default to `'TLSv1.2'`. Using `--tls-max-v1.3` sets the default to + * `'TLSv1.3'`. If multiple of the options are provided, the highest maximum is used. + */ + maxVersion?: SecureVersion | undefined; + /** + * Optionally set the minimum TLS version to allow. One + * of `'TLSv1.3'`, `'TLSv1.2'`, `'TLSv1.1'`, or `'TLSv1'`. Cannot be specified along with the + * `secureProtocol` option, use one or the other. It is not recommended to use + * less than TLSv1.2, but it may be required for interoperability. + * **Default:** `'TLSv1.2'`, unless changed using CLI options. Using + * `--tls-v1.0` sets the default to `'TLSv1'`. Using `--tls-v1.1` sets the default to + * `'TLSv1.1'`. Using `--tls-min-v1.3` sets the default to + * 'TLSv1.3'. If multiple of the options are provided, the lowest minimum is used. + */ + minVersion?: SecureVersion | undefined; + /** + * Shared passphrase used for a single private key and/or a PFX. + */ + passphrase?: string | undefined; + /** + * PFX or PKCS12 encoded private key and certificate chain. pfx is an + * alternative to providing key and cert individually. PFX is usually + * encrypted, if it is, passphrase will be used to decrypt it. Multiple + * PFX can be provided either as an array of unencrypted PFX buffers, + * or an array of objects in the form {buf: [, + * passphrase: ]}. The object form can only occur in an array. + * object.passphrase is optional. Encrypted PFX will be decrypted with + * object.passphrase if provided, or options.passphrase if it is not. + */ + pfx?: string | Buffer | Array | undefined; + /** + * Optionally affect the OpenSSL protocol behavior, which is not + * usually necessary. This should be used carefully if at all! Value is + * a numeric bitmask of the SSL_OP_* options from OpenSSL Options + */ + secureOptions?: number | undefined; // Value is a numeric bitmask of the `SSL_OP_*` options + /** + * Legacy mechanism to select the TLS protocol version to use, it does + * not support independent control of the minimum and maximum version, + * and does not support limiting the protocol to TLSv1.3. Use + * minVersion and maxVersion instead. The possible values are listed as + * SSL_METHODS, use the function names as strings. For example, use + * 'TLSv1_1_method' to force TLS version 1.1, or 'TLS_method' to allow + * any TLS protocol version up to TLSv1.3. It is not recommended to use + * TLS versions less than 1.2, but it may be required for + * interoperability. Default: none, see minVersion. + */ + secureProtocol?: string | undefined; + /** + * Opaque identifier used by servers to ensure session state is not + * shared between applications. Unused by clients. + */ + sessionIdContext?: string | undefined; + /** + * 48-bytes of cryptographically strong pseudo-random data. + * See Session Resumption for more information. + */ + ticketKeys?: Buffer | undefined; + /** + * The number of seconds after which a TLS session created by the + * server will no longer be resumable. See Session Resumption for more + * information. Default: 300. + */ + sessionTimeout?: number | undefined; + } + interface SecureContext { + context: any; + } + /** + * Verifies the certificate `cert` is issued to `hostname`. + * + * Returns [Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error) object, populating it with `reason`, `host`, and `cert` on + * failure. On success, returns [undefined](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Undefined_type). + * + * This function is intended to be used in combination with the`checkServerIdentity` option that can be passed to {@link connect} and as + * such operates on a `certificate object`. For other purposes, consider using `x509.checkHost()` instead. + * + * This function can be overwritten by providing an alternative function as the`options.checkServerIdentity` option that is passed to `tls.connect()`. The + * overwriting function can call `tls.checkServerIdentity()` of course, to augment + * the checks done with additional verification. + * + * This function is only called if the certificate passed all other checks, such as + * being issued by trusted CA (`options.ca`). + * + * Earlier versions of Node.js incorrectly accepted certificates for a given`hostname` if a matching `uniformResourceIdentifier` subject alternative name + * was present (see [CVE-2021-44531](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-44531)). Applications that wish to accept`uniformResourceIdentifier` subject alternative names can use + * a custom`options.checkServerIdentity` function that implements the desired behavior. + * @since v0.8.4 + * @param hostname The host name or IP address to verify the certificate against. + * @param cert A `certificate object` representing the peer's certificate. + */ + function checkServerIdentity(hostname: string, cert: PeerCertificate): Error | undefined; + /** + * Creates a new {@link Server}. The `secureConnectionListener`, if provided, is + * automatically set as a listener for the `'secureConnection'` event. + * + * The `ticketKeys` options is automatically shared between `node:cluster` module + * workers. + * + * The following illustrates a simple echo server: + * + * ```js + * const tls = require('node:tls'); + * const fs = require('node:fs'); + * + * const options = { + * key: fs.readFileSync('server-key.pem'), + * cert: fs.readFileSync('server-cert.pem'), + * + * // This is necessary only if using client certificate authentication. + * requestCert: true, + * + * // This is necessary only if the client uses a self-signed certificate. + * ca: [ fs.readFileSync('client-cert.pem') ], + * }; + * + * const server = tls.createServer(options, (socket) => { + * console.log('server connected', + * socket.authorized ? 'authorized' : 'unauthorized'); + * socket.write('welcome!\n'); + * socket.setEncoding('utf8'); + * socket.pipe(socket); + * }); + * server.listen(8000, () => { + * console.log('server bound'); + * }); + * ``` + * + * The server can be tested by connecting to it using the example client from {@link connect}. + * @since v0.3.2 + */ + function createServer(secureConnectionListener?: (socket: TLSSocket) => void): Server; + function createServer(options: TlsOptions, secureConnectionListener?: (socket: TLSSocket) => void): Server; + /** + * The `callback` function, if specified, will be added as a listener for the `'secureConnect'` event. + * + * `tls.connect()` returns a {@link TLSSocket} object. + * + * Unlike the `https` API, `tls.connect()` does not enable the + * SNI (Server Name Indication) extension by default, which may cause some + * servers to return an incorrect certificate or reject the connection + * altogether. To enable SNI, set the `servername` option in addition + * to `host`. + * + * The following illustrates a client for the echo server example from {@link createServer}: + * + * ```js + * // Assumes an echo server that is listening on port 8000. + * const tls = require('node:tls'); + * const fs = require('node:fs'); + * + * const options = { + * // Necessary only if the server requires client certificate authentication. + * key: fs.readFileSync('client-key.pem'), + * cert: fs.readFileSync('client-cert.pem'), + * + * // Necessary only if the server uses a self-signed certificate. + * ca: [ fs.readFileSync('server-cert.pem') ], + * + * // Necessary only if the server's cert isn't for "localhost". + * checkServerIdentity: () => { return null; }, + * }; + * + * const socket = tls.connect(8000, options, () => { + * console.log('client connected', + * socket.authorized ? 'authorized' : 'unauthorized'); + * process.stdin.pipe(socket); + * process.stdin.resume(); + * }); + * socket.setEncoding('utf8'); + * socket.on('data', (data) => { + * console.log(data); + * }); + * socket.on('end', () => { + * console.log('server ends connection'); + * }); + * ``` + * @since v0.11.3 + */ + function connect(options: ConnectionOptions, secureConnectListener?: () => void): TLSSocket; + function connect( + port: number, + host?: string, + options?: ConnectionOptions, + secureConnectListener?: () => void, + ): TLSSocket; + function connect(port: number, options?: ConnectionOptions, secureConnectListener?: () => void): TLSSocket; + /** + * Creates a new secure pair object with two streams, one of which reads and writes + * the encrypted data and the other of which reads and writes the cleartext data. + * Generally, the encrypted stream is piped to/from an incoming encrypted data + * stream and the cleartext one is used as a replacement for the initial encrypted + * stream. + * + * `tls.createSecurePair()` returns a `tls.SecurePair` object with `cleartext` and`encrypted` stream properties. + * + * Using `cleartext` has the same API as {@link TLSSocket}. + * + * The `tls.createSecurePair()` method is now deprecated in favor of`tls.TLSSocket()`. For example, the code: + * + * ```js + * pair = tls.createSecurePair(// ... ); + * pair.encrypted.pipe(socket); + * socket.pipe(pair.encrypted); + * ``` + * + * can be replaced by: + * + * ```js + * secureSocket = tls.TLSSocket(socket, options); + * ``` + * + * where `secureSocket` has the same API as `pair.cleartext`. + * @since v0.3.2 + * @deprecated Since v0.11.3 - Use {@link TLSSocket} instead. + * @param context A secure context object as returned by `tls.createSecureContext()` + * @param isServer `true` to specify that this TLS connection should be opened as a server. + * @param requestCert `true` to specify whether a server should request a certificate from a connecting client. Only applies when `isServer` is `true`. + * @param rejectUnauthorized If not `false` a server automatically reject clients with invalid certificates. Only applies when `isServer` is `true`. + */ + function createSecurePair( + context?: SecureContext, + isServer?: boolean, + requestCert?: boolean, + rejectUnauthorized?: boolean, + ): SecurePair; + /** + * {@link createServer} sets the default value of the `honorCipherOrder` option + * to `true`, other APIs that create secure contexts leave it unset. + * + * {@link createServer} uses a 128 bit truncated SHA1 hash value generated + * from `process.argv` as the default value of the `sessionIdContext` option, other + * APIs that create secure contexts have no default value. + * + * The `tls.createSecureContext()` method creates a `SecureContext` object. It is + * usable as an argument to several `tls` APIs, such as `server.addContext()`, + * but has no public methods. The {@link Server} constructor and the {@link createServer} method do not support the `secureContext` option. + * + * A key is _required_ for ciphers that use certificates. Either `key` or`pfx` can be used to provide it. + * + * If the `ca` option is not given, then Node.js will default to using [Mozilla's publicly trusted list of + * CAs](https://hg.mozilla.org/mozilla-central/raw-file/tip/security/nss/lib/ckfw/builtins/certdata.txt). + * + * Custom DHE parameters are discouraged in favor of the new `dhparam: 'auto'`option. When set to `'auto'`, well-known DHE parameters of sufficient strength + * will be selected automatically. Otherwise, if necessary, `openssl dhparam` can + * be used to create custom parameters. The key length must be greater than or + * equal to 1024 bits or else an error will be thrown. Although 1024 bits is + * permissible, use 2048 bits or larger for stronger security. + * @since v0.11.13 + */ + function createSecureContext(options?: SecureContextOptions): SecureContext; + /** + * Returns an array with the names of the supported TLS ciphers. The names are + * lower-case for historical reasons, but must be uppercased to be used in + * the `ciphers` option of {@link createSecureContext}. + * + * Not all supported ciphers are enabled by default. See `Modifying the default TLS cipher suite`. + * + * Cipher names that start with `'tls_'` are for TLSv1.3, all the others are for + * TLSv1.2 and below. + * + * ```js + * console.log(tls.getCiphers()); // ['aes128-gcm-sha256', 'aes128-sha', ...] + * ``` + * @since v0.10.2 + */ + function getCiphers(): string[]; + /** + * The default curve name to use for ECDH key agreement in a tls server. + * The default value is 'auto'. See tls.createSecureContext() for further + * information. + */ + let DEFAULT_ECDH_CURVE: string; + /** + * The default value of the maxVersion option of + * tls.createSecureContext(). It can be assigned any of the supported TLS + * protocol versions, 'TLSv1.3', 'TLSv1.2', 'TLSv1.1', or 'TLSv1'. Default: + * 'TLSv1.3', unless changed using CLI options. Using --tls-max-v1.2 sets + * the default to 'TLSv1.2'. Using --tls-max-v1.3 sets the default to + * 'TLSv1.3'. If multiple of the options are provided, the highest maximum + * is used. + */ + let DEFAULT_MAX_VERSION: SecureVersion; + /** + * The default value of the minVersion option of tls.createSecureContext(). + * It can be assigned any of the supported TLS protocol versions, + * 'TLSv1.3', 'TLSv1.2', 'TLSv1.1', or 'TLSv1'. Default: 'TLSv1.2', unless + * changed using CLI options. Using --tls-min-v1.0 sets the default to + * 'TLSv1'. Using --tls-min-v1.1 sets the default to 'TLSv1.1'. Using + * --tls-min-v1.3 sets the default to 'TLSv1.3'. If multiple of the options + * are provided, the lowest minimum is used. + */ + let DEFAULT_MIN_VERSION: SecureVersion; + /** + * The default value of the ciphers option of tls.createSecureContext(). + * It can be assigned any of the supported OpenSSL ciphers. + * Defaults to the content of crypto.constants.defaultCoreCipherList, unless + * changed using CLI options using --tls-default-ciphers. + */ + let DEFAULT_CIPHERS: string; + /** + * An immutable array of strings representing the root certificates (in PEM + * format) used for verifying peer certificates. This is the default value + * of the ca option to tls.createSecureContext(). + */ + const rootCertificates: readonly string[]; +} +declare module "node:tls" { + export * from "tls"; +} diff --git a/task/node_modules/@types/node/ts4.8/trace_events.d.ts b/task/node_modules/@types/node/ts4.8/trace_events.d.ts new file mode 100644 index 0000000..3361359 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/trace_events.d.ts @@ -0,0 +1,182 @@ +/** + * The `node:trace_events` module provides a mechanism to centralize tracing + * information generated by V8, Node.js core, and userspace code. + * + * Tracing can be enabled with the `--trace-event-categories` command-line flag + * or by using the `node:trace_events` module. The `--trace-event-categories` flag + * accepts a list of comma-separated category names. + * + * The available categories are: + * + * * `node`: An empty placeholder. + * * `node.async_hooks`: Enables capture of detailed `async_hooks` trace data. + * The `async_hooks` events have a unique `asyncId` and a special `triggerId` `triggerAsyncId` property. + * * `node.bootstrap`: Enables capture of Node.js bootstrap milestones. + * * `node.console`: Enables capture of `console.time()` and `console.count()`output. + * * `node.threadpoolwork.sync`: Enables capture of trace data for threadpool + * synchronous operations, such as `blob`, `zlib`, `crypto` and `node_api`. + * * `node.threadpoolwork.async`: Enables capture of trace data for threadpool + * asynchronous operations, such as `blob`, `zlib`, `crypto` and `node_api`. + * * `node.dns.native`: Enables capture of trace data for DNS queries. + * * `node.net.native`: Enables capture of trace data for network. + * * `node.environment`: Enables capture of Node.js Environment milestones. + * * `node.fs.sync`: Enables capture of trace data for file system sync methods. + * * `node.fs_dir.sync`: Enables capture of trace data for file system sync + * directory methods. + * * `node.fs.async`: Enables capture of trace data for file system async methods. + * * `node.fs_dir.async`: Enables capture of trace data for file system async + * directory methods. + * * `node.perf`: Enables capture of `Performance API` measurements. + * * `node.perf.usertiming`: Enables capture of only Performance API User Timing + * measures and marks. + * * `node.perf.timerify`: Enables capture of only Performance API timerify + * measurements. + * * `node.promises.rejections`: Enables capture of trace data tracking the number + * of unhandled Promise rejections and handled-after-rejections. + * * `node.vm.script`: Enables capture of trace data for the `node:vm` module's`runInNewContext()`, `runInContext()`, and `runInThisContext()` methods. + * * `v8`: The `V8` events are GC, compiling, and execution related. + * * `node.http`: Enables capture of trace data for http request / response. + * + * By default the `node`, `node.async_hooks`, and `v8` categories are enabled. + * + * ```bash + * node --trace-event-categories v8,node,node.async_hooks server.js + * ``` + * + * Prior versions of Node.js required the use of the `--trace-events-enabled`flag to enable trace events. This requirement has been removed. However, the`--trace-events-enabled` flag _may_ still be + * used and will enable the`node`, `node.async_hooks`, and `v8` trace event categories by default. + * + * ```bash + * node --trace-events-enabled + * + * # is equivalent to + * + * node --trace-event-categories v8,node,node.async_hooks + * ``` + * + * Alternatively, trace events may be enabled using the `node:trace_events` module: + * + * ```js + * const trace_events = require('node:trace_events'); + * const tracing = trace_events.createTracing({ categories: ['node.perf'] }); + * tracing.enable(); // Enable trace event capture for the 'node.perf' category + * + * // do work + * + * tracing.disable(); // Disable trace event capture for the 'node.perf' category + * ``` + * + * Running Node.js with tracing enabled will produce log files that can be opened + * in the [`chrome://tracing`](https://www.chromium.org/developers/how-tos/trace-event-profiling-tool) tab of Chrome. + * + * The logging file is by default called `node_trace.${rotation}.log`, where`${rotation}` is an incrementing log-rotation id. The filepath pattern can + * be specified with `--trace-event-file-pattern` that accepts a template + * string that supports `${rotation}` and `${pid}`: + * + * ```bash + * node --trace-event-categories v8 --trace-event-file-pattern '${pid}-${rotation}.log' server.js + * ``` + * + * To guarantee that the log file is properly generated after signal events like`SIGINT`, `SIGTERM`, or `SIGBREAK`, make sure to have the appropriate handlers + * in your code, such as: + * + * ```js + * process.on('SIGINT', function onSigint() { + * console.info('Received SIGINT.'); + * process.exit(130); // Or applicable exit code depending on OS and signal + * }); + * ``` + * + * The tracing system uses the same time source + * as the one used by `process.hrtime()`. + * However the trace-event timestamps are expressed in microseconds, + * unlike `process.hrtime()` which returns nanoseconds. + * + * The features from this module are not available in `Worker` threads. + * @experimental + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/trace_events.js) + */ +declare module "trace_events" { + /** + * The `Tracing` object is used to enable or disable tracing for sets of + * categories. Instances are created using the + * `trace_events.createTracing()` method. + * + * When created, the `Tracing` object is disabled. Calling the + * `tracing.enable()` method adds the categories to the set of enabled trace + * event categories. Calling `tracing.disable()` will remove the categories + * from the set of enabled trace event categories. + */ + interface Tracing { + /** + * A comma-separated list of the trace event categories covered by this + * `Tracing` object. + */ + readonly categories: string; + /** + * Disables this `Tracing` object. + * + * Only trace event categories _not_ covered by other enabled `Tracing` + * objects and _not_ specified by the `--trace-event-categories` flag + * will be disabled. + */ + disable(): void; + /** + * Enables this `Tracing` object for the set of categories covered by + * the `Tracing` object. + */ + enable(): void; + /** + * `true` only if the `Tracing` object has been enabled. + */ + readonly enabled: boolean; + } + interface CreateTracingOptions { + /** + * An array of trace category names. Values included in the array are + * coerced to a string when possible. An error will be thrown if the + * value cannot be coerced. + */ + categories: string[]; + } + /** + * Creates and returns a `Tracing` object for the given set of `categories`. + * + * ```js + * const trace_events = require('node:trace_events'); + * const categories = ['node.perf', 'node.async_hooks']; + * const tracing = trace_events.createTracing({ categories }); + * tracing.enable(); + * // do stuff + * tracing.disable(); + * ``` + * @since v10.0.0 + * @return . + */ + function createTracing(options: CreateTracingOptions): Tracing; + /** + * Returns a comma-separated list of all currently-enabled trace event + * categories. The current set of enabled trace event categories is determined + * by the _union_ of all currently-enabled `Tracing` objects and any categories + * enabled using the `--trace-event-categories` flag. + * + * Given the file `test.js` below, the command`node --trace-event-categories node.perf test.js` will print`'node.async_hooks,node.perf'` to the console. + * + * ```js + * const trace_events = require('node:trace_events'); + * const t1 = trace_events.createTracing({ categories: ['node.async_hooks'] }); + * const t2 = trace_events.createTracing({ categories: ['node.perf'] }); + * const t3 = trace_events.createTracing({ categories: ['v8'] }); + * + * t1.enable(); + * t2.enable(); + * + * console.log(trace_events.getEnabledCategories()); + * ``` + * @since v10.0.0 + */ + function getEnabledCategories(): string | undefined; +} +declare module "node:trace_events" { + export * from "trace_events"; +} diff --git a/task/node_modules/@types/node/ts4.8/tty.d.ts b/task/node_modules/@types/node/ts4.8/tty.d.ts new file mode 100644 index 0000000..1c0dafd --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/tty.d.ts @@ -0,0 +1,208 @@ +/** + * The `node:tty` module provides the `tty.ReadStream` and `tty.WriteStream`classes. In most cases, it will not be necessary or possible to use this module + * directly. However, it can be accessed using: + * + * ```js + * const tty = require('node:tty'); + * ``` + * + * When Node.js detects that it is being run with a text terminal ("TTY") + * attached, `process.stdin` will, by default, be initialized as an instance of`tty.ReadStream` and both `process.stdout` and `process.stderr` will, by + * default, be instances of `tty.WriteStream`. The preferred method of determining + * whether Node.js is being run within a TTY context is to check that the value of + * the `process.stdout.isTTY` property is `true`: + * + * ```console + * $ node -p -e "Boolean(process.stdout.isTTY)" + * true + * $ node -p -e "Boolean(process.stdout.isTTY)" | cat + * false + * ``` + * + * In most cases, there should be little to no reason for an application to + * manually create instances of the `tty.ReadStream` and `tty.WriteStream`classes. + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/tty.js) + */ +declare module "tty" { + import * as net from "node:net"; + /** + * The `tty.isatty()` method returns `true` if the given `fd` is associated with + * a TTY and `false` if it is not, including whenever `fd` is not a non-negative + * integer. + * @since v0.5.8 + * @param fd A numeric file descriptor + */ + function isatty(fd: number): boolean; + /** + * Represents the readable side of a TTY. In normal circumstances `process.stdin` will be the only `tty.ReadStream` instance in a Node.js + * process and there should be no reason to create additional instances. + * @since v0.5.8 + */ + class ReadStream extends net.Socket { + constructor(fd: number, options?: net.SocketConstructorOpts); + /** + * A `boolean` that is `true` if the TTY is currently configured to operate as a + * raw device. + * + * This flag is always `false` when a process starts, even if the terminal is + * operating in raw mode. Its value will change with subsequent calls to`setRawMode`. + * @since v0.7.7 + */ + isRaw: boolean; + /** + * Allows configuration of `tty.ReadStream` so that it operates as a raw device. + * + * When in raw mode, input is always available character-by-character, not + * including modifiers. Additionally, all special processing of characters by the + * terminal is disabled, including echoing input + * characters. Ctrl+C will no longer cause a `SIGINT` when + * in this mode. + * @since v0.7.7 + * @param mode If `true`, configures the `tty.ReadStream` to operate as a raw device. If `false`, configures the `tty.ReadStream` to operate in its default mode. The `readStream.isRaw` + * property will be set to the resulting mode. + * @return The read stream instance. + */ + setRawMode(mode: boolean): this; + /** + * A `boolean` that is always `true` for `tty.ReadStream` instances. + * @since v0.5.8 + */ + isTTY: boolean; + } + /** + * -1 - to the left from cursor + * 0 - the entire line + * 1 - to the right from cursor + */ + type Direction = -1 | 0 | 1; + /** + * Represents the writable side of a TTY. In normal circumstances,`process.stdout` and `process.stderr` will be the only`tty.WriteStream` instances created for a Node.js process and there + * should be no reason to create additional instances. + * @since v0.5.8 + */ + class WriteStream extends net.Socket { + constructor(fd: number); + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "resize", listener: () => void): this; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "resize"): boolean; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "resize", listener: () => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "resize", listener: () => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "resize", listener: () => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "resize", listener: () => void): this; + /** + * `writeStream.clearLine()` clears the current line of this `WriteStream` in a + * direction identified by `dir`. + * @since v0.7.7 + * @param callback Invoked once the operation completes. + * @return `false` if the stream wishes for the calling code to wait for the `'drain'` event to be emitted before continuing to write additional data; otherwise `true`. + */ + clearLine(dir: Direction, callback?: () => void): boolean; + /** + * `writeStream.clearScreenDown()` clears this `WriteStream` from the current + * cursor down. + * @since v0.7.7 + * @param callback Invoked once the operation completes. + * @return `false` if the stream wishes for the calling code to wait for the `'drain'` event to be emitted before continuing to write additional data; otherwise `true`. + */ + clearScreenDown(callback?: () => void): boolean; + /** + * `writeStream.cursorTo()` moves this `WriteStream`'s cursor to the specified + * position. + * @since v0.7.7 + * @param callback Invoked once the operation completes. + * @return `false` if the stream wishes for the calling code to wait for the `'drain'` event to be emitted before continuing to write additional data; otherwise `true`. + */ + cursorTo(x: number, y?: number, callback?: () => void): boolean; + cursorTo(x: number, callback: () => void): boolean; + /** + * `writeStream.moveCursor()` moves this `WriteStream`'s cursor _relative_ to its + * current position. + * @since v0.7.7 + * @param callback Invoked once the operation completes. + * @return `false` if the stream wishes for the calling code to wait for the `'drain'` event to be emitted before continuing to write additional data; otherwise `true`. + */ + moveCursor(dx: number, dy: number, callback?: () => void): boolean; + /** + * Returns: + * + * * `1` for 2, + * * `4` for 16, + * * `8` for 256, + * * `24` for 16,777,216 colors supported. + * + * Use this to determine what colors the terminal supports. Due to the nature of + * colors in terminals it is possible to either have false positives or false + * negatives. It depends on process information and the environment variables that + * may lie about what terminal is used. + * It is possible to pass in an `env` object to simulate the usage of a specific + * terminal. This can be useful to check how specific environment settings behave. + * + * To enforce a specific color support, use one of the below environment settings. + * + * * 2 colors: `FORCE_COLOR = 0` (Disables colors) + * * 16 colors: `FORCE_COLOR = 1` + * * 256 colors: `FORCE_COLOR = 2` + * * 16,777,216 colors: `FORCE_COLOR = 3` + * + * Disabling color support is also possible by using the `NO_COLOR` and`NODE_DISABLE_COLORS` environment variables. + * @since v9.9.0 + * @param [env=process.env] An object containing the environment variables to check. This enables simulating the usage of a specific terminal. + */ + getColorDepth(env?: object): number; + /** + * Returns `true` if the `writeStream` supports at least as many colors as provided + * in `count`. Minimum support is 2 (black and white). + * + * This has the same false positives and negatives as described in `writeStream.getColorDepth()`. + * + * ```js + * process.stdout.hasColors(); + * // Returns true or false depending on if `stdout` supports at least 16 colors. + * process.stdout.hasColors(256); + * // Returns true or false depending on if `stdout` supports at least 256 colors. + * process.stdout.hasColors({ TMUX: '1' }); + * // Returns true. + * process.stdout.hasColors(2 ** 24, { TMUX: '1' }); + * // Returns false (the environment setting pretends to support 2 ** 8 colors). + * ``` + * @since v11.13.0, v10.16.0 + * @param [count=16] The number of colors that are requested (minimum 2). + * @param [env=process.env] An object containing the environment variables to check. This enables simulating the usage of a specific terminal. + */ + hasColors(count?: number): boolean; + hasColors(env?: object): boolean; + hasColors(count: number, env?: object): boolean; + /** + * `writeStream.getWindowSize()` returns the size of the TTY + * corresponding to this `WriteStream`. The array is of the type`[numColumns, numRows]` where `numColumns` and `numRows` represent the number + * of columns and rows in the corresponding TTY. + * @since v0.7.7 + */ + getWindowSize(): [number, number]; + /** + * A `number` specifying the number of columns the TTY currently has. This property + * is updated whenever the `'resize'` event is emitted. + * @since v0.7.7 + */ + columns: number; + /** + * A `number` specifying the number of rows the TTY currently has. This property + * is updated whenever the `'resize'` event is emitted. + * @since v0.7.7 + */ + rows: number; + /** + * A `boolean` that is always `true`. + * @since v0.5.8 + */ + isTTY: boolean; + } +} +declare module "node:tty" { + export * from "tty"; +} diff --git a/task/node_modules/@types/node/ts4.8/url.d.ts b/task/node_modules/@types/node/ts4.8/url.d.ts new file mode 100644 index 0000000..20a5d85 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/url.d.ts @@ -0,0 +1,927 @@ +/** + * The `node:url` module provides utilities for URL resolution and parsing. It can + * be accessed using: + * + * ```js + * import url from 'node:url'; + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/url.js) + */ +declare module "url" { + import { Blob as NodeBlob } from "node:buffer"; + import { ClientRequestArgs } from "node:http"; + import { ParsedUrlQuery, ParsedUrlQueryInput } from "node:querystring"; + // Input to `url.format` + interface UrlObject { + auth?: string | null | undefined; + hash?: string | null | undefined; + host?: string | null | undefined; + hostname?: string | null | undefined; + href?: string | null | undefined; + pathname?: string | null | undefined; + protocol?: string | null | undefined; + search?: string | null | undefined; + slashes?: boolean | null | undefined; + port?: string | number | null | undefined; + query?: string | null | ParsedUrlQueryInput | undefined; + } + // Output of `url.parse` + interface Url { + auth: string | null; + hash: string | null; + host: string | null; + hostname: string | null; + href: string; + path: string | null; + pathname: string | null; + protocol: string | null; + search: string | null; + slashes: boolean | null; + port: string | null; + query: string | null | ParsedUrlQuery; + } + interface UrlWithParsedQuery extends Url { + query: ParsedUrlQuery; + } + interface UrlWithStringQuery extends Url { + query: string | null; + } + /** + * The `url.parse()` method takes a URL string, parses it, and returns a URL + * object. + * + * A `TypeError` is thrown if `urlString` is not a string. + * + * A `URIError` is thrown if the `auth` property is present but cannot be decoded. + * + * `url.parse()` uses a lenient, non-standard algorithm for parsing URL + * strings. It is prone to security issues such as [host name spoofing](https://hackerone.com/reports/678487) and incorrect handling of usernames and passwords. Do not use with untrusted + * input. CVEs are not issued for `url.parse()` vulnerabilities. Use the `WHATWG URL` API instead. + * @since v0.1.25 + * @deprecated Use the WHATWG URL API instead. + * @param urlString The URL string to parse. + * @param [parseQueryString=false] If `true`, the `query` property will always be set to an object returned by the {@link querystring} module's `parse()` method. If `false`, the `query` property + * on the returned URL object will be an unparsed, undecoded string. + * @param [slashesDenoteHost=false] If `true`, the first token after the literal string `//` and preceding the next `/` will be interpreted as the `host`. For instance, given `//foo/bar`, the + * result would be `{host: 'foo', pathname: '/bar'}` rather than `{pathname: '//foo/bar'}`. + */ + function parse(urlString: string): UrlWithStringQuery; + function parse( + urlString: string, + parseQueryString: false | undefined, + slashesDenoteHost?: boolean, + ): UrlWithStringQuery; + function parse(urlString: string, parseQueryString: true, slashesDenoteHost?: boolean): UrlWithParsedQuery; + function parse(urlString: string, parseQueryString: boolean, slashesDenoteHost?: boolean): Url; + /** + * The `url.format()` method returns a formatted URL string derived from`urlObject`. + * + * ```js + * const url = require('node:url'); + * url.format({ + * protocol: 'https', + * hostname: 'example.com', + * pathname: '/some/path', + * query: { + * page: 1, + * format: 'json', + * }, + * }); + * + * // => 'https://example.com/some/path?page=1&format=json' + * ``` + * + * If `urlObject` is not an object or a string, `url.format()` will throw a `TypeError`. + * + * The formatting process operates as follows: + * + * * A new empty string `result` is created. + * * If `urlObject.protocol` is a string, it is appended as-is to `result`. + * * Otherwise, if `urlObject.protocol` is not `undefined` and is not a string, an `Error` is thrown. + * * For all string values of `urlObject.protocol` that _do not end_ with an ASCII + * colon (`:`) character, the literal string `:` will be appended to `result`. + * * If either of the following conditions is true, then the literal string `//`will be appended to `result`: + * * `urlObject.slashes` property is true; + * * `urlObject.protocol` begins with `http`, `https`, `ftp`, `gopher`, or`file`; + * * If the value of the `urlObject.auth` property is truthy, and either`urlObject.host` or `urlObject.hostname` are not `undefined`, the value of`urlObject.auth` will be coerced into a string + * and appended to `result`followed by the literal string `@`. + * * If the `urlObject.host` property is `undefined` then: + * * If the `urlObject.hostname` is a string, it is appended to `result`. + * * Otherwise, if `urlObject.hostname` is not `undefined` and is not a string, + * an `Error` is thrown. + * * If the `urlObject.port` property value is truthy, and `urlObject.hostname`is not `undefined`: + * * The literal string `:` is appended to `result`, and + * * The value of `urlObject.port` is coerced to a string and appended to`result`. + * * Otherwise, if the `urlObject.host` property value is truthy, the value of`urlObject.host` is coerced to a string and appended to `result`. + * * If the `urlObject.pathname` property is a string that is not an empty string: + * * If the `urlObject.pathname`_does not start_ with an ASCII forward slash + * (`/`), then the literal string `'/'` is appended to `result`. + * * The value of `urlObject.pathname` is appended to `result`. + * * Otherwise, if `urlObject.pathname` is not `undefined` and is not a string, an `Error` is thrown. + * * If the `urlObject.search` property is `undefined` and if the `urlObject.query`property is an `Object`, the literal string `?` is appended to `result`followed by the output of calling the + * `querystring` module's `stringify()`method passing the value of `urlObject.query`. + * * Otherwise, if `urlObject.search` is a string: + * * If the value of `urlObject.search`_does not start_ with the ASCII question + * mark (`?`) character, the literal string `?` is appended to `result`. + * * The value of `urlObject.search` is appended to `result`. + * * Otherwise, if `urlObject.search` is not `undefined` and is not a string, an `Error` is thrown. + * * If the `urlObject.hash` property is a string: + * * If the value of `urlObject.hash`_does not start_ with the ASCII hash (`#`) + * character, the literal string `#` is appended to `result`. + * * The value of `urlObject.hash` is appended to `result`. + * * Otherwise, if the `urlObject.hash` property is not `undefined` and is not a + * string, an `Error` is thrown. + * * `result` is returned. + * @since v0.1.25 + * @legacy Use the WHATWG URL API instead. + * @param urlObject A URL object (as returned by `url.parse()` or constructed otherwise). If a string, it is converted to an object by passing it to `url.parse()`. + */ + function format(urlObject: URL, options?: URLFormatOptions): string; + /** + * The `url.format()` method returns a formatted URL string derived from`urlObject`. + * + * ```js + * const url = require('url'); + * url.format({ + * protocol: 'https', + * hostname: 'example.com', + * pathname: '/some/path', + * query: { + * page: 1, + * format: 'json' + * } + * }); + * + * // => 'https://example.com/some/path?page=1&format=json' + * ``` + * + * If `urlObject` is not an object or a string, `url.format()` will throw a `TypeError`. + * + * The formatting process operates as follows: + * + * * A new empty string `result` is created. + * * If `urlObject.protocol` is a string, it is appended as-is to `result`. + * * Otherwise, if `urlObject.protocol` is not `undefined` and is not a string, an `Error` is thrown. + * * For all string values of `urlObject.protocol` that _do not end_ with an ASCII + * colon (`:`) character, the literal string `:` will be appended to `result`. + * * If either of the following conditions is true, then the literal string `//`will be appended to `result`: + * * `urlObject.slashes` property is true; + * * `urlObject.protocol` begins with `http`, `https`, `ftp`, `gopher`, or`file`; + * * If the value of the `urlObject.auth` property is truthy, and either`urlObject.host` or `urlObject.hostname` are not `undefined`, the value of`urlObject.auth` will be coerced into a string + * and appended to `result`followed by the literal string `@`. + * * If the `urlObject.host` property is `undefined` then: + * * If the `urlObject.hostname` is a string, it is appended to `result`. + * * Otherwise, if `urlObject.hostname` is not `undefined` and is not a string, + * an `Error` is thrown. + * * If the `urlObject.port` property value is truthy, and `urlObject.hostname`is not `undefined`: + * * The literal string `:` is appended to `result`, and + * * The value of `urlObject.port` is coerced to a string and appended to`result`. + * * Otherwise, if the `urlObject.host` property value is truthy, the value of`urlObject.host` is coerced to a string and appended to `result`. + * * If the `urlObject.pathname` property is a string that is not an empty string: + * * If the `urlObject.pathname`_does not start_ with an ASCII forward slash + * (`/`), then the literal string `'/'` is appended to `result`. + * * The value of `urlObject.pathname` is appended to `result`. + * * Otherwise, if `urlObject.pathname` is not `undefined` and is not a string, an `Error` is thrown. + * * If the `urlObject.search` property is `undefined` and if the `urlObject.query`property is an `Object`, the literal string `?` is appended to `result`followed by the output of calling the + * `querystring` module's `stringify()`method passing the value of `urlObject.query`. + * * Otherwise, if `urlObject.search` is a string: + * * If the value of `urlObject.search`_does not start_ with the ASCII question + * mark (`?`) character, the literal string `?` is appended to `result`. + * * The value of `urlObject.search` is appended to `result`. + * * Otherwise, if `urlObject.search` is not `undefined` and is not a string, an `Error` is thrown. + * * If the `urlObject.hash` property is a string: + * * If the value of `urlObject.hash`_does not start_ with the ASCII hash (`#`) + * character, the literal string `#` is appended to `result`. + * * The value of `urlObject.hash` is appended to `result`. + * * Otherwise, if the `urlObject.hash` property is not `undefined` and is not a + * string, an `Error` is thrown. + * * `result` is returned. + * @since v0.1.25 + * @legacy Use the WHATWG URL API instead. + * @param urlObject A URL object (as returned by `url.parse()` or constructed otherwise). If a string, it is converted to an object by passing it to `url.parse()`. + */ + function format(urlObject: UrlObject | string): string; + /** + * The `url.resolve()` method resolves a target URL relative to a base URL in a + * manner similar to that of a web browser resolving an anchor tag. + * + * ```js + * const url = require('node:url'); + * url.resolve('/one/two/three', 'four'); // '/one/two/four' + * url.resolve('http://example.com/', '/one'); // 'http://example.com/one' + * url.resolve('http://example.com/one', '/two'); // 'http://example.com/two' + * ``` + * + * To achieve the same result using the WHATWG URL API: + * + * ```js + * function resolve(from, to) { + * const resolvedUrl = new URL(to, new URL(from, 'resolve://')); + * if (resolvedUrl.protocol === 'resolve:') { + * // `from` is a relative URL. + * const { pathname, search, hash } = resolvedUrl; + * return pathname + search + hash; + * } + * return resolvedUrl.toString(); + * } + * + * resolve('/one/two/three', 'four'); // '/one/two/four' + * resolve('http://example.com/', '/one'); // 'http://example.com/one' + * resolve('http://example.com/one', '/two'); // 'http://example.com/two' + * ``` + * @since v0.1.25 + * @legacy Use the WHATWG URL API instead. + * @param from The base URL to use if `to` is a relative URL. + * @param to The target URL to resolve. + */ + function resolve(from: string, to: string): string; + /** + * Returns the [Punycode](https://tools.ietf.org/html/rfc5891#section-4.4) ASCII serialization of the `domain`. If `domain` is an + * invalid domain, the empty string is returned. + * + * It performs the inverse operation to {@link domainToUnicode}. + * + * ```js + * import url from 'node:url'; + * + * console.log(url.domainToASCII('español.com')); + * // Prints xn--espaol-zwa.com + * console.log(url.domainToASCII('中文.com')); + * // Prints xn--fiq228c.com + * console.log(url.domainToASCII('xn--iñvalid.com')); + * // Prints an empty string + * ``` + * @since v7.4.0, v6.13.0 + */ + function domainToASCII(domain: string): string; + /** + * Returns the Unicode serialization of the `domain`. If `domain` is an invalid + * domain, the empty string is returned. + * + * It performs the inverse operation to {@link domainToASCII}. + * + * ```js + * import url from 'node:url'; + * + * console.log(url.domainToUnicode('xn--espaol-zwa.com')); + * // Prints español.com + * console.log(url.domainToUnicode('xn--fiq228c.com')); + * // Prints 中文.com + * console.log(url.domainToUnicode('xn--iñvalid.com')); + * // Prints an empty string + * ``` + * @since v7.4.0, v6.13.0 + */ + function domainToUnicode(domain: string): string; + /** + * This function ensures the correct decodings of percent-encoded characters as + * well as ensuring a cross-platform valid absolute path string. + * + * ```js + * import { fileURLToPath } from 'node:url'; + * + * const __filename = fileURLToPath(import.meta.url); + * + * new URL('file:///C:/path/').pathname; // Incorrect: /C:/path/ + * fileURLToPath('file:///C:/path/'); // Correct: C:\path\ (Windows) + * + * new URL('file://nas/foo.txt').pathname; // Incorrect: /foo.txt + * fileURLToPath('file://nas/foo.txt'); // Correct: \\nas\foo.txt (Windows) + * + * new URL('file:///你好.txt').pathname; // Incorrect: /%E4%BD%A0%E5%A5%BD.txt + * fileURLToPath('file:///你好.txt'); // Correct: /你好.txt (POSIX) + * + * new URL('file:///hello world').pathname; // Incorrect: /hello%20world + * fileURLToPath('file:///hello world'); // Correct: /hello world (POSIX) + * ``` + * @since v10.12.0 + * @param url The file URL string or URL object to convert to a path. + * @return The fully-resolved platform-specific Node.js file path. + */ + function fileURLToPath(url: string | URL): string; + /** + * This function ensures that `path` is resolved absolutely, and that the URL + * control characters are correctly encoded when converting into a File URL. + * + * ```js + * import { pathToFileURL } from 'node:url'; + * + * new URL('/foo#1', 'file:'); // Incorrect: file:///foo#1 + * pathToFileURL('/foo#1'); // Correct: file:///foo%231 (POSIX) + * + * new URL('/some/path%.c', 'file:'); // Incorrect: file:///some/path%.c + * pathToFileURL('/some/path%.c'); // Correct: file:///some/path%25.c (POSIX) + * ``` + * @since v10.12.0 + * @param path The path to convert to a File URL. + * @return The file URL object. + */ + function pathToFileURL(path: string): URL; + /** + * This utility function converts a URL object into an ordinary options object as + * expected by the `http.request()` and `https.request()` APIs. + * + * ```js + * import { urlToHttpOptions } from 'node:url'; + * const myURL = new URL('https://a:b@測試?abc#foo'); + * + * console.log(urlToHttpOptions(myURL)); + * /* + * { + * protocol: 'https:', + * hostname: 'xn--g6w251d', + * hash: '#foo', + * search: '?abc', + * pathname: '/', + * path: '/?abc', + * href: 'https://a:b@xn--g6w251d/?abc#foo', + * auth: 'a:b' + * } + * + * ``` + * @since v15.7.0, v14.18.0 + * @param url The `WHATWG URL` object to convert to an options object. + * @return Options object + */ + function urlToHttpOptions(url: URL): ClientRequestArgs; + interface URLFormatOptions { + auth?: boolean | undefined; + fragment?: boolean | undefined; + search?: boolean | undefined; + unicode?: boolean | undefined; + } + /** + * Browser-compatible `URL` class, implemented by following the WHATWG URL + * Standard. [Examples of parsed URLs](https://url.spec.whatwg.org/#example-url-parsing) may be found in the Standard itself. + * The `URL` class is also available on the global object. + * + * In accordance with browser conventions, all properties of `URL` objects + * are implemented as getters and setters on the class prototype, rather than as + * data properties on the object itself. Thus, unlike `legacy urlObject` s, + * using the `delete` keyword on any properties of `URL` objects (e.g. `delete myURL.protocol`, `delete myURL.pathname`, etc) has no effect but will still + * return `true`. + * @since v7.0.0, v6.13.0 + */ + class URL { + /** + * Creates a `'blob:nodedata:...'` URL string that represents the given `Blob` object and can be used to retrieve the `Blob` later. + * + * ```js + * const { + * Blob, + * resolveObjectURL, + * } = require('node:buffer'); + * + * const blob = new Blob(['hello']); + * const id = URL.createObjectURL(blob); + * + * // later... + * + * const otherBlob = resolveObjectURL(id); + * console.log(otherBlob.size); + * ``` + * + * The data stored by the registered `Blob` will be retained in memory until`URL.revokeObjectURL()` is called to remove it. + * + * `Blob` objects are registered within the current thread. If using Worker + * Threads, `Blob` objects registered within one Worker will not be available + * to other workers or the main thread. + * @since v16.7.0 + * @experimental + */ + static createObjectURL(blob: NodeBlob): string; + /** + * Removes the stored `Blob` identified by the given ID. Attempting to revoke a + * ID that isn't registered will silently fail. + * @since v16.7.0 + * @experimental + * @param id A `'blob:nodedata:...` URL string returned by a prior call to `URL.createObjectURL()`. + */ + static revokeObjectURL(objectUrl: string): void; + /** + * Checks if an `input` relative to the `base` can be parsed to a `URL`. + * + * ```js + * const isValid = URL.canParse('/foo', 'https://example.org/'); // true + * + * const isNotValid = URL.canParse('/foo'); // false + * ``` + * @since v19.9.0 + * @param input The absolute or relative input URL to parse. If `input` is relative, then `base` is required. If `input` is absolute, the `base` is ignored. If `input` is not a string, it is + * `converted to a string` first. + * @param base The base URL to resolve against if the `input` is not absolute. If `base` is not a string, it is `converted to a string` first. + */ + static canParse(input: string, base?: string): boolean; + constructor(input: string, base?: string | URL); + /** + * Gets and sets the fragment portion of the URL. + * + * ```js + * const myURL = new URL('https://example.org/foo#bar'); + * console.log(myURL.hash); + * // Prints #bar + * + * myURL.hash = 'baz'; + * console.log(myURL.href); + * // Prints https://example.org/foo#baz + * ``` + * + * Invalid URL characters included in the value assigned to the `hash` property + * are `percent-encoded`. The selection of which characters to + * percent-encode may vary somewhat from what the {@link parse} and {@link format} methods would produce. + */ + hash: string; + /** + * Gets and sets the host portion of the URL. + * + * ```js + * const myURL = new URL('https://example.org:81/foo'); + * console.log(myURL.host); + * // Prints example.org:81 + * + * myURL.host = 'example.com:82'; + * console.log(myURL.href); + * // Prints https://example.com:82/foo + * ``` + * + * Invalid host values assigned to the `host` property are ignored. + */ + host: string; + /** + * Gets and sets the host name portion of the URL. The key difference between`url.host` and `url.hostname` is that `url.hostname` does _not_ include the + * port. + * + * ```js + * const myURL = new URL('https://example.org:81/foo'); + * console.log(myURL.hostname); + * // Prints example.org + * + * // Setting the hostname does not change the port + * myURL.hostname = 'example.com'; + * console.log(myURL.href); + * // Prints https://example.com:81/foo + * + * // Use myURL.host to change the hostname and port + * myURL.host = 'example.org:82'; + * console.log(myURL.href); + * // Prints https://example.org:82/foo + * ``` + * + * Invalid host name values assigned to the `hostname` property are ignored. + */ + hostname: string; + /** + * Gets and sets the serialized URL. + * + * ```js + * const myURL = new URL('https://example.org/foo'); + * console.log(myURL.href); + * // Prints https://example.org/foo + * + * myURL.href = 'https://example.com/bar'; + * console.log(myURL.href); + * // Prints https://example.com/bar + * ``` + * + * Getting the value of the `href` property is equivalent to calling {@link toString}. + * + * Setting the value of this property to a new value is equivalent to creating a + * new `URL` object using `new URL(value)`. Each of the `URL`object's properties will be modified. + * + * If the value assigned to the `href` property is not a valid URL, a `TypeError`will be thrown. + */ + href: string; + /** + * Gets the read-only serialization of the URL's origin. + * + * ```js + * const myURL = new URL('https://example.org/foo/bar?baz'); + * console.log(myURL.origin); + * // Prints https://example.org + * ``` + * + * ```js + * const idnURL = new URL('https://測試'); + * console.log(idnURL.origin); + * // Prints https://xn--g6w251d + * + * console.log(idnURL.hostname); + * // Prints xn--g6w251d + * ``` + */ + readonly origin: string; + /** + * Gets and sets the password portion of the URL. + * + * ```js + * const myURL = new URL('https://abc:xyz@example.com'); + * console.log(myURL.password); + * // Prints xyz + * + * myURL.password = '123'; + * console.log(myURL.href); + * // Prints https://abc:123@example.com/ + * ``` + * + * Invalid URL characters included in the value assigned to the `password` property + * are `percent-encoded`. The selection of which characters to + * percent-encode may vary somewhat from what the {@link parse} and {@link format} methods would produce. + */ + password: string; + /** + * Gets and sets the path portion of the URL. + * + * ```js + * const myURL = new URL('https://example.org/abc/xyz?123'); + * console.log(myURL.pathname); + * // Prints /abc/xyz + * + * myURL.pathname = '/abcdef'; + * console.log(myURL.href); + * // Prints https://example.org/abcdef?123 + * ``` + * + * Invalid URL characters included in the value assigned to the `pathname`property are `percent-encoded`. The selection of which characters + * to percent-encode may vary somewhat from what the {@link parse} and {@link format} methods would produce. + */ + pathname: string; + /** + * Gets and sets the port portion of the URL. + * + * The port value may be a number or a string containing a number in the range`0` to `65535` (inclusive). Setting the value to the default port of the`URL` objects given `protocol` will + * result in the `port` value becoming + * the empty string (`''`). + * + * The port value can be an empty string in which case the port depends on + * the protocol/scheme: + * + * + * + * Upon assigning a value to the port, the value will first be converted to a + * string using `.toString()`. + * + * If that string is invalid but it begins with a number, the leading number is + * assigned to `port`. + * If the number lies outside the range denoted above, it is ignored. + * + * ```js + * const myURL = new URL('https://example.org:8888'); + * console.log(myURL.port); + * // Prints 8888 + * + * // Default ports are automatically transformed to the empty string + * // (HTTPS protocol's default port is 443) + * myURL.port = '443'; + * console.log(myURL.port); + * // Prints the empty string + * console.log(myURL.href); + * // Prints https://example.org/ + * + * myURL.port = 1234; + * console.log(myURL.port); + * // Prints 1234 + * console.log(myURL.href); + * // Prints https://example.org:1234/ + * + * // Completely invalid port strings are ignored + * myURL.port = 'abcd'; + * console.log(myURL.port); + * // Prints 1234 + * + * // Leading numbers are treated as a port number + * myURL.port = '5678abcd'; + * console.log(myURL.port); + * // Prints 5678 + * + * // Non-integers are truncated + * myURL.port = 1234.5678; + * console.log(myURL.port); + * // Prints 1234 + * + * // Out-of-range numbers which are not represented in scientific notation + * // will be ignored. + * myURL.port = 1e10; // 10000000000, will be range-checked as described below + * console.log(myURL.port); + * // Prints 1234 + * ``` + * + * Numbers which contain a decimal point, + * such as floating-point numbers or numbers in scientific notation, + * are not an exception to this rule. + * Leading numbers up to the decimal point will be set as the URL's port, + * assuming they are valid: + * + * ```js + * myURL.port = 4.567e21; + * console.log(myURL.port); + * // Prints 4 (because it is the leading number in the string '4.567e21') + * ``` + */ + port: string; + /** + * Gets and sets the protocol portion of the URL. + * + * ```js + * const myURL = new URL('https://example.org'); + * console.log(myURL.protocol); + * // Prints https: + * + * myURL.protocol = 'ftp'; + * console.log(myURL.href); + * // Prints ftp://example.org/ + * ``` + * + * Invalid URL protocol values assigned to the `protocol` property are ignored. + */ + protocol: string; + /** + * Gets and sets the serialized query portion of the URL. + * + * ```js + * const myURL = new URL('https://example.org/abc?123'); + * console.log(myURL.search); + * // Prints ?123 + * + * myURL.search = 'abc=xyz'; + * console.log(myURL.href); + * // Prints https://example.org/abc?abc=xyz + * ``` + * + * Any invalid URL characters appearing in the value assigned the `search`property will be `percent-encoded`. The selection of which + * characters to percent-encode may vary somewhat from what the {@link parse} and {@link format} methods would produce. + */ + search: string; + /** + * Gets the `URLSearchParams` object representing the query parameters of the + * URL. This property is read-only but the `URLSearchParams` object it provides + * can be used to mutate the URL instance; to replace the entirety of query + * parameters of the URL, use the {@link search} setter. See `URLSearchParams` documentation for details. + * + * Use care when using `.searchParams` to modify the `URL` because, + * per the WHATWG specification, the `URLSearchParams` object uses + * different rules to determine which characters to percent-encode. For + * instance, the `URL` object will not percent encode the ASCII tilde (`~`) + * character, while `URLSearchParams` will always encode it: + * + * ```js + * const myURL = new URL('https://example.org/abc?foo=~bar'); + * + * console.log(myURL.search); // prints ?foo=~bar + * + * // Modify the URL via searchParams... + * myURL.searchParams.sort(); + * + * console.log(myURL.search); // prints ?foo=%7Ebar + * ``` + */ + readonly searchParams: URLSearchParams; + /** + * Gets and sets the username portion of the URL. + * + * ```js + * const myURL = new URL('https://abc:xyz@example.com'); + * console.log(myURL.username); + * // Prints abc + * + * myURL.username = '123'; + * console.log(myURL.href); + * // Prints https://123:xyz@example.com/ + * ``` + * + * Any invalid URL characters appearing in the value assigned the `username`property will be `percent-encoded`. The selection of which + * characters to percent-encode may vary somewhat from what the {@link parse} and {@link format} methods would produce. + */ + username: string; + /** + * The `toString()` method on the `URL` object returns the serialized URL. The + * value returned is equivalent to that of {@link href} and {@link toJSON}. + */ + toString(): string; + /** + * The `toJSON()` method on the `URL` object returns the serialized URL. The + * value returned is equivalent to that of {@link href} and {@link toString}. + * + * This method is automatically called when an `URL` object is serialized + * with [`JSON.stringify()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify). + * + * ```js + * const myURLs = [ + * new URL('https://www.example.com'), + * new URL('https://test.example.org'), + * ]; + * console.log(JSON.stringify(myURLs)); + * // Prints ["https://www.example.com/","https://test.example.org/"] + * ``` + */ + toJSON(): string; + } + /** + * The `URLSearchParams` API provides read and write access to the query of a`URL`. The `URLSearchParams` class can also be used standalone with one of the + * four following constructors. + * The `URLSearchParams` class is also available on the global object. + * + * The WHATWG `URLSearchParams` interface and the `querystring` module have + * similar purpose, but the purpose of the `querystring` module is more + * general, as it allows the customization of delimiter characters (`&` and `=`). + * On the other hand, this API is designed purely for URL query strings. + * + * ```js + * const myURL = new URL('https://example.org/?abc=123'); + * console.log(myURL.searchParams.get('abc')); + * // Prints 123 + * + * myURL.searchParams.append('abc', 'xyz'); + * console.log(myURL.href); + * // Prints https://example.org/?abc=123&abc=xyz + * + * myURL.searchParams.delete('abc'); + * myURL.searchParams.set('a', 'b'); + * console.log(myURL.href); + * // Prints https://example.org/?a=b + * + * const newSearchParams = new URLSearchParams(myURL.searchParams); + * // The above is equivalent to + * // const newSearchParams = new URLSearchParams(myURL.search); + * + * newSearchParams.append('a', 'c'); + * console.log(myURL.href); + * // Prints https://example.org/?a=b + * console.log(newSearchParams.toString()); + * // Prints a=b&a=c + * + * // newSearchParams.toString() is implicitly called + * myURL.search = newSearchParams; + * console.log(myURL.href); + * // Prints https://example.org/?a=b&a=c + * newSearchParams.delete('a'); + * console.log(myURL.href); + * // Prints https://example.org/?a=b&a=c + * ``` + * @since v7.5.0, v6.13.0 + */ + class URLSearchParams implements Iterable<[string, string]> { + constructor( + init?: + | URLSearchParams + | string + | Record + | Iterable<[string, string]> + | ReadonlyArray<[string, string]>, + ); + /** + * Append a new name-value pair to the query string. + */ + append(name: string, value: string): void; + /** + * If `value` is provided, removes all name-value pairs + * where name is `name` and value is `value`.. + * + * If `value` is not provided, removes all name-value pairs whose name is `name`. + */ + delete(name: string, value?: string): void; + /** + * Returns an ES6 `Iterator` over each of the name-value pairs in the query. + * Each item of the iterator is a JavaScript `Array`. The first item of the `Array`is the `name`, the second item of the `Array` is the `value`. + * + * Alias for `urlSearchParams[@@iterator]()`. + */ + entries(): IterableIterator<[string, string]>; + /** + * Iterates over each name-value pair in the query and invokes the given function. + * + * ```js + * const myURL = new URL('https://example.org/?a=b&c=d'); + * myURL.searchParams.forEach((value, name, searchParams) => { + * console.log(name, value, myURL.searchParams === searchParams); + * }); + * // Prints: + * // a b true + * // c d true + * ``` + * @param fn Invoked for each name-value pair in the query + * @param thisArg To be used as `this` value for when `fn` is called + */ + forEach( + callback: (this: TThis, value: string, name: string, searchParams: URLSearchParams) => void, + thisArg?: TThis, + ): void; + /** + * Returns the value of the first name-value pair whose name is `name`. If there + * are no such pairs, `null` is returned. + * @return or `null` if there is no name-value pair with the given `name`. + */ + get(name: string): string | null; + /** + * Returns the values of all name-value pairs whose name is `name`. If there are + * no such pairs, an empty array is returned. + */ + getAll(name: string): string[]; + /** + * Checks if the `URLSearchParams` object contains key-value pair(s) based on`name` and an optional `value` argument. + * + * If `value` is provided, returns `true` when name-value pair with + * same `name` and `value` exists. + * + * If `value` is not provided, returns `true` if there is at least one name-value + * pair whose name is `name`. + */ + has(name: string, value?: string): boolean; + /** + * Returns an ES6 `Iterator` over the names of each name-value pair. + * + * ```js + * const params = new URLSearchParams('foo=bar&foo=baz'); + * for (const name of params.keys()) { + * console.log(name); + * } + * // Prints: + * // foo + * // foo + * ``` + */ + keys(): IterableIterator; + /** + * Sets the value in the `URLSearchParams` object associated with `name` to`value`. If there are any pre-existing name-value pairs whose names are `name`, + * set the first such pair's value to `value` and remove all others. If not, + * append the name-value pair to the query string. + * + * ```js + * const params = new URLSearchParams(); + * params.append('foo', 'bar'); + * params.append('foo', 'baz'); + * params.append('abc', 'def'); + * console.log(params.toString()); + * // Prints foo=bar&foo=baz&abc=def + * + * params.set('foo', 'def'); + * params.set('xyz', 'opq'); + * console.log(params.toString()); + * // Prints foo=def&abc=def&xyz=opq + * ``` + */ + set(name: string, value: string): void; + /** + * The total number of parameter entries. + * @since v19.8.0 + */ + readonly size: number; + /** + * Sort all existing name-value pairs in-place by their names. Sorting is done + * with a [stable sorting algorithm](https://en.wikipedia.org/wiki/Sorting_algorithm#Stability), so relative order between name-value pairs + * with the same name is preserved. + * + * This method can be used, in particular, to increase cache hits. + * + * ```js + * const params = new URLSearchParams('query[]=abc&type=search&query[]=123'); + * params.sort(); + * console.log(params.toString()); + * // Prints query%5B%5D=abc&query%5B%5D=123&type=search + * ``` + * @since v7.7.0, v6.13.0 + */ + sort(): void; + /** + * Returns the search parameters serialized as a string, with characters + * percent-encoded where necessary. + */ + toString(): string; + /** + * Returns an ES6 `Iterator` over the values of each name-value pair. + */ + values(): IterableIterator; + [Symbol.iterator](): IterableIterator<[string, string]>; + } + import { URL as _URL, URLSearchParams as _URLSearchParams } from "url"; + global { + interface URLSearchParams extends _URLSearchParams {} + interface URL extends _URL {} + interface Global { + URL: typeof _URL; + URLSearchParams: typeof _URLSearchParams; + } + /** + * `URL` class is a global reference for `require('url').URL` + * https://nodejs.org/api/url.html#the-whatwg-url-api + * @since v10.0.0 + */ + var URL: typeof globalThis extends { + onmessage: any; + URL: infer T; + } ? T + : typeof _URL; + /** + * `URLSearchParams` class is a global reference for `require('url').URLSearchParams` + * https://nodejs.org/api/url.html#class-urlsearchparams + * @since v10.0.0 + */ + var URLSearchParams: typeof globalThis extends { + onmessage: any; + URLSearchParams: infer T; + } ? T + : typeof _URLSearchParams; + } +} +declare module "node:url" { + export * from "url"; +} diff --git a/task/node_modules/@types/node/ts4.8/util.d.ts b/task/node_modules/@types/node/ts4.8/util.d.ts new file mode 100644 index 0000000..ac269ec --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/util.d.ts @@ -0,0 +1,2183 @@ +/** + * The `node:util` module supports the needs of Node.js internal APIs. Many of the + * utilities are useful for application and module developers as well. To access + * it: + * + * ```js + * const util = require('node:util'); + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/util.js) + */ +declare module "util" { + import * as types from "node:util/types"; + export interface InspectOptions { + /** + * If `true`, object's non-enumerable symbols and properties are included in the formatted result. + * `WeakMap` and `WeakSet` entries are also included as well as user defined prototype properties (excluding method properties). + * @default false + */ + showHidden?: boolean | undefined; + /** + * Specifies the number of times to recurse while formatting object. + * This is useful for inspecting large objects. + * To recurse up to the maximum call stack size pass `Infinity` or `null`. + * @default 2 + */ + depth?: number | null | undefined; + /** + * If `true`, the output is styled with ANSI color codes. Colors are customizable. + */ + colors?: boolean | undefined; + /** + * If `false`, `[util.inspect.custom](depth, opts, inspect)` functions are not invoked. + * @default true + */ + customInspect?: boolean | undefined; + /** + * If `true`, `Proxy` inspection includes the target and handler objects. + * @default false + */ + showProxy?: boolean | undefined; + /** + * Specifies the maximum number of `Array`, `TypedArray`, `WeakMap`, and `WeakSet` elements + * to include when formatting. Set to `null` or `Infinity` to show all elements. + * Set to `0` or negative to show no elements. + * @default 100 + */ + maxArrayLength?: number | null | undefined; + /** + * Specifies the maximum number of characters to + * include when formatting. Set to `null` or `Infinity` to show all elements. + * Set to `0` or negative to show no characters. + * @default 10000 + */ + maxStringLength?: number | null | undefined; + /** + * The length at which input values are split across multiple lines. + * Set to `Infinity` to format the input as a single line + * (in combination with `compact` set to `true` or any number >= `1`). + * @default 80 + */ + breakLength?: number | undefined; + /** + * Setting this to `false` causes each object key + * to be displayed on a new line. It will also add new lines to text that is + * longer than `breakLength`. If set to a number, the most `n` inner elements + * are united on a single line as long as all properties fit into + * `breakLength`. Short array elements are also grouped together. Note that no + * text will be reduced below 16 characters, no matter the `breakLength` size. + * For more information, see the example below. + * @default true + */ + compact?: boolean | number | undefined; + /** + * If set to `true` or a function, all properties of an object, and `Set` and `Map` + * entries are sorted in the resulting string. + * If set to `true` the default sort is used. + * If set to a function, it is used as a compare function. + */ + sorted?: boolean | ((a: string, b: string) => number) | undefined; + /** + * If set to `true`, getters are going to be + * inspected as well. If set to `'get'` only getters without setter are going + * to be inspected. If set to `'set'` only getters having a corresponding + * setter are going to be inspected. This might cause side effects depending on + * the getter function. + * @default false + */ + getters?: "get" | "set" | boolean | undefined; + /** + * If set to `true`, an underscore is used to separate every three digits in all bigints and numbers. + * @default false + */ + numericSeparator?: boolean | undefined; + } + export type Style = + | "special" + | "number" + | "bigint" + | "boolean" + | "undefined" + | "null" + | "string" + | "symbol" + | "date" + | "regexp" + | "module"; + export type CustomInspectFunction = (depth: number, options: InspectOptionsStylized) => any; // TODO: , inspect: inspect + export interface InspectOptionsStylized extends InspectOptions { + stylize(text: string, styleType: Style): string; + } + /** + * The `util.format()` method returns a formatted string using the first argument + * as a `printf`\-like format string which can contain zero or more format + * specifiers. Each specifier is replaced with the converted value from the + * corresponding argument. Supported specifiers are: + * + * If a specifier does not have a corresponding argument, it is not replaced: + * + * ```js + * util.format('%s:%s', 'foo'); + * // Returns: 'foo:%s' + * ``` + * + * Values that are not part of the format string are formatted using`util.inspect()` if their type is not `string`. + * + * If there are more arguments passed to the `util.format()` method than the + * number of specifiers, the extra arguments are concatenated to the returned + * string, separated by spaces: + * + * ```js + * util.format('%s:%s', 'foo', 'bar', 'baz'); + * // Returns: 'foo:bar baz' + * ``` + * + * If the first argument does not contain a valid format specifier, `util.format()`returns a string that is the concatenation of all arguments separated by spaces: + * + * ```js + * util.format(1, 2, 3); + * // Returns: '1 2 3' + * ``` + * + * If only one argument is passed to `util.format()`, it is returned as it is + * without any formatting: + * + * ```js + * util.format('%% %s'); + * // Returns: '%% %s' + * ``` + * + * `util.format()` is a synchronous method that is intended as a debugging tool. + * Some input values can have a significant performance overhead that can block the + * event loop. Use this function with care and never in a hot code path. + * @since v0.5.3 + * @param format A `printf`-like format string. + */ + export function format(format?: any, ...param: any[]): string; + /** + * This function is identical to {@link format}, except in that it takes + * an `inspectOptions` argument which specifies options that are passed along to {@link inspect}. + * + * ```js + * util.formatWithOptions({ colors: true }, 'See object %O', { foo: 42 }); + * // Returns 'See object { foo: 42 }', where `42` is colored as a number + * // when printed to a terminal. + * ``` + * @since v10.0.0 + */ + export function formatWithOptions(inspectOptions: InspectOptions, format?: any, ...param: any[]): string; + /** + * Returns the string name for a numeric error code that comes from a Node.js API. + * The mapping between error codes and error names is platform-dependent. + * See `Common System Errors` for the names of common errors. + * + * ```js + * fs.access('file/that/does/not/exist', (err) => { + * const name = util.getSystemErrorName(err.errno); + * console.error(name); // ENOENT + * }); + * ``` + * @since v9.7.0 + */ + export function getSystemErrorName(err: number): string; + /** + * Returns a Map of all system error codes available from the Node.js API. + * The mapping between error codes and error names is platform-dependent. + * See `Common System Errors` for the names of common errors. + * + * ```js + * fs.access('file/that/does/not/exist', (err) => { + * const errorMap = util.getSystemErrorMap(); + * const name = errorMap.get(err.errno); + * console.error(name); // ENOENT + * }); + * ``` + * @since v16.0.0, v14.17.0 + */ + export function getSystemErrorMap(): Map; + /** + * The `util.log()` method prints the given `string` to `stdout` with an included + * timestamp. + * + * ```js + * const util = require('node:util'); + * + * util.log('Timestamped message.'); + * ``` + * @since v0.3.0 + * @deprecated Since v6.0.0 - Use a third party module instead. + */ + export function log(string: string): void; + /** + * Returns the `string` after replacing any surrogate code points + * (or equivalently, any unpaired surrogate code units) with the + * Unicode "replacement character" U+FFFD. + * @since v16.8.0, v14.18.0 + */ + export function toUSVString(string: string): string; + /** + * Creates and returns an `AbortController` instance whose `AbortSignal` is marked + * as transferable and can be used with `structuredClone()` or `postMessage()`. + * @since v18.11.0 + * @experimental + * @returns A transferable AbortController + */ + export function transferableAbortController(): AbortController; + /** + * Marks the given `AbortSignal` as transferable so that it can be used with`structuredClone()` and `postMessage()`. + * + * ```js + * const signal = transferableAbortSignal(AbortSignal.timeout(100)); + * const channel = new MessageChannel(); + * channel.port2.postMessage(signal, [signal]); + * ``` + * @since v18.11.0 + * @experimental + * @param signal The AbortSignal + * @returns The same AbortSignal + */ + export function transferableAbortSignal(signal: AbortSignal): AbortSignal; + /** + * Listens to abort event on the provided `signal` and + * returns a promise that is fulfilled when the `signal` is + * aborted. If the passed `resource` is garbage collected before the `signal` is + * aborted, the returned promise shall remain pending indefinitely. + * + * ```js + * import { aborted } from 'node:util'; + * + * const dependent = obtainSomethingAbortable(); + * + * aborted(dependent.signal, dependent).then(() => { + * // Do something when dependent is aborted. + * }); + * + * dependent.on('event', () => { + * dependent.abort(); + * }); + * ``` + * @since v19.7.0 + * @experimental + * @param resource Any non-null entity, reference to which is held weakly. + */ + export function aborted(signal: AbortSignal, resource: any): Promise; + /** + * The `util.inspect()` method returns a string representation of `object` that is + * intended for debugging. The output of `util.inspect` may change at any time + * and should not be depended upon programmatically. Additional `options` may be + * passed that alter the result.`util.inspect()` will use the constructor's name and/or `@@toStringTag` to make + * an identifiable tag for an inspected value. + * + * ```js + * class Foo { + * get [Symbol.toStringTag]() { + * return 'bar'; + * } + * } + * + * class Bar {} + * + * const baz = Object.create(null, { [Symbol.toStringTag]: { value: 'foo' } }); + * + * util.inspect(new Foo()); // 'Foo [bar] {}' + * util.inspect(new Bar()); // 'Bar {}' + * util.inspect(baz); // '[foo] {}' + * ``` + * + * Circular references point to their anchor by using a reference index: + * + * ```js + * const { inspect } = require('node:util'); + * + * const obj = {}; + * obj.a = [obj]; + * obj.b = {}; + * obj.b.inner = obj.b; + * obj.b.obj = obj; + * + * console.log(inspect(obj)); + * // { + * // a: [ [Circular *1] ], + * // b: { inner: [Circular *2], obj: [Circular *1] } + * // } + * ``` + * + * The following example inspects all properties of the `util` object: + * + * ```js + * const util = require('node:util'); + * + * console.log(util.inspect(util, { showHidden: true, depth: null })); + * ``` + * + * The following example highlights the effect of the `compact` option: + * + * ```js + * const util = require('node:util'); + * + * const o = { + * a: [1, 2, [[ + * 'Lorem ipsum dolor sit amet,\nconsectetur adipiscing elit, sed do ' + + * 'eiusmod \ntempor incididunt ut labore et dolore magna aliqua.', + * 'test', + * 'foo']], 4], + * b: new Map([['za', 1], ['zb', 'test']]), + * }; + * console.log(util.inspect(o, { compact: true, depth: 5, breakLength: 80 })); + * + * // { a: + * // [ 1, + * // 2, + * // [ [ 'Lorem ipsum dolor sit amet,\nconsectetur [...]', // A long line + * // 'test', + * // 'foo' ] ], + * // 4 ], + * // b: Map(2) { 'za' => 1, 'zb' => 'test' } } + * + * // Setting `compact` to false or an integer creates more reader friendly output. + * console.log(util.inspect(o, { compact: false, depth: 5, breakLength: 80 })); + * + * // { + * // a: [ + * // 1, + * // 2, + * // [ + * // [ + * // 'Lorem ipsum dolor sit amet,\n' + + * // 'consectetur adipiscing elit, sed do eiusmod \n' + + * // 'tempor incididunt ut labore et dolore magna aliqua.', + * // 'test', + * // 'foo' + * // ] + * // ], + * // 4 + * // ], + * // b: Map(2) { + * // 'za' => 1, + * // 'zb' => 'test' + * // } + * // } + * + * // Setting `breakLength` to e.g. 150 will print the "Lorem ipsum" text in a + * // single line. + * ``` + * + * The `showHidden` option allows [`WeakMap`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap) and + * [`WeakSet`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet) entries to be + * inspected. If there are more entries than `maxArrayLength`, there is no + * guarantee which entries are displayed. That means retrieving the same [`WeakSet`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet) entries twice may + * result in different output. Furthermore, entries + * with no remaining strong references may be garbage collected at any time. + * + * ```js + * const { inspect } = require('node:util'); + * + * const obj = { a: 1 }; + * const obj2 = { b: 2 }; + * const weakSet = new WeakSet([obj, obj2]); + * + * console.log(inspect(weakSet, { showHidden: true })); + * // WeakSet { { a: 1 }, { b: 2 } } + * ``` + * + * The `sorted` option ensures that an object's property insertion order does not + * impact the result of `util.inspect()`. + * + * ```js + * const { inspect } = require('node:util'); + * const assert = require('node:assert'); + * + * const o1 = { + * b: [2, 3, 1], + * a: '`a` comes before `b`', + * c: new Set([2, 3, 1]), + * }; + * console.log(inspect(o1, { sorted: true })); + * // { a: '`a` comes before `b`', b: [ 2, 3, 1 ], c: Set(3) { 1, 2, 3 } } + * console.log(inspect(o1, { sorted: (a, b) => b.localeCompare(a) })); + * // { c: Set(3) { 3, 2, 1 }, b: [ 2, 3, 1 ], a: '`a` comes before `b`' } + * + * const o2 = { + * c: new Set([2, 1, 3]), + * a: '`a` comes before `b`', + * b: [2, 3, 1], + * }; + * assert.strict.equal( + * inspect(o1, { sorted: true }), + * inspect(o2, { sorted: true }), + * ); + * ``` + * + * The `numericSeparator` option adds an underscore every three digits to all + * numbers. + * + * ```js + * const { inspect } = require('node:util'); + * + * const thousand = 1_000; + * const million = 1_000_000; + * const bigNumber = 123_456_789n; + * const bigDecimal = 1_234.123_45; + * + * console.log(inspect(thousand, { numericSeparator: true })); + * // 1_000 + * console.log(inspect(million, { numericSeparator: true })); + * // 1_000_000 + * console.log(inspect(bigNumber, { numericSeparator: true })); + * // 123_456_789n + * console.log(inspect(bigDecimal, { numericSeparator: true })); + * // 1_234.123_45 + * ``` + * + * `util.inspect()` is a synchronous method intended for debugging. Its maximum + * output length is approximately 128 MiB. Inputs that result in longer output will + * be truncated. + * @since v0.3.0 + * @param object Any JavaScript primitive or `Object`. + * @return The representation of `object`. + */ + export function inspect(object: any, showHidden?: boolean, depth?: number | null, color?: boolean): string; + export function inspect(object: any, options?: InspectOptions): string; + export namespace inspect { + let colors: NodeJS.Dict<[number, number]>; + let styles: { + [K in Style]: string; + }; + let defaultOptions: InspectOptions; + /** + * Allows changing inspect settings from the repl. + */ + let replDefaults: InspectOptions; + /** + * That can be used to declare custom inspect functions. + */ + const custom: unique symbol; + } + /** + * Alias for [`Array.isArray()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray). + * + * Returns `true` if the given `object` is an `Array`. Otherwise, returns `false`. + * + * ```js + * const util = require('node:util'); + * + * util.isArray([]); + * // Returns: true + * util.isArray(new Array()); + * // Returns: true + * util.isArray({}); + * // Returns: false + * ``` + * @since v0.6.0 + * @deprecated Since v4.0.0 - Use `isArray` instead. + */ + export function isArray(object: unknown): object is unknown[]; + /** + * Returns `true` if the given `object` is a `RegExp`. Otherwise, returns `false`. + * + * ```js + * const util = require('node:util'); + * + * util.isRegExp(/some regexp/); + * // Returns: true + * util.isRegExp(new RegExp('another regexp')); + * // Returns: true + * util.isRegExp({}); + * // Returns: false + * ``` + * @since v0.6.0 + * @deprecated Since v4.0.0 - Deprecated + */ + export function isRegExp(object: unknown): object is RegExp; + /** + * Returns `true` if the given `object` is a `Date`. Otherwise, returns `false`. + * + * ```js + * const util = require('node:util'); + * + * util.isDate(new Date()); + * // Returns: true + * util.isDate(Date()); + * // false (without 'new' returns a String) + * util.isDate({}); + * // Returns: false + * ``` + * @since v0.6.0 + * @deprecated Since v4.0.0 - Use {@link types.isDate} instead. + */ + export function isDate(object: unknown): object is Date; + /** + * Returns `true` if the given `object` is an `Error`. Otherwise, returns`false`. + * + * ```js + * const util = require('node:util'); + * + * util.isError(new Error()); + * // Returns: true + * util.isError(new TypeError()); + * // Returns: true + * util.isError({ name: 'Error', message: 'an error occurred' }); + * // Returns: false + * ``` + * + * This method relies on `Object.prototype.toString()` behavior. It is + * possible to obtain an incorrect result when the `object` argument manipulates`@@toStringTag`. + * + * ```js + * const util = require('node:util'); + * const obj = { name: 'Error', message: 'an error occurred' }; + * + * util.isError(obj); + * // Returns: false + * obj[Symbol.toStringTag] = 'Error'; + * util.isError(obj); + * // Returns: true + * ``` + * @since v0.6.0 + * @deprecated Since v4.0.0 - Use {@link types.isNativeError} instead. + */ + export function isError(object: unknown): object is Error; + /** + * Usage of `util.inherits()` is discouraged. Please use the ES6 `class` and`extends` keywords to get language level inheritance support. Also note + * that the two styles are [semantically incompatible](https://github.com/nodejs/node/issues/4179). + * + * Inherit the prototype methods from one [constructor](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor) into another. The + * prototype of `constructor` will be set to a new object created from`superConstructor`. + * + * This mainly adds some input validation on top of`Object.setPrototypeOf(constructor.prototype, superConstructor.prototype)`. + * As an additional convenience, `superConstructor` will be accessible + * through the `constructor.super_` property. + * + * ```js + * const util = require('node:util'); + * const EventEmitter = require('node:events'); + * + * function MyStream() { + * EventEmitter.call(this); + * } + * + * util.inherits(MyStream, EventEmitter); + * + * MyStream.prototype.write = function(data) { + * this.emit('data', data); + * }; + * + * const stream = new MyStream(); + * + * console.log(stream instanceof EventEmitter); // true + * console.log(MyStream.super_ === EventEmitter); // true + * + * stream.on('data', (data) => { + * console.log(`Received data: "${data}"`); + * }); + * stream.write('It works!'); // Received data: "It works!" + * ``` + * + * ES6 example using `class` and `extends`: + * + * ```js + * const EventEmitter = require('node:events'); + * + * class MyStream extends EventEmitter { + * write(data) { + * this.emit('data', data); + * } + * } + * + * const stream = new MyStream(); + * + * stream.on('data', (data) => { + * console.log(`Received data: "${data}"`); + * }); + * stream.write('With ES6'); + * ``` + * @since v0.3.0 + * @legacy Use ES2015 class syntax and `extends` keyword instead. + */ + export function inherits(constructor: unknown, superConstructor: unknown): void; + export type DebugLoggerFunction = (msg: string, ...param: unknown[]) => void; + export interface DebugLogger extends DebugLoggerFunction { + enabled: boolean; + } + /** + * The `util.debuglog()` method is used to create a function that conditionally + * writes debug messages to `stderr` based on the existence of the `NODE_DEBUG`environment variable. If the `section` name appears within the value of that + * environment variable, then the returned function operates similar to `console.error()`. If not, then the returned function is a no-op. + * + * ```js + * const util = require('node:util'); + * const debuglog = util.debuglog('foo'); + * + * debuglog('hello from foo [%d]', 123); + * ``` + * + * If this program is run with `NODE_DEBUG=foo` in the environment, then + * it will output something like: + * + * ```console + * FOO 3245: hello from foo [123] + * ``` + * + * where `3245` is the process id. If it is not run with that + * environment variable set, then it will not print anything. + * + * The `section` supports wildcard also: + * + * ```js + * const util = require('node:util'); + * const debuglog = util.debuglog('foo-bar'); + * + * debuglog('hi there, it\'s foo-bar [%d]', 2333); + * ``` + * + * if it is run with `NODE_DEBUG=foo*` in the environment, then it will output + * something like: + * + * ```console + * FOO-BAR 3257: hi there, it's foo-bar [2333] + * ``` + * + * Multiple comma-separated `section` names may be specified in the `NODE_DEBUG`environment variable: `NODE_DEBUG=fs,net,tls`. + * + * The optional `callback` argument can be used to replace the logging function + * with a different function that doesn't have any initialization or + * unnecessary wrapping. + * + * ```js + * const util = require('node:util'); + * let debuglog = util.debuglog('internals', (debug) => { + * // Replace with a logging function that optimizes out + * // testing if the section is enabled + * debuglog = debug; + * }); + * ``` + * @since v0.11.3 + * @param section A string identifying the portion of the application for which the `debuglog` function is being created. + * @param callback A callback invoked the first time the logging function is called with a function argument that is a more optimized logging function. + * @return The logging function + */ + export function debuglog(section: string, callback?: (fn: DebugLoggerFunction) => void): DebugLogger; + export const debug: typeof debuglog; + /** + * Returns `true` if the given `object` is a `Boolean`. Otherwise, returns `false`. + * + * ```js + * const util = require('node:util'); + * + * util.isBoolean(1); + * // Returns: false + * util.isBoolean(0); + * // Returns: false + * util.isBoolean(false); + * // Returns: true + * ``` + * @since v0.11.5 + * @deprecated Since v4.0.0 - Use `typeof value === 'boolean'` instead. + */ + export function isBoolean(object: unknown): object is boolean; + /** + * Returns `true` if the given `object` is a `Buffer`. Otherwise, returns `false`. + * + * ```js + * const util = require('node:util'); + * + * util.isBuffer({ length: 0 }); + * // Returns: false + * util.isBuffer([]); + * // Returns: false + * util.isBuffer(Buffer.from('hello world')); + * // Returns: true + * ``` + * @since v0.11.5 + * @deprecated Since v4.0.0 - Use `isBuffer` instead. + */ + export function isBuffer(object: unknown): object is Buffer; + /** + * Returns `true` if the given `object` is a `Function`. Otherwise, returns`false`. + * + * ```js + * const util = require('node:util'); + * + * function Foo() {} + * const Bar = () => {}; + * + * util.isFunction({}); + * // Returns: false + * util.isFunction(Foo); + * // Returns: true + * util.isFunction(Bar); + * // Returns: true + * ``` + * @since v0.11.5 + * @deprecated Since v4.0.0 - Use `typeof value === 'function'` instead. + */ + export function isFunction(object: unknown): boolean; + /** + * Returns `true` if the given `object` is strictly `null`. Otherwise, returns`false`. + * + * ```js + * const util = require('node:util'); + * + * util.isNull(0); + * // Returns: false + * util.isNull(undefined); + * // Returns: false + * util.isNull(null); + * // Returns: true + * ``` + * @since v0.11.5 + * @deprecated Since v4.0.0 - Use `value === null` instead. + */ + export function isNull(object: unknown): object is null; + /** + * Returns `true` if the given `object` is `null` or `undefined`. Otherwise, + * returns `false`. + * + * ```js + * const util = require('node:util'); + * + * util.isNullOrUndefined(0); + * // Returns: false + * util.isNullOrUndefined(undefined); + * // Returns: true + * util.isNullOrUndefined(null); + * // Returns: true + * ``` + * @since v0.11.5 + * @deprecated Since v4.0.0 - Use `value === undefined || value === null` instead. + */ + export function isNullOrUndefined(object: unknown): object is null | undefined; + /** + * Returns `true` if the given `object` is a `Number`. Otherwise, returns `false`. + * + * ```js + * const util = require('node:util'); + * + * util.isNumber(false); + * // Returns: false + * util.isNumber(Infinity); + * // Returns: true + * util.isNumber(0); + * // Returns: true + * util.isNumber(NaN); + * // Returns: true + * ``` + * @since v0.11.5 + * @deprecated Since v4.0.0 - Use `typeof value === 'number'` instead. + */ + export function isNumber(object: unknown): object is number; + /** + * Returns `true` if the given `object` is strictly an `Object`**and** not a`Function` (even though functions are objects in JavaScript). + * Otherwise, returns `false`. + * + * ```js + * const util = require('node:util'); + * + * util.isObject(5); + * // Returns: false + * util.isObject(null); + * // Returns: false + * util.isObject({}); + * // Returns: true + * util.isObject(() => {}); + * // Returns: false + * ``` + * @since v0.11.5 + * @deprecated Since v4.0.0 - Use `value !== null && typeof value === 'object'` instead. + */ + export function isObject(object: unknown): boolean; + /** + * Returns `true` if the given `object` is a primitive type. Otherwise, returns`false`. + * + * ```js + * const util = require('node:util'); + * + * util.isPrimitive(5); + * // Returns: true + * util.isPrimitive('foo'); + * // Returns: true + * util.isPrimitive(false); + * // Returns: true + * util.isPrimitive(null); + * // Returns: true + * util.isPrimitive(undefined); + * // Returns: true + * util.isPrimitive({}); + * // Returns: false + * util.isPrimitive(() => {}); + * // Returns: false + * util.isPrimitive(/^$/); + * // Returns: false + * util.isPrimitive(new Date()); + * // Returns: false + * ``` + * @since v0.11.5 + * @deprecated Since v4.0.0 - Use `(typeof value !== 'object' && typeof value !== 'function') || value === null` instead. + */ + export function isPrimitive(object: unknown): boolean; + /** + * Returns `true` if the given `object` is a `string`. Otherwise, returns `false`. + * + * ```js + * const util = require('node:util'); + * + * util.isString(''); + * // Returns: true + * util.isString('foo'); + * // Returns: true + * util.isString(String('foo')); + * // Returns: true + * util.isString(5); + * // Returns: false + * ``` + * @since v0.11.5 + * @deprecated Since v4.0.0 - Use `typeof value === 'string'` instead. + */ + export function isString(object: unknown): object is string; + /** + * Returns `true` if the given `object` is a `Symbol`. Otherwise, returns `false`. + * + * ```js + * const util = require('node:util'); + * + * util.isSymbol(5); + * // Returns: false + * util.isSymbol('foo'); + * // Returns: false + * util.isSymbol(Symbol('foo')); + * // Returns: true + * ``` + * @since v0.11.5 + * @deprecated Since v4.0.0 - Use `typeof value === 'symbol'` instead. + */ + export function isSymbol(object: unknown): object is symbol; + /** + * Returns `true` if the given `object` is `undefined`. Otherwise, returns `false`. + * + * ```js + * const util = require('node:util'); + * + * const foo = undefined; + * util.isUndefined(5); + * // Returns: false + * util.isUndefined(foo); + * // Returns: true + * util.isUndefined(null); + * // Returns: false + * ``` + * @since v0.11.5 + * @deprecated Since v4.0.0 - Use `value === undefined` instead. + */ + export function isUndefined(object: unknown): object is undefined; + /** + * The `util.deprecate()` method wraps `fn` (which may be a function or class) in + * such a way that it is marked as deprecated. + * + * ```js + * const util = require('node:util'); + * + * exports.obsoleteFunction = util.deprecate(() => { + * // Do something here. + * }, 'obsoleteFunction() is deprecated. Use newShinyFunction() instead.'); + * ``` + * + * When called, `util.deprecate()` will return a function that will emit a`DeprecationWarning` using the `'warning'` event. The warning will + * be emitted and printed to `stderr` the first time the returned function is + * called. After the warning is emitted, the wrapped function is called without + * emitting a warning. + * + * If the same optional `code` is supplied in multiple calls to `util.deprecate()`, + * the warning will be emitted only once for that `code`. + * + * ```js + * const util = require('node:util'); + * + * const fn1 = util.deprecate(someFunction, someMessage, 'DEP0001'); + * const fn2 = util.deprecate(someOtherFunction, someOtherMessage, 'DEP0001'); + * fn1(); // Emits a deprecation warning with code DEP0001 + * fn2(); // Does not emit a deprecation warning because it has the same code + * ``` + * + * If either the `--no-deprecation` or `--no-warnings` command-line flags are + * used, or if the `process.noDeprecation` property is set to `true`_prior_ to + * the first deprecation warning, the `util.deprecate()` method does nothing. + * + * If the `--trace-deprecation` or `--trace-warnings` command-line flags are set, + * or the `process.traceDeprecation` property is set to `true`, a warning and a + * stack trace are printed to `stderr` the first time the deprecated function is + * called. + * + * If the `--throw-deprecation` command-line flag is set, or the`process.throwDeprecation` property is set to `true`, then an exception will be + * thrown when the deprecated function is called. + * + * The `--throw-deprecation` command-line flag and `process.throwDeprecation`property take precedence over `--trace-deprecation` and`process.traceDeprecation`. + * @since v0.8.0 + * @param fn The function that is being deprecated. + * @param msg A warning message to display when the deprecated function is invoked. + * @param code A deprecation code. See the `list of deprecated APIs` for a list of codes. + * @return The deprecated function wrapped to emit a warning. + */ + export function deprecate(fn: T, msg: string, code?: string): T; + /** + * Returns `true` if there is deep strict equality between `val1` and `val2`. + * Otherwise, returns `false`. + * + * See `assert.deepStrictEqual()` for more information about deep strict + * equality. + * @since v9.0.0 + */ + export function isDeepStrictEqual(val1: unknown, val2: unknown): boolean; + /** + * Returns `str` with any ANSI escape codes removed. + * + * ```js + * console.log(util.stripVTControlCharacters('\u001B[4mvalue\u001B[0m')); + * // Prints "value" + * ``` + * @since v16.11.0 + */ + export function stripVTControlCharacters(str: string): string; + /** + * Takes an `async` function (or a function that returns a `Promise`) and returns a + * function following the error-first callback style, i.e. taking + * an `(err, value) => ...` callback as the last argument. In the callback, the + * first argument will be the rejection reason (or `null` if the `Promise`resolved), and the second argument will be the resolved value. + * + * ```js + * const util = require('node:util'); + * + * async function fn() { + * return 'hello world'; + * } + * const callbackFunction = util.callbackify(fn); + * + * callbackFunction((err, ret) => { + * if (err) throw err; + * console.log(ret); + * }); + * ``` + * + * Will print: + * + * ```text + * hello world + * ``` + * + * The callback is executed asynchronously, and will have a limited stack trace. + * If the callback throws, the process will emit an `'uncaughtException'` event, and if not handled will exit. + * + * Since `null` has a special meaning as the first argument to a callback, if a + * wrapped function rejects a `Promise` with a falsy value as a reason, the value + * is wrapped in an `Error` with the original value stored in a field named`reason`. + * + * ```js + * function fn() { + * return Promise.reject(null); + * } + * const callbackFunction = util.callbackify(fn); + * + * callbackFunction((err, ret) => { + * // When the Promise was rejected with `null` it is wrapped with an Error and + * // the original value is stored in `reason`. + * err && Object.hasOwn(err, 'reason') && err.reason === null; // true + * }); + * ``` + * @since v8.2.0 + * @param fn An `async` function + * @return a callback style function + */ + export function callbackify(fn: () => Promise): (callback: (err: NodeJS.ErrnoException) => void) => void; + export function callbackify( + fn: () => Promise, + ): (callback: (err: NodeJS.ErrnoException, result: TResult) => void) => void; + export function callbackify( + fn: (arg1: T1) => Promise, + ): (arg1: T1, callback: (err: NodeJS.ErrnoException) => void) => void; + export function callbackify( + fn: (arg1: T1) => Promise, + ): (arg1: T1, callback: (err: NodeJS.ErrnoException, result: TResult) => void) => void; + export function callbackify( + fn: (arg1: T1, arg2: T2) => Promise, + ): (arg1: T1, arg2: T2, callback: (err: NodeJS.ErrnoException) => void) => void; + export function callbackify( + fn: (arg1: T1, arg2: T2) => Promise, + ): (arg1: T1, arg2: T2, callback: (err: NodeJS.ErrnoException | null, result: TResult) => void) => void; + export function callbackify( + fn: (arg1: T1, arg2: T2, arg3: T3) => Promise, + ): (arg1: T1, arg2: T2, arg3: T3, callback: (err: NodeJS.ErrnoException) => void) => void; + export function callbackify( + fn: (arg1: T1, arg2: T2, arg3: T3) => Promise, + ): (arg1: T1, arg2: T2, arg3: T3, callback: (err: NodeJS.ErrnoException | null, result: TResult) => void) => void; + export function callbackify( + fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Promise, + ): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err: NodeJS.ErrnoException) => void) => void; + export function callbackify( + fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Promise, + ): ( + arg1: T1, + arg2: T2, + arg3: T3, + arg4: T4, + callback: (err: NodeJS.ErrnoException | null, result: TResult) => void, + ) => void; + export function callbackify( + fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Promise, + ): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err: NodeJS.ErrnoException) => void) => void; + export function callbackify( + fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Promise, + ): ( + arg1: T1, + arg2: T2, + arg3: T3, + arg4: T4, + arg5: T5, + callback: (err: NodeJS.ErrnoException | null, result: TResult) => void, + ) => void; + export function callbackify( + fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Promise, + ): ( + arg1: T1, + arg2: T2, + arg3: T3, + arg4: T4, + arg5: T5, + arg6: T6, + callback: (err: NodeJS.ErrnoException) => void, + ) => void; + export function callbackify( + fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Promise, + ): ( + arg1: T1, + arg2: T2, + arg3: T3, + arg4: T4, + arg5: T5, + arg6: T6, + callback: (err: NodeJS.ErrnoException | null, result: TResult) => void, + ) => void; + export interface CustomPromisifyLegacy extends Function { + __promisify__: TCustom; + } + export interface CustomPromisifySymbol extends Function { + [promisify.custom]: TCustom; + } + export type CustomPromisify = + | CustomPromisifySymbol + | CustomPromisifyLegacy; + /** + * Takes a function following the common error-first callback style, i.e. taking + * an `(err, value) => ...` callback as the last argument, and returns a version + * that returns promises. + * + * ```js + * const util = require('node:util'); + * const fs = require('node:fs'); + * + * const stat = util.promisify(fs.stat); + * stat('.').then((stats) => { + * // Do something with `stats` + * }).catch((error) => { + * // Handle the error. + * }); + * ``` + * + * Or, equivalently using `async function`s: + * + * ```js + * const util = require('node:util'); + * const fs = require('node:fs'); + * + * const stat = util.promisify(fs.stat); + * + * async function callStat() { + * const stats = await stat('.'); + * console.log(`This directory is owned by ${stats.uid}`); + * } + * + * callStat(); + * ``` + * + * If there is an `original[util.promisify.custom]` property present, `promisify`will return its value, see `Custom promisified functions`. + * + * `promisify()` assumes that `original` is a function taking a callback as its + * final argument in all cases. If `original` is not a function, `promisify()`will throw an error. If `original` is a function but its last argument is not + * an error-first callback, it will still be passed an error-first + * callback as its last argument. + * + * Using `promisify()` on class methods or other methods that use `this` may not + * work as expected unless handled specially: + * + * ```js + * const util = require('node:util'); + * + * class Foo { + * constructor() { + * this.a = 42; + * } + * + * bar(callback) { + * callback(null, this.a); + * } + * } + * + * const foo = new Foo(); + * + * const naiveBar = util.promisify(foo.bar); + * // TypeError: Cannot read property 'a' of undefined + * // naiveBar().then(a => console.log(a)); + * + * naiveBar.call(foo).then((a) => console.log(a)); // '42' + * + * const bindBar = naiveBar.bind(foo); + * bindBar().then((a) => console.log(a)); // '42' + * ``` + * @since v8.0.0 + */ + export function promisify(fn: CustomPromisify): TCustom; + export function promisify( + fn: (callback: (err: any, result: TResult) => void) => void, + ): () => Promise; + export function promisify(fn: (callback: (err?: any) => void) => void): () => Promise; + export function promisify( + fn: (arg1: T1, callback: (err: any, result: TResult) => void) => void, + ): (arg1: T1) => Promise; + export function promisify(fn: (arg1: T1, callback: (err?: any) => void) => void): (arg1: T1) => Promise; + export function promisify( + fn: (arg1: T1, arg2: T2, callback: (err: any, result: TResult) => void) => void, + ): (arg1: T1, arg2: T2) => Promise; + export function promisify( + fn: (arg1: T1, arg2: T2, callback: (err?: any) => void) => void, + ): (arg1: T1, arg2: T2) => Promise; + export function promisify( + fn: (arg1: T1, arg2: T2, arg3: T3, callback: (err: any, result: TResult) => void) => void, + ): (arg1: T1, arg2: T2, arg3: T3) => Promise; + export function promisify( + fn: (arg1: T1, arg2: T2, arg3: T3, callback: (err?: any) => void) => void, + ): (arg1: T1, arg2: T2, arg3: T3) => Promise; + export function promisify( + fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err: any, result: TResult) => void) => void, + ): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Promise; + export function promisify( + fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err?: any) => void) => void, + ): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Promise; + export function promisify( + fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err: any, result: TResult) => void) => void, + ): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Promise; + export function promisify( + fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err?: any) => void) => void, + ): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Promise; + export function promisify(fn: Function): Function; + export namespace promisify { + /** + * That can be used to declare custom promisified variants of functions. + */ + const custom: unique symbol; + } + /** + * An implementation of the [WHATWG Encoding Standard](https://encoding.spec.whatwg.org/) `TextDecoder` API. + * + * ```js + * const decoder = new TextDecoder(); + * const u8arr = new Uint8Array([72, 101, 108, 108, 111]); + * console.log(decoder.decode(u8arr)); // Hello + * ``` + * @since v8.3.0 + */ + export class TextDecoder { + /** + * The encoding supported by the `TextDecoder` instance. + */ + readonly encoding: string; + /** + * The value will be `true` if decoding errors result in a `TypeError` being + * thrown. + */ + readonly fatal: boolean; + /** + * The value will be `true` if the decoding result will include the byte order + * mark. + */ + readonly ignoreBOM: boolean; + constructor( + encoding?: string, + options?: { + fatal?: boolean | undefined; + ignoreBOM?: boolean | undefined; + }, + ); + /** + * Decodes the `input` and returns a string. If `options.stream` is `true`, any + * incomplete byte sequences occurring at the end of the `input` are buffered + * internally and emitted after the next call to `textDecoder.decode()`. + * + * If `textDecoder.fatal` is `true`, decoding errors that occur will result in a`TypeError` being thrown. + * @param input An `ArrayBuffer`, `DataView`, or `TypedArray` instance containing the encoded data. + */ + decode( + input?: NodeJS.ArrayBufferView | ArrayBuffer | null, + options?: { + stream?: boolean | undefined; + }, + ): string; + } + export interface EncodeIntoResult { + /** + * The read Unicode code units of input. + */ + read: number; + /** + * The written UTF-8 bytes of output. + */ + written: number; + } + export { types }; + + //// TextEncoder/Decoder + /** + * An implementation of the [WHATWG Encoding Standard](https://encoding.spec.whatwg.org/) `TextEncoder` API. All + * instances of `TextEncoder` only support UTF-8 encoding. + * + * ```js + * const encoder = new TextEncoder(); + * const uint8array = encoder.encode('this is some data'); + * ``` + * + * The `TextEncoder` class is also available on the global object. + * @since v8.3.0 + */ + export class TextEncoder { + /** + * The encoding supported by the `TextEncoder` instance. Always set to `'utf-8'`. + */ + readonly encoding: string; + /** + * UTF-8 encodes the `input` string and returns a `Uint8Array` containing the + * encoded bytes. + * @param [input='an empty string'] The text to encode. + */ + encode(input?: string): Uint8Array; + /** + * UTF-8 encodes the `src` string to the `dest` Uint8Array and returns an object + * containing the read Unicode code units and written UTF-8 bytes. + * + * ```js + * const encoder = new TextEncoder(); + * const src = 'this is some data'; + * const dest = new Uint8Array(10); + * const { read, written } = encoder.encodeInto(src, dest); + * ``` + * @param src The text to encode. + * @param dest The array to hold the encode result. + */ + encodeInto(src: string, dest: Uint8Array): EncodeIntoResult; + } + import { TextDecoder as _TextDecoder, TextEncoder as _TextEncoder } from "util"; + global { + /** + * `TextDecoder` class is a global reference for `require('util').TextDecoder` + * https://nodejs.org/api/globals.html#textdecoder + * @since v11.0.0 + */ + var TextDecoder: typeof globalThis extends { + onmessage: any; + TextDecoder: infer TextDecoder; + } ? TextDecoder + : typeof _TextDecoder; + /** + * `TextEncoder` class is a global reference for `require('util').TextEncoder` + * https://nodejs.org/api/globals.html#textencoder + * @since v11.0.0 + */ + var TextEncoder: typeof globalThis extends { + onmessage: any; + TextEncoder: infer TextEncoder; + } ? TextEncoder + : typeof _TextEncoder; + } + + //// parseArgs + /** + * Provides a higher level API for command-line argument parsing than interacting + * with `process.argv` directly. Takes a specification for the expected arguments + * and returns a structured object with the parsed options and positionals. + * + * ```js + * import { parseArgs } from 'node:util'; + * const args = ['-f', '--bar', 'b']; + * const options = { + * foo: { + * type: 'boolean', + * short: 'f', + * }, + * bar: { + * type: 'string', + * }, + * }; + * const { + * values, + * positionals, + * } = parseArgs({ args, options }); + * console.log(values, positionals); + * // Prints: [Object: null prototype] { foo: true, bar: 'b' } [] + * ``` + * @since v18.3.0, v16.17.0 + * @param config Used to provide arguments for parsing and to configure the parser. `config` supports the following properties: + * @return The parsed command line arguments: + */ + export function parseArgs(config?: T): ParsedResults; + interface ParseArgsOptionConfig { + /** + * Type of argument. + */ + type: "string" | "boolean"; + /** + * Whether this option can be provided multiple times. + * If `true`, all values will be collected in an array. + * If `false`, values for the option are last-wins. + * @default false. + */ + multiple?: boolean | undefined; + /** + * A single character alias for the option. + */ + short?: string | undefined; + /** + * The default option value when it is not set by args. + * It must be of the same type as the the `type` property. + * When `multiple` is `true`, it must be an array. + * @since v18.11.0 + */ + default?: string | boolean | string[] | boolean[] | undefined; + } + interface ParseArgsOptionsConfig { + [longOption: string]: ParseArgsOptionConfig; + } + export interface ParseArgsConfig { + /** + * Array of argument strings. + */ + args?: string[] | undefined; + /** + * Used to describe arguments known to the parser. + */ + options?: ParseArgsOptionsConfig | undefined; + /** + * Should an error be thrown when unknown arguments are encountered, + * or when arguments are passed that do not match the `type` configured in `options`. + * @default true + */ + strict?: boolean | undefined; + /** + * Whether this command accepts positional arguments. + */ + allowPositionals?: boolean | undefined; + /** + * Return the parsed tokens. This is useful for extending the built-in behavior, + * from adding additional checks through to reprocessing the tokens in different ways. + * @default false + */ + tokens?: boolean | undefined; + } + /* + IfDefaultsTrue and IfDefaultsFalse are helpers to handle default values for missing boolean properties. + TypeScript does not have exact types for objects: https://github.com/microsoft/TypeScript/issues/12936 + This means it is impossible to distinguish between "field X is definitely not present" and "field X may or may not be present". + But we expect users to generally provide their config inline or `as const`, which means TS will always know whether a given field is present. + So this helper treats "not definitely present" (i.e., not `extends boolean`) as being "definitely not present", i.e. it should have its default value. + This is technically incorrect but is a much nicer UX for the common case. + The IfDefaultsTrue version is for things which default to true; the IfDefaultsFalse version is for things which default to false. + */ + type IfDefaultsTrue = T extends true ? IfTrue + : T extends false ? IfFalse + : IfTrue; + + // we put the `extends false` condition first here because `undefined` compares like `any` when `strictNullChecks: false` + type IfDefaultsFalse = T extends false ? IfFalse + : T extends true ? IfTrue + : IfFalse; + + type ExtractOptionValue = IfDefaultsTrue< + T["strict"], + O["type"] extends "string" ? string : O["type"] extends "boolean" ? boolean : string | boolean, + string | boolean + >; + + type ParsedValues = + & IfDefaultsTrue + & (T["options"] extends ParseArgsOptionsConfig ? { + -readonly [LongOption in keyof T["options"]]: IfDefaultsFalse< + T["options"][LongOption]["multiple"], + undefined | Array>, + undefined | ExtractOptionValue + >; + } + : {}); + + type ParsedPositionals = IfDefaultsTrue< + T["strict"], + IfDefaultsFalse, + IfDefaultsTrue + >; + + type PreciseTokenForOptions< + K extends string, + O extends ParseArgsOptionConfig, + > = O["type"] extends "string" ? { + kind: "option"; + index: number; + name: K; + rawName: string; + value: string; + inlineValue: boolean; + } + : O["type"] extends "boolean" ? { + kind: "option"; + index: number; + name: K; + rawName: string; + value: undefined; + inlineValue: undefined; + } + : OptionToken & { name: K }; + + type TokenForOptions< + T extends ParseArgsConfig, + K extends keyof T["options"] = keyof T["options"], + > = K extends unknown + ? T["options"] extends ParseArgsOptionsConfig ? PreciseTokenForOptions + : OptionToken + : never; + + type ParsedOptionToken = IfDefaultsTrue, OptionToken>; + + type ParsedPositionalToken = IfDefaultsTrue< + T["strict"], + IfDefaultsFalse, + IfDefaultsTrue + >; + + type ParsedTokens = Array< + ParsedOptionToken | ParsedPositionalToken | { kind: "option-terminator"; index: number } + >; + + type PreciseParsedResults = IfDefaultsFalse< + T["tokens"], + { + values: ParsedValues; + positionals: ParsedPositionals; + tokens: ParsedTokens; + }, + { + values: ParsedValues; + positionals: ParsedPositionals; + } + >; + + type OptionToken = + | { kind: "option"; index: number; name: string; rawName: string; value: string; inlineValue: boolean } + | { + kind: "option"; + index: number; + name: string; + rawName: string; + value: undefined; + inlineValue: undefined; + }; + + type Token = + | OptionToken + | { kind: "positional"; index: number; value: string } + | { kind: "option-terminator"; index: number }; + + // If ParseArgsConfig extends T, then the user passed config constructed elsewhere. + // So we can't rely on the `"not definitely present" implies "definitely not present"` assumption mentioned above. + type ParsedResults = ParseArgsConfig extends T ? { + values: { + [longOption: string]: undefined | string | boolean | Array; + }; + positionals: string[]; + tokens?: Token[]; + } + : PreciseParsedResults; + + /** + * An implementation of [the MIMEType class](https://bmeck.github.io/node-proposal-mime-api/). + * + * In accordance with browser conventions, all properties of `MIMEType` objects + * are implemented as getters and setters on the class prototype, rather than as + * data properties on the object itself. + * + * A MIME string is a structured string containing multiple meaningful + * components. When parsed, a `MIMEType` object is returned containing + * properties for each of these components. + * @since v19.1.0, v18.13.0 + * @experimental + */ + export class MIMEType { + /** + * Creates a new MIMEType object by parsing the input. + * + * A `TypeError` will be thrown if the `input` is not a valid MIME. + * Note that an effort will be made to coerce the given values into strings. + * @param input The input MIME to parse. + */ + constructor(input: string | { toString: () => string }); + + /** + * Gets and sets the type portion of the MIME. + * + * ```js + * import { MIMEType } from 'node:util'; + * + * const myMIME = new MIMEType('text/javascript'); + * console.log(myMIME.type); + * // Prints: text + * myMIME.type = 'application'; + * console.log(myMIME.type); + * // Prints: application + * console.log(String(myMIME)); + * // Prints: application/javascript + * ``` + */ + type: string; + /** + * Gets and sets the subtype portion of the MIME. + * + * ```js + * import { MIMEType } from 'node:util'; + * + * const myMIME = new MIMEType('text/ecmascript'); + * console.log(myMIME.subtype); + * // Prints: ecmascript + * myMIME.subtype = 'javascript'; + * console.log(myMIME.subtype); + * // Prints: javascript + * console.log(String(myMIME)); + * // Prints: text/javascript + * ``` + */ + subtype: string; + /** + * Gets the essence of the MIME. This property is read only. + * Use `mime.type` or `mime.subtype` to alter the MIME. + * + * ```js + * import { MIMEType } from 'node:util'; + * + * const myMIME = new MIMEType('text/javascript;key=value'); + * console.log(myMIME.essence); + * // Prints: text/javascript + * myMIME.type = 'application'; + * console.log(myMIME.essence); + * // Prints: application/javascript + * console.log(String(myMIME)); + * // Prints: application/javascript;key=value + * ``` + */ + readonly essence: string; + /** + * Gets the `MIMEParams` object representing the + * parameters of the MIME. This property is read-only. See `MIMEParams` documentation for details. + */ + readonly params: MIMEParams; + /** + * The `toString()` method on the `MIMEType` object returns the serialized MIME. + * + * Because of the need for standard compliance, this method does not allow users + * to customize the serialization process of the MIME. + */ + toString(): string; + } + /** + * The `MIMEParams` API provides read and write access to the parameters of a`MIMEType`. + * @since v19.1.0, v18.13.0 + */ + export class MIMEParams { + /** + * Remove all name-value pairs whose name is `name`. + */ + delete(name: string): void; + /** + * Returns an iterator over each of the name-value pairs in the parameters. + * Each item of the iterator is a JavaScript `Array`. The first item of the array + * is the `name`, the second item of the array is the `value`. + */ + entries(): IterableIterator<[string, string]>; + /** + * Returns the value of the first name-value pair whose name is `name`. If there + * are no such pairs, `null` is returned. + * @return or `null` if there is no name-value pair with the given `name`. + */ + get(name: string): string | null; + /** + * Returns `true` if there is at least one name-value pair whose name is `name`. + */ + has(name: string): boolean; + /** + * Returns an iterator over the names of each name-value pair. + * + * ```js + * import { MIMEType } from 'node:util'; + * + * const { params } = new MIMEType('text/plain;foo=0;bar=1'); + * for (const name of params.keys()) { + * console.log(name); + * } + * // Prints: + * // foo + * // bar + * ``` + */ + keys(): IterableIterator; + /** + * Sets the value in the `MIMEParams` object associated with `name` to`value`. If there are any pre-existing name-value pairs whose names are `name`, + * set the first such pair's value to `value`. + * + * ```js + * import { MIMEType } from 'node:util'; + * + * const { params } = new MIMEType('text/plain;foo=0;bar=1'); + * params.set('foo', 'def'); + * params.set('baz', 'xyz'); + * console.log(params.toString()); + * // Prints: foo=def;bar=1;baz=xyz + * ``` + */ + set(name: string, value: string): void; + /** + * Returns an iterator over the values of each name-value pair. + */ + values(): IterableIterator; + /** + * Returns an iterator over each of the name-value pairs in the parameters. + */ + [Symbol.iterator]: typeof MIMEParams.prototype.entries; + } +} +declare module "util/types" { + import { KeyObject, webcrypto } from "node:crypto"; + /** + * Returns `true` if the value is a built-in [`ArrayBuffer`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer) or + * [`SharedArrayBuffer`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer) instance. + * + * See also `util.types.isArrayBuffer()` and `util.types.isSharedArrayBuffer()`. + * + * ```js + * util.types.isAnyArrayBuffer(new ArrayBuffer()); // Returns true + * util.types.isAnyArrayBuffer(new SharedArrayBuffer()); // Returns true + * ``` + * @since v10.0.0 + */ + function isAnyArrayBuffer(object: unknown): object is ArrayBufferLike; + /** + * Returns `true` if the value is an `arguments` object. + * + * ```js + * function foo() { + * util.types.isArgumentsObject(arguments); // Returns true + * } + * ``` + * @since v10.0.0 + */ + function isArgumentsObject(object: unknown): object is IArguments; + /** + * Returns `true` if the value is a built-in [`ArrayBuffer`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer) instance. + * This does _not_ include [`SharedArrayBuffer`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer) instances. Usually, it is + * desirable to test for both; See `util.types.isAnyArrayBuffer()` for that. + * + * ```js + * util.types.isArrayBuffer(new ArrayBuffer()); // Returns true + * util.types.isArrayBuffer(new SharedArrayBuffer()); // Returns false + * ``` + * @since v10.0.0 + */ + function isArrayBuffer(object: unknown): object is ArrayBuffer; + /** + * Returns `true` if the value is an instance of one of the [`ArrayBuffer`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer) views, such as typed + * array objects or [`DataView`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView). Equivalent to + * [`ArrayBuffer.isView()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer/isView). + * + * ```js + * util.types.isArrayBufferView(new Int8Array()); // true + * util.types.isArrayBufferView(Buffer.from('hello world')); // true + * util.types.isArrayBufferView(new DataView(new ArrayBuffer(16))); // true + * util.types.isArrayBufferView(new ArrayBuffer()); // false + * ``` + * @since v10.0.0 + */ + function isArrayBufferView(object: unknown): object is NodeJS.ArrayBufferView; + /** + * Returns `true` if the value is an [async function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function). + * This only reports back what the JavaScript engine is seeing; + * in particular, the return value may not match the original source code if + * a transpilation tool was used. + * + * ```js + * util.types.isAsyncFunction(function foo() {}); // Returns false + * util.types.isAsyncFunction(async function foo() {}); // Returns true + * ``` + * @since v10.0.0 + */ + function isAsyncFunction(object: unknown): boolean; + /** + * Returns `true` if the value is a `BigInt64Array` instance. + * + * ```js + * util.types.isBigInt64Array(new BigInt64Array()); // Returns true + * util.types.isBigInt64Array(new BigUint64Array()); // Returns false + * ``` + * @since v10.0.0 + */ + function isBigInt64Array(value: unknown): value is BigInt64Array; + /** + * Returns `true` if the value is a `BigUint64Array` instance. + * + * ```js + * util.types.isBigUint64Array(new BigInt64Array()); // Returns false + * util.types.isBigUint64Array(new BigUint64Array()); // Returns true + * ``` + * @since v10.0.0 + */ + function isBigUint64Array(value: unknown): value is BigUint64Array; + /** + * Returns `true` if the value is a boolean object, e.g. created + * by `new Boolean()`. + * + * ```js + * util.types.isBooleanObject(false); // Returns false + * util.types.isBooleanObject(true); // Returns false + * util.types.isBooleanObject(new Boolean(false)); // Returns true + * util.types.isBooleanObject(new Boolean(true)); // Returns true + * util.types.isBooleanObject(Boolean(false)); // Returns false + * util.types.isBooleanObject(Boolean(true)); // Returns false + * ``` + * @since v10.0.0 + */ + function isBooleanObject(object: unknown): object is Boolean; + /** + * Returns `true` if the value is any boxed primitive object, e.g. created + * by `new Boolean()`, `new String()` or `Object(Symbol())`. + * + * For example: + * + * ```js + * util.types.isBoxedPrimitive(false); // Returns false + * util.types.isBoxedPrimitive(new Boolean(false)); // Returns true + * util.types.isBoxedPrimitive(Symbol('foo')); // Returns false + * util.types.isBoxedPrimitive(Object(Symbol('foo'))); // Returns true + * util.types.isBoxedPrimitive(Object(BigInt(5))); // Returns true + * ``` + * @since v10.11.0 + */ + function isBoxedPrimitive(object: unknown): object is String | Number | BigInt | Boolean | Symbol; + /** + * Returns `true` if the value is a built-in [`DataView`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView) instance. + * + * ```js + * const ab = new ArrayBuffer(20); + * util.types.isDataView(new DataView(ab)); // Returns true + * util.types.isDataView(new Float64Array()); // Returns false + * ``` + * + * See also [`ArrayBuffer.isView()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer/isView). + * @since v10.0.0 + */ + function isDataView(object: unknown): object is DataView; + /** + * Returns `true` if the value is a built-in [`Date`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date) instance. + * + * ```js + * util.types.isDate(new Date()); // Returns true + * ``` + * @since v10.0.0 + */ + function isDate(object: unknown): object is Date; + /** + * Returns `true` if the value is a native `External` value. + * + * A native `External` value is a special type of object that contains a + * raw C++ pointer (`void*`) for access from native code, and has no other + * properties. Such objects are created either by Node.js internals or native + * addons. In JavaScript, they are [frozen](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze) objects with a`null` prototype. + * + * ```c + * #include + * #include + * napi_value result; + * static napi_value MyNapi(napi_env env, napi_callback_info info) { + * int* raw = (int*) malloc(1024); + * napi_status status = napi_create_external(env, (void*) raw, NULL, NULL, &result); + * if (status != napi_ok) { + * napi_throw_error(env, NULL, "napi_create_external failed"); + * return NULL; + * } + * return result; + * } + * ... + * DECLARE_NAPI_PROPERTY("myNapi", MyNapi) + * ... + * ``` + * + * ```js + * const native = require('napi_addon.node'); + * const data = native.myNapi(); + * util.types.isExternal(data); // returns true + * util.types.isExternal(0); // returns false + * util.types.isExternal(new String('foo')); // returns false + * ``` + * + * For further information on `napi_create_external`, refer to `napi_create_external()`. + * @since v10.0.0 + */ + function isExternal(object: unknown): boolean; + /** + * Returns `true` if the value is a built-in [`Float32Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Float32Array) instance. + * + * ```js + * util.types.isFloat32Array(new ArrayBuffer()); // Returns false + * util.types.isFloat32Array(new Float32Array()); // Returns true + * util.types.isFloat32Array(new Float64Array()); // Returns false + * ``` + * @since v10.0.0 + */ + function isFloat32Array(object: unknown): object is Float32Array; + /** + * Returns `true` if the value is a built-in [`Float64Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Float64Array) instance. + * + * ```js + * util.types.isFloat64Array(new ArrayBuffer()); // Returns false + * util.types.isFloat64Array(new Uint8Array()); // Returns false + * util.types.isFloat64Array(new Float64Array()); // Returns true + * ``` + * @since v10.0.0 + */ + function isFloat64Array(object: unknown): object is Float64Array; + /** + * Returns `true` if the value is a generator function. + * This only reports back what the JavaScript engine is seeing; + * in particular, the return value may not match the original source code if + * a transpilation tool was used. + * + * ```js + * util.types.isGeneratorFunction(function foo() {}); // Returns false + * util.types.isGeneratorFunction(function* foo() {}); // Returns true + * ``` + * @since v10.0.0 + */ + function isGeneratorFunction(object: unknown): object is GeneratorFunction; + /** + * Returns `true` if the value is a generator object as returned from a + * built-in generator function. + * This only reports back what the JavaScript engine is seeing; + * in particular, the return value may not match the original source code if + * a transpilation tool was used. + * + * ```js + * function* foo() {} + * const generator = foo(); + * util.types.isGeneratorObject(generator); // Returns true + * ``` + * @since v10.0.0 + */ + function isGeneratorObject(object: unknown): object is Generator; + /** + * Returns `true` if the value is a built-in [`Int8Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int8Array) instance. + * + * ```js + * util.types.isInt8Array(new ArrayBuffer()); // Returns false + * util.types.isInt8Array(new Int8Array()); // Returns true + * util.types.isInt8Array(new Float64Array()); // Returns false + * ``` + * @since v10.0.0 + */ + function isInt8Array(object: unknown): object is Int8Array; + /** + * Returns `true` if the value is a built-in [`Int16Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int16Array) instance. + * + * ```js + * util.types.isInt16Array(new ArrayBuffer()); // Returns false + * util.types.isInt16Array(new Int16Array()); // Returns true + * util.types.isInt16Array(new Float64Array()); // Returns false + * ``` + * @since v10.0.0 + */ + function isInt16Array(object: unknown): object is Int16Array; + /** + * Returns `true` if the value is a built-in [`Int32Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int32Array) instance. + * + * ```js + * util.types.isInt32Array(new ArrayBuffer()); // Returns false + * util.types.isInt32Array(new Int32Array()); // Returns true + * util.types.isInt32Array(new Float64Array()); // Returns false + * ``` + * @since v10.0.0 + */ + function isInt32Array(object: unknown): object is Int32Array; + /** + * Returns `true` if the value is a built-in [`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) instance. + * + * ```js + * util.types.isMap(new Map()); // Returns true + * ``` + * @since v10.0.0 + */ + function isMap( + object: T | {}, + ): object is T extends ReadonlyMap ? (unknown extends T ? never : ReadonlyMap) + : Map; + /** + * Returns `true` if the value is an iterator returned for a built-in [`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) instance. + * + * ```js + * const map = new Map(); + * util.types.isMapIterator(map.keys()); // Returns true + * util.types.isMapIterator(map.values()); // Returns true + * util.types.isMapIterator(map.entries()); // Returns true + * util.types.isMapIterator(map[Symbol.iterator]()); // Returns true + * ``` + * @since v10.0.0 + */ + function isMapIterator(object: unknown): boolean; + /** + * Returns `true` if the value is an instance of a [Module Namespace Object](https://tc39.github.io/ecma262/#sec-module-namespace-exotic-objects). + * + * ```js + * import * as ns from './a.js'; + * + * util.types.isModuleNamespaceObject(ns); // Returns true + * ``` + * @since v10.0.0 + */ + function isModuleNamespaceObject(value: unknown): boolean; + /** + * Returns `true` if the value was returned by the constructor of a [built-in `Error` type](https://tc39.es/ecma262/#sec-error-objects). + * + * ```js + * console.log(util.types.isNativeError(new Error())); // true + * console.log(util.types.isNativeError(new TypeError())); // true + * console.log(util.types.isNativeError(new RangeError())); // true + * ``` + * + * Subclasses of the native error types are also native errors: + * + * ```js + * class MyError extends Error {} + * console.log(util.types.isNativeError(new MyError())); // true + * ``` + * + * A value being `instanceof` a native error class is not equivalent to `isNativeError()`returning `true` for that value. `isNativeError()` returns `true` for errors + * which come from a different [realm](https://tc39.es/ecma262/#realm) while `instanceof Error` returns `false`for these errors: + * + * ```js + * const vm = require('node:vm'); + * const context = vm.createContext({}); + * const myError = vm.runInContext('new Error()', context); + * console.log(util.types.isNativeError(myError)); // true + * console.log(myError instanceof Error); // false + * ``` + * + * Conversely, `isNativeError()` returns `false` for all objects which were not + * returned by the constructor of a native error. That includes values + * which are `instanceof` native errors: + * + * ```js + * const myError = { __proto__: Error.prototype }; + * console.log(util.types.isNativeError(myError)); // false + * console.log(myError instanceof Error); // true + * ``` + * @since v10.0.0 + */ + function isNativeError(object: unknown): object is Error; + /** + * Returns `true` if the value is a number object, e.g. created + * by `new Number()`. + * + * ```js + * util.types.isNumberObject(0); // Returns false + * util.types.isNumberObject(new Number(0)); // Returns true + * ``` + * @since v10.0.0 + */ + function isNumberObject(object: unknown): object is Number; + /** + * Returns `true` if the value is a built-in [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). + * + * ```js + * util.types.isPromise(Promise.resolve(42)); // Returns true + * ``` + * @since v10.0.0 + */ + function isPromise(object: unknown): object is Promise; + /** + * Returns `true` if the value is a [`Proxy`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy) instance. + * + * ```js + * const target = {}; + * const proxy = new Proxy(target, {}); + * util.types.isProxy(target); // Returns false + * util.types.isProxy(proxy); // Returns true + * ``` + * @since v10.0.0 + */ + function isProxy(object: unknown): boolean; + /** + * Returns `true` if the value is a regular expression object. + * + * ```js + * util.types.isRegExp(/abc/); // Returns true + * util.types.isRegExp(new RegExp('abc')); // Returns true + * ``` + * @since v10.0.0 + */ + function isRegExp(object: unknown): object is RegExp; + /** + * Returns `true` if the value is a built-in [`Set`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set) instance. + * + * ```js + * util.types.isSet(new Set()); // Returns true + * ``` + * @since v10.0.0 + */ + function isSet( + object: T | {}, + ): object is T extends ReadonlySet ? (unknown extends T ? never : ReadonlySet) : Set; + /** + * Returns `true` if the value is an iterator returned for a built-in [`Set`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set) instance. + * + * ```js + * const set = new Set(); + * util.types.isSetIterator(set.keys()); // Returns true + * util.types.isSetIterator(set.values()); // Returns true + * util.types.isSetIterator(set.entries()); // Returns true + * util.types.isSetIterator(set[Symbol.iterator]()); // Returns true + * ``` + * @since v10.0.0 + */ + function isSetIterator(object: unknown): boolean; + /** + * Returns `true` if the value is a built-in [`SharedArrayBuffer`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer) instance. + * This does _not_ include [`ArrayBuffer`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer) instances. Usually, it is + * desirable to test for both; See `util.types.isAnyArrayBuffer()` for that. + * + * ```js + * util.types.isSharedArrayBuffer(new ArrayBuffer()); // Returns false + * util.types.isSharedArrayBuffer(new SharedArrayBuffer()); // Returns true + * ``` + * @since v10.0.0 + */ + function isSharedArrayBuffer(object: unknown): object is SharedArrayBuffer; + /** + * Returns `true` if the value is a string object, e.g. created + * by `new String()`. + * + * ```js + * util.types.isStringObject('foo'); // Returns false + * util.types.isStringObject(new String('foo')); // Returns true + * ``` + * @since v10.0.0 + */ + function isStringObject(object: unknown): object is String; + /** + * Returns `true` if the value is a symbol object, created + * by calling `Object()` on a `Symbol` primitive. + * + * ```js + * const symbol = Symbol('foo'); + * util.types.isSymbolObject(symbol); // Returns false + * util.types.isSymbolObject(Object(symbol)); // Returns true + * ``` + * @since v10.0.0 + */ + function isSymbolObject(object: unknown): object is Symbol; + /** + * Returns `true` if the value is a built-in [`TypedArray`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray) instance. + * + * ```js + * util.types.isTypedArray(new ArrayBuffer()); // Returns false + * util.types.isTypedArray(new Uint8Array()); // Returns true + * util.types.isTypedArray(new Float64Array()); // Returns true + * ``` + * + * See also [`ArrayBuffer.isView()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer/isView). + * @since v10.0.0 + */ + function isTypedArray(object: unknown): object is NodeJS.TypedArray; + /** + * Returns `true` if the value is a built-in [`Uint8Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array) instance. + * + * ```js + * util.types.isUint8Array(new ArrayBuffer()); // Returns false + * util.types.isUint8Array(new Uint8Array()); // Returns true + * util.types.isUint8Array(new Float64Array()); // Returns false + * ``` + * @since v10.0.0 + */ + function isUint8Array(object: unknown): object is Uint8Array; + /** + * Returns `true` if the value is a built-in [`Uint8ClampedArray`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8ClampedArray) instance. + * + * ```js + * util.types.isUint8ClampedArray(new ArrayBuffer()); // Returns false + * util.types.isUint8ClampedArray(new Uint8ClampedArray()); // Returns true + * util.types.isUint8ClampedArray(new Float64Array()); // Returns false + * ``` + * @since v10.0.0 + */ + function isUint8ClampedArray(object: unknown): object is Uint8ClampedArray; + /** + * Returns `true` if the value is a built-in [`Uint16Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint16Array) instance. + * + * ```js + * util.types.isUint16Array(new ArrayBuffer()); // Returns false + * util.types.isUint16Array(new Uint16Array()); // Returns true + * util.types.isUint16Array(new Float64Array()); // Returns false + * ``` + * @since v10.0.0 + */ + function isUint16Array(object: unknown): object is Uint16Array; + /** + * Returns `true` if the value is a built-in [`Uint32Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint32Array) instance. + * + * ```js + * util.types.isUint32Array(new ArrayBuffer()); // Returns false + * util.types.isUint32Array(new Uint32Array()); // Returns true + * util.types.isUint32Array(new Float64Array()); // Returns false + * ``` + * @since v10.0.0 + */ + function isUint32Array(object: unknown): object is Uint32Array; + /** + * Returns `true` if the value is a built-in [`WeakMap`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap) instance. + * + * ```js + * util.types.isWeakMap(new WeakMap()); // Returns true + * ``` + * @since v10.0.0 + */ + function isWeakMap(object: unknown): object is WeakMap; + /** + * Returns `true` if the value is a built-in [`WeakSet`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet) instance. + * + * ```js + * util.types.isWeakSet(new WeakSet()); // Returns true + * ``` + * @since v10.0.0 + */ + function isWeakSet(object: unknown): object is WeakSet; + /** + * Returns `true` if `value` is a `KeyObject`, `false` otherwise. + * @since v16.2.0 + */ + function isKeyObject(object: unknown): object is KeyObject; + /** + * Returns `true` if `value` is a `CryptoKey`, `false` otherwise. + * @since v16.2.0 + */ + function isCryptoKey(object: unknown): object is webcrypto.CryptoKey; +} +declare module "node:util" { + export * from "util"; +} +declare module "node:util/types" { + export * from "util/types"; +} diff --git a/task/node_modules/@types/node/ts4.8/v8.d.ts b/task/node_modules/@types/node/ts4.8/v8.d.ts new file mode 100644 index 0000000..6790e76 --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/v8.d.ts @@ -0,0 +1,635 @@ +/** + * The `node:v8` module exposes APIs that are specific to the version of [V8](https://developers.google.com/v8/) built into the Node.js binary. It can be accessed using: + * + * ```js + * const v8 = require('node:v8'); + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/v8.js) + */ +declare module "v8" { + import { Readable } from "node:stream"; + interface HeapSpaceInfo { + space_name: string; + space_size: number; + space_used_size: number; + space_available_size: number; + physical_space_size: number; + } + // ** Signifies if the --zap_code_space option is enabled or not. 1 == enabled, 0 == disabled. */ + type DoesZapCodeSpaceFlag = 0 | 1; + interface HeapInfo { + total_heap_size: number; + total_heap_size_executable: number; + total_physical_size: number; + total_available_size: number; + used_heap_size: number; + heap_size_limit: number; + malloced_memory: number; + peak_malloced_memory: number; + does_zap_garbage: DoesZapCodeSpaceFlag; + number_of_native_contexts: number; + number_of_detached_contexts: number; + total_global_handles_size: number; + used_global_handles_size: number; + external_memory: number; + } + interface HeapCodeStatistics { + code_and_metadata_size: number; + bytecode_and_metadata_size: number; + external_script_source_size: number; + } + /** + * Returns an integer representing a version tag derived from the V8 version, + * command-line flags, and detected CPU features. This is useful for determining + * whether a `vm.Script` `cachedData` buffer is compatible with this instance + * of V8. + * + * ```js + * console.log(v8.cachedDataVersionTag()); // 3947234607 + * // The value returned by v8.cachedDataVersionTag() is derived from the V8 + * // version, command-line flags, and detected CPU features. Test that the value + * // does indeed update when flags are toggled. + * v8.setFlagsFromString('--allow_natives_syntax'); + * console.log(v8.cachedDataVersionTag()); // 183726201 + * ``` + * @since v8.0.0 + */ + function cachedDataVersionTag(): number; + /** + * Returns an object with the following properties: + * + * `does_zap_garbage` is a 0/1 boolean, which signifies whether the`--zap_code_space` option is enabled or not. This makes V8 overwrite heap + * garbage with a bit pattern. The RSS footprint (resident set size) gets bigger + * because it continuously touches all heap pages and that makes them less likely + * to get swapped out by the operating system. + * + * `number_of_native_contexts` The value of native\_context is the number of the + * top-level contexts currently active. Increase of this number over time indicates + * a memory leak. + * + * `number_of_detached_contexts` The value of detached\_context is the number + * of contexts that were detached and not yet garbage collected. This number + * being non-zero indicates a potential memory leak. + * + * `total_global_handles_size` The value of total\_global\_handles\_size is the + * total memory size of V8 global handles. + * + * `used_global_handles_size` The value of used\_global\_handles\_size is the + * used memory size of V8 global handles. + * + * `external_memory` The value of external\_memory is the memory size of array + * buffers and external strings. + * + * ```js + * { + * total_heap_size: 7326976, + * total_heap_size_executable: 4194304, + * total_physical_size: 7326976, + * total_available_size: 1152656, + * used_heap_size: 3476208, + * heap_size_limit: 1535115264, + * malloced_memory: 16384, + * peak_malloced_memory: 1127496, + * does_zap_garbage: 0, + * number_of_native_contexts: 1, + * number_of_detached_contexts: 0, + * total_global_handles_size: 8192, + * used_global_handles_size: 3296, + * external_memory: 318824 + * } + * ``` + * @since v1.0.0 + */ + function getHeapStatistics(): HeapInfo; + /** + * Returns statistics about the V8 heap spaces, i.e. the segments which make up + * the V8 heap. Neither the ordering of heap spaces, nor the availability of a + * heap space can be guaranteed as the statistics are provided via the + * V8[`GetHeapSpaceStatistics`](https://v8docs.nodesource.com/node-13.2/d5/dda/classv8_1_1_isolate.html#ac673576f24fdc7a33378f8f57e1d13a4) function and may change from one V8 version to the + * next. + * + * The value returned is an array of objects containing the following properties: + * + * ```json + * [ + * { + * "space_name": "new_space", + * "space_size": 2063872, + * "space_used_size": 951112, + * "space_available_size": 80824, + * "physical_space_size": 2063872 + * }, + * { + * "space_name": "old_space", + * "space_size": 3090560, + * "space_used_size": 2493792, + * "space_available_size": 0, + * "physical_space_size": 3090560 + * }, + * { + * "space_name": "code_space", + * "space_size": 1260160, + * "space_used_size": 644256, + * "space_available_size": 960, + * "physical_space_size": 1260160 + * }, + * { + * "space_name": "map_space", + * "space_size": 1094160, + * "space_used_size": 201608, + * "space_available_size": 0, + * "physical_space_size": 1094160 + * }, + * { + * "space_name": "large_object_space", + * "space_size": 0, + * "space_used_size": 0, + * "space_available_size": 1490980608, + * "physical_space_size": 0 + * } + * ] + * ``` + * @since v6.0.0 + */ + function getHeapSpaceStatistics(): HeapSpaceInfo[]; + /** + * The `v8.setFlagsFromString()` method can be used to programmatically set + * V8 command-line flags. This method should be used with care. Changing settings + * after the VM has started may result in unpredictable behavior, including + * crashes and data loss; or it may simply do nothing. + * + * The V8 options available for a version of Node.js may be determined by running`node --v8-options`. + * + * Usage: + * + * ```js + * // Print GC events to stdout for one minute. + * const v8 = require('node:v8'); + * v8.setFlagsFromString('--trace_gc'); + * setTimeout(() => { v8.setFlagsFromString('--notrace_gc'); }, 60e3); + * ``` + * @since v1.0.0 + */ + function setFlagsFromString(flags: string): void; + /** + * Generates a snapshot of the current V8 heap and returns a Readable + * Stream that may be used to read the JSON serialized representation. + * This JSON stream format is intended to be used with tools such as + * Chrome DevTools. The JSON schema is undocumented and specific to the + * V8 engine. Therefore, the schema may change from one version of V8 to the next. + * + * Creating a heap snapshot requires memory about twice the size of the heap at + * the time the snapshot is created. This results in the risk of OOM killers + * terminating the process. + * + * Generating a snapshot is a synchronous operation which blocks the event loop + * for a duration depending on the heap size. + * + * ```js + * // Print heap snapshot to the console + * const v8 = require('node:v8'); + * const stream = v8.getHeapSnapshot(); + * stream.pipe(process.stdout); + * ``` + * @since v11.13.0 + * @return A Readable containing the V8 heap snapshot. + */ + function getHeapSnapshot(): Readable; + /** + * Generates a snapshot of the current V8 heap and writes it to a JSON + * file. This file is intended to be used with tools such as Chrome + * DevTools. The JSON schema is undocumented and specific to the V8 + * engine, and may change from one version of V8 to the next. + * + * A heap snapshot is specific to a single V8 isolate. When using `worker threads`, a heap snapshot generated from the main thread will + * not contain any information about the workers, and vice versa. + * + * Creating a heap snapshot requires memory about twice the size of the heap at + * the time the snapshot is created. This results in the risk of OOM killers + * terminating the process. + * + * Generating a snapshot is a synchronous operation which blocks the event loop + * for a duration depending on the heap size. + * + * ```js + * const { writeHeapSnapshot } = require('node:v8'); + * const { + * Worker, + * isMainThread, + * parentPort, + * } = require('node:worker_threads'); + * + * if (isMainThread) { + * const worker = new Worker(__filename); + * + * worker.once('message', (filename) => { + * console.log(`worker heapdump: ${filename}`); + * // Now get a heapdump for the main thread. + * console.log(`main thread heapdump: ${writeHeapSnapshot()}`); + * }); + * + * // Tell the worker to create a heapdump. + * worker.postMessage('heapdump'); + * } else { + * parentPort.once('message', (message) => { + * if (message === 'heapdump') { + * // Generate a heapdump for the worker + * // and return the filename to the parent. + * parentPort.postMessage(writeHeapSnapshot()); + * } + * }); + * } + * ``` + * @since v11.13.0 + * @param filename The file path where the V8 heap snapshot is to be saved. If not specified, a file name with the pattern `'Heap-${yyyymmdd}-${hhmmss}-${pid}-${thread_id}.heapsnapshot'` will be + * generated, where `{pid}` will be the PID of the Node.js process, `{thread_id}` will be `0` when `writeHeapSnapshot()` is called from the main Node.js thread or the id of a + * worker thread. + * @return The filename where the snapshot was saved. + */ + function writeHeapSnapshot(filename?: string): string; + /** + * Get statistics about code and its metadata in the heap, see + * V8[`GetHeapCodeAndMetadataStatistics`](https://v8docs.nodesource.com/node-13.2/d5/dda/classv8_1_1_isolate.html#a6079122af17612ef54ef3348ce170866) API. Returns an object with the + * following properties: + * + * ```js + * { + * code_and_metadata_size: 212208, + * bytecode_and_metadata_size: 161368, + * external_script_source_size: 1410794, + * cpu_profiler_metadata_size: 0, + * } + * ``` + * @since v12.8.0 + */ + function getHeapCodeStatistics(): HeapCodeStatistics; + /** + * @since v8.0.0 + */ + class Serializer { + /** + * Writes out a header, which includes the serialization format version. + */ + writeHeader(): void; + /** + * Serializes a JavaScript value and adds the serialized representation to the + * internal buffer. + * + * This throws an error if `value` cannot be serialized. + */ + writeValue(val: any): boolean; + /** + * Returns the stored internal buffer. This serializer should not be used once + * the buffer is released. Calling this method results in undefined behavior + * if a previous write has failed. + */ + releaseBuffer(): Buffer; + /** + * Marks an `ArrayBuffer` as having its contents transferred out of band. + * Pass the corresponding `ArrayBuffer` in the deserializing context to `deserializer.transferArrayBuffer()`. + * @param id A 32-bit unsigned integer. + * @param arrayBuffer An `ArrayBuffer` instance. + */ + transferArrayBuffer(id: number, arrayBuffer: ArrayBuffer): void; + /** + * Write a raw 32-bit unsigned integer. + * For use inside of a custom `serializer._writeHostObject()`. + */ + writeUint32(value: number): void; + /** + * Write a raw 64-bit unsigned integer, split into high and low 32-bit parts. + * For use inside of a custom `serializer._writeHostObject()`. + */ + writeUint64(hi: number, lo: number): void; + /** + * Write a JS `number` value. + * For use inside of a custom `serializer._writeHostObject()`. + */ + writeDouble(value: number): void; + /** + * Write raw bytes into the serializer's internal buffer. The deserializer + * will require a way to compute the length of the buffer. + * For use inside of a custom `serializer._writeHostObject()`. + */ + writeRawBytes(buffer: NodeJS.TypedArray): void; + } + /** + * A subclass of `Serializer` that serializes `TypedArray`(in particular `Buffer`) and `DataView` objects as host objects, and only + * stores the part of their underlying `ArrayBuffer`s that they are referring to. + * @since v8.0.0 + */ + class DefaultSerializer extends Serializer {} + /** + * @since v8.0.0 + */ + class Deserializer { + constructor(data: NodeJS.TypedArray); + /** + * Reads and validates a header (including the format version). + * May, for example, reject an invalid or unsupported wire format. In that case, + * an `Error` is thrown. + */ + readHeader(): boolean; + /** + * Deserializes a JavaScript value from the buffer and returns it. + */ + readValue(): any; + /** + * Marks an `ArrayBuffer` as having its contents transferred out of band. + * Pass the corresponding `ArrayBuffer` in the serializing context to `serializer.transferArrayBuffer()` (or return the `id` from `serializer._getSharedArrayBufferId()` in the case of + * `SharedArrayBuffer`s). + * @param id A 32-bit unsigned integer. + * @param arrayBuffer An `ArrayBuffer` instance. + */ + transferArrayBuffer(id: number, arrayBuffer: ArrayBuffer): void; + /** + * Reads the underlying wire format version. Likely mostly to be useful to + * legacy code reading old wire format versions. May not be called before`.readHeader()`. + */ + getWireFormatVersion(): number; + /** + * Read a raw 32-bit unsigned integer and return it. + * For use inside of a custom `deserializer._readHostObject()`. + */ + readUint32(): number; + /** + * Read a raw 64-bit unsigned integer and return it as an array `[hi, lo]`with two 32-bit unsigned integer entries. + * For use inside of a custom `deserializer._readHostObject()`. + */ + readUint64(): [number, number]; + /** + * Read a JS `number` value. + * For use inside of a custom `deserializer._readHostObject()`. + */ + readDouble(): number; + /** + * Read raw bytes from the deserializer's internal buffer. The `length` parameter + * must correspond to the length of the buffer that was passed to `serializer.writeRawBytes()`. + * For use inside of a custom `deserializer._readHostObject()`. + */ + readRawBytes(length: number): Buffer; + } + /** + * A subclass of `Deserializer` corresponding to the format written by `DefaultSerializer`. + * @since v8.0.0 + */ + class DefaultDeserializer extends Deserializer {} + /** + * Uses a `DefaultSerializer` to serialize `value` into a buffer. + * + * `ERR_BUFFER_TOO_LARGE` will be thrown when trying to + * serialize a huge object which requires buffer + * larger than `buffer.constants.MAX_LENGTH`. + * @since v8.0.0 + */ + function serialize(value: any): Buffer; + /** + * Uses a `DefaultDeserializer` with default options to read a JS value + * from a buffer. + * @since v8.0.0 + * @param buffer A buffer returned by {@link serialize}. + */ + function deserialize(buffer: NodeJS.TypedArray): any; + /** + * The `v8.takeCoverage()` method allows the user to write the coverage started by `NODE_V8_COVERAGE` to disk on demand. This method can be invoked multiple + * times during the lifetime of the process. Each time the execution counter will + * be reset and a new coverage report will be written to the directory specified + * by `NODE_V8_COVERAGE`. + * + * When the process is about to exit, one last coverage will still be written to + * disk unless {@link stopCoverage} is invoked before the process exits. + * @since v15.1.0, v14.18.0, v12.22.0 + */ + function takeCoverage(): void; + /** + * The `v8.stopCoverage()` method allows the user to stop the coverage collection + * started by `NODE_V8_COVERAGE`, so that V8 can release the execution count + * records and optimize code. This can be used in conjunction with {@link takeCoverage} if the user wants to collect the coverage on demand. + * @since v15.1.0, v14.18.0, v12.22.0 + */ + function stopCoverage(): void; + /** + * This API collects GC data in current thread. + * @since v19.6.0, v18.15.0 + */ + class GCProfiler { + /** + * Start collecting GC data. + * @since v19.6.0, v18.15.0 + */ + start(): void; + /** + * Stop collecting GC data and return an object.The content of object + * is as follows. + * + * ```json + * { + * "version": 1, + * "startTime": 1674059033862, + * "statistics": [ + * { + * "gcType": "Scavenge", + * "beforeGC": { + * "heapStatistics": { + * "totalHeapSize": 5005312, + * "totalHeapSizeExecutable": 524288, + * "totalPhysicalSize": 5226496, + * "totalAvailableSize": 4341325216, + * "totalGlobalHandlesSize": 8192, + * "usedGlobalHandlesSize": 2112, + * "usedHeapSize": 4883840, + * "heapSizeLimit": 4345298944, + * "mallocedMemory": 254128, + * "externalMemory": 225138, + * "peakMallocedMemory": 181760 + * }, + * "heapSpaceStatistics": [ + * { + * "spaceName": "read_only_space", + * "spaceSize": 0, + * "spaceUsedSize": 0, + * "spaceAvailableSize": 0, + * "physicalSpaceSize": 0 + * } + * ] + * }, + * "cost": 1574.14, + * "afterGC": { + * "heapStatistics": { + * "totalHeapSize": 6053888, + * "totalHeapSizeExecutable": 524288, + * "totalPhysicalSize": 5500928, + * "totalAvailableSize": 4341101384, + * "totalGlobalHandlesSize": 8192, + * "usedGlobalHandlesSize": 2112, + * "usedHeapSize": 4059096, + * "heapSizeLimit": 4345298944, + * "mallocedMemory": 254128, + * "externalMemory": 225138, + * "peakMallocedMemory": 181760 + * }, + * "heapSpaceStatistics": [ + * { + * "spaceName": "read_only_space", + * "spaceSize": 0, + * "spaceUsedSize": 0, + * "spaceAvailableSize": 0, + * "physicalSpaceSize": 0 + * } + * ] + * } + * } + * ], + * "endTime": 1674059036865 + * } + * ``` + * + * Here's an example. + * + * ```js + * const { GCProfiler } = require('v8'); + * const profiler = new GCProfiler(); + * profiler.start(); + * setTimeout(() => { + * console.log(profiler.stop()); + * }, 1000); + * ``` + * @since v19.6.0, v18.15.0 + */ + stop(): GCProfilerResult; + } + interface GCProfilerResult { + version: number; + startTime: number; + endTime: number; + statistics: Array<{ + gcType: string; + cost: number; + beforeGC: { + heapStatistics: HeapStatistics; + heapSpaceStatistics: HeapSpaceStatistics[]; + }; + afterGC: { + heapStatistics: HeapStatistics; + heapSpaceStatistics: HeapSpaceStatistics[]; + }; + }>; + } + interface HeapStatistics { + totalHeapSize: number; + totalHeapSizeExecutable: number; + totalPhysicalSize: number; + totalAvailableSize: number; + totalGlobalHandlesSize: number; + usedGlobalHandlesSize: number; + usedHeapSize: number; + heapSizeLimit: number; + mallocedMemory: number; + externalMemory: number; + peakMallocedMemory: number; + } + interface HeapSpaceStatistics { + spaceName: string; + spaceSize: number; + spaceUsedSize: number; + spaceAvailableSize: number; + physicalSpaceSize: number; + } + /** + * Called when a promise is constructed. This does not mean that corresponding before/after events will occur, only that the possibility exists. This will + * happen if a promise is created without ever getting a continuation. + * @since v17.1.0, v16.14.0 + * @param promise The promise being created. + * @param parent The promise continued from, if applicable. + */ + interface Init { + (promise: Promise, parent: Promise): void; + } + /** + * Called before a promise continuation executes. This can be in the form of `then()`, `catch()`, or `finally()` handlers or an await resuming. + * + * The before callback will be called 0 to N times. The before callback will typically be called 0 times if no continuation was ever made for the promise. + * The before callback may be called many times in the case where many continuations have been made from the same promise. + * @since v17.1.0, v16.14.0 + */ + interface Before { + (promise: Promise): void; + } + /** + * Called immediately after a promise continuation executes. This may be after a `then()`, `catch()`, or `finally()` handler or before an await after another await. + * @since v17.1.0, v16.14.0 + */ + interface After { + (promise: Promise): void; + } + /** + * Called when the promise receives a resolution or rejection value. This may occur synchronously in the case of {@link Promise.resolve()} or + * {@link Promise.reject()}. + * @since v17.1.0, v16.14.0 + */ + interface Settled { + (promise: Promise): void; + } + /** + * Key events in the lifetime of a promise have been categorized into four areas: creation of a promise, before/after a continuation handler is called or + * around an await, and when the promise resolves or rejects. + * + * Because promises are asynchronous resources whose lifecycle is tracked via the promise hooks mechanism, the `init()`, `before()`, `after()`, and + * `settled()` callbacks must not be async functions as they create more promises which would produce an infinite loop. + * @since v17.1.0, v16.14.0 + */ + interface HookCallbacks { + init?: Init; + before?: Before; + after?: After; + settled?: Settled; + } + interface PromiseHooks { + /** + * The `init` hook must be a plain function. Providing an async function will throw as it would produce an infinite microtask loop. + * @since v17.1.0, v16.14.0 + * @param init The {@link Init | `init` callback} to call when a promise is created. + * @return Call to stop the hook. + */ + onInit: (init: Init) => Function; + /** + * The `settled` hook must be a plain function. Providing an async function will throw as it would produce an infinite microtask loop. + * @since v17.1.0, v16.14.0 + * @param settled The {@link Settled | `settled` callback} to call when a promise is created. + * @return Call to stop the hook. + */ + onSettled: (settled: Settled) => Function; + /** + * The `before` hook must be a plain function. Providing an async function will throw as it would produce an infinite microtask loop. + * @since v17.1.0, v16.14.0 + * @param before The {@link Before | `before` callback} to call before a promise continuation executes. + * @return Call to stop the hook. + */ + onBefore: (before: Before) => Function; + /** + * The `after` hook must be a plain function. Providing an async function will throw as it would produce an infinite microtask loop. + * @since v17.1.0, v16.14.0 + * @param after The {@link After | `after` callback} to call after a promise continuation executes. + * @return Call to stop the hook. + */ + onAfter: (after: After) => Function; + /** + * Registers functions to be called for different lifetime events of each promise. + * The callbacks `init()`/`before()`/`after()`/`settled()` are called for the respective events during a promise's lifetime. + * All callbacks are optional. For example, if only promise creation needs to be tracked, then only the init callback needs to be passed. + * The hook callbacks must be plain functions. Providing async functions will throw as it would produce an infinite microtask loop. + * @since v17.1.0, v16.14.0 + * @param callbacks The {@link HookCallbacks | Hook Callbacks} to register + * @return Used for disabling hooks + */ + createHook: (callbacks: HookCallbacks) => Function; + } + /** + * The `promiseHooks` interface can be used to track promise lifecycle events. + * @since v17.1.0, v16.14.0 + */ + const promiseHooks: PromiseHooks; +} +declare module "node:v8" { + export * from "v8"; +} diff --git a/task/node_modules/@types/node/ts4.8/vm.d.ts b/task/node_modules/@types/node/ts4.8/vm.d.ts new file mode 100644 index 0000000..3a310cc --- /dev/null +++ b/task/node_modules/@types/node/ts4.8/vm.d.ts @@ -0,0 +1,903 @@ +/** + * The `node:vm` module enables compiling and running code within V8 Virtual + * Machine contexts. + * + * **The `node:vm` module is not a security** + * **mechanism. Do not use it to run untrusted code.** + * + * JavaScript code can be compiled and run immediately or + * compiled, saved, and run later. + * + * A common use case is to run the code in a different V8 Context. This means + * invoked code has a different global object than the invoking code. + * + * One can provide the context by `contextifying` an + * object. The invoked code treats any property in the context like a + * global variable. Any changes to global variables caused by the invoked + * code are reflected in the context object. + * + * ```js + * const vm = require('node:vm'); + * + * const x = 1; + * + * const context = { x: 2 }; + * vm.createContext(context); // Contextify the object. + * + * const code = 'x += 40; var y = 17;'; + * // `x` and `y` are global variables in the context. + * // Initially, x has the value 2 because that is the value of context.x. + * vm.runInContext(code, context); + * + * console.log(context.x); // 42 + * console.log(context.y); // 17 + * + * console.log(x); // 1; y is not defined. + * ``` + * @see [source](https://github.com/nodejs/node/blob/v20.2.0/lib/vm.js) + */ +declare module "vm" { + import { ImportAttributes } from "node:module"; + interface Context extends NodeJS.Dict {} + interface BaseOptions { + /** + * Specifies the filename used in stack traces produced by this script. + * Default: `''`. + */ + filename?: string | undefined; + /** + * Specifies the line number offset that is displayed in stack traces produced by this script. + * Default: `0`. + */ + lineOffset?: number | undefined; + /** + * Specifies the column number offset that is displayed in stack traces produced by this script. + * @default 0 + */ + columnOffset?: number | undefined; + } + interface ScriptOptions extends BaseOptions { + /** + * V8's code cache data for the supplied source. + */ + cachedData?: Buffer | NodeJS.ArrayBufferView | undefined; + /** @deprecated in favor of `script.createCachedData()` */ + produceCachedData?: boolean | undefined; + /** + * Called during evaluation of this module when `import()` is called. + * If this option is not specified, calls to `import()` will reject with `ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING`. + */ + importModuleDynamically?: + | ((specifier: string, script: Script, importAttributes: ImportAttributes) => Module) + | undefined; + } + interface RunningScriptOptions extends BaseOptions { + /** + * When `true`, if an `Error` occurs while compiling the `code`, the line of code causing the error is attached to the stack trace. + * Default: `true`. + */ + displayErrors?: boolean | undefined; + /** + * Specifies the number of milliseconds to execute code before terminating execution. + * If execution is terminated, an `Error` will be thrown. This value must be a strictly positive integer. + */ + timeout?: number | undefined; + /** + * If `true`, the execution will be terminated when `SIGINT` (Ctrl+C) is received. + * Existing handlers for the event that have been attached via `process.on('SIGINT')` will be disabled during script execution, but will continue to work after that. + * If execution is terminated, an `Error` will be thrown. + * Default: `false`. + */ + breakOnSigint?: boolean | undefined; + } + interface RunningScriptInNewContextOptions extends RunningScriptOptions { + /** + * Human-readable name of the newly created context. + */ + contextName?: CreateContextOptions["name"]; + /** + * Origin corresponding to the newly created context for display purposes. The origin should be formatted like a URL, + * but with only the scheme, host, and port (if necessary), like the value of the `url.origin` property of a `URL` object. + * Most notably, this string should omit the trailing slash, as that denotes a path. + */ + contextOrigin?: CreateContextOptions["origin"]; + contextCodeGeneration?: CreateContextOptions["codeGeneration"]; + /** + * If set to `afterEvaluate`, microtasks will be run immediately after the script has run. + */ + microtaskMode?: CreateContextOptions["microtaskMode"]; + } + interface RunningCodeOptions extends RunningScriptOptions { + cachedData?: ScriptOptions["cachedData"]; + importModuleDynamically?: ScriptOptions["importModuleDynamically"]; + } + interface RunningCodeInNewContextOptions extends RunningScriptInNewContextOptions { + cachedData?: ScriptOptions["cachedData"]; + importModuleDynamically?: ScriptOptions["importModuleDynamically"]; + } + interface CompileFunctionOptions extends BaseOptions { + /** + * Provides an optional data with V8's code cache data for the supplied source. + */ + cachedData?: Buffer | undefined; + /** + * Specifies whether to produce new cache data. + * Default: `false`, + */ + produceCachedData?: boolean | undefined; + /** + * The sandbox/context in which the said function should be compiled in. + */ + parsingContext?: Context | undefined; + /** + * An array containing a collection of context extensions (objects wrapping the current scope) to be applied while compiling + */ + contextExtensions?: Object[] | undefined; + } + interface CreateContextOptions { + /** + * Human-readable name of the newly created context. + * @default 'VM Context i' Where i is an ascending numerical index of the created context. + */ + name?: string | undefined; + /** + * Corresponds to the newly created context for display purposes. + * The origin should be formatted like a `URL`, but with only the scheme, host, and port (if necessary), + * like the value of the `url.origin` property of a URL object. + * Most notably, this string should omit the trailing slash, as that denotes a path. + * @default '' + */ + origin?: string | undefined; + codeGeneration?: + | { + /** + * If set to false any calls to eval or function constructors (Function, GeneratorFunction, etc) + * will throw an EvalError. + * @default true + */ + strings?: boolean | undefined; + /** + * If set to false any attempt to compile a WebAssembly module will throw a WebAssembly.CompileError. + * @default true + */ + wasm?: boolean | undefined; + } + | undefined; + /** + * If set to `afterEvaluate`, microtasks will be run immediately after the script has run. + */ + microtaskMode?: "afterEvaluate" | undefined; + } + type MeasureMemoryMode = "summary" | "detailed"; + interface MeasureMemoryOptions { + /** + * @default 'summary' + */ + mode?: MeasureMemoryMode | undefined; + /** + * @default 'default' + */ + execution?: "default" | "eager" | undefined; + } + interface MemoryMeasurement { + total: { + jsMemoryEstimate: number; + jsMemoryRange: [number, number]; + }; + } + /** + * Instances of the `vm.Script` class contain precompiled scripts that can be + * executed in specific contexts. + * @since v0.3.1 + */ + class Script { + constructor(code: string, options?: ScriptOptions | string); + /** + * Runs the compiled code contained by the `vm.Script` object within the given`contextifiedObject` and returns the result. Running code does not have access + * to local scope. + * + * The following example compiles code that increments a global variable, sets + * the value of another global variable, then execute the code multiple times. + * The globals are contained in the `context` object. + * + * ```js + * const vm = require('node:vm'); + * + * const context = { + * animal: 'cat', + * count: 2, + * }; + * + * const script = new vm.Script('count += 1; name = "kitty";'); + * + * vm.createContext(context); + * for (let i = 0; i < 10; ++i) { + * script.runInContext(context); + * } + * + * console.log(context); + * // Prints: { animal: 'cat', count: 12, name: 'kitty' } + * ``` + * + * Using the `timeout` or `breakOnSigint` options will result in new event loops + * and corresponding threads being started, which have a non-zero performance + * overhead. + * @since v0.3.1 + * @param contextifiedObject A `contextified` object as returned by the `vm.createContext()` method. + * @return the result of the very last statement executed in the script. + */ + runInContext(contextifiedObject: Context, options?: RunningScriptOptions): any; + /** + * First contextifies the given `contextObject`, runs the compiled code contained + * by the `vm.Script` object within the created context, and returns the result. + * Running code does not have access to local scope. + * + * The following example compiles code that sets a global variable, then executes + * the code multiple times in different contexts. The globals are set on and + * contained within each individual `context`. + * + * ```js + * const vm = require('node:vm'); + * + * const script = new vm.Script('globalVar = "set"'); + * + * const contexts = [{}, {}, {}]; + * contexts.forEach((context) => { + * script.runInNewContext(context); + * }); + * + * console.log(contexts); + * // Prints: [{ globalVar: 'set' }, { globalVar: 'set' }, { globalVar: 'set' }] + * ``` + * @since v0.3.1 + * @param contextObject An object that will be `contextified`. If `undefined`, a new object will be created. + * @return the result of the very last statement executed in the script. + */ + runInNewContext(contextObject?: Context, options?: RunningScriptInNewContextOptions): any; + /** + * Runs the compiled code contained by the `vm.Script` within the context of the + * current `global` object. Running code does not have access to local scope, but _does_ have access to the current `global` object. + * + * The following example compiles code that increments a `global` variable then + * executes that code multiple times: + * + * ```js + * const vm = require('node:vm'); + * + * global.globalVar = 0; + * + * const script = new vm.Script('globalVar += 1', { filename: 'myfile.vm' }); + * + * for (let i = 0; i < 1000; ++i) { + * script.runInThisContext(); + * } + * + * console.log(globalVar); + * + * // 1000 + * ``` + * @since v0.3.1 + * @return the result of the very last statement executed in the script. + */ + runInThisContext(options?: RunningScriptOptions): any; + /** + * Creates a code cache that can be used with the `Script` constructor's`cachedData` option. Returns a `Buffer`. This method may be called at any + * time and any number of times. + * + * The code cache of the `Script` doesn't contain any JavaScript observable + * states. The code cache is safe to be saved along side the script source and + * used to construct new `Script` instances multiple times. + * + * Functions in the `Script` source can be marked as lazily compiled and they are + * not compiled at construction of the `Script`. These functions are going to be + * compiled when they are invoked the first time. The code cache serializes the + * metadata that V8 currently knows about the `Script` that it can use to speed up + * future compilations. + * + * ```js + * const script = new vm.Script(` + * function add(a, b) { + * return a + b; + * } + * + * const x = add(1, 2); + * `); + * + * const cacheWithoutAdd = script.createCachedData(); + * // In `cacheWithoutAdd` the function `add()` is marked for full compilation + * // upon invocation. + * + * script.runInThisContext(); + * + * const cacheWithAdd = script.createCachedData(); + * // `cacheWithAdd` contains fully compiled function `add()`. + * ``` + * @since v10.6.0 + */ + createCachedData(): Buffer; + /** @deprecated in favor of `script.createCachedData()` */ + cachedDataProduced?: boolean | undefined; + /** + * When `cachedData` is supplied to create the `vm.Script`, this value will be set + * to either `true` or `false` depending on acceptance of the data by V8\. + * Otherwise the value is `undefined`. + * @since v5.7.0 + */ + cachedDataRejected?: boolean | undefined; + cachedData?: Buffer | undefined; + /** + * When the script is compiled from a source that contains a source map magic + * comment, this property will be set to the URL of the source map. + * + * ```js + * import vm from 'node:vm'; + * + * const script = new vm.Script(` + * function myFunc() {} + * //# sourceMappingURL=sourcemap.json + * `); + * + * console.log(script.sourceMapURL); + * // Prints: sourcemap.json + * ``` + * @since v19.1.0, v18.13.0 + */ + sourceMapURL?: string | undefined; + } + /** + * If given a `contextObject`, the `vm.createContext()` method will `prepare + * that object` so that it can be used in calls to {@link runInContext} or `script.runInContext()`. Inside such scripts, + * the `contextObject` will be the global object, retaining all of its existing + * properties but also having the built-in objects and functions any standard [global object](https://es5.github.io/#x15.1) has. Outside of scripts run by the vm module, global variables + * will remain unchanged. + * + * ```js + * const vm = require('node:vm'); + * + * global.globalVar = 3; + * + * const context = { globalVar: 1 }; + * vm.createContext(context); + * + * vm.runInContext('globalVar *= 2;', context); + * + * console.log(context); + * // Prints: { globalVar: 2 } + * + * console.log(global.globalVar); + * // Prints: 3 + * ``` + * + * If `contextObject` is omitted (or passed explicitly as `undefined`), a new, + * empty `contextified` object will be returned. + * + * The `vm.createContext()` method is primarily useful for creating a single + * context that can be used to run multiple scripts. For instance, if emulating a + * web browser, the method can be used to create a single context representing a + * window's global object, then run all ` +``` + +Using unpkg CDN: + +```html + +``` + +## Example + +> **Note**: CommonJS usage +> In order to gain the TypeScript typings (for intellisense / autocomplete) while using CommonJS imports with `require()`, use the following approach: + +```js +import axios from 'axios'; +//const axios = require('axios'); // legacy way + +// Make a request for a user with a given ID +axios.get('/user?ID=12345') + .then(function (response) { + // handle success + console.log(response); + }) + .catch(function (error) { + // handle error + console.log(error); + }) + .finally(function () { + // always executed + }); + +// Optionally the request above could also be done as +axios.get('/user', { + params: { + ID: 12345 + } + }) + .then(function (response) { + console.log(response); + }) + .catch(function (error) { + console.log(error); + }) + .finally(function () { + // always executed + }); + +// Want to use async/await? Add the `async` keyword to your outer function/method. +async function getUser() { + try { + const response = await axios.get('/user?ID=12345'); + console.log(response); + } catch (error) { + console.error(error); + } +} +``` + +> **Note**: `async/await` is part of ECMAScript 2017 and is not supported in Internet +> Explorer and older browsers, so use with caution. + +Performing a `POST` request + +```js +axios.post('/user', { + firstName: 'Fred', + lastName: 'Flintstone' + }) + .then(function (response) { + console.log(response); + }) + .catch(function (error) { + console.log(error); + }); +``` + +Performing multiple concurrent requests + +```js +function getUserAccount() { + return axios.get('/user/12345'); +} + +function getUserPermissions() { + return axios.get('/user/12345/permissions'); +} + +Promise.all([getUserAccount(), getUserPermissions()]) + .then(function (results) { + const acct = results[0]; + const perm = results[1]; + }); +``` + +## axios API + +Requests can be made by passing the relevant config to `axios`. + +##### axios(config) + +```js +// Send a POST request +axios({ + method: 'post', + url: '/user/12345', + data: { + firstName: 'Fred', + lastName: 'Flintstone' + } +}); +``` + +```js +// GET request for remote image in node.js +axios({ + method: 'get', + url: 'https://bit.ly/2mTM3nY', + responseType: 'stream' +}) + .then(function (response) { + response.data.pipe(fs.createWriteStream('ada_lovelace.jpg')) + }); +``` + +##### axios(url[, config]) + +```js +// Send a GET request (default method) +axios('/user/12345'); +``` + +### Request method aliases + +For convenience, aliases have been provided for all common request methods. + +##### axios.request(config) +##### axios.get(url[, config]) +##### axios.delete(url[, config]) +##### axios.head(url[, config]) +##### axios.options(url[, config]) +##### axios.post(url[, data[, config]]) +##### axios.put(url[, data[, config]]) +##### axios.patch(url[, data[, config]]) + +###### NOTE +When using the alias methods `url`, `method`, and `data` properties don't need to be specified in config. + +### Concurrency (Deprecated) +Please use `Promise.all` to replace the below functions. + +Helper functions for dealing with concurrent requests. + +axios.all(iterable) +axios.spread(callback) + +### Creating an instance + +You can create a new instance of axios with a custom config. + +##### axios.create([config]) + +```js +const instance = axios.create({ + baseURL: 'https://some-domain.com/api/', + timeout: 1000, + headers: {'X-Custom-Header': 'foobar'} +}); +``` + +### Instance methods + +The available instance methods are listed below. The specified config will be merged with the instance config. + +##### axios#request(config) +##### axios#get(url[, config]) +##### axios#delete(url[, config]) +##### axios#head(url[, config]) +##### axios#options(url[, config]) +##### axios#post(url[, data[, config]]) +##### axios#put(url[, data[, config]]) +##### axios#patch(url[, data[, config]]) +##### axios#getUri([config]) + +## Request Config + +These are the available config options for making requests. Only the `url` is required. Requests will default to `GET` if `method` is not specified. + +```js +{ + // `url` is the server URL that will be used for the request + url: '/user', + + // `method` is the request method to be used when making the request + method: 'get', // default + + // `baseURL` will be prepended to `url` unless `url` is absolute. + // It can be convenient to set `baseURL` for an instance of axios to pass relative URLs + // to methods of that instance. + baseURL: 'https://some-domain.com/api/', + + // `transformRequest` allows changes to the request data before it is sent to the server + // This is only applicable for request methods 'PUT', 'POST', 'PATCH' and 'DELETE' + // The last function in the array must return a string or an instance of Buffer, ArrayBuffer, + // FormData or Stream + // You may modify the headers object. + transformRequest: [function (data, headers) { + // Do whatever you want to transform the data + + return data; + }], + + // `transformResponse` allows changes to the response data to be made before + // it is passed to then/catch + transformResponse: [function (data) { + // Do whatever you want to transform the data + + return data; + }], + + // `headers` are custom headers to be sent + headers: {'X-Requested-With': 'XMLHttpRequest'}, + + // `params` are the URL parameters to be sent with the request + // Must be a plain object or a URLSearchParams object + params: { + ID: 12345 + }, + + // `paramsSerializer` is an optional config that allows you to customize serializing `params`. + paramsSerializer: { + + //Custom encoder function which sends key/value pairs in an iterative fashion. + encode?: (param: string): string => { /* Do custom operations here and return transformed string */ }, + + // Custom serializer function for the entire parameter. Allows user to mimic pre 1.x behaviour. + serialize?: (params: Record, options?: ParamsSerializerOptions ), + + //Configuration for formatting array indexes in the params. + indexes: false // Three available options: (1) indexes: null (leads to no brackets), (2) (default) indexes: false (leads to empty brackets), (3) indexes: true (leads to brackets with indexes). + }, + + // `data` is the data to be sent as the request body + // Only applicable for request methods 'PUT', 'POST', 'DELETE , and 'PATCH' + // When no `transformRequest` is set, must be of one of the following types: + // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams + // - Browser only: FormData, File, Blob + // - Node only: Stream, Buffer, FormData (form-data package) + data: { + firstName: 'Fred' + }, + + // syntax alternative to send data into the body + // method post + // only the value is sent, not the key + data: 'Country=Brasil&City=Belo Horizonte', + + // `timeout` specifies the number of milliseconds before the request times out. + // If the request takes longer than `timeout`, the request will be aborted. + timeout: 1000, // default is `0` (no timeout) + + // `withCredentials` indicates whether or not cross-site Access-Control requests + // should be made using credentials + withCredentials: false, // default + + // `adapter` allows custom handling of requests which makes testing easier. + // Return a promise and supply a valid response (see lib/adapters/README.md). + adapter: function (config) { + /* ... */ + }, + + // `auth` indicates that HTTP Basic auth should be used, and supplies credentials. + // This will set an `Authorization` header, overwriting any existing + // `Authorization` custom headers you have set using `headers`. + // Please note that only HTTP Basic auth is configurable through this parameter. + // For Bearer tokens and such, use `Authorization` custom headers instead. + auth: { + username: 'janedoe', + password: 's00pers3cret' + }, + + // `responseType` indicates the type of data that the server will respond with + // options are: 'arraybuffer', 'document', 'json', 'text', 'stream' + // browser only: 'blob' + responseType: 'json', // default + + // `responseEncoding` indicates encoding to use for decoding responses (Node.js only) + // Note: Ignored for `responseType` of 'stream' or client-side requests + responseEncoding: 'utf8', // default + + // `xsrfCookieName` is the name of the cookie to use as a value for xsrf token + xsrfCookieName: 'XSRF-TOKEN', // default + + // `xsrfHeaderName` is the name of the http header that carries the xsrf token value + xsrfHeaderName: 'X-XSRF-TOKEN', // default + + // `undefined` (default) - set XSRF header only for the same origin requests + withXSRFToken: boolean | undefined | ((config: InternalAxiosRequestConfig) => boolean | undefined), + + // `onUploadProgress` allows handling of progress events for uploads + // browser & node.js + onUploadProgress: function ({loaded, total, progress, bytes, estimated, rate, upload = true}) { + // Do whatever you want with the Axios progress event + }, + + // `onDownloadProgress` allows handling of progress events for downloads + // browser & node.js + onDownloadProgress: function ({loaded, total, progress, bytes, estimated, rate, download = true}) { + // Do whatever you want with the Axios progress event + }, + + // `maxContentLength` defines the max size of the http response content in bytes allowed in node.js + maxContentLength: 2000, + + // `maxBodyLength` (Node only option) defines the max size of the http request content in bytes allowed + maxBodyLength: 2000, + + // `validateStatus` defines whether to resolve or reject the promise for a given + // HTTP response status code. If `validateStatus` returns `true` (or is set to `null` + // or `undefined`), the promise will be resolved; otherwise, the promise will be + // rejected. + validateStatus: function (status) { + return status >= 200 && status < 300; // default + }, + + // `maxRedirects` defines the maximum number of redirects to follow in node.js. + // If set to 0, no redirects will be followed. + maxRedirects: 21, // default + + // `beforeRedirect` defines a function that will be called before redirect. + // Use this to adjust the request options upon redirecting, + // to inspect the latest response headers, + // or to cancel the request by throwing an error + // If maxRedirects is set to 0, `beforeRedirect` is not used. + beforeRedirect: (options, { headers }) => { + if (options.hostname === "example.com") { + options.auth = "user:password"; + } + }, + + // `socketPath` defines a UNIX Socket to be used in node.js. + // e.g. '/var/run/docker.sock' to send requests to the docker daemon. + // Only either `socketPath` or `proxy` can be specified. + // If both are specified, `socketPath` is used. + socketPath: null, // default + + // `transport` determines the transport method that will be used to make the request. If defined, it will be used. Otherwise, if `maxRedirects` is 0, the default `http` or `https` library will be used, depending on the protocol specified in `protocol`. Otherwise, the `httpFollow` or `httpsFollow` library will be used, again depending on the protocol, which can handle redirects. + transport: undefined, // default + + // `httpAgent` and `httpsAgent` define a custom agent to be used when performing http + // and https requests, respectively, in node.js. This allows options to be added like + // `keepAlive` that are not enabled by default. + httpAgent: new http.Agent({ keepAlive: true }), + httpsAgent: new https.Agent({ keepAlive: true }), + + // `proxy` defines the hostname, port, and protocol of the proxy server. + // You can also define your proxy using the conventional `http_proxy` and + // `https_proxy` environment variables. If you are using environment variables + // for your proxy configuration, you can also define a `no_proxy` environment + // variable as a comma-separated list of domains that should not be proxied. + // Use `false` to disable proxies, ignoring environment variables. + // `auth` indicates that HTTP Basic auth should be used to connect to the proxy, and + // supplies credentials. + // This will set an `Proxy-Authorization` header, overwriting any existing + // `Proxy-Authorization` custom headers you have set using `headers`. + // If the proxy server uses HTTPS, then you must set the protocol to `https`. + proxy: { + protocol: 'https', + host: '127.0.0.1', + // hostname: '127.0.0.1' // Takes precedence over 'host' if both are defined + port: 9000, + auth: { + username: 'mikeymike', + password: 'rapunz3l' + } + }, + + // `cancelToken` specifies a cancel token that can be used to cancel the request + // (see Cancellation section below for details) + cancelToken: new CancelToken(function (cancel) { + }), + + // an alternative way to cancel Axios requests using AbortController + signal: new AbortController().signal, + + // `decompress` indicates whether or not the response body should be decompressed + // automatically. If set to `true` will also remove the 'content-encoding' header + // from the responses objects of all decompressed responses + // - Node only (XHR cannot turn off decompression) + decompress: true, // default + + // `insecureHTTPParser` boolean. + // Indicates where to use an insecure HTTP parser that accepts invalid HTTP headers. + // This may allow interoperability with non-conformant HTTP implementations. + // Using the insecure parser should be avoided. + // see options https://nodejs.org/dist/latest-v12.x/docs/api/http.html#http_http_request_url_options_callback + // see also https://nodejs.org/en/blog/vulnerability/february-2020-security-releases/#strict-http-header-parsing-none + insecureHTTPParser: undefined, // default + + // transitional options for backward compatibility that may be removed in the newer versions + transitional: { + // silent JSON parsing mode + // `true` - ignore JSON parsing errors and set response.data to null if parsing failed (old behaviour) + // `false` - throw SyntaxError if JSON parsing failed (Note: responseType must be set to 'json') + silentJSONParsing: true, // default value for the current Axios version + + // try to parse the response string as JSON even if `responseType` is not 'json' + forcedJSONParsing: true, + + // throw ETIMEDOUT error instead of generic ECONNABORTED on request timeouts + clarifyTimeoutError: false, + }, + + env: { + // The FormData class to be used to automatically serialize the payload into a FormData object + FormData: window?.FormData || global?.FormData + }, + + formSerializer: { + visitor: (value, key, path, helpers) => {}; // custom visitor function to serialize form values + dots: boolean; // use dots instead of brackets format + metaTokens: boolean; // keep special endings like {} in parameter key + indexes: boolean; // array indexes format null - no brackets, false - empty brackets, true - brackets with indexes + }, + + // http adapter only (node.js) + maxRate: [ + 100 * 1024, // 100KB/s upload limit, + 100 * 1024 // 100KB/s download limit + ] +} +``` + +## Response Schema + +The response for a request contains the following information. + +```js +{ + // `data` is the response that was provided by the server + data: {}, + + // `status` is the HTTP status code from the server response + status: 200, + + // `statusText` is the HTTP status message from the server response + statusText: 'OK', + + // `headers` the HTTP headers that the server responded with + // All header names are lowercase and can be accessed using the bracket notation. + // Example: `response.headers['content-type']` + headers: {}, + + // `config` is the config that was provided to `axios` for the request + config: {}, + + // `request` is the request that generated this response + // It is the last ClientRequest instance in node.js (in redirects) + // and an XMLHttpRequest instance in the browser + request: {} +} +``` + +When using `then`, you will receive the response as follows: + +```js +axios.get('/user/12345') + .then(function (response) { + console.log(response.data); + console.log(response.status); + console.log(response.statusText); + console.log(response.headers); + console.log(response.config); + }); +``` + +When using `catch`, or passing a [rejection callback](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then) as second parameter of `then`, the response will be available through the `error` object as explained in the [Handling Errors](#handling-errors) section. + +## Config Defaults + +You can specify config defaults that will be applied to every request. + +### Global axios defaults + +```js +axios.defaults.baseURL = 'https://api.example.com'; + +// Important: If axios is used with multiple domains, the AUTH_TOKEN will be sent to all of them. +// See below for an example using Custom instance defaults instead. +axios.defaults.headers.common['Authorization'] = AUTH_TOKEN; + +axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; +``` + +### Custom instance defaults + +```js +// Set config defaults when creating the instance +const instance = axios.create({ + baseURL: 'https://api.example.com' +}); + +// Alter defaults after instance has been created +instance.defaults.headers.common['Authorization'] = AUTH_TOKEN; +``` + +### Config order of precedence + +Config will be merged with an order of precedence. The order is library defaults found in [lib/defaults.js](https://github.com/axios/axios/blob/master/lib/defaults/index.js#L28), then `defaults` property of the instance, and finally `config` argument for the request. The latter will take precedence over the former. Here's an example. + +```js +// Create an instance using the config defaults provided by the library +// At this point the timeout config value is `0` as is the default for the library +const instance = axios.create(); + +// Override timeout default for the library +// Now all requests using this instance will wait 2.5 seconds before timing out +instance.defaults.timeout = 2500; + +// Override timeout for this request as it's known to take a long time +instance.get('/longRequest', { + timeout: 5000 +}); +``` + +## Interceptors + +You can intercept requests or responses before they are handled by `then` or `catch`. + +```js +// Add a request interceptor +axios.interceptors.request.use(function (config) { + // Do something before request is sent + return config; + }, function (error) { + // Do something with request error + return Promise.reject(error); + }); + +// Add a response interceptor +axios.interceptors.response.use(function (response) { + // Any status code that lie within the range of 2xx cause this function to trigger + // Do something with response data + return response; + }, function (error) { + // Any status codes that falls outside the range of 2xx cause this function to trigger + // Do something with response error + return Promise.reject(error); + }); +``` + +If you need to remove an interceptor later you can. + +```js +const myInterceptor = axios.interceptors.request.use(function () {/*...*/}); +axios.interceptors.request.eject(myInterceptor); +``` + +You can also clear all interceptors for requests or responses. +```js +const instance = axios.create(); +instance.interceptors.request.use(function () {/*...*/}); +instance.interceptors.request.clear(); // Removes interceptors from requests +instance.interceptors.response.use(function () {/*...*/}); +instance.interceptors.response.clear(); // Removes interceptors from responses +``` + +You can add interceptors to a custom instance of axios. + +```js +const instance = axios.create(); +instance.interceptors.request.use(function () {/*...*/}); +``` + +When you add request interceptors, they are presumed to be asynchronous by default. This can cause a delay +in the execution of your axios request when the main thread is blocked (a promise is created under the hood for +the interceptor and your request gets put on the bottom of the call stack). If your request interceptors are synchronous you can add a flag +to the options object that will tell axios to run the code synchronously and avoid any delays in request execution. + +```js +axios.interceptors.request.use(function (config) { + config.headers.test = 'I am only a header!'; + return config; +}, null, { synchronous: true }); +``` + +If you want to execute a particular interceptor based on a runtime check, +you can add a `runWhen` function to the options object. The interceptor will not be executed **if and only if** the return +of `runWhen` is `false`. The function will be called with the config +object (don't forget that you can bind your own arguments to it as well.) This can be handy when you have an +asynchronous request interceptor that only needs to run at certain times. + +```js +function onGetCall(config) { + return config.method === 'get'; +} +axios.interceptors.request.use(function (config) { + config.headers.test = 'special get headers'; + return config; +}, null, { runWhen: onGetCall }); +``` + +### Multiple Interceptors + +Given you add multiple response interceptors +and when the response was fulfilled +- then each interceptor is executed +- then they are executed in the order they were added +- then only the last interceptor's result is returned +- then every interceptor receives the result of its predecessor +- and when the fulfillment-interceptor throws + - then the following fulfillment-interceptor is not called + - then the following rejection-interceptor is called + - once caught, another following fulfill-interceptor is called again (just like in a promise chain). + +Read [the interceptor tests](./test/specs/interceptors.spec.js) for seeing all this in code. + +## Error Types + +There are many different axios error messages that can appear that can provide basic information about the specifics of the error and where opportunities may lie in debugging. + +The general structure of axios errors is as follows: +| Property | Definition | +| -------- | ---------- | +| message | A quick summary of the error message and the status it failed with. | +| name | This defines where the error originated from. For axios, it will always be an 'AxiosError'. | +| stack | Provides the stack trace of the error. | +| config | An axios config object with specific instance configurations defined by the user from when the request was made | +| code | Represents an axios identified error. The table below lists out specific definitions for internal axios error. | +| status | HTTP response status code. See [here](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes) for common HTTP response status code meanings. + +Below is a list of potential axios identified error +| Code | Definition | +| -------- | ---------- | +| ERR_BAD_OPTION_VALUE | Invalid or unsupported value provided in axios configuration. | +| ERR_BAD_OPTION | Invalid option provided in axios configuration. | +| ECONNABORTED | Request timed out due to exceeding timeout specified in axios configuration. | +| ETIMEDOUT | Request timed out due to exceeding default axios timelimit. | +| ERR_NETWORK | Network-related issue. +| ERR_FR_TOO_MANY_REDIRECTS | Request is redirected too many times; exceeds max redirects specified in axios configuration. +| ERR_DEPRECATED | Deprecated feature or method used in axios. +| ERR_BAD_RESPONSE | Response cannot be parsed properly or is in an unexpected format. +| ERR_BAD_REQUEST | Requested has unexpected format or missing required parameters. | +| ERR_CANCELED | Feature or method is canceled explicitly by the user. +| ERR_NOT_SUPPORT | Feature or method not supported in the current axios environment. +| ERR_INVALID_URL | Invalid URL provided for axios request. + +## Handling Errors + +the default behavior is to reject every response that returns with a status code that falls out of the range of 2xx and treat it as an error. + +```js +axios.get('/user/12345') + .catch(function (error) { + if (error.response) { + // The request was made and the server responded with a status code + // that falls out of the range of 2xx + console.log(error.response.data); + console.log(error.response.status); + console.log(error.response.headers); + } else if (error.request) { + // The request was made but no response was received + // `error.request` is an instance of XMLHttpRequest in the browser and an instance of + // http.ClientRequest in node.js + console.log(error.request); + } else { + // Something happened in setting up the request that triggered an Error + console.log('Error', error.message); + } + console.log(error.config); + }); +``` + +Using the `validateStatus` config option, you can override the default condition (status >= 200 && status < 300) and define HTTP code(s) that should throw an error. + +```js +axios.get('/user/12345', { + validateStatus: function (status) { + return status < 500; // Resolve only if the status code is less than 500 + } +}) +``` + +Using `toJSON` you get an object with more information about the HTTP error. + +```js +axios.get('/user/12345') + .catch(function (error) { + console.log(error.toJSON()); + }); +``` + +## Cancellation + +### AbortController + +Starting from `v0.22.0` Axios supports AbortController to cancel requests in fetch API way: + +```js +const controller = new AbortController(); + +axios.get('/foo/bar', { + signal: controller.signal +}).then(function(response) { + //... +}); +// cancel the request +controller.abort() +``` + +### CancelToken `👎deprecated` + +You can also cancel a request using a *CancelToken*. + +> The axios cancel token API is based on the withdrawn [cancellable promises proposal](https://github.com/tc39/proposal-cancelable-promises). + +> This API is deprecated since v0.22.0 and shouldn't be used in new projects + +You can create a cancel token using the `CancelToken.source` factory as shown below: + +```js +const CancelToken = axios.CancelToken; +const source = CancelToken.source(); + +axios.get('/user/12345', { + cancelToken: source.token +}).catch(function (thrown) { + if (axios.isCancel(thrown)) { + console.log('Request canceled', thrown.message); + } else { + // handle error + } +}); + +axios.post('/user/12345', { + name: 'new name' +}, { + cancelToken: source.token +}) + +// cancel the request (the message parameter is optional) +source.cancel('Operation canceled by the user.'); +``` + +You can also create a cancel token by passing an executor function to the `CancelToken` constructor: + +```js +const CancelToken = axios.CancelToken; +let cancel; + +axios.get('/user/12345', { + cancelToken: new CancelToken(function executor(c) { + // An executor function receives a cancel function as a parameter + cancel = c; + }) +}); + +// cancel the request +cancel(); +``` + +> **Note:** you can cancel several requests with the same cancel token/abort controller. +> If a cancellation token is already cancelled at the moment of starting an Axios request, then the request is cancelled immediately, without any attempts to make a real request. + +> During the transition period, you can use both cancellation APIs, even for the same request: + +## Using `application/x-www-form-urlencoded` format + +### URLSearchParams + +By default, axios serializes JavaScript objects to `JSON`. To send data in the [`application/x-www-form-urlencoded` format](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST) instead, you can use the [`URLSearchParams`](https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams) API, which is [supported](http://www.caniuse.com/#feat=urlsearchparams) in the vast majority of browsers,and [ Node](https://nodejs.org/api/url.html#url_class_urlsearchparams) starting with v10 (released in 2018). + +```js +const params = new URLSearchParams({ foo: 'bar' }); +params.append('extraparam', 'value'); +axios.post('/foo', params); +``` + +### Query string (Older browsers) + +For compatibility with very old browsers, there is a [polyfill](https://github.com/WebReflection/url-search-params) available (make sure to polyfill the global environment). + +Alternatively, you can encode data using the [`qs`](https://github.com/ljharb/qs) library: + +```js +const qs = require('qs'); +axios.post('/foo', qs.stringify({ 'bar': 123 })); +``` + +Or in another way (ES6), + +```js +import qs from 'qs'; +const data = { 'bar': 123 }; +const options = { + method: 'POST', + headers: { 'content-type': 'application/x-www-form-urlencoded' }, + data: qs.stringify(data), + url, +}; +axios(options); +``` + +### Older Node.js versions + +For older Node.js engines, you can use the [`querystring`](https://nodejs.org/api/querystring.html) module as follows: + +```js +const querystring = require('querystring'); +axios.post('https://something.com/', querystring.stringify({ foo: 'bar' })); +``` + +You can also use the [`qs`](https://github.com/ljharb/qs) library. + +> **Note**: The `qs` library is preferable if you need to stringify nested objects, as the `querystring` method has [known issues](https://github.com/nodejs/node-v0.x-archive/issues/1665) with that use case. + +### 🆕 Automatic serialization to URLSearchParams + +Axios will automatically serialize the data object to urlencoded format if the content-type header is set to "application/x-www-form-urlencoded". + +```js +const data = { + x: 1, + arr: [1, 2, 3], + arr2: [1, [2], 3], + users: [{name: 'Peter', surname: 'Griffin'}, {name: 'Thomas', surname: 'Anderson'}], +}; + +await axios.postForm('https://postman-echo.com/post', data, + {headers: {'content-type': 'application/x-www-form-urlencoded'}} +); +``` + +The server will handle it as: + +```js + { + x: '1', + 'arr[]': [ '1', '2', '3' ], + 'arr2[0]': '1', + 'arr2[1][0]': '2', + 'arr2[2]': '3', + 'arr3[]': [ '1', '2', '3' ], + 'users[0][name]': 'Peter', + 'users[0][surname]': 'griffin', + 'users[1][name]': 'Thomas', + 'users[1][surname]': 'Anderson' + } +```` + +If your backend body-parser (like `body-parser` of `express.js`) supports nested objects decoding, you will get the same object on the server-side automatically + +```js + var app = express(); + + app.use(bodyParser.urlencoded({ extended: true })); // support encoded bodies + + app.post('/', function (req, res, next) { + // echo body as JSON + res.send(JSON.stringify(req.body)); + }); + + server = app.listen(3000); +``` + +## Using `multipart/form-data` format + +### FormData + +To send the data as a `multipart/formdata` you need to pass a formData instance as a payload. +Setting the `Content-Type` header is not required as Axios guesses it based on the payload type. + +```js +const formData = new FormData(); +formData.append('foo', 'bar'); + +axios.post('https://httpbin.org/post', formData); +``` + +In node.js, you can use the [`form-data`](https://github.com/form-data/form-data) library as follows: + +```js +const FormData = require('form-data'); + +const form = new FormData(); +form.append('my_field', 'my value'); +form.append('my_buffer', new Buffer(10)); +form.append('my_file', fs.createReadStream('/foo/bar.jpg')); + +axios.post('https://example.com', form) +``` + +### 🆕 Automatic serialization to FormData + +Starting from `v0.27.0`, Axios supports automatic object serialization to a FormData object if the request `Content-Type` +header is set to `multipart/form-data`. + +The following request will submit the data in a FormData format (Browser & Node.js): + +```js +import axios from 'axios'; + +axios.post('https://httpbin.org/post', {x: 1}, { + headers: { + 'Content-Type': 'multipart/form-data' + } +}).then(({data}) => console.log(data)); +``` + +In the `node.js` build, the ([`form-data`](https://github.com/form-data/form-data)) polyfill is used by default. + +You can overload the FormData class by setting the `env.FormData` config variable, +but you probably won't need it in most cases: + +```js +const axios = require('axios'); +var FormData = require('form-data'); + +axios.post('https://httpbin.org/post', {x: 1, buf: new Buffer(10)}, { + headers: { + 'Content-Type': 'multipart/form-data' + } +}).then(({data}) => console.log(data)); +``` + +Axios FormData serializer supports some special endings to perform the following operations: + +- `{}` - serialize the value with JSON.stringify +- `[]` - unwrap the array-like object as separate fields with the same key + +> **Note**: unwrap/expand operation will be used by default on arrays and FileList objects + +FormData serializer supports additional options via `config.formSerializer: object` property to handle rare cases: + +- `visitor: Function` - user-defined visitor function that will be called recursively to serialize the data object +to a `FormData` object by following custom rules. + +- `dots: boolean = false` - use dot notation instead of brackets to serialize arrays and objects; + +- `metaTokens: boolean = true` - add the special ending (e.g `user{}: '{"name": "John"}'`) in the FormData key. +The back-end body-parser could potentially use this meta-information to automatically parse the value as JSON. + +- `indexes: null|false|true = false` - controls how indexes will be added to unwrapped keys of `flat` array-like objects + + - `null` - don't add brackets (`arr: 1`, `arr: 2`, `arr: 3`) + - `false`(default) - add empty brackets (`arr[]: 1`, `arr[]: 2`, `arr[]: 3`) + - `true` - add brackets with indexes (`arr[0]: 1`, `arr[1]: 2`, `arr[2]: 3`) + +Let's say we have an object like this one: + +```js +const obj = { + x: 1, + arr: [1, 2, 3], + arr2: [1, [2], 3], + users: [{name: 'Peter', surname: 'Griffin'}, {name: 'Thomas', surname: 'Anderson'}], + 'obj2{}': [{x:1}] +}; +``` + +The following steps will be executed by the Axios serializer internally: + +```js +const formData = new FormData(); +formData.append('x', '1'); +formData.append('arr[]', '1'); +formData.append('arr[]', '2'); +formData.append('arr[]', '3'); +formData.append('arr2[0]', '1'); +formData.append('arr2[1][0]', '2'); +formData.append('arr2[2]', '3'); +formData.append('users[0][name]', 'Peter'); +formData.append('users[0][surname]', 'Griffin'); +formData.append('users[1][name]', 'Thomas'); +formData.append('users[1][surname]', 'Anderson'); +formData.append('obj2{}', '[{"x":1}]'); +``` + +Axios supports the following shortcut methods: `postForm`, `putForm`, `patchForm` +which are just the corresponding http methods with the `Content-Type` header preset to `multipart/form-data`. + +## Files Posting + +You can easily submit a single file: + +```js +await axios.postForm('https://httpbin.org/post', { + 'myVar' : 'foo', + 'file': document.querySelector('#fileInput').files[0] +}); +``` + +or multiple files as `multipart/form-data`: + +```js +await axios.postForm('https://httpbin.org/post', { + 'files[]': document.querySelector('#fileInput').files +}); +``` + +`FileList` object can be passed directly: + +```js +await axios.postForm('https://httpbin.org/post', document.querySelector('#fileInput').files) +``` + +All files will be sent with the same field names: `files[]`. + +## 🆕 HTML Form Posting (browser) + +Pass HTML Form element as a payload to submit it as `multipart/form-data` content. + +```js +await axios.postForm('https://httpbin.org/post', document.querySelector('#htmlForm')); +``` + +`FormData` and `HTMLForm` objects can also be posted as `JSON` by explicitly setting the `Content-Type` header to `application/json`: + +```js +await axios.post('https://httpbin.org/post', document.querySelector('#htmlForm'), { + headers: { + 'Content-Type': 'application/json' + } +}) +``` + +For example, the Form + +```html +
+ + + + + + + + + +
+``` + +will be submitted as the following JSON object: + +```js +{ + "foo": "1", + "deep": { + "prop": { + "spaced": "3" + } + }, + "baz": [ + "4", + "5" + ], + "user": { + "age": "value2" + } +} +```` + +Sending `Blobs`/`Files` as JSON (`base64`) is not currently supported. + +## 🆕 Progress capturing + +Axios supports both browser and node environments to capture request upload/download progress. + +```js +await axios.post(url, data, { + onUploadProgress: function (axiosProgressEvent) { + /*{ + loaded: number; + total?: number; + progress?: number; // in range [0..1] + bytes: number; // how many bytes have been transferred since the last trigger (delta) + estimated?: number; // estimated time in seconds + rate?: number; // upload speed in bytes + upload: true; // upload sign + }*/ + }, + + onDownloadProgress: function (axiosProgressEvent) { + /*{ + loaded: number; + total?: number; + progress?: number; + bytes: number; + estimated?: number; + rate?: number; // download speed in bytes + download: true; // download sign + }*/ + } +}); +``` + +You can also track stream upload/download progress in node.js: + +```js +const {data} = await axios.post(SERVER_URL, readableStream, { + onUploadProgress: ({progress}) => { + console.log((progress * 100).toFixed(2)); + }, + + headers: { + 'Content-Length': contentLength + }, + + maxRedirects: 0 // avoid buffering the entire stream +}); +```` + +> **Note:** +> Capturing FormData upload progress is not currently supported in node.js environments. + +> **⚠️ Warning** +> It is recommended to disable redirects by setting maxRedirects: 0 to upload the stream in the **node.js** environment, +> as follow-redirects package will buffer the entire stream in RAM without following the "backpressure" algorithm. + + +## 🆕 Rate limiting + +Download and upload rate limits can only be set for the http adapter (node.js): + +```js +const {data} = await axios.post(LOCAL_SERVER_URL, myBuffer, { + onUploadProgress: ({progress, rate}) => { + console.log(`Upload [${(progress*100).toFixed(2)}%]: ${(rate / 1024).toFixed(2)}KB/s`) + }, + + maxRate: [100 * 1024], // 100KB/s limit +}); +``` + +## 🆕 AxiosHeaders + +Axios has its own `AxiosHeaders` class to manipulate headers using a Map-like API that guarantees caseless work. +Although HTTP is case-insensitive in headers, Axios will retain the case of the original header for stylistic reasons +and for a workaround when servers mistakenly consider the header's case. +The old approach of directly manipulating headers object is still available, but deprecated and not recommended for future usage. + +### Working with headers + +An AxiosHeaders object instance can contain different types of internal values. that control setting and merging logic. +The final headers object with string values is obtained by Axios by calling the `toJSON` method. + +> Note: By JSON here we mean an object consisting only of string values intended to be sent over the network. + +The header value can be one of the following types: +- `string` - normal string value that will be sent to the server +- `null` - skip header when rendering to JSON +- `false` - skip header when rendering to JSON, additionally indicates that `set` method must be called with `rewrite` option set to `true` + to overwrite this value (Axios uses this internally to allow users to opt out of installing certain headers like `User-Agent` or `Content-Type`) +- `undefined` - value is not set + +> Note: The header value is considered set if it is not equal to undefined. + +The headers object is always initialized inside interceptors and transformers: + +```ts + axios.interceptors.request.use((request: InternalAxiosRequestConfig) => { + request.headers.set('My-header', 'value'); + + request.headers.set({ + "My-set-header1": "my-set-value1", + "My-set-header2": "my-set-value2" + }); + + request.headers.set('User-Agent', false); // disable subsequent setting the header by Axios + + request.headers.setContentType('text/plain'); + + request.headers['My-set-header2'] = 'newValue' // direct access is deprecated + + return request; + } + ); +```` + +You can iterate over an `AxiosHeaders` instance using a `for...of` statement: + +````js +const headers = new AxiosHeaders({ + foo: '1', + bar: '2', + baz: '3' +}); + +for(const [header, value] of headers) { + console.log(header, value); +} + +// foo 1 +// bar 2 +// baz 3 +```` + +### new AxiosHeaders(headers?) + +Constructs a new `AxiosHeaders` instance. + +``` +constructor(headers?: RawAxiosHeaders | AxiosHeaders | string); +``` + +If the headers object is a string, it will be parsed as RAW HTTP headers. + +````js +const headers = new AxiosHeaders(` +Host: www.bing.com +User-Agent: curl/7.54.0 +Accept: */*`); + +console.log(headers); + +// Object [AxiosHeaders] { +// host: 'www.bing.com', +// 'user-agent': 'curl/7.54.0', +// accept: '*/*' +// } +```` + +### AxiosHeaders#set + +```ts +set(headerName, value: Axios, rewrite?: boolean); +set(headerName, value, rewrite?: (this: AxiosHeaders, value: string, name: string, headers: RawAxiosHeaders) => boolean); +set(headers?: RawAxiosHeaders | AxiosHeaders | string, rewrite?: boolean); +``` + +The `rewrite` argument controls the overwriting behavior: +- `false` - do not overwrite if header's value is set (is not `undefined`) +- `undefined` (default) - overwrite the header unless its value is set to `false` +- `true` - rewrite anyway + +The option can also accept a user-defined function that determines whether the value should be overwritten or not. + +Returns `this`. + +### AxiosHeaders#get(header) + +``` + get(headerName: string, matcher?: true | AxiosHeaderMatcher): AxiosHeaderValue; + get(headerName: string, parser: RegExp): RegExpExecArray | null; +```` + +Returns the internal value of the header. It can take an extra argument to parse the header's value with `RegExp.exec`, +matcher function or internal key-value parser. + +```ts +const headers = new AxiosHeaders({ + 'Content-Type': 'multipart/form-data; boundary=Asrf456BGe4h' +}); + +console.log(headers.get('Content-Type')); +// multipart/form-data; boundary=Asrf456BGe4h + +console.log(headers.get('Content-Type', true)); // parse key-value pairs from a string separated with \s,;= delimiters: +// [Object: null prototype] { +// 'multipart/form-data': undefined, +// boundary: 'Asrf456BGe4h' +// } + + +console.log(headers.get('Content-Type', (value, name, headers) => { + return String(value).replace(/a/g, 'ZZZ'); +})); +// multipZZZrt/form-dZZZtZZZ; boundZZZry=Asrf456BGe4h + +console.log(headers.get('Content-Type', /boundary=(\w+)/)?.[0]); +// boundary=Asrf456BGe4h + +``` + +Returns the value of the header. + +### AxiosHeaders#has(header, matcher?) + +``` +has(header: string, matcher?: AxiosHeaderMatcher): boolean; +``` + +Returns `true` if the header is set (has no `undefined` value). + +### AxiosHeaders#delete(header, matcher?) + +``` +delete(header: string | string[], matcher?: AxiosHeaderMatcher): boolean; +``` + +Returns `true` if at least one header has been removed. + +### AxiosHeaders#clear(matcher?) + +``` +clear(matcher?: AxiosHeaderMatcher): boolean; +``` + +Removes all headers. +Unlike the `delete` method matcher, this optional matcher will be used to match against the header name rather than the value. + +```ts +const headers = new AxiosHeaders({ + 'foo': '1', + 'x-foo': '2', + 'x-bar': '3', +}); + +console.log(headers.clear(/^x-/)); // true + +console.log(headers.toJSON()); // [Object: null prototype] { foo: '1' } +``` + +Returns `true` if at least one header has been cleared. + +### AxiosHeaders#normalize(format); + +If the headers object was changed directly, it can have duplicates with the same name but in different cases. +This method normalizes the headers object by combining duplicate keys into one. +Axios uses this method internally after calling each interceptor. +Set `format` to true for converting headers name to lowercase and capitalize the initial letters (`cOntEnt-type` => `Content-Type`) + +```js +const headers = new AxiosHeaders({ + 'foo': '1', +}); + +headers.Foo = '2'; +headers.FOO = '3'; + +console.log(headers.toJSON()); // [Object: null prototype] { foo: '1', Foo: '2', FOO: '3' } +console.log(headers.normalize().toJSON()); // [Object: null prototype] { foo: '3' } +console.log(headers.normalize(true).toJSON()); // [Object: null prototype] { Foo: '3' } +``` + +Returns `this`. + +### AxiosHeaders#concat(...targets) + +``` +concat(...targets: Array): AxiosHeaders; +``` + +Merges the instance with targets into a new `AxiosHeaders` instance. If the target is a string, it will be parsed as RAW HTTP headers. + +Returns a new `AxiosHeaders` instance. + +### AxiosHeaders#toJSON(asStrings?) + +```` +toJSON(asStrings?: boolean): RawAxiosHeaders; +```` + +Resolve all internal headers values into a new null prototype object. +Set `asStrings` to true to resolve arrays as a string containing all elements, separated by commas. + +### AxiosHeaders.from(thing?) + +```` +from(thing?: AxiosHeaders | RawAxiosHeaders | string): AxiosHeaders; +```` + +Returns a new `AxiosHeaders` instance created from the raw headers passed in, +or simply returns the given headers object if it's an `AxiosHeaders` instance. + +### AxiosHeaders.concat(...targets) + +```` +concat(...targets: Array): AxiosHeaders; +```` + +Returns a new `AxiosHeaders` instance created by merging the target objects. + +### Shortcuts + +The following shortcuts are available: + +- `setContentType`, `getContentType`, `hasContentType` + +- `setContentLength`, `getContentLength`, `hasContentLength` + +- `setAccept`, `getAccept`, `hasAccept` + +- `setUserAgent`, `getUserAgent`, `hasUserAgent` + +- `setContentEncoding`, `getContentEncoding`, `hasContentEncoding` + + +## Semver + +Until axios reaches a `1.0` release, breaking changes will be released with a new minor version. For example `0.5.1`, and `0.5.4` will have the same API, but `0.6.0` will have breaking changes. + +## Promises + +axios depends on a native ES6 Promise implementation to be [supported](https://caniuse.com/promises). +If your environment doesn't support ES6 Promises, you can [polyfill](https://github.com/jakearchibald/es6-promise). + +## TypeScript + +axios includes [TypeScript](https://typescriptlang.org) definitions and a type guard for axios errors. + +```typescript +let user: User = null; +try { + const { data } = await axios.get('/user?ID=12345'); + user = data.userDetails; +} catch (error) { + if (axios.isAxiosError(error)) { + handleAxiosError(error); + } else { + handleUnexpectedError(error); + } +} +``` + +Because axios dual publishes with an ESM default export and a CJS `module.exports`, there are some caveats. +The recommended setting is to use `"moduleResolution": "node16"` (this is implied by `"module": "node16"`). Note that this requires TypeScript 4.7 or greater. +If use ESM, your settings should be fine. +If you compile TypeScript to CJS and you can’t use `"moduleResolution": "node 16"`, you have to enable `esModuleInterop`. +If you use TypeScript to type check CJS JavaScript code, your only option is to use `"moduleResolution": "node16"`. + +## Online one-click setup + +You can use Gitpod, an online IDE(which is free for Open Source) for contributing or running the examples online. + +[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/axios/axios/blob/main/examples/server.js) + + +## Resources + +* [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) +* [Ecosystem](https://github.com/axios/axios/blob/v1.x/ECOSYSTEM.md) +* [Contributing Guide](https://github.com/axios/axios/blob/v1.x/CONTRIBUTING.md) +* [Code of Conduct](https://github.com/axios/axios/blob/v1.x/CODE_OF_CONDUCT.md) + +## Credits + +axios is heavily inspired by the [$http service](https://docs.angularjs.org/api/ng/service/$http) provided in [AngularJS](https://angularjs.org/). Ultimately axios is an effort to provide a standalone `$http`-like service for use outside of AngularJS. + +## License + +[MIT](LICENSE) diff --git a/task/node_modules/axios/SECURITY.md b/task/node_modules/axios/SECURITY.md new file mode 100644 index 0000000..a5a2b7d --- /dev/null +++ b/task/node_modules/axios/SECURITY.md @@ -0,0 +1,6 @@ +# Reporting a Vulnerability + +If you discover a security vulnerability in axios please disclose it via [our huntr page](https://huntr.dev/repos/axios/axios/). Bounty eligibility, CVE assignment, response times and past reports are all there. + + +Thank you for improving the security of axios. diff --git a/task/node_modules/axios/dist/axios.js b/task/node_modules/axios/dist/axios.js new file mode 100644 index 0000000..21b3bbb --- /dev/null +++ b/task/node_modules/axios/dist/axios.js @@ -0,0 +1,3062 @@ +// Axios v1.6.4 Copyright (c) 2024 Matt Zabriskie and contributors +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.axios = factory()); +})(this, (function () { 'use strict'; + + function ownKeys(object, enumerableOnly) { + var keys = Object.keys(object); + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(object); + enumerableOnly && (symbols = symbols.filter(function (sym) { + return Object.getOwnPropertyDescriptor(object, sym).enumerable; + })), keys.push.apply(keys, symbols); + } + return keys; + } + function _objectSpread2(target) { + for (var i = 1; i < arguments.length; i++) { + var source = null != arguments[i] ? arguments[i] : {}; + i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { + _defineProperty(target, key, source[key]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { + Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); + }); + } + return target; + } + function _typeof(obj) { + "@babel/helpers - typeof"; + + return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { + return typeof obj; + } : function (obj) { + return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }, _typeof(obj); + } + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", { + writable: false + }); + return Constructor; + } + function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + function _slicedToArray(arr, i) { + return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); + } + function _toArray(arr) { + return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest(); + } + function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); + } + function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) return _arrayLikeToArray(arr); + } + function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; + } + function _iterableToArray(iter) { + if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); + } + function _iterableToArrayLimit(arr, i) { + var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; + if (_i == null) return; + var _arr = []; + var _n = true; + var _d = false; + var _s, _e; + try { + for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"] != null) _i["return"](); + } finally { + if (_d) throw _e; + } + } + return _arr; + } + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); + } + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; + return arr2; + } + function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + function bind(fn, thisArg) { + return function wrap() { + return fn.apply(thisArg, arguments); + }; + } + + // utils is a library of generic helper functions non-specific to axios + + var toString = Object.prototype.toString; + var getPrototypeOf = Object.getPrototypeOf; + var kindOf = function (cache) { + return function (thing) { + var str = toString.call(thing); + return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase()); + }; + }(Object.create(null)); + var kindOfTest = function kindOfTest(type) { + type = type.toLowerCase(); + return function (thing) { + return kindOf(thing) === type; + }; + }; + var typeOfTest = function typeOfTest(type) { + return function (thing) { + return _typeof(thing) === type; + }; + }; + + /** + * Determine if a value is an Array + * + * @param {Object} val The value to test + * + * @returns {boolean} True if value is an Array, otherwise false + */ + var isArray = Array.isArray; + + /** + * Determine if a value is undefined + * + * @param {*} val The value to test + * + * @returns {boolean} True if the value is undefined, otherwise false + */ + var isUndefined = typeOfTest('undefined'); + + /** + * Determine if a value is a Buffer + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a Buffer, otherwise false + */ + function isBuffer(val) { + return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val); + } + + /** + * Determine if a value is an ArrayBuffer + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is an ArrayBuffer, otherwise false + */ + var isArrayBuffer = kindOfTest('ArrayBuffer'); + + /** + * Determine if a value is a view on an ArrayBuffer + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false + */ + function isArrayBufferView(val) { + var result; + if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView) { + result = ArrayBuffer.isView(val); + } else { + result = val && val.buffer && isArrayBuffer(val.buffer); + } + return result; + } + + /** + * Determine if a value is a String + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a String, otherwise false + */ + var isString = typeOfTest('string'); + + /** + * Determine if a value is a Function + * + * @param {*} val The value to test + * @returns {boolean} True if value is a Function, otherwise false + */ + var isFunction = typeOfTest('function'); + + /** + * Determine if a value is a Number + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a Number, otherwise false + */ + var isNumber = typeOfTest('number'); + + /** + * Determine if a value is an Object + * + * @param {*} thing The value to test + * + * @returns {boolean} True if value is an Object, otherwise false + */ + var isObject = function isObject(thing) { + return thing !== null && _typeof(thing) === 'object'; + }; + + /** + * Determine if a value is a Boolean + * + * @param {*} thing The value to test + * @returns {boolean} True if value is a Boolean, otherwise false + */ + var isBoolean = function isBoolean(thing) { + return thing === true || thing === false; + }; + + /** + * Determine if a value is a plain Object + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a plain Object, otherwise false + */ + var isPlainObject = function isPlainObject(val) { + if (kindOf(val) !== 'object') { + return false; + } + var prototype = getPrototypeOf(val); + return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val); + }; + + /** + * Determine if a value is a Date + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a Date, otherwise false + */ + var isDate = kindOfTest('Date'); + + /** + * Determine if a value is a File + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a File, otherwise false + */ + var isFile = kindOfTest('File'); + + /** + * Determine if a value is a Blob + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a Blob, otherwise false + */ + var isBlob = kindOfTest('Blob'); + + /** + * Determine if a value is a FileList + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a File, otherwise false + */ + var isFileList = kindOfTest('FileList'); + + /** + * Determine if a value is a Stream + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a Stream, otherwise false + */ + var isStream = function isStream(val) { + return isObject(val) && isFunction(val.pipe); + }; + + /** + * Determine if a value is a FormData + * + * @param {*} thing The value to test + * + * @returns {boolean} True if value is an FormData, otherwise false + */ + var isFormData = function isFormData(thing) { + var kind; + return thing && (typeof FormData === 'function' && thing instanceof FormData || isFunction(thing.append) && ((kind = kindOf(thing)) === 'formdata' || + // detect form-data instance + kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')); + }; + + /** + * Determine if a value is a URLSearchParams object + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a URLSearchParams object, otherwise false + */ + var isURLSearchParams = kindOfTest('URLSearchParams'); + + /** + * Trim excess whitespace off the beginning and end of a string + * + * @param {String} str The String to trim + * + * @returns {String} The String freed of excess whitespace + */ + var trim = function trim(str) { + return str.trim ? str.trim() : str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); + }; + + /** + * Iterate over an Array or an Object invoking a function for each item. + * + * If `obj` is an Array callback will be called passing + * the value, index, and complete array for each item. + * + * If 'obj' is an Object callback will be called passing + * the value, key, and complete object for each property. + * + * @param {Object|Array} obj The object to iterate + * @param {Function} fn The callback to invoke for each item + * + * @param {Boolean} [allOwnKeys = false] + * @returns {any} + */ + function forEach(obj, fn) { + var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, + _ref$allOwnKeys = _ref.allOwnKeys, + allOwnKeys = _ref$allOwnKeys === void 0 ? false : _ref$allOwnKeys; + // Don't bother if no value provided + if (obj === null || typeof obj === 'undefined') { + return; + } + var i; + var l; + + // Force an array if not already something iterable + if (_typeof(obj) !== 'object') { + /*eslint no-param-reassign:0*/ + obj = [obj]; + } + if (isArray(obj)) { + // Iterate over array values + for (i = 0, l = obj.length; i < l; i++) { + fn.call(null, obj[i], i, obj); + } + } else { + // Iterate over object keys + var keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj); + var len = keys.length; + var key; + for (i = 0; i < len; i++) { + key = keys[i]; + fn.call(null, obj[key], key, obj); + } + } + } + function findKey(obj, key) { + key = key.toLowerCase(); + var keys = Object.keys(obj); + var i = keys.length; + var _key; + while (i-- > 0) { + _key = keys[i]; + if (key === _key.toLowerCase()) { + return _key; + } + } + return null; + } + var _global = function () { + /*eslint no-undef:0*/ + if (typeof globalThis !== "undefined") return globalThis; + return typeof self !== "undefined" ? self : typeof window !== 'undefined' ? window : global; + }(); + var isContextDefined = function isContextDefined(context) { + return !isUndefined(context) && context !== _global; + }; + + /** + * Accepts varargs expecting each argument to be an object, then + * immutably merges the properties of each object and returns result. + * + * When multiple objects contain the same key the later object in + * the arguments list will take precedence. + * + * Example: + * + * ```js + * var result = merge({foo: 123}, {foo: 456}); + * console.log(result.foo); // outputs 456 + * ``` + * + * @param {Object} obj1 Object to merge + * + * @returns {Object} Result of all merge properties + */ + function /* obj1, obj2, obj3, ... */ + merge() { + var _ref2 = isContextDefined(this) && this || {}, + caseless = _ref2.caseless; + var result = {}; + var assignValue = function assignValue(val, key) { + var targetKey = caseless && findKey(result, key) || key; + if (isPlainObject(result[targetKey]) && isPlainObject(val)) { + result[targetKey] = merge(result[targetKey], val); + } else if (isPlainObject(val)) { + result[targetKey] = merge({}, val); + } else if (isArray(val)) { + result[targetKey] = val.slice(); + } else { + result[targetKey] = val; + } + }; + for (var i = 0, l = arguments.length; i < l; i++) { + arguments[i] && forEach(arguments[i], assignValue); + } + return result; + } + + /** + * Extends object a by mutably adding to it the properties of object b. + * + * @param {Object} a The object to be extended + * @param {Object} b The object to copy properties from + * @param {Object} thisArg The object to bind function to + * + * @param {Boolean} [allOwnKeys] + * @returns {Object} The resulting value of object a + */ + var extend = function extend(a, b, thisArg) { + var _ref3 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}, + allOwnKeys = _ref3.allOwnKeys; + forEach(b, function (val, key) { + if (thisArg && isFunction(val)) { + a[key] = bind(val, thisArg); + } else { + a[key] = val; + } + }, { + allOwnKeys: allOwnKeys + }); + return a; + }; + + /** + * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM) + * + * @param {string} content with BOM + * + * @returns {string} content value without BOM + */ + var stripBOM = function stripBOM(content) { + if (content.charCodeAt(0) === 0xFEFF) { + content = content.slice(1); + } + return content; + }; + + /** + * Inherit the prototype methods from one constructor into another + * @param {function} constructor + * @param {function} superConstructor + * @param {object} [props] + * @param {object} [descriptors] + * + * @returns {void} + */ + var inherits = function inherits(constructor, superConstructor, props, descriptors) { + constructor.prototype = Object.create(superConstructor.prototype, descriptors); + constructor.prototype.constructor = constructor; + Object.defineProperty(constructor, 'super', { + value: superConstructor.prototype + }); + props && Object.assign(constructor.prototype, props); + }; + + /** + * Resolve object with deep prototype chain to a flat object + * @param {Object} sourceObj source object + * @param {Object} [destObj] + * @param {Function|Boolean} [filter] + * @param {Function} [propFilter] + * + * @returns {Object} + */ + var toFlatObject = function toFlatObject(sourceObj, destObj, filter, propFilter) { + var props; + var i; + var prop; + var merged = {}; + destObj = destObj || {}; + // eslint-disable-next-line no-eq-null,eqeqeq + if (sourceObj == null) return destObj; + do { + props = Object.getOwnPropertyNames(sourceObj); + i = props.length; + while (i-- > 0) { + prop = props[i]; + if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) { + destObj[prop] = sourceObj[prop]; + merged[prop] = true; + } + } + sourceObj = filter !== false && getPrototypeOf(sourceObj); + } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype); + return destObj; + }; + + /** + * Determines whether a string ends with the characters of a specified string + * + * @param {String} str + * @param {String} searchString + * @param {Number} [position= 0] + * + * @returns {boolean} + */ + var endsWith = function endsWith(str, searchString, position) { + str = String(str); + if (position === undefined || position > str.length) { + position = str.length; + } + position -= searchString.length; + var lastIndex = str.indexOf(searchString, position); + return lastIndex !== -1 && lastIndex === position; + }; + + /** + * Returns new array from array like object or null if failed + * + * @param {*} [thing] + * + * @returns {?Array} + */ + var toArray = function toArray(thing) { + if (!thing) return null; + if (isArray(thing)) return thing; + var i = thing.length; + if (!isNumber(i)) return null; + var arr = new Array(i); + while (i-- > 0) { + arr[i] = thing[i]; + } + return arr; + }; + + /** + * Checking if the Uint8Array exists and if it does, it returns a function that checks if the + * thing passed in is an instance of Uint8Array + * + * @param {TypedArray} + * + * @returns {Array} + */ + // eslint-disable-next-line func-names + var isTypedArray = function (TypedArray) { + // eslint-disable-next-line func-names + return function (thing) { + return TypedArray && thing instanceof TypedArray; + }; + }(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array)); + + /** + * For each entry in the object, call the function with the key and value. + * + * @param {Object} obj - The object to iterate over. + * @param {Function} fn - The function to call for each entry. + * + * @returns {void} + */ + var forEachEntry = function forEachEntry(obj, fn) { + var generator = obj && obj[Symbol.iterator]; + var iterator = generator.call(obj); + var result; + while ((result = iterator.next()) && !result.done) { + var pair = result.value; + fn.call(obj, pair[0], pair[1]); + } + }; + + /** + * It takes a regular expression and a string, and returns an array of all the matches + * + * @param {string} regExp - The regular expression to match against. + * @param {string} str - The string to search. + * + * @returns {Array} + */ + var matchAll = function matchAll(regExp, str) { + var matches; + var arr = []; + while ((matches = regExp.exec(str)) !== null) { + arr.push(matches); + } + return arr; + }; + + /* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */ + var isHTMLForm = kindOfTest('HTMLFormElement'); + var toCamelCase = function toCamelCase(str) { + return str.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g, function replacer(m, p1, p2) { + return p1.toUpperCase() + p2; + }); + }; + + /* Creating a function that will check if an object has a property. */ + var hasOwnProperty = function (_ref4) { + var hasOwnProperty = _ref4.hasOwnProperty; + return function (obj, prop) { + return hasOwnProperty.call(obj, prop); + }; + }(Object.prototype); + + /** + * Determine if a value is a RegExp object + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a RegExp object, otherwise false + */ + var isRegExp = kindOfTest('RegExp'); + var reduceDescriptors = function reduceDescriptors(obj, reducer) { + var descriptors = Object.getOwnPropertyDescriptors(obj); + var reducedDescriptors = {}; + forEach(descriptors, function (descriptor, name) { + var ret; + if ((ret = reducer(descriptor, name, obj)) !== false) { + reducedDescriptors[name] = ret || descriptor; + } + }); + Object.defineProperties(obj, reducedDescriptors); + }; + + /** + * Makes all methods read-only + * @param {Object} obj + */ + + var freezeMethods = function freezeMethods(obj) { + reduceDescriptors(obj, function (descriptor, name) { + // skip restricted props in strict mode + if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) { + return false; + } + var value = obj[name]; + if (!isFunction(value)) return; + descriptor.enumerable = false; + if ('writable' in descriptor) { + descriptor.writable = false; + return; + } + if (!descriptor.set) { + descriptor.set = function () { + throw Error('Can not rewrite read-only method \'' + name + '\''); + }; + } + }); + }; + var toObjectSet = function toObjectSet(arrayOrString, delimiter) { + var obj = {}; + var define = function define(arr) { + arr.forEach(function (value) { + obj[value] = true; + }); + }; + isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter)); + return obj; + }; + var noop = function noop() {}; + var toFiniteNumber = function toFiniteNumber(value, defaultValue) { + value = +value; + return Number.isFinite(value) ? value : defaultValue; + }; + var ALPHA = 'abcdefghijklmnopqrstuvwxyz'; + var DIGIT = '0123456789'; + var ALPHABET = { + DIGIT: DIGIT, + ALPHA: ALPHA, + ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT + }; + var generateString = function generateString() { + var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 16; + var alphabet = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ALPHABET.ALPHA_DIGIT; + var str = ''; + var length = alphabet.length; + while (size--) { + str += alphabet[Math.random() * length | 0]; + } + return str; + }; + + /** + * If the thing is a FormData object, return true, otherwise return false. + * + * @param {unknown} thing - The thing to check. + * + * @returns {boolean} + */ + function isSpecCompliantForm(thing) { + return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]); + } + var toJSONObject = function toJSONObject(obj) { + var stack = new Array(10); + var visit = function visit(source, i) { + if (isObject(source)) { + if (stack.indexOf(source) >= 0) { + return; + } + if (!('toJSON' in source)) { + stack[i] = source; + var target = isArray(source) ? [] : {}; + forEach(source, function (value, key) { + var reducedValue = visit(value, i + 1); + !isUndefined(reducedValue) && (target[key] = reducedValue); + }); + stack[i] = undefined; + return target; + } + } + return source; + }; + return visit(obj, 0); + }; + var isAsyncFn = kindOfTest('AsyncFunction'); + var isThenable = function isThenable(thing) { + return thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing["catch"]); + }; + var utils$1 = { + isArray: isArray, + isArrayBuffer: isArrayBuffer, + isBuffer: isBuffer, + isFormData: isFormData, + isArrayBufferView: isArrayBufferView, + isString: isString, + isNumber: isNumber, + isBoolean: isBoolean, + isObject: isObject, + isPlainObject: isPlainObject, + isUndefined: isUndefined, + isDate: isDate, + isFile: isFile, + isBlob: isBlob, + isRegExp: isRegExp, + isFunction: isFunction, + isStream: isStream, + isURLSearchParams: isURLSearchParams, + isTypedArray: isTypedArray, + isFileList: isFileList, + forEach: forEach, + merge: merge, + extend: extend, + trim: trim, + stripBOM: stripBOM, + inherits: inherits, + toFlatObject: toFlatObject, + kindOf: kindOf, + kindOfTest: kindOfTest, + endsWith: endsWith, + toArray: toArray, + forEachEntry: forEachEntry, + matchAll: matchAll, + isHTMLForm: isHTMLForm, + hasOwnProperty: hasOwnProperty, + hasOwnProp: hasOwnProperty, + // an alias to avoid ESLint no-prototype-builtins detection + reduceDescriptors: reduceDescriptors, + freezeMethods: freezeMethods, + toObjectSet: toObjectSet, + toCamelCase: toCamelCase, + noop: noop, + toFiniteNumber: toFiniteNumber, + findKey: findKey, + global: _global, + isContextDefined: isContextDefined, + ALPHABET: ALPHABET, + generateString: generateString, + isSpecCompliantForm: isSpecCompliantForm, + toJSONObject: toJSONObject, + isAsyncFn: isAsyncFn, + isThenable: isThenable + }; + + /** + * Create an Error with the specified message, config, error code, request and response. + * + * @param {string} message The error message. + * @param {string} [code] The error code (for example, 'ECONNABORTED'). + * @param {Object} [config] The config. + * @param {Object} [request] The request. + * @param {Object} [response] The response. + * + * @returns {Error} The created error. + */ + function AxiosError(message, code, config, request, response) { + Error.call(this); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } else { + this.stack = new Error().stack; + } + this.message = message; + this.name = 'AxiosError'; + code && (this.code = code); + config && (this.config = config); + request && (this.request = request); + response && (this.response = response); + } + utils$1.inherits(AxiosError, Error, { + toJSON: function toJSON() { + return { + // Standard + message: this.message, + name: this.name, + // Microsoft + description: this.description, + number: this.number, + // Mozilla + fileName: this.fileName, + lineNumber: this.lineNumber, + columnNumber: this.columnNumber, + stack: this.stack, + // Axios + config: utils$1.toJSONObject(this.config), + code: this.code, + status: this.response && this.response.status ? this.response.status : null + }; + } + }); + var prototype$1 = AxiosError.prototype; + var descriptors = {}; + ['ERR_BAD_OPTION_VALUE', 'ERR_BAD_OPTION', 'ECONNABORTED', 'ETIMEDOUT', 'ERR_NETWORK', 'ERR_FR_TOO_MANY_REDIRECTS', 'ERR_DEPRECATED', 'ERR_BAD_RESPONSE', 'ERR_BAD_REQUEST', 'ERR_CANCELED', 'ERR_NOT_SUPPORT', 'ERR_INVALID_URL' + // eslint-disable-next-line func-names + ].forEach(function (code) { + descriptors[code] = { + value: code + }; + }); + Object.defineProperties(AxiosError, descriptors); + Object.defineProperty(prototype$1, 'isAxiosError', { + value: true + }); + + // eslint-disable-next-line func-names + AxiosError.from = function (error, code, config, request, response, customProps) { + var axiosError = Object.create(prototype$1); + utils$1.toFlatObject(error, axiosError, function filter(obj) { + return obj !== Error.prototype; + }, function (prop) { + return prop !== 'isAxiosError'; + }); + AxiosError.call(axiosError, error.message, code, config, request, response); + axiosError.cause = error; + axiosError.name = error.name; + customProps && Object.assign(axiosError, customProps); + return axiosError; + }; + + // eslint-disable-next-line strict + var httpAdapter = null; + + /** + * Determines if the given thing is a array or js object. + * + * @param {string} thing - The object or array to be visited. + * + * @returns {boolean} + */ + function isVisitable(thing) { + return utils$1.isPlainObject(thing) || utils$1.isArray(thing); + } + + /** + * It removes the brackets from the end of a string + * + * @param {string} key - The key of the parameter. + * + * @returns {string} the key without the brackets. + */ + function removeBrackets(key) { + return utils$1.endsWith(key, '[]') ? key.slice(0, -2) : key; + } + + /** + * It takes a path, a key, and a boolean, and returns a string + * + * @param {string} path - The path to the current key. + * @param {string} key - The key of the current object being iterated over. + * @param {string} dots - If true, the key will be rendered with dots instead of brackets. + * + * @returns {string} The path to the current key. + */ + function renderKey(path, key, dots) { + if (!path) return key; + return path.concat(key).map(function each(token, i) { + // eslint-disable-next-line no-param-reassign + token = removeBrackets(token); + return !dots && i ? '[' + token + ']' : token; + }).join(dots ? '.' : ''); + } + + /** + * If the array is an array and none of its elements are visitable, then it's a flat array. + * + * @param {Array} arr - The array to check + * + * @returns {boolean} + */ + function isFlatArray(arr) { + return utils$1.isArray(arr) && !arr.some(isVisitable); + } + var predicates = utils$1.toFlatObject(utils$1, {}, null, function filter(prop) { + return /^is[A-Z]/.test(prop); + }); + + /** + * Convert a data object to FormData + * + * @param {Object} obj + * @param {?Object} [formData] + * @param {?Object} [options] + * @param {Function} [options.visitor] + * @param {Boolean} [options.metaTokens = true] + * @param {Boolean} [options.dots = false] + * @param {?Boolean} [options.indexes = false] + * + * @returns {Object} + **/ + + /** + * It converts an object into a FormData object + * + * @param {Object} obj - The object to convert to form data. + * @param {string} formData - The FormData object to append to. + * @param {Object} options + * + * @returns + */ + function toFormData(obj, formData, options) { + if (!utils$1.isObject(obj)) { + throw new TypeError('target must be an object'); + } + + // eslint-disable-next-line no-param-reassign + formData = formData || new (FormData)(); + + // eslint-disable-next-line no-param-reassign + options = utils$1.toFlatObject(options, { + metaTokens: true, + dots: false, + indexes: false + }, false, function defined(option, source) { + // eslint-disable-next-line no-eq-null,eqeqeq + return !utils$1.isUndefined(source[option]); + }); + var metaTokens = options.metaTokens; + // eslint-disable-next-line no-use-before-define + var visitor = options.visitor || defaultVisitor; + var dots = options.dots; + var indexes = options.indexes; + var _Blob = options.Blob || typeof Blob !== 'undefined' && Blob; + var useBlob = _Blob && utils$1.isSpecCompliantForm(formData); + if (!utils$1.isFunction(visitor)) { + throw new TypeError('visitor must be a function'); + } + function convertValue(value) { + if (value === null) return ''; + if (utils$1.isDate(value)) { + return value.toISOString(); + } + if (!useBlob && utils$1.isBlob(value)) { + throw new AxiosError('Blob is not supported. Use a Buffer instead.'); + } + if (utils$1.isArrayBuffer(value) || utils$1.isTypedArray(value)) { + return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value); + } + return value; + } + + /** + * Default visitor. + * + * @param {*} value + * @param {String|Number} key + * @param {Array} path + * @this {FormData} + * + * @returns {boolean} return true to visit the each prop of the value recursively + */ + function defaultVisitor(value, key, path) { + var arr = value; + if (value && !path && _typeof(value) === 'object') { + if (utils$1.endsWith(key, '{}')) { + // eslint-disable-next-line no-param-reassign + key = metaTokens ? key : key.slice(0, -2); + // eslint-disable-next-line no-param-reassign + value = JSON.stringify(value); + } else if (utils$1.isArray(value) && isFlatArray(value) || (utils$1.isFileList(value) || utils$1.endsWith(key, '[]')) && (arr = utils$1.toArray(value))) { + // eslint-disable-next-line no-param-reassign + key = removeBrackets(key); + arr.forEach(function each(el, index) { + !(utils$1.isUndefined(el) || el === null) && formData.append( + // eslint-disable-next-line no-nested-ternary + indexes === true ? renderKey([key], index, dots) : indexes === null ? key : key + '[]', convertValue(el)); + }); + return false; + } + } + if (isVisitable(value)) { + return true; + } + formData.append(renderKey(path, key, dots), convertValue(value)); + return false; + } + var stack = []; + var exposedHelpers = Object.assign(predicates, { + defaultVisitor: defaultVisitor, + convertValue: convertValue, + isVisitable: isVisitable + }); + function build(value, path) { + if (utils$1.isUndefined(value)) return; + if (stack.indexOf(value) !== -1) { + throw Error('Circular reference detected in ' + path.join('.')); + } + stack.push(value); + utils$1.forEach(value, function each(el, key) { + var result = !(utils$1.isUndefined(el) || el === null) && visitor.call(formData, el, utils$1.isString(key) ? key.trim() : key, path, exposedHelpers); + if (result === true) { + build(el, path ? path.concat(key) : [key]); + } + }); + stack.pop(); + } + if (!utils$1.isObject(obj)) { + throw new TypeError('data must be an object'); + } + build(obj); + return formData; + } + + /** + * It encodes a string by replacing all characters that are not in the unreserved set with + * their percent-encoded equivalents + * + * @param {string} str - The string to encode. + * + * @returns {string} The encoded string. + */ + function encode$1(str) { + var charMap = { + '!': '%21', + "'": '%27', + '(': '%28', + ')': '%29', + '~': '%7E', + '%20': '+', + '%00': '\x00' + }; + return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) { + return charMap[match]; + }); + } + + /** + * It takes a params object and converts it to a FormData object + * + * @param {Object} params - The parameters to be converted to a FormData object. + * @param {Object} options - The options object passed to the Axios constructor. + * + * @returns {void} + */ + function AxiosURLSearchParams(params, options) { + this._pairs = []; + params && toFormData(params, this, options); + } + var prototype = AxiosURLSearchParams.prototype; + prototype.append = function append(name, value) { + this._pairs.push([name, value]); + }; + prototype.toString = function toString(encoder) { + var _encode = encoder ? function (value) { + return encoder.call(this, value, encode$1); + } : encode$1; + return this._pairs.map(function each(pair) { + return _encode(pair[0]) + '=' + _encode(pair[1]); + }, '').join('&'); + }; + + /** + * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their + * URI encoded counterparts + * + * @param {string} val The value to be encoded. + * + * @returns {string} The encoded value. + */ + function encode(val) { + return encodeURIComponent(val).replace(/%3A/gi, ':').replace(/%24/g, '$').replace(/%2C/gi, ',').replace(/%20/g, '+').replace(/%5B/gi, '[').replace(/%5D/gi, ']'); + } + + /** + * Build a URL by appending params to the end + * + * @param {string} url The base of the url (e.g., http://www.google.com) + * @param {object} [params] The params to be appended + * @param {?object} options + * + * @returns {string} The formatted url + */ + function buildURL(url, params, options) { + /*eslint no-param-reassign:0*/ + if (!params) { + return url; + } + var _encode = options && options.encode || encode; + var serializeFn = options && options.serialize; + var serializedParams; + if (serializeFn) { + serializedParams = serializeFn(params, options); + } else { + serializedParams = utils$1.isURLSearchParams(params) ? params.toString() : new AxiosURLSearchParams(params, options).toString(_encode); + } + if (serializedParams) { + var hashmarkIndex = url.indexOf("#"); + if (hashmarkIndex !== -1) { + url = url.slice(0, hashmarkIndex); + } + url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams; + } + return url; + } + + var InterceptorManager = /*#__PURE__*/function () { + function InterceptorManager() { + _classCallCheck(this, InterceptorManager); + this.handlers = []; + } + + /** + * Add a new interceptor to the stack + * + * @param {Function} fulfilled The function to handle `then` for a `Promise` + * @param {Function} rejected The function to handle `reject` for a `Promise` + * + * @return {Number} An ID used to remove interceptor later + */ + _createClass(InterceptorManager, [{ + key: "use", + value: function use(fulfilled, rejected, options) { + this.handlers.push({ + fulfilled: fulfilled, + rejected: rejected, + synchronous: options ? options.synchronous : false, + runWhen: options ? options.runWhen : null + }); + return this.handlers.length - 1; + } + + /** + * Remove an interceptor from the stack + * + * @param {Number} id The ID that was returned by `use` + * + * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise + */ + }, { + key: "eject", + value: function eject(id) { + if (this.handlers[id]) { + this.handlers[id] = null; + } + } + + /** + * Clear all interceptors from the stack + * + * @returns {void} + */ + }, { + key: "clear", + value: function clear() { + if (this.handlers) { + this.handlers = []; + } + } + + /** + * Iterate over all the registered interceptors + * + * This method is particularly useful for skipping over any + * interceptors that may have become `null` calling `eject`. + * + * @param {Function} fn The function to call for each interceptor + * + * @returns {void} + */ + }, { + key: "forEach", + value: function forEach(fn) { + utils$1.forEach(this.handlers, function forEachHandler(h) { + if (h !== null) { + fn(h); + } + }); + } + }]); + return InterceptorManager; + }(); + var InterceptorManager$1 = InterceptorManager; + + var transitionalDefaults = { + silentJSONParsing: true, + forcedJSONParsing: true, + clarifyTimeoutError: false + }; + + var URLSearchParams$1 = typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams; + + var FormData$1 = typeof FormData !== 'undefined' ? FormData : null; + + var Blob$1 = typeof Blob !== 'undefined' ? Blob : null; + + var platform$1 = { + isBrowser: true, + classes: { + URLSearchParams: URLSearchParams$1, + FormData: FormData$1, + Blob: Blob$1 + }, + protocols: ['http', 'https', 'file', 'blob', 'url', 'data'] + }; + + var hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined'; + + /** + * Determine if we're running in a standard browser environment + * + * This allows axios to run in a web worker, and react-native. + * Both environments support XMLHttpRequest, but not fully standard globals. + * + * web workers: + * typeof window -> undefined + * typeof document -> undefined + * + * react-native: + * navigator.product -> 'ReactNative' + * nativescript + * navigator.product -> 'NativeScript' or 'NS' + * + * @returns {boolean} + */ + var hasStandardBrowserEnv = function (product) { + return hasBrowserEnv && ['ReactNative', 'NativeScript', 'NS'].indexOf(product) < 0; + }(typeof navigator !== 'undefined' && navigator.product); + + /** + * Determine if we're running in a standard browser webWorker environment + * + * Although the `isStandardBrowserEnv` method indicates that + * `allows axios to run in a web worker`, the WebWorker will still be + * filtered out due to its judgment standard + * `typeof window !== 'undefined' && typeof document !== 'undefined'`. + * This leads to a problem when axios post `FormData` in webWorker + */ + var hasStandardBrowserWebWorkerEnv = function () { + return typeof WorkerGlobalScope !== 'undefined' && + // eslint-disable-next-line no-undef + self instanceof WorkerGlobalScope && typeof self.importScripts === 'function'; + }(); + + var utils = /*#__PURE__*/Object.freeze({ + __proto__: null, + hasBrowserEnv: hasBrowserEnv, + hasStandardBrowserWebWorkerEnv: hasStandardBrowserWebWorkerEnv, + hasStandardBrowserEnv: hasStandardBrowserEnv + }); + + var platform = _objectSpread2(_objectSpread2({}, utils), platform$1); + + function toURLEncodedForm(data, options) { + return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({ + visitor: function visitor(value, key, path, helpers) { + if (platform.isNode && utils$1.isBuffer(value)) { + this.append(key, value.toString('base64')); + return false; + } + return helpers.defaultVisitor.apply(this, arguments); + } + }, options)); + } + + /** + * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z'] + * + * @param {string} name - The name of the property to get. + * + * @returns An array of strings. + */ + function parsePropPath(name) { + // foo[x][y][z] + // foo.x.y.z + // foo-x-y-z + // foo x y z + return utils$1.matchAll(/\w+|\[(\w*)]/g, name).map(function (match) { + return match[0] === '[]' ? '' : match[1] || match[0]; + }); + } + + /** + * Convert an array to an object. + * + * @param {Array} arr - The array to convert to an object. + * + * @returns An object with the same keys and values as the array. + */ + function arrayToObject(arr) { + var obj = {}; + var keys = Object.keys(arr); + var i; + var len = keys.length; + var key; + for (i = 0; i < len; i++) { + key = keys[i]; + obj[key] = arr[key]; + } + return obj; + } + + /** + * It takes a FormData object and returns a JavaScript object + * + * @param {string} formData The FormData object to convert to JSON. + * + * @returns {Object | null} The converted object. + */ + function formDataToJSON(formData) { + function buildPath(path, value, target, index) { + var name = path[index++]; + if (name === '__proto__') return true; + var isNumericKey = Number.isFinite(+name); + var isLast = index >= path.length; + name = !name && utils$1.isArray(target) ? target.length : name; + if (isLast) { + if (utils$1.hasOwnProp(target, name)) { + target[name] = [target[name], value]; + } else { + target[name] = value; + } + return !isNumericKey; + } + if (!target[name] || !utils$1.isObject(target[name])) { + target[name] = []; + } + var result = buildPath(path, value, target[name], index); + if (result && utils$1.isArray(target[name])) { + target[name] = arrayToObject(target[name]); + } + return !isNumericKey; + } + if (utils$1.isFormData(formData) && utils$1.isFunction(formData.entries)) { + var obj = {}; + utils$1.forEachEntry(formData, function (name, value) { + buildPath(parsePropPath(name), value, obj, 0); + }); + return obj; + } + return null; + } + + /** + * It takes a string, tries to parse it, and if it fails, it returns the stringified version + * of the input + * + * @param {any} rawValue - The value to be stringified. + * @param {Function} parser - A function that parses a string into a JavaScript object. + * @param {Function} encoder - A function that takes a value and returns a string. + * + * @returns {string} A stringified version of the rawValue. + */ + function stringifySafely(rawValue, parser, encoder) { + if (utils$1.isString(rawValue)) { + try { + (parser || JSON.parse)(rawValue); + return utils$1.trim(rawValue); + } catch (e) { + if (e.name !== 'SyntaxError') { + throw e; + } + } + } + return (encoder || JSON.stringify)(rawValue); + } + var defaults = { + transitional: transitionalDefaults, + adapter: ['xhr', 'http'], + transformRequest: [function transformRequest(data, headers) { + var contentType = headers.getContentType() || ''; + var hasJSONContentType = contentType.indexOf('application/json') > -1; + var isObjectPayload = utils$1.isObject(data); + if (isObjectPayload && utils$1.isHTMLForm(data)) { + data = new FormData(data); + } + var isFormData = utils$1.isFormData(data); + if (isFormData) { + if (!hasJSONContentType) { + return data; + } + return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data; + } + if (utils$1.isArrayBuffer(data) || utils$1.isBuffer(data) || utils$1.isStream(data) || utils$1.isFile(data) || utils$1.isBlob(data)) { + return data; + } + if (utils$1.isArrayBufferView(data)) { + return data.buffer; + } + if (utils$1.isURLSearchParams(data)) { + headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false); + return data.toString(); + } + var isFileList; + if (isObjectPayload) { + if (contentType.indexOf('application/x-www-form-urlencoded') > -1) { + return toURLEncodedForm(data, this.formSerializer).toString(); + } + if ((isFileList = utils$1.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) { + var _FormData = this.env && this.env.FormData; + return toFormData(isFileList ? { + 'files[]': data + } : data, _FormData && new _FormData(), this.formSerializer); + } + } + if (isObjectPayload || hasJSONContentType) { + headers.setContentType('application/json', false); + return stringifySafely(data); + } + return data; + }], + transformResponse: [function transformResponse(data) { + var transitional = this.transitional || defaults.transitional; + var forcedJSONParsing = transitional && transitional.forcedJSONParsing; + var JSONRequested = this.responseType === 'json'; + if (data && utils$1.isString(data) && (forcedJSONParsing && !this.responseType || JSONRequested)) { + var silentJSONParsing = transitional && transitional.silentJSONParsing; + var strictJSONParsing = !silentJSONParsing && JSONRequested; + try { + return JSON.parse(data); + } catch (e) { + if (strictJSONParsing) { + if (e.name === 'SyntaxError') { + throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response); + } + throw e; + } + } + } + return data; + }], + /** + * A timeout in milliseconds to abort a request. If set to 0 (default) a + * timeout is not created. + */ + timeout: 0, + xsrfCookieName: 'XSRF-TOKEN', + xsrfHeaderName: 'X-XSRF-TOKEN', + maxContentLength: -1, + maxBodyLength: -1, + env: { + FormData: platform.classes.FormData, + Blob: platform.classes.Blob + }, + validateStatus: function validateStatus(status) { + return status >= 200 && status < 300; + }, + headers: { + common: { + 'Accept': 'application/json, text/plain, */*', + 'Content-Type': undefined + } + } + }; + utils$1.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], function (method) { + defaults.headers[method] = {}; + }); + var defaults$1 = defaults; + + // RawAxiosHeaders whose duplicates are ignored by node + // c.f. https://nodejs.org/api/http.html#http_message_headers + var ignoreDuplicateOf = utils$1.toObjectSet(['age', 'authorization', 'content-length', 'content-type', 'etag', 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', 'last-modified', 'location', 'max-forwards', 'proxy-authorization', 'referer', 'retry-after', 'user-agent']); + + /** + * Parse headers into an object + * + * ``` + * Date: Wed, 27 Aug 2014 08:58:49 GMT + * Content-Type: application/json + * Connection: keep-alive + * Transfer-Encoding: chunked + * ``` + * + * @param {String} rawHeaders Headers needing to be parsed + * + * @returns {Object} Headers parsed into an object + */ + var parseHeaders = (function (rawHeaders) { + var parsed = {}; + var key; + var val; + var i; + rawHeaders && rawHeaders.split('\n').forEach(function parser(line) { + i = line.indexOf(':'); + key = line.substring(0, i).trim().toLowerCase(); + val = line.substring(i + 1).trim(); + if (!key || parsed[key] && ignoreDuplicateOf[key]) { + return; + } + if (key === 'set-cookie') { + if (parsed[key]) { + parsed[key].push(val); + } else { + parsed[key] = [val]; + } + } else { + parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; + } + }); + return parsed; + }); + + var $internals = Symbol('internals'); + function normalizeHeader(header) { + return header && String(header).trim().toLowerCase(); + } + function normalizeValue(value) { + if (value === false || value == null) { + return value; + } + return utils$1.isArray(value) ? value.map(normalizeValue) : String(value); + } + function parseTokens(str) { + var tokens = Object.create(null); + var tokensRE = /([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g; + var match; + while (match = tokensRE.exec(str)) { + tokens[match[1]] = match[2]; + } + return tokens; + } + var isValidHeaderName = function isValidHeaderName(str) { + return /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim()); + }; + function matchHeaderValue(context, value, header, filter, isHeaderNameFilter) { + if (utils$1.isFunction(filter)) { + return filter.call(this, value, header); + } + if (isHeaderNameFilter) { + value = header; + } + if (!utils$1.isString(value)) return; + if (utils$1.isString(filter)) { + return value.indexOf(filter) !== -1; + } + if (utils$1.isRegExp(filter)) { + return filter.test(value); + } + } + function formatHeader(header) { + return header.trim().toLowerCase().replace(/([a-z\d])(\w*)/g, function (w, _char, str) { + return _char.toUpperCase() + str; + }); + } + function buildAccessors(obj, header) { + var accessorName = utils$1.toCamelCase(' ' + header); + ['get', 'set', 'has'].forEach(function (methodName) { + Object.defineProperty(obj, methodName + accessorName, { + value: function value(arg1, arg2, arg3) { + return this[methodName].call(this, header, arg1, arg2, arg3); + }, + configurable: true + }); + }); + } + var AxiosHeaders = /*#__PURE__*/function (_Symbol$iterator, _Symbol$toStringTag) { + function AxiosHeaders(headers) { + _classCallCheck(this, AxiosHeaders); + headers && this.set(headers); + } + _createClass(AxiosHeaders, [{ + key: "set", + value: function set(header, valueOrRewrite, rewrite) { + var self = this; + function setHeader(_value, _header, _rewrite) { + var lHeader = normalizeHeader(_header); + if (!lHeader) { + throw new Error('header name must be a non-empty string'); + } + var key = utils$1.findKey(self, lHeader); + if (!key || self[key] === undefined || _rewrite === true || _rewrite === undefined && self[key] !== false) { + self[key || _header] = normalizeValue(_value); + } + } + var setHeaders = function setHeaders(headers, _rewrite) { + return utils$1.forEach(headers, function (_value, _header) { + return setHeader(_value, _header, _rewrite); + }); + }; + if (utils$1.isPlainObject(header) || header instanceof this.constructor) { + setHeaders(header, valueOrRewrite); + } else if (utils$1.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) { + setHeaders(parseHeaders(header), valueOrRewrite); + } else { + header != null && setHeader(valueOrRewrite, header, rewrite); + } + return this; + } + }, { + key: "get", + value: function get(header, parser) { + header = normalizeHeader(header); + if (header) { + var key = utils$1.findKey(this, header); + if (key) { + var value = this[key]; + if (!parser) { + return value; + } + if (parser === true) { + return parseTokens(value); + } + if (utils$1.isFunction(parser)) { + return parser.call(this, value, key); + } + if (utils$1.isRegExp(parser)) { + return parser.exec(value); + } + throw new TypeError('parser must be boolean|regexp|function'); + } + } + } + }, { + key: "has", + value: function has(header, matcher) { + header = normalizeHeader(header); + if (header) { + var key = utils$1.findKey(this, header); + return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher))); + } + return false; + } + }, { + key: "delete", + value: function _delete(header, matcher) { + var self = this; + var deleted = false; + function deleteHeader(_header) { + _header = normalizeHeader(_header); + if (_header) { + var key = utils$1.findKey(self, _header); + if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) { + delete self[key]; + deleted = true; + } + } + } + if (utils$1.isArray(header)) { + header.forEach(deleteHeader); + } else { + deleteHeader(header); + } + return deleted; + } + }, { + key: "clear", + value: function clear(matcher) { + var keys = Object.keys(this); + var i = keys.length; + var deleted = false; + while (i--) { + var key = keys[i]; + if (!matcher || matchHeaderValue(this, this[key], key, matcher, true)) { + delete this[key]; + deleted = true; + } + } + return deleted; + } + }, { + key: "normalize", + value: function normalize(format) { + var self = this; + var headers = {}; + utils$1.forEach(this, function (value, header) { + var key = utils$1.findKey(headers, header); + if (key) { + self[key] = normalizeValue(value); + delete self[header]; + return; + } + var normalized = format ? formatHeader(header) : String(header).trim(); + if (normalized !== header) { + delete self[header]; + } + self[normalized] = normalizeValue(value); + headers[normalized] = true; + }); + return this; + } + }, { + key: "concat", + value: function concat() { + var _this$constructor; + for (var _len = arguments.length, targets = new Array(_len), _key = 0; _key < _len; _key++) { + targets[_key] = arguments[_key]; + } + return (_this$constructor = this.constructor).concat.apply(_this$constructor, [this].concat(targets)); + } + }, { + key: "toJSON", + value: function toJSON(asStrings) { + var obj = Object.create(null); + utils$1.forEach(this, function (value, header) { + value != null && value !== false && (obj[header] = asStrings && utils$1.isArray(value) ? value.join(', ') : value); + }); + return obj; + } + }, { + key: _Symbol$iterator, + value: function value() { + return Object.entries(this.toJSON())[Symbol.iterator](); + } + }, { + key: "toString", + value: function toString() { + return Object.entries(this.toJSON()).map(function (_ref) { + var _ref2 = _slicedToArray(_ref, 2), + header = _ref2[0], + value = _ref2[1]; + return header + ': ' + value; + }).join('\n'); + } + }, { + key: _Symbol$toStringTag, + get: function get() { + return 'AxiosHeaders'; + } + }], [{ + key: "from", + value: function from(thing) { + return thing instanceof this ? thing : new this(thing); + } + }, { + key: "concat", + value: function concat(first) { + var computed = new this(first); + for (var _len2 = arguments.length, targets = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + targets[_key2 - 1] = arguments[_key2]; + } + targets.forEach(function (target) { + return computed.set(target); + }); + return computed; + } + }, { + key: "accessor", + value: function accessor(header) { + var internals = this[$internals] = this[$internals] = { + accessors: {} + }; + var accessors = internals.accessors; + var prototype = this.prototype; + function defineAccessor(_header) { + var lHeader = normalizeHeader(_header); + if (!accessors[lHeader]) { + buildAccessors(prototype, _header); + accessors[lHeader] = true; + } + } + utils$1.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header); + return this; + } + }]); + return AxiosHeaders; + }(Symbol.iterator, Symbol.toStringTag); + AxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']); + + // reserved names hotfix + utils$1.reduceDescriptors(AxiosHeaders.prototype, function (_ref3, key) { + var value = _ref3.value; + var mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set` + return { + get: function get() { + return value; + }, + set: function set(headerValue) { + this[mapped] = headerValue; + } + }; + }); + utils$1.freezeMethods(AxiosHeaders); + var AxiosHeaders$1 = AxiosHeaders; + + /** + * Transform the data for a request or a response + * + * @param {Array|Function} fns A single function or Array of functions + * @param {?Object} response The response object + * + * @returns {*} The resulting transformed data + */ + function transformData(fns, response) { + var config = this || defaults$1; + var context = response || config; + var headers = AxiosHeaders$1.from(context.headers); + var data = context.data; + utils$1.forEach(fns, function transform(fn) { + data = fn.call(config, data, headers.normalize(), response ? response.status : undefined); + }); + headers.normalize(); + return data; + } + + function isCancel(value) { + return !!(value && value.__CANCEL__); + } + + /** + * A `CanceledError` is an object that is thrown when an operation is canceled. + * + * @param {string=} message The message. + * @param {Object=} config The config. + * @param {Object=} request The request. + * + * @returns {CanceledError} The created error. + */ + function CanceledError(message, config, request) { + // eslint-disable-next-line no-eq-null,eqeqeq + AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request); + this.name = 'CanceledError'; + } + utils$1.inherits(CanceledError, AxiosError, { + __CANCEL__: true + }); + + /** + * Resolve or reject a Promise based on response status. + * + * @param {Function} resolve A function that resolves the promise. + * @param {Function} reject A function that rejects the promise. + * @param {object} response The response. + * + * @returns {object} The response. + */ + function settle(resolve, reject, response) { + var validateStatus = response.config.validateStatus; + if (!response.status || !validateStatus || validateStatus(response.status)) { + resolve(response); + } else { + reject(new AxiosError('Request failed with status code ' + response.status, [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4], response.config, response.request, response)); + } + } + + var cookies = platform.hasStandardBrowserEnv ? + // Standard browser envs support document.cookie + { + write: function write(name, value, expires, path, domain, secure) { + var cookie = [name + '=' + encodeURIComponent(value)]; + utils$1.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString()); + utils$1.isString(path) && cookie.push('path=' + path); + utils$1.isString(domain) && cookie.push('domain=' + domain); + secure === true && cookie.push('secure'); + document.cookie = cookie.join('; '); + }, + read: function read(name) { + var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)')); + return match ? decodeURIComponent(match[3]) : null; + }, + remove: function remove(name) { + this.write(name, '', Date.now() - 86400000); + } + } : + // Non-standard browser env (web workers, react-native) lack needed support. + { + write: function write() {}, + read: function read() { + return null; + }, + remove: function remove() {} + }; + + /** + * Determines whether the specified URL is absolute + * + * @param {string} url The URL to test + * + * @returns {boolean} True if the specified URL is absolute, otherwise false + */ + function isAbsoluteURL(url) { + // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL). + // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed + // by any combination of letters, digits, plus, period, or hyphen. + return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url); + } + + /** + * Creates a new URL by combining the specified URLs + * + * @param {string} baseURL The base URL + * @param {string} relativeURL The relative URL + * + * @returns {string} The combined URL + */ + function combineURLs(baseURL, relativeURL) { + return relativeURL ? baseURL.replace(/\/?\/$/, '') + '/' + relativeURL.replace(/^\/+/, '') : baseURL; + } + + /** + * Creates a new URL by combining the baseURL with the requestedURL, + * only when the requestedURL is not already an absolute URL. + * If the requestURL is absolute, this function returns the requestedURL untouched. + * + * @param {string} baseURL The base URL + * @param {string} requestedURL Absolute or relative URL to combine + * + * @returns {string} The combined full path + */ + function buildFullPath(baseURL, requestedURL) { + if (baseURL && !isAbsoluteURL(requestedURL)) { + return combineURLs(baseURL, requestedURL); + } + return requestedURL; + } + + var isURLSameOrigin = platform.hasStandardBrowserEnv ? + // Standard browser envs have full support of the APIs needed to test + // whether the request URL is of the same origin as current location. + function standardBrowserEnv() { + var msie = /(msie|trident)/i.test(navigator.userAgent); + var urlParsingNode = document.createElement('a'); + var originURL; + + /** + * Parse a URL to discover its components + * + * @param {String} url The URL to be parsed + * @returns {Object} + */ + function resolveURL(url) { + var href = url; + if (msie) { + // IE needs attribute set twice to normalize properties + urlParsingNode.setAttribute('href', href); + href = urlParsingNode.href; + } + urlParsingNode.setAttribute('href', href); + + // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils + return { + href: urlParsingNode.href, + protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', + host: urlParsingNode.host, + search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', + hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', + hostname: urlParsingNode.hostname, + port: urlParsingNode.port, + pathname: urlParsingNode.pathname.charAt(0) === '/' ? urlParsingNode.pathname : '/' + urlParsingNode.pathname + }; + } + originURL = resolveURL(window.location.href); + + /** + * Determine if a URL shares the same origin as the current location + * + * @param {String} requestURL The URL to test + * @returns {boolean} True if URL shares the same origin, otherwise false + */ + return function isURLSameOrigin(requestURL) { + var parsed = utils$1.isString(requestURL) ? resolveURL(requestURL) : requestURL; + return parsed.protocol === originURL.protocol && parsed.host === originURL.host; + }; + }() : + // Non standard browser envs (web workers, react-native) lack needed support. + function nonStandardBrowserEnv() { + return function isURLSameOrigin() { + return true; + }; + }(); + + function parseProtocol(url) { + var match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url); + return match && match[1] || ''; + } + + /** + * Calculate data maxRate + * @param {Number} [samplesCount= 10] + * @param {Number} [min= 1000] + * @returns {Function} + */ + function speedometer(samplesCount, min) { + samplesCount = samplesCount || 10; + var bytes = new Array(samplesCount); + var timestamps = new Array(samplesCount); + var head = 0; + var tail = 0; + var firstSampleTS; + min = min !== undefined ? min : 1000; + return function push(chunkLength) { + var now = Date.now(); + var startedAt = timestamps[tail]; + if (!firstSampleTS) { + firstSampleTS = now; + } + bytes[head] = chunkLength; + timestamps[head] = now; + var i = tail; + var bytesCount = 0; + while (i !== head) { + bytesCount += bytes[i++]; + i = i % samplesCount; + } + head = (head + 1) % samplesCount; + if (head === tail) { + tail = (tail + 1) % samplesCount; + } + if (now - firstSampleTS < min) { + return; + } + var passed = startedAt && now - startedAt; + return passed ? Math.round(bytesCount * 1000 / passed) : undefined; + }; + } + + function progressEventReducer(listener, isDownloadStream) { + var bytesNotified = 0; + var _speedometer = speedometer(50, 250); + return function (e) { + var loaded = e.loaded; + var total = e.lengthComputable ? e.total : undefined; + var progressBytes = loaded - bytesNotified; + var rate = _speedometer(progressBytes); + var inRange = loaded <= total; + bytesNotified = loaded; + var data = { + loaded: loaded, + total: total, + progress: total ? loaded / total : undefined, + bytes: progressBytes, + rate: rate ? rate : undefined, + estimated: rate && total && inRange ? (total - loaded) / rate : undefined, + event: e + }; + data[isDownloadStream ? 'download' : 'upload'] = true; + listener(data); + }; + } + var isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined'; + var xhrAdapter = isXHRAdapterSupported && function (config) { + return new Promise(function dispatchXhrRequest(resolve, reject) { + var requestData = config.data; + var requestHeaders = AxiosHeaders$1.from(config.headers).normalize(); + var responseType = config.responseType, + withXSRFToken = config.withXSRFToken; + var onCanceled; + function done() { + if (config.cancelToken) { + config.cancelToken.unsubscribe(onCanceled); + } + if (config.signal) { + config.signal.removeEventListener('abort', onCanceled); + } + } + var contentType; + if (utils$1.isFormData(requestData)) { + if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) { + requestHeaders.setContentType(false); // Let the browser set it + } else if ((contentType = requestHeaders.getContentType()) !== false) { + // fix semicolon duplication issue for ReactNative FormData implementation + var _ref = contentType ? contentType.split(';').map(function (token) { + return token.trim(); + }).filter(Boolean) : [], + _ref2 = _toArray(_ref), + type = _ref2[0], + tokens = _ref2.slice(1); + requestHeaders.setContentType([type || 'multipart/form-data'].concat(_toConsumableArray(tokens)).join('; ')); + } + } + var request = new XMLHttpRequest(); + + // HTTP basic authentication + if (config.auth) { + var username = config.auth.username || ''; + var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : ''; + requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password)); + } + var fullPath = buildFullPath(config.baseURL, config.url); + request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true); + + // Set the request timeout in MS + request.timeout = config.timeout; + function onloadend() { + if (!request) { + return; + } + // Prepare the response + var responseHeaders = AxiosHeaders$1.from('getAllResponseHeaders' in request && request.getAllResponseHeaders()); + var responseData = !responseType || responseType === 'text' || responseType === 'json' ? request.responseText : request.response; + var response = { + data: responseData, + status: request.status, + statusText: request.statusText, + headers: responseHeaders, + config: config, + request: request + }; + settle(function _resolve(value) { + resolve(value); + done(); + }, function _reject(err) { + reject(err); + done(); + }, response); + + // Clean up request + request = null; + } + if ('onloadend' in request) { + // Use onloadend if available + request.onloadend = onloadend; + } else { + // Listen for ready state to emulate onloadend + request.onreadystatechange = function handleLoad() { + if (!request || request.readyState !== 4) { + return; + } + + // The request errored out and we didn't get a response, this will be + // handled by onerror instead + // With one exception: request that using file: protocol, most browsers + // will return status as 0 even though it's a successful request + if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) { + return; + } + // readystate handler is calling before onerror or ontimeout handlers, + // so we should call onloadend on the next 'tick' + setTimeout(onloadend); + }; + } + + // Handle browser request cancellation (as opposed to a manual cancellation) + request.onabort = function handleAbort() { + if (!request) { + return; + } + reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request)); + + // Clean up request + request = null; + }; + + // Handle low level network errors + request.onerror = function handleError() { + // Real errors are hidden from us by the browser + // onerror should only fire if it's a network error + reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request)); + + // Clean up request + request = null; + }; + + // Handle timeout + request.ontimeout = function handleTimeout() { + var timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded'; + var transitional = config.transitional || transitionalDefaults; + if (config.timeoutErrorMessage) { + timeoutErrorMessage = config.timeoutErrorMessage; + } + reject(new AxiosError(timeoutErrorMessage, transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED, config, request)); + + // Clean up request + request = null; + }; + + // Add xsrf header + // This is only done if running in a standard browser environment. + // Specifically not if we're in a web worker, or react-native. + if (platform.hasStandardBrowserEnv) { + withXSRFToken && utils$1.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(config)); + if (withXSRFToken || withXSRFToken !== false && isURLSameOrigin(fullPath)) { + // Add xsrf header + var xsrfValue = config.xsrfHeaderName && config.xsrfCookieName && cookies.read(config.xsrfCookieName); + if (xsrfValue) { + requestHeaders.set(config.xsrfHeaderName, xsrfValue); + } + } + } + + // Remove Content-Type if data is undefined + requestData === undefined && requestHeaders.setContentType(null); + + // Add headers to the request + if ('setRequestHeader' in request) { + utils$1.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) { + request.setRequestHeader(key, val); + }); + } + + // Add withCredentials to request if needed + if (!utils$1.isUndefined(config.withCredentials)) { + request.withCredentials = !!config.withCredentials; + } + + // Add responseType to request if needed + if (responseType && responseType !== 'json') { + request.responseType = config.responseType; + } + + // Handle progress if needed + if (typeof config.onDownloadProgress === 'function') { + request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true)); + } + + // Not all browsers support upload events + if (typeof config.onUploadProgress === 'function' && request.upload) { + request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress)); + } + if (config.cancelToken || config.signal) { + // Handle cancellation + // eslint-disable-next-line func-names + onCanceled = function onCanceled(cancel) { + if (!request) { + return; + } + reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel); + request.abort(); + request = null; + }; + config.cancelToken && config.cancelToken.subscribe(onCanceled); + if (config.signal) { + config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled); + } + } + var protocol = parseProtocol(fullPath); + if (protocol && platform.protocols.indexOf(protocol) === -1) { + reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config)); + return; + } + + // Send the request + request.send(requestData || null); + }); + }; + + var knownAdapters = { + http: httpAdapter, + xhr: xhrAdapter + }; + utils$1.forEach(knownAdapters, function (fn, value) { + if (fn) { + try { + Object.defineProperty(fn, 'name', { + value: value + }); + } catch (e) { + // eslint-disable-next-line no-empty + } + Object.defineProperty(fn, 'adapterName', { + value: value + }); + } + }); + var renderReason = function renderReason(reason) { + return "- ".concat(reason); + }; + var isResolvedHandle = function isResolvedHandle(adapter) { + return utils$1.isFunction(adapter) || adapter === null || adapter === false; + }; + var adapters = { + getAdapter: function getAdapter(adapters) { + adapters = utils$1.isArray(adapters) ? adapters : [adapters]; + var _adapters = adapters, + length = _adapters.length; + var nameOrAdapter; + var adapter; + var rejectedReasons = {}; + for (var i = 0; i < length; i++) { + nameOrAdapter = adapters[i]; + var id = void 0; + adapter = nameOrAdapter; + if (!isResolvedHandle(nameOrAdapter)) { + adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()]; + if (adapter === undefined) { + throw new AxiosError("Unknown adapter '".concat(id, "'")); + } + } + if (adapter) { + break; + } + rejectedReasons[id || '#' + i] = adapter; + } + if (!adapter) { + var reasons = Object.entries(rejectedReasons).map(function (_ref) { + var _ref2 = _slicedToArray(_ref, 2), + id = _ref2[0], + state = _ref2[1]; + return "adapter ".concat(id, " ") + (state === false ? 'is not supported by the environment' : 'is not available in the build'); + }); + var s = length ? reasons.length > 1 ? 'since :\n' + reasons.map(renderReason).join('\n') : ' ' + renderReason(reasons[0]) : 'as no adapter specified'; + throw new AxiosError("There is no suitable adapter to dispatch the request " + s, 'ERR_NOT_SUPPORT'); + } + return adapter; + }, + adapters: knownAdapters + }; + + /** + * Throws a `CanceledError` if cancellation has been requested. + * + * @param {Object} config The config that is to be used for the request + * + * @returns {void} + */ + function throwIfCancellationRequested(config) { + if (config.cancelToken) { + config.cancelToken.throwIfRequested(); + } + if (config.signal && config.signal.aborted) { + throw new CanceledError(null, config); + } + } + + /** + * Dispatch a request to the server using the configured adapter. + * + * @param {object} config The config that is to be used for the request + * + * @returns {Promise} The Promise to be fulfilled + */ + function dispatchRequest(config) { + throwIfCancellationRequested(config); + config.headers = AxiosHeaders$1.from(config.headers); + + // Transform request data + config.data = transformData.call(config, config.transformRequest); + if (['post', 'put', 'patch'].indexOf(config.method) !== -1) { + config.headers.setContentType('application/x-www-form-urlencoded', false); + } + var adapter = adapters.getAdapter(config.adapter || defaults$1.adapter); + return adapter(config).then(function onAdapterResolution(response) { + throwIfCancellationRequested(config); + + // Transform response data + response.data = transformData.call(config, config.transformResponse, response); + response.headers = AxiosHeaders$1.from(response.headers); + return response; + }, function onAdapterRejection(reason) { + if (!isCancel(reason)) { + throwIfCancellationRequested(config); + + // Transform response data + if (reason && reason.response) { + reason.response.data = transformData.call(config, config.transformResponse, reason.response); + reason.response.headers = AxiosHeaders$1.from(reason.response.headers); + } + } + return Promise.reject(reason); + }); + } + + var headersToObject = function headersToObject(thing) { + return thing instanceof AxiosHeaders$1 ? thing.toJSON() : thing; + }; + + /** + * Config-specific merge-function which creates a new config-object + * by merging two configuration objects together. + * + * @param {Object} config1 + * @param {Object} config2 + * + * @returns {Object} New object resulting from merging config2 to config1 + */ + function mergeConfig(config1, config2) { + // eslint-disable-next-line no-param-reassign + config2 = config2 || {}; + var config = {}; + function getMergedValue(target, source, caseless) { + if (utils$1.isPlainObject(target) && utils$1.isPlainObject(source)) { + return utils$1.merge.call({ + caseless: caseless + }, target, source); + } else if (utils$1.isPlainObject(source)) { + return utils$1.merge({}, source); + } else if (utils$1.isArray(source)) { + return source.slice(); + } + return source; + } + + // eslint-disable-next-line consistent-return + function mergeDeepProperties(a, b, caseless) { + if (!utils$1.isUndefined(b)) { + return getMergedValue(a, b, caseless); + } else if (!utils$1.isUndefined(a)) { + return getMergedValue(undefined, a, caseless); + } + } + + // eslint-disable-next-line consistent-return + function valueFromConfig2(a, b) { + if (!utils$1.isUndefined(b)) { + return getMergedValue(undefined, b); + } + } + + // eslint-disable-next-line consistent-return + function defaultToConfig2(a, b) { + if (!utils$1.isUndefined(b)) { + return getMergedValue(undefined, b); + } else if (!utils$1.isUndefined(a)) { + return getMergedValue(undefined, a); + } + } + + // eslint-disable-next-line consistent-return + function mergeDirectKeys(a, b, prop) { + if (prop in config2) { + return getMergedValue(a, b); + } else if (prop in config1) { + return getMergedValue(undefined, a); + } + } + var mergeMap = { + url: valueFromConfig2, + method: valueFromConfig2, + data: valueFromConfig2, + baseURL: defaultToConfig2, + transformRequest: defaultToConfig2, + transformResponse: defaultToConfig2, + paramsSerializer: defaultToConfig2, + timeout: defaultToConfig2, + timeoutMessage: defaultToConfig2, + withCredentials: defaultToConfig2, + withXSRFToken: defaultToConfig2, + adapter: defaultToConfig2, + responseType: defaultToConfig2, + xsrfCookieName: defaultToConfig2, + xsrfHeaderName: defaultToConfig2, + onUploadProgress: defaultToConfig2, + onDownloadProgress: defaultToConfig2, + decompress: defaultToConfig2, + maxContentLength: defaultToConfig2, + maxBodyLength: defaultToConfig2, + beforeRedirect: defaultToConfig2, + transport: defaultToConfig2, + httpAgent: defaultToConfig2, + httpsAgent: defaultToConfig2, + cancelToken: defaultToConfig2, + socketPath: defaultToConfig2, + responseEncoding: defaultToConfig2, + validateStatus: mergeDirectKeys, + headers: function headers(a, b) { + return mergeDeepProperties(headersToObject(a), headersToObject(b), true); + } + }; + utils$1.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) { + var merge = mergeMap[prop] || mergeDeepProperties; + var configValue = merge(config1[prop], config2[prop], prop); + utils$1.isUndefined(configValue) && merge !== mergeDirectKeys || (config[prop] = configValue); + }); + return config; + } + + var VERSION = "1.6.4"; + + var validators$1 = {}; + + // eslint-disable-next-line func-names + ['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function (type, i) { + validators$1[type] = function validator(thing) { + return _typeof(thing) === type || 'a' + (i < 1 ? 'n ' : ' ') + type; + }; + }); + var deprecatedWarnings = {}; + + /** + * Transitional option validator + * + * @param {function|boolean?} validator - set to false if the transitional option has been removed + * @param {string?} version - deprecated version / removed since version + * @param {string?} message - some message with additional info + * + * @returns {function} + */ + validators$1.transitional = function transitional(validator, version, message) { + function formatMessage(opt, desc) { + return '[Axios v' + VERSION + '] Transitional option \'' + opt + '\'' + desc + (message ? '. ' + message : ''); + } + + // eslint-disable-next-line func-names + return function (value, opt, opts) { + if (validator === false) { + throw new AxiosError(formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')), AxiosError.ERR_DEPRECATED); + } + if (version && !deprecatedWarnings[opt]) { + deprecatedWarnings[opt] = true; + // eslint-disable-next-line no-console + console.warn(formatMessage(opt, ' has been deprecated since v' + version + ' and will be removed in the near future')); + } + return validator ? validator(value, opt, opts) : true; + }; + }; + + /** + * Assert object's properties type + * + * @param {object} options + * @param {object} schema + * @param {boolean?} allowUnknown + * + * @returns {object} + */ + + function assertOptions(options, schema, allowUnknown) { + if (_typeof(options) !== 'object') { + throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE); + } + var keys = Object.keys(options); + var i = keys.length; + while (i-- > 0) { + var opt = keys[i]; + var validator = schema[opt]; + if (validator) { + var value = options[opt]; + var result = value === undefined || validator(value, opt, options); + if (result !== true) { + throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE); + } + continue; + } + if (allowUnknown !== true) { + throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION); + } + } + } + var validator = { + assertOptions: assertOptions, + validators: validators$1 + }; + + var validators = validator.validators; + + /** + * Create a new instance of Axios + * + * @param {Object} instanceConfig The default config for the instance + * + * @return {Axios} A new instance of Axios + */ + var Axios = /*#__PURE__*/function () { + function Axios(instanceConfig) { + _classCallCheck(this, Axios); + this.defaults = instanceConfig; + this.interceptors = { + request: new InterceptorManager$1(), + response: new InterceptorManager$1() + }; + } + + /** + * Dispatch a request + * + * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults) + * @param {?Object} config + * + * @returns {Promise} The Promise to be fulfilled + */ + _createClass(Axios, [{ + key: "request", + value: function request(configOrUrl, config) { + /*eslint no-param-reassign:0*/ + // Allow for axios('example/url'[, config]) a la fetch API + if (typeof configOrUrl === 'string') { + config = config || {}; + config.url = configOrUrl; + } else { + config = configOrUrl || {}; + } + config = mergeConfig(this.defaults, config); + var _config = config, + transitional = _config.transitional, + paramsSerializer = _config.paramsSerializer, + headers = _config.headers; + if (transitional !== undefined) { + validator.assertOptions(transitional, { + silentJSONParsing: validators.transitional(validators["boolean"]), + forcedJSONParsing: validators.transitional(validators["boolean"]), + clarifyTimeoutError: validators.transitional(validators["boolean"]) + }, false); + } + if (paramsSerializer != null) { + if (utils$1.isFunction(paramsSerializer)) { + config.paramsSerializer = { + serialize: paramsSerializer + }; + } else { + validator.assertOptions(paramsSerializer, { + encode: validators["function"], + serialize: validators["function"] + }, true); + } + } + + // Set config.method + config.method = (config.method || this.defaults.method || 'get').toLowerCase(); + + // Flatten headers + var contextHeaders = headers && utils$1.merge(headers.common, headers[config.method]); + headers && utils$1.forEach(['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], function (method) { + delete headers[method]; + }); + config.headers = AxiosHeaders$1.concat(contextHeaders, headers); + + // filter out skipped interceptors + var requestInterceptorChain = []; + var synchronousRequestInterceptors = true; + this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { + if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) { + return; + } + synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous; + requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected); + }); + var responseInterceptorChain = []; + this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { + responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected); + }); + var promise; + var i = 0; + var len; + if (!synchronousRequestInterceptors) { + var chain = [dispatchRequest.bind(this), undefined]; + chain.unshift.apply(chain, requestInterceptorChain); + chain.push.apply(chain, responseInterceptorChain); + len = chain.length; + promise = Promise.resolve(config); + while (i < len) { + promise = promise.then(chain[i++], chain[i++]); + } + return promise; + } + len = requestInterceptorChain.length; + var newConfig = config; + i = 0; + while (i < len) { + var onFulfilled = requestInterceptorChain[i++]; + var onRejected = requestInterceptorChain[i++]; + try { + newConfig = onFulfilled(newConfig); + } catch (error) { + onRejected.call(this, error); + break; + } + } + try { + promise = dispatchRequest.call(this, newConfig); + } catch (error) { + return Promise.reject(error); + } + i = 0; + len = responseInterceptorChain.length; + while (i < len) { + promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]); + } + return promise; + } + }, { + key: "getUri", + value: function getUri(config) { + config = mergeConfig(this.defaults, config); + var fullPath = buildFullPath(config.baseURL, config.url); + return buildURL(fullPath, config.params, config.paramsSerializer); + } + }]); + return Axios; + }(); // Provide aliases for supported request methods + utils$1.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { + /*eslint func-names:0*/ + Axios.prototype[method] = function (url, config) { + return this.request(mergeConfig(config || {}, { + method: method, + url: url, + data: (config || {}).data + })); + }; + }); + utils$1.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { + /*eslint func-names:0*/ + + function generateHTTPMethod(isForm) { + return function httpMethod(url, data, config) { + return this.request(mergeConfig(config || {}, { + method: method, + headers: isForm ? { + 'Content-Type': 'multipart/form-data' + } : {}, + url: url, + data: data + })); + }; + } + Axios.prototype[method] = generateHTTPMethod(); + Axios.prototype[method + 'Form'] = generateHTTPMethod(true); + }); + var Axios$1 = Axios; + + /** + * A `CancelToken` is an object that can be used to request cancellation of an operation. + * + * @param {Function} executor The executor function. + * + * @returns {CancelToken} + */ + var CancelToken = /*#__PURE__*/function () { + function CancelToken(executor) { + _classCallCheck(this, CancelToken); + if (typeof executor !== 'function') { + throw new TypeError('executor must be a function.'); + } + var resolvePromise; + this.promise = new Promise(function promiseExecutor(resolve) { + resolvePromise = resolve; + }); + var token = this; + + // eslint-disable-next-line func-names + this.promise.then(function (cancel) { + if (!token._listeners) return; + var i = token._listeners.length; + while (i-- > 0) { + token._listeners[i](cancel); + } + token._listeners = null; + }); + + // eslint-disable-next-line func-names + this.promise.then = function (onfulfilled) { + var _resolve; + // eslint-disable-next-line func-names + var promise = new Promise(function (resolve) { + token.subscribe(resolve); + _resolve = resolve; + }).then(onfulfilled); + promise.cancel = function reject() { + token.unsubscribe(_resolve); + }; + return promise; + }; + executor(function cancel(message, config, request) { + if (token.reason) { + // Cancellation has already been requested + return; + } + token.reason = new CanceledError(message, config, request); + resolvePromise(token.reason); + }); + } + + /** + * Throws a `CanceledError` if cancellation has been requested. + */ + _createClass(CancelToken, [{ + key: "throwIfRequested", + value: function throwIfRequested() { + if (this.reason) { + throw this.reason; + } + } + + /** + * Subscribe to the cancel signal + */ + }, { + key: "subscribe", + value: function subscribe(listener) { + if (this.reason) { + listener(this.reason); + return; + } + if (this._listeners) { + this._listeners.push(listener); + } else { + this._listeners = [listener]; + } + } + + /** + * Unsubscribe from the cancel signal + */ + }, { + key: "unsubscribe", + value: function unsubscribe(listener) { + if (!this._listeners) { + return; + } + var index = this._listeners.indexOf(listener); + if (index !== -1) { + this._listeners.splice(index, 1); + } + } + + /** + * Returns an object that contains a new `CancelToken` and a function that, when called, + * cancels the `CancelToken`. + */ + }], [{ + key: "source", + value: function source() { + var cancel; + var token = new CancelToken(function executor(c) { + cancel = c; + }); + return { + token: token, + cancel: cancel + }; + } + }]); + return CancelToken; + }(); + var CancelToken$1 = CancelToken; + + /** + * Syntactic sugar for invoking a function and expanding an array for arguments. + * + * Common use case would be to use `Function.prototype.apply`. + * + * ```js + * function f(x, y, z) {} + * var args = [1, 2, 3]; + * f.apply(null, args); + * ``` + * + * With `spread` this example can be re-written. + * + * ```js + * spread(function(x, y, z) {})([1, 2, 3]); + * ``` + * + * @param {Function} callback + * + * @returns {Function} + */ + function spread(callback) { + return function wrap(arr) { + return callback.apply(null, arr); + }; + } + + /** + * Determines whether the payload is an error thrown by Axios + * + * @param {*} payload The value to test + * + * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false + */ + function isAxiosError(payload) { + return utils$1.isObject(payload) && payload.isAxiosError === true; + } + + var HttpStatusCode = { + Continue: 100, + SwitchingProtocols: 101, + Processing: 102, + EarlyHints: 103, + Ok: 200, + Created: 201, + Accepted: 202, + NonAuthoritativeInformation: 203, + NoContent: 204, + ResetContent: 205, + PartialContent: 206, + MultiStatus: 207, + AlreadyReported: 208, + ImUsed: 226, + MultipleChoices: 300, + MovedPermanently: 301, + Found: 302, + SeeOther: 303, + NotModified: 304, + UseProxy: 305, + Unused: 306, + TemporaryRedirect: 307, + PermanentRedirect: 308, + BadRequest: 400, + Unauthorized: 401, + PaymentRequired: 402, + Forbidden: 403, + NotFound: 404, + MethodNotAllowed: 405, + NotAcceptable: 406, + ProxyAuthenticationRequired: 407, + RequestTimeout: 408, + Conflict: 409, + Gone: 410, + LengthRequired: 411, + PreconditionFailed: 412, + PayloadTooLarge: 413, + UriTooLong: 414, + UnsupportedMediaType: 415, + RangeNotSatisfiable: 416, + ExpectationFailed: 417, + ImATeapot: 418, + MisdirectedRequest: 421, + UnprocessableEntity: 422, + Locked: 423, + FailedDependency: 424, + TooEarly: 425, + UpgradeRequired: 426, + PreconditionRequired: 428, + TooManyRequests: 429, + RequestHeaderFieldsTooLarge: 431, + UnavailableForLegalReasons: 451, + InternalServerError: 500, + NotImplemented: 501, + BadGateway: 502, + ServiceUnavailable: 503, + GatewayTimeout: 504, + HttpVersionNotSupported: 505, + VariantAlsoNegotiates: 506, + InsufficientStorage: 507, + LoopDetected: 508, + NotExtended: 510, + NetworkAuthenticationRequired: 511 + }; + Object.entries(HttpStatusCode).forEach(function (_ref) { + var _ref2 = _slicedToArray(_ref, 2), + key = _ref2[0], + value = _ref2[1]; + HttpStatusCode[value] = key; + }); + var HttpStatusCode$1 = HttpStatusCode; + + /** + * Create an instance of Axios + * + * @param {Object} defaultConfig The default config for the instance + * + * @returns {Axios} A new instance of Axios + */ + function createInstance(defaultConfig) { + var context = new Axios$1(defaultConfig); + var instance = bind(Axios$1.prototype.request, context); + + // Copy axios.prototype to instance + utils$1.extend(instance, Axios$1.prototype, context, { + allOwnKeys: true + }); + + // Copy context to instance + utils$1.extend(instance, context, null, { + allOwnKeys: true + }); + + // Factory for creating new instances + instance.create = function create(instanceConfig) { + return createInstance(mergeConfig(defaultConfig, instanceConfig)); + }; + return instance; + } + + // Create the default instance to be exported + var axios = createInstance(defaults$1); + + // Expose Axios class to allow class inheritance + axios.Axios = Axios$1; + + // Expose Cancel & CancelToken + axios.CanceledError = CanceledError; + axios.CancelToken = CancelToken$1; + axios.isCancel = isCancel; + axios.VERSION = VERSION; + axios.toFormData = toFormData; + + // Expose AxiosError class + axios.AxiosError = AxiosError; + + // alias for CanceledError for backward compatibility + axios.Cancel = axios.CanceledError; + + // Expose all/spread + axios.all = function all(promises) { + return Promise.all(promises); + }; + axios.spread = spread; + + // Expose isAxiosError + axios.isAxiosError = isAxiosError; + + // Expose mergeConfig + axios.mergeConfig = mergeConfig; + axios.AxiosHeaders = AxiosHeaders$1; + axios.formToJSON = function (thing) { + return formDataToJSON(utils$1.isHTMLForm(thing) ? new FormData(thing) : thing); + }; + axios.getAdapter = adapters.getAdapter; + axios.HttpStatusCode = HttpStatusCode$1; + axios["default"] = axios; + + return axios; + +})); +//# sourceMappingURL=axios.js.map diff --git a/task/node_modules/axios/dist/axios.js.map b/task/node_modules/axios/dist/axios.js.map new file mode 100644 index 0000000..afd1c8d --- /dev/null +++ b/task/node_modules/axios/dist/axios.js.map @@ -0,0 +1 @@ +{"version":3,"file":"axios.js","sources":["../lib/helpers/bind.js","../lib/utils.js","../lib/core/AxiosError.js","../lib/helpers/null.js","../lib/helpers/toFormData.js","../lib/helpers/AxiosURLSearchParams.js","../lib/helpers/buildURL.js","../lib/core/InterceptorManager.js","../lib/defaults/transitional.js","../lib/platform/browser/classes/URLSearchParams.js","../lib/platform/browser/classes/FormData.js","../lib/platform/browser/classes/Blob.js","../lib/platform/browser/index.js","../lib/platform/common/utils.js","../lib/platform/index.js","../lib/helpers/toURLEncodedForm.js","../lib/helpers/formDataToJSON.js","../lib/defaults/index.js","../lib/helpers/parseHeaders.js","../lib/core/AxiosHeaders.js","../lib/core/transformData.js","../lib/cancel/isCancel.js","../lib/cancel/CanceledError.js","../lib/core/settle.js","../lib/helpers/cookies.js","../lib/helpers/isAbsoluteURL.js","../lib/helpers/combineURLs.js","../lib/core/buildFullPath.js","../lib/helpers/isURLSameOrigin.js","../lib/helpers/parseProtocol.js","../lib/helpers/speedometer.js","../lib/adapters/xhr.js","../lib/adapters/adapters.js","../lib/core/dispatchRequest.js","../lib/core/mergeConfig.js","../lib/env/data.js","../lib/helpers/validator.js","../lib/core/Axios.js","../lib/cancel/CancelToken.js","../lib/helpers/spread.js","../lib/helpers/isAxiosError.js","../lib/helpers/HttpStatusCode.js","../lib/axios.js"],"sourcesContent":["'use strict';\n\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n","'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n let kind;\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) || (\n isFunction(thing.append) && (\n (kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n )\n )\n )\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\nfunction findKey(obj, key) {\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const {caseless} = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else {\n result[targetKey] = val;\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[Symbol.iterator];\n\n const iterator = generator.call(obj);\n\n let result;\n\n while ((result = iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n value = +value;\n return Number.isFinite(value) ? value : defaultValue;\n}\n\nconst ALPHA = 'abcdefghijklmnopqrstuvwxyz'\n\nconst DIGIT = '0123456789';\n\nconst ALPHABET = {\n DIGIT,\n ALPHA,\n ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT\n}\n\nconst generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {\n let str = '';\n const {length} = alphabet;\n while (size--) {\n str += alphabet[Math.random() * length|0]\n }\n\n return str;\n}\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]);\n}\n\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n\n const visit = (source, i) => {\n\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n\n if(!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n\n stack[i] = undefined;\n\n return target;\n }\n }\n\n return source;\n }\n\n return visit(obj, 0);\n}\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n ALPHABET,\n generateString,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable\n};\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n response && (this.response = response);\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils.toJSONObject(this.config),\n code: this.code,\n status: this.response && this.response.status ? this.response.status : null\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n AxiosError.call(axiosError, error.message, code, config, request, response);\n\n axiosError.cause = error;\n\n axiosError.name = error.name;\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n","// eslint-disable-next-line strict\nexport default null;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\nimport PlatformFormData from '../platform/node/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (PlatformFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n","'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object} params - The parameters to be converted to a FormData object.\n * @param {Object} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?object} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n","'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n","'use strict';\n\nimport AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';\nexport default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n","'use strict';\n\nexport default typeof FormData !== 'undefined' ? FormData : null;\n","'use strict'\n\nexport default typeof Blob !== 'undefined' ? Blob : null\n","import URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\nimport Blob from './classes/Blob.js'\n\nexport default {\n isBrowser: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob\n },\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n","const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = (\n (product) => {\n return hasBrowserEnv && ['ReactNative', 'NativeScript', 'NS'].indexOf(product) < 0\n })(typeof navigator !== 'undefined' && navigator.product);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope &&\n typeof self.importScripts === 'function'\n );\n})();\n\nexport {\n hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv\n}\n","import platform from './node/index.js';\nimport * as utils from './common/utils.js';\n\nexport default {\n ...utils,\n ...platform\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n }\n }, options));\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n\n if (name === '__proto__') return true;\n\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: ['xhr', 'http'],\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n if (!hasJSONContentType) {\n return data;\n }\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*',\n 'Content-Type': undefined\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n defaults.headers[method] = {};\n});\n\nexport default defaults;\n","'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = utils.findKey(self, lHeader);\n\n if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n\n const setHeaders = (headers, _rewrite) =>\n utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite)\n } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n }\n\n get(header, parser) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n\n has(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n }\n\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = utils.findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n }\n\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n\n while (i--) {\n const key = keys[i];\n if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n\n return deleted;\n }\n\n normalize(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = utils.findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n }\n\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n\n toJSON(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n });\n\n return obj;\n }\n\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n\n static concat(first, ...targets) {\n const computed = new this(first);\n\n targets.forEach((target) => computed.set(target));\n\n return computed;\n }\n\n static accessor(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n }\n }\n});\n\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n","'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n","'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n","'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n","import utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n // Standard browser envs support document.cookie\n {\n write(name, value, expires, path, domain, secure) {\n const cookie = [name + '=' + encodeURIComponent(value)];\n\n utils.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n\n utils.isString(path) && cookie.push('path=' + path);\n\n utils.isString(domain) && cookie.push('domain=' + domain);\n\n secure === true && cookie.push('secure');\n\n document.cookie = cookie.join('; ');\n },\n\n read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n }\n\n :\n\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {},\n read() {\n return null;\n },\n remove() {}\n };\n\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n","'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n","'use strict';\n\nimport utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n// Standard browser envs have full support of the APIs needed to test\n// whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n const msie = /(msie|trident)/i.test(navigator.userAgent);\n const urlParsingNode = document.createElement('a');\n let originURL;\n\n /**\n * Parse a URL to discover its components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n let href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n const parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })();\n","'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n","'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n","'use strict';\n\nimport utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport cookies from './../helpers/cookies.js';\nimport buildURL from './../helpers/buildURL.js';\nimport buildFullPath from '../core/buildFullPath.js';\nimport isURLSameOrigin from './../helpers/isURLSameOrigin.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport speedometer from '../helpers/speedometer.js';\n\nfunction progressEventReducer(listener, isDownloadStream) {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e\n };\n\n data[isDownloadStream ? 'download' : 'upload'] = true;\n\n listener(data);\n };\n}\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nexport default isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n let requestData = config.data;\n const requestHeaders = AxiosHeaders.from(config.headers).normalize();\n let {responseType, withXSRFToken} = config;\n let onCanceled;\n function done() {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(onCanceled);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', onCanceled);\n }\n }\n\n let contentType;\n\n if (utils.isFormData(requestData)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n requestHeaders.setContentType(false); // Let the browser set it\n } else if ((contentType = requestHeaders.getContentType()) !== false) {\n // fix semicolon duplication issue for ReactNative FormData implementation\n const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : [];\n requestHeaders.setContentType([type || 'multipart/form-data', ...tokens].join('; '));\n }\n }\n\n let request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n const username = config.auth.username || '';\n const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password));\n }\n\n const fullPath = buildFullPath(config.baseURL, config.url);\n\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = config.transitional || transitionalDefaults;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if(platform.hasStandardBrowserEnv) {\n withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(config));\n\n if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(fullPath))) {\n // Add xsrf header\n const xsrfValue = config.xsrfHeaderName && config.xsrfCookieName && cookies.read(config.xsrfCookieName);\n\n if (xsrfValue) {\n requestHeaders.set(config.xsrfHeaderName, xsrfValue);\n }\n }\n }\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = config.responseType;\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true));\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress));\n }\n\n if (config.cancelToken || config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n config.cancelToken && config.cancelToken.subscribe(onCanceled);\n if (config.signal) {\n config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(fullPath);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n","import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\nimport AxiosError from \"../core/AxiosError.js\";\n\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter\n}\n\nutils.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, 'name', {value});\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', {value});\n }\n});\n\nconst renderReason = (reason) => `- ${reason}`;\n\nconst isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;\n\nexport default {\n getAdapter: (adapters) => {\n adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n const {length} = adapters;\n let nameOrAdapter;\n let adapter;\n\n const rejectedReasons = {};\n\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n let id;\n\n adapter = nameOrAdapter;\n\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n if (adapter === undefined) {\n throw new AxiosError(`Unknown adapter '${id}'`);\n }\n }\n\n if (adapter) {\n break;\n }\n\n rejectedReasons[id || '#' + i] = adapter;\n }\n\n if (!adapter) {\n\n const reasons = Object.entries(rejectedReasons)\n .map(([id, state]) => `adapter ${id} ` +\n (state === false ? 'is not supported by the environment' : 'is not available in the build')\n );\n\n let s = length ?\n (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n 'as no adapter specified';\n\n throw new AxiosError(\n `There is no suitable adapter to dispatch the request ` + s,\n 'ERR_NOT_SUPPORT'\n );\n }\n\n return adapter;\n },\n adapters: knownAdapters\n}\n","'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport adapters from \"../adapters/adapters.js\";\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n\n const adapter = adapters.getAdapter(config.adapter || defaults.adapter);\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosHeaders from \"./AxiosHeaders.js\";\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? thing.toJSON() : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source, caseless) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge.call({caseless}, target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, caseless) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(a, b, caseless);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a, caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b) => mergeDeepProperties(headersToObject(a), headersToObject(b), true)\n };\n\n utils.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n","export const VERSION = \"1.6.4\";","'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n","'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer, headers} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n }\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n let contextHeaders = headers && utils.merge(\n headers.common,\n headers[config.method]\n );\n\n headers && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift.apply(chain, requestInterceptorChain);\n chain.push.apply(chain, responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n i = 0;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n","'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n","const HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n\nexport default HttpStatusCode;\n","'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\nimport AxiosHeaders from \"./core/AxiosHeaders.js\";\nimport adapters from './adapters/adapters.js';\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders;\n\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\nexport default axios\n"],"names":["bind","fn","thisArg","wrap","apply","arguments","toString","Object","prototype","getPrototypeOf","kindOf","cache","thing","str","call","slice","toLowerCase","create","kindOfTest","type","typeOfTest","isArray","Array","isUndefined","isBuffer","val","constructor","isFunction","isArrayBuffer","isArrayBufferView","result","ArrayBuffer","isView","buffer","isString","isNumber","isObject","isBoolean","isPlainObject","Symbol","toStringTag","iterator","isDate","isFile","isBlob","isFileList","isStream","pipe","isFormData","kind","FormData","append","isURLSearchParams","trim","replace","forEach","obj","allOwnKeys","i","l","length","keys","getOwnPropertyNames","len","key","findKey","_key","_global","globalThis","self","window","global","isContextDefined","context","merge","caseless","assignValue","targetKey","extend","a","b","stripBOM","content","charCodeAt","inherits","superConstructor","props","descriptors","defineProperty","value","assign","toFlatObject","sourceObj","destObj","filter","propFilter","prop","merged","endsWith","searchString","position","String","undefined","lastIndex","indexOf","toArray","arr","isTypedArray","TypedArray","Uint8Array","forEachEntry","generator","next","done","pair","matchAll","regExp","matches","exec","push","isHTMLForm","toCamelCase","replacer","m","p1","p2","toUpperCase","hasOwnProperty","isRegExp","reduceDescriptors","reducer","getOwnPropertyDescriptors","reducedDescriptors","descriptor","name","ret","defineProperties","freezeMethods","enumerable","writable","set","Error","toObjectSet","arrayOrString","delimiter","define","split","noop","toFiniteNumber","defaultValue","Number","isFinite","ALPHA","DIGIT","ALPHABET","ALPHA_DIGIT","generateString","size","alphabet","Math","random","isSpecCompliantForm","toJSONObject","stack","visit","source","target","reducedValue","isAsyncFn","isThenable","then","hasOwnProp","AxiosError","message","code","config","request","response","captureStackTrace","utils","toJSON","description","number","fileName","lineNumber","columnNumber","status","from","error","customProps","axiosError","cause","isVisitable","removeBrackets","renderKey","path","dots","concat","map","each","token","join","isFlatArray","some","predicates","test","toFormData","formData","options","TypeError","metaTokens","indexes","defined","option","visitor","defaultVisitor","_Blob","Blob","useBlob","convertValue","toISOString","Buffer","JSON","stringify","el","index","exposedHelpers","build","pop","encode","charMap","encodeURIComponent","match","AxiosURLSearchParams","params","_pairs","encoder","_encode","buildURL","url","serializeFn","serialize","serializedParams","hashmarkIndex","InterceptorManager","handlers","fulfilled","rejected","synchronous","runWhen","id","forEachHandler","h","silentJSONParsing","forcedJSONParsing","clarifyTimeoutError","URLSearchParams","isBrowser","classes","protocols","hasBrowserEnv","document","hasStandardBrowserEnv","product","navigator","hasStandardBrowserWebWorkerEnv","WorkerGlobalScope","importScripts","platform","toURLEncodedForm","data","helpers","isNode","parsePropPath","arrayToObject","formDataToJSON","buildPath","isNumericKey","isLast","entries","stringifySafely","rawValue","parser","parse","e","defaults","transitional","transitionalDefaults","adapter","transformRequest","headers","contentType","getContentType","hasJSONContentType","isObjectPayload","setContentType","formSerializer","_FormData","env","transformResponse","JSONRequested","responseType","strictJSONParsing","ERR_BAD_RESPONSE","timeout","xsrfCookieName","xsrfHeaderName","maxContentLength","maxBodyLength","validateStatus","common","method","ignoreDuplicateOf","rawHeaders","parsed","line","substring","$internals","normalizeHeader","header","normalizeValue","parseTokens","tokens","tokensRE","isValidHeaderName","matchHeaderValue","isHeaderNameFilter","formatHeader","w","char","buildAccessors","accessorName","methodName","arg1","arg2","arg3","configurable","AxiosHeaders","valueOrRewrite","rewrite","setHeader","_value","_header","_rewrite","lHeader","setHeaders","parseHeaders","matcher","deleted","deleteHeader","format","normalized","targets","asStrings","first","computed","internals","accessors","defineAccessor","accessor","mapped","get","headerValue","transformData","fns","transform","normalize","isCancel","__CANCEL__","CanceledError","ERR_CANCELED","settle","resolve","reject","ERR_BAD_REQUEST","floor","write","expires","domain","secure","cookie","Date","toGMTString","read","RegExp","decodeURIComponent","remove","now","isAbsoluteURL","combineURLs","baseURL","relativeURL","buildFullPath","requestedURL","standardBrowserEnv","msie","userAgent","urlParsingNode","createElement","originURL","resolveURL","href","setAttribute","protocol","host","search","hash","hostname","port","pathname","charAt","location","isURLSameOrigin","requestURL","nonStandardBrowserEnv","parseProtocol","speedometer","samplesCount","min","bytes","timestamps","head","tail","firstSampleTS","chunkLength","startedAt","bytesCount","passed","round","progressEventReducer","listener","isDownloadStream","bytesNotified","_speedometer","loaded","total","lengthComputable","progressBytes","rate","inRange","progress","estimated","event","isXHRAdapterSupported","XMLHttpRequest","Promise","dispatchXhrRequest","requestData","requestHeaders","withXSRFToken","onCanceled","cancelToken","unsubscribe","signal","removeEventListener","Boolean","auth","username","password","unescape","btoa","fullPath","open","paramsSerializer","onloadend","responseHeaders","getAllResponseHeaders","responseData","responseText","statusText","_resolve","_reject","err","onreadystatechange","handleLoad","readyState","responseURL","setTimeout","onabort","handleAbort","ECONNABORTED","onerror","handleError","ERR_NETWORK","ontimeout","handleTimeout","timeoutErrorMessage","ETIMEDOUT","xsrfValue","cookies","setRequestHeader","withCredentials","onDownloadProgress","addEventListener","onUploadProgress","upload","cancel","abort","subscribe","aborted","send","knownAdapters","http","httpAdapter","xhr","xhrAdapter","renderReason","reason","isResolvedHandle","getAdapter","adapters","nameOrAdapter","rejectedReasons","reasons","state","s","throwIfCancellationRequested","throwIfRequested","dispatchRequest","onAdapterResolution","onAdapterRejection","headersToObject","mergeConfig","config1","config2","getMergedValue","mergeDeepProperties","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","timeoutMessage","decompress","beforeRedirect","transport","httpAgent","httpsAgent","socketPath","responseEncoding","computeConfigValue","configValue","VERSION","validators","validator","deprecatedWarnings","version","formatMessage","opt","desc","opts","ERR_DEPRECATED","console","warn","assertOptions","schema","allowUnknown","ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","Axios","instanceConfig","interceptors","configOrUrl","contextHeaders","requestInterceptorChain","synchronousRequestInterceptors","unshiftRequestInterceptors","interceptor","unshift","responseInterceptorChain","pushResponseInterceptors","promise","chain","newConfig","onFulfilled","onRejected","forEachMethodNoData","forEachMethodWithData","generateHTTPMethod","isForm","httpMethod","CancelToken","executor","resolvePromise","promiseExecutor","_listeners","onfulfilled","splice","c","spread","callback","isAxiosError","payload","HttpStatusCode","Continue","SwitchingProtocols","Processing","EarlyHints","Ok","Created","Accepted","NonAuthoritativeInformation","NoContent","ResetContent","PartialContent","MultiStatus","AlreadyReported","ImUsed","MultipleChoices","MovedPermanently","Found","SeeOther","NotModified","UseProxy","Unused","TemporaryRedirect","PermanentRedirect","BadRequest","Unauthorized","PaymentRequired","Forbidden","NotFound","MethodNotAllowed","NotAcceptable","ProxyAuthenticationRequired","RequestTimeout","Conflict","Gone","LengthRequired","PreconditionFailed","PayloadTooLarge","UriTooLong","UnsupportedMediaType","RangeNotSatisfiable","ExpectationFailed","ImATeapot","MisdirectedRequest","UnprocessableEntity","Locked","FailedDependency","TooEarly","UpgradeRequired","PreconditionRequired","TooManyRequests","RequestHeaderFieldsTooLarge","UnavailableForLegalReasons","InternalServerError","NotImplemented","BadGateway","ServiceUnavailable","GatewayTimeout","HttpVersionNotSupported","VariantAlsoNegotiates","InsufficientStorage","LoopDetected","NotExtended","NetworkAuthenticationRequired","createInstance","defaultConfig","instance","axios","Cancel","all","promises","formToJSON"],"mappings":"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"} \ No newline at end of file diff --git a/task/node_modules/axios/dist/axios.min.js b/task/node_modules/axios/dist/axios.min.js new file mode 100644 index 0000000..79f1769 --- /dev/null +++ b/task/node_modules/axios/dist/axios.min.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).axios=t()}(this,(function(){"use strict";function e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function t(t){for(var n=1;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n2&&void 0!==arguments[2]?arguments[2]:{},a=i.allOwnKeys,s=void 0!==a&&a;if(null!=e)if("object"!==n(e)&&(e=[e]),O(e))for(r=0,o=e.length;r0;)if(t===(n=r[o]).toLowerCase())return n;return null}var D="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:global,B=function(e){return!E(e)&&e!==D};var L,I=(L="undefined"!=typeof Uint8Array&&v(Uint8Array),function(e){return L&&e instanceof L}),q=g("HTMLFormElement"),z=function(e){var t=Object.prototype.hasOwnProperty;return function(e,n){return t.call(e,n)}}(),M=g("RegExp"),H=function(e,t){var n=Object.getOwnPropertyDescriptors(e),r={};F(n,(function(n,o){var i;!1!==(i=t(n,o,e))&&(r[o]=i||n)})),Object.defineProperties(e,r)},J="abcdefghijklmnopqrstuvwxyz",W="0123456789",K={DIGIT:W,ALPHA:J,ALPHA_DIGIT:J+J.toUpperCase()+W};var V=g("AsyncFunction"),G={isArray:O,isArrayBuffer:S,isBuffer:function(e){return null!==e&&!E(e)&&null!==e.constructor&&!E(e.constructor)&&A(e.constructor.isBuffer)&&e.constructor.isBuffer(e)},isFormData:function(e){var t;return e&&("function"==typeof FormData&&e instanceof FormData||A(e.append)&&("formdata"===(t=b(e))||"object"===t&&A(e.toString)&&"[object FormData]"===e.toString()))},isArrayBufferView:function(e){return"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&S(e.buffer)},isString:R,isNumber:j,isBoolean:function(e){return!0===e||!1===e},isObject:T,isPlainObject:P,isUndefined:E,isDate:N,isFile:x,isBlob:C,isRegExp:M,isFunction:A,isStream:function(e){return T(e)&&A(e.pipe)},isURLSearchParams:_,isTypedArray:I,isFileList:k,forEach:F,merge:function e(){for(var t=B(this)&&this||{},n=t.caseless,r={},o=function(t,o){var i=n&&U(r,o)||o;P(r[i])&&P(t)?r[i]=e(r[i],t):P(t)?r[i]=e({},t):O(t)?r[i]=t.slice():r[i]=t},i=0,a=arguments.length;i3&&void 0!==arguments[3]?arguments[3]:{},o=r.allOwnKeys;return F(t,(function(t,r){n&&A(t)?e[r]=h(t,n):e[r]=t}),{allOwnKeys:o}),e},trim:function(e){return e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")},stripBOM:function(e){return 65279===e.charCodeAt(0)&&(e=e.slice(1)),e},inherits:function(e,t,n,r){e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},toFlatObject:function(e,t,n,r){var o,i,a,s={};if(t=t||{},null==e)return t;do{for(i=(o=Object.getOwnPropertyNames(e)).length;i-- >0;)a=o[i],r&&!r(a,e,t)||s[a]||(t[a]=e[a],s[a]=!0);e=!1!==n&&v(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},kindOf:b,kindOfTest:g,endsWith:function(e,t,n){e=String(e),(void 0===n||n>e.length)&&(n=e.length),n-=t.length;var r=e.indexOf(t,n);return-1!==r&&r===n},toArray:function(e){if(!e)return null;if(O(e))return e;var t=e.length;if(!j(t))return null;for(var n=new Array(t);t-- >0;)n[t]=e[t];return n},forEachEntry:function(e,t){for(var n,r=(e&&e[Symbol.iterator]).call(e);(n=r.next())&&!n.done;){var o=n.value;t.call(e,o[0],o[1])}},matchAll:function(e,t){for(var n,r=[];null!==(n=e.exec(t));)r.push(n);return r},isHTMLForm:q,hasOwnProperty:z,hasOwnProp:z,reduceDescriptors:H,freezeMethods:function(e){H(e,(function(t,n){if(A(e)&&-1!==["arguments","caller","callee"].indexOf(n))return!1;var r=e[n];A(r)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=function(){throw Error("Can not rewrite read-only method '"+n+"'")}))}))},toObjectSet:function(e,t){var n={},r=function(e){e.forEach((function(e){n[e]=!0}))};return O(e)?r(e):r(String(e).split(t)),n},toCamelCase:function(e){return e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,(function(e,t,n){return t.toUpperCase()+n}))},noop:function(){},toFiniteNumber:function(e,t){return e=+e,Number.isFinite(e)?e:t},findKey:U,global:D,isContextDefined:B,ALPHABET:K,generateString:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:16,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:K.ALPHA_DIGIT,n="",r=t.length;e--;)n+=t[Math.random()*r|0];return n},isSpecCompliantForm:function(e){return!!(e&&A(e.append)&&"FormData"===e[Symbol.toStringTag]&&e[Symbol.iterator])},toJSONObject:function(e){var t=new Array(10);return function e(n,r){if(T(n)){if(t.indexOf(n)>=0)return;if(!("toJSON"in n)){t[r]=n;var o=O(n)?[]:{};return F(n,(function(t,n){var i=e(t,r+1);!E(i)&&(o[n]=i)})),t[r]=void 0,o}}return n}(e,0)},isAsyncFn:V,isThenable:function(e){return e&&(T(e)||A(e))&&A(e.then)&&A(e.catch)}};function X(e,t,n,r,o){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),o&&(this.response=o)}G.inherits(X,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:G.toJSONObject(this.config),code:this.code,status:this.response&&this.response.status?this.response.status:null}}});var $=X.prototype,Q={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach((function(e){Q[e]={value:e}})),Object.defineProperties(X,Q),Object.defineProperty($,"isAxiosError",{value:!0}),X.from=function(e,t,n,r,o,i){var a=Object.create($);return G.toFlatObject(e,a,(function(e){return e!==Error.prototype}),(function(e){return"isAxiosError"!==e})),X.call(a,e.message,t,n,r,o),a.cause=e,a.name=e.name,i&&Object.assign(a,i),a};function Z(e){return G.isPlainObject(e)||G.isArray(e)}function Y(e){return G.endsWith(e,"[]")?e.slice(0,-2):e}function ee(e,t,n){return e?e.concat(t).map((function(e,t){return e=Y(e),!n&&t?"["+e+"]":e})).join(n?".":""):t}var te=G.toFlatObject(G,{},null,(function(e){return/^is[A-Z]/.test(e)}));function ne(e,t,r){if(!G.isObject(e))throw new TypeError("target must be an object");t=t||new FormData;var o=(r=G.toFlatObject(r,{metaTokens:!0,dots:!1,indexes:!1},!1,(function(e,t){return!G.isUndefined(t[e])}))).metaTokens,i=r.visitor||f,a=r.dots,s=r.indexes,u=(r.Blob||"undefined"!=typeof Blob&&Blob)&&G.isSpecCompliantForm(t);if(!G.isFunction(i))throw new TypeError("visitor must be a function");function c(e){if(null===e)return"";if(G.isDate(e))return e.toISOString();if(!u&&G.isBlob(e))throw new X("Blob is not supported. Use a Buffer instead.");return G.isArrayBuffer(e)||G.isTypedArray(e)?u&&"function"==typeof Blob?new Blob([e]):Buffer.from(e):e}function f(e,r,i){var u=e;if(e&&!i&&"object"===n(e))if(G.endsWith(r,"{}"))r=o?r:r.slice(0,-2),e=JSON.stringify(e);else if(G.isArray(e)&&function(e){return G.isArray(e)&&!e.some(Z)}(e)||(G.isFileList(e)||G.endsWith(r,"[]"))&&(u=G.toArray(e)))return r=Y(r),u.forEach((function(e,n){!G.isUndefined(e)&&null!==e&&t.append(!0===s?ee([r],n,a):null===s?r:r+"[]",c(e))})),!1;return!!Z(e)||(t.append(ee(i,r,a),c(e)),!1)}var l=[],d=Object.assign(te,{defaultVisitor:f,convertValue:c,isVisitable:Z});if(!G.isObject(e))throw new TypeError("data must be an object");return function e(n,r){if(!G.isUndefined(n)){if(-1!==l.indexOf(n))throw Error("Circular reference detected in "+r.join("."));l.push(n),G.forEach(n,(function(n,o){!0===(!(G.isUndefined(n)||null===n)&&i.call(t,n,G.isString(o)?o.trim():o,r,d))&&e(n,r?r.concat(o):[o])})),l.pop()}}(e),t}function re(e){var t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,(function(e){return t[e]}))}function oe(e,t){this._pairs=[],e&&ne(e,this,t)}var ie=oe.prototype;function ae(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function se(e,t,n){if(!t)return e;var r,o=n&&n.encode||ae,i=n&&n.serialize;if(r=i?i(t,n):G.isURLSearchParams(t)?t.toString():new oe(t,n).toString(o)){var a=e.indexOf("#");-1!==a&&(e=e.slice(0,a)),e+=(-1===e.indexOf("?")?"?":"&")+r}return e}ie.append=function(e,t){this._pairs.push([e,t])},ie.toString=function(e){var t=e?function(t){return e.call(this,t,re)}:re;return this._pairs.map((function(e){return t(e[0])+"="+t(e[1])}),"").join("&")};var ue,ce=function(){function e(){r(this,e),this.handlers=[]}return i(e,[{key:"use",value:function(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1}},{key:"eject",value:function(e){this.handlers[e]&&(this.handlers[e]=null)}},{key:"clear",value:function(){this.handlers&&(this.handlers=[])}},{key:"forEach",value:function(e){G.forEach(this.handlers,(function(t){null!==t&&e(t)}))}}]),e}(),fe={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},le={isBrowser:!0,classes:{URLSearchParams:"undefined"!=typeof URLSearchParams?URLSearchParams:oe,FormData:"undefined"!=typeof FormData?FormData:null,Blob:"undefined"!=typeof Blob?Blob:null},protocols:["http","https","file","blob","url","data"]},de="undefined"!=typeof window&&"undefined"!=typeof document,pe=(ue="undefined"!=typeof navigator&&navigator.product,de&&["ReactNative","NativeScript","NS"].indexOf(ue)<0),he="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&"function"==typeof self.importScripts,me=t(t({},Object.freeze({__proto__:null,hasBrowserEnv:de,hasStandardBrowserWebWorkerEnv:he,hasStandardBrowserEnv:pe})),le);function ye(e){function t(e,n,r,o){var i=e[o++];if("__proto__"===i)return!0;var a=Number.isFinite(+i),s=o>=e.length;return i=!i&&G.isArray(r)?r.length:i,s?(G.hasOwnProp(r,i)?r[i]=[r[i],n]:r[i]=n,!a):(r[i]&&G.isObject(r[i])||(r[i]=[]),t(e,n,r[i],o)&&G.isArray(r[i])&&(r[i]=function(e){var t,n,r={},o=Object.keys(e),i=o.length;for(t=0;t-1,i=G.isObject(e);if(i&&G.isHTMLForm(e)&&(e=new FormData(e)),G.isFormData(e))return o&&o?JSON.stringify(ye(e)):e;if(G.isArrayBuffer(e)||G.isBuffer(e)||G.isStream(e)||G.isFile(e)||G.isBlob(e))return e;if(G.isArrayBufferView(e))return e.buffer;if(G.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();if(i){if(r.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return ne(e,new me.classes.URLSearchParams,Object.assign({visitor:function(e,t,n,r){return me.isNode&&G.isBuffer(e)?(this.append(t,e.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)}},t))}(e,this.formSerializer).toString();if((n=G.isFileList(e))||r.indexOf("multipart/form-data")>-1){var a=this.env&&this.env.FormData;return ne(n?{"files[]":e}:e,a&&new a,this.formSerializer)}}return i||o?(t.setContentType("application/json",!1),function(e,t,n){if(G.isString(e))try{return(t||JSON.parse)(e),G.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(n||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=this.transitional||ve.transitional,n=t&&t.forcedJSONParsing,r="json"===this.responseType;if(e&&G.isString(e)&&(n&&!this.responseType||r)){var o=!(t&&t.silentJSONParsing)&&r;try{return JSON.parse(e)}catch(e){if(o){if("SyntaxError"===e.name)throw X.from(e,X.ERR_BAD_RESPONSE,this,null,this.response);throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:me.classes.FormData,Blob:me.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};G.forEach(["delete","get","head","post","put","patch"],(function(e){ve.headers[e]={}}));var be=ve,ge=G.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),we=Symbol("internals");function Oe(e){return e&&String(e).trim().toLowerCase()}function Ee(e){return!1===e||null==e?e:G.isArray(e)?e.map(Ee):String(e)}function Se(e,t,n,r,o){return G.isFunction(r)?r.call(this,t,n):(o&&(t=n),G.isString(t)?G.isString(r)?-1!==t.indexOf(r):G.isRegExp(r)?r.test(t):void 0:void 0)}var Re=function(e,t){function n(e){r(this,n),e&&this.set(e)}return i(n,[{key:"set",value:function(e,t,n){var r=this;function o(e,t,n){var o=Oe(t);if(!o)throw new Error("header name must be a non-empty string");var i=G.findKey(r,o);(!i||void 0===r[i]||!0===n||void 0===n&&!1!==r[i])&&(r[i||t]=Ee(e))}var i,a,s,u,c,f=function(e,t){return G.forEach(e,(function(e,n){return o(e,n,t)}))};return G.isPlainObject(e)||e instanceof this.constructor?f(e,t):G.isString(e)&&(e=e.trim())&&!/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim())?f((c={},(i=e)&&i.split("\n").forEach((function(e){u=e.indexOf(":"),a=e.substring(0,u).trim().toLowerCase(),s=e.substring(u+1).trim(),!a||c[a]&&ge[a]||("set-cookie"===a?c[a]?c[a].push(s):c[a]=[s]:c[a]=c[a]?c[a]+", "+s:s)})),c),t):null!=e&&o(t,e,n),this}},{key:"get",value:function(e,t){if(e=Oe(e)){var n=G.findKey(this,e);if(n){var r=this[n];if(!t)return r;if(!0===t)return function(e){for(var t,n=Object.create(null),r=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;t=r.exec(e);)n[t[1]]=t[2];return n}(r);if(G.isFunction(t))return t.call(this,r,n);if(G.isRegExp(t))return t.exec(r);throw new TypeError("parser must be boolean|regexp|function")}}}},{key:"has",value:function(e,t){if(e=Oe(e)){var n=G.findKey(this,e);return!(!n||void 0===this[n]||t&&!Se(0,this[n],n,t))}return!1}},{key:"delete",value:function(e,t){var n=this,r=!1;function o(e){if(e=Oe(e)){var o=G.findKey(n,e);!o||t&&!Se(0,n[o],o,t)||(delete n[o],r=!0)}}return G.isArray(e)?e.forEach(o):o(e),r}},{key:"clear",value:function(e){for(var t=Object.keys(this),n=t.length,r=!1;n--;){var o=t[n];e&&!Se(0,this[o],o,e,!0)||(delete this[o],r=!0)}return r}},{key:"normalize",value:function(e){var t=this,n={};return G.forEach(this,(function(r,o){var i=G.findKey(n,o);if(i)return t[i]=Ee(r),void delete t[o];var a=e?function(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(function(e,t,n){return t.toUpperCase()+n}))}(o):String(o).trim();a!==o&&delete t[o],t[a]=Ee(r),n[a]=!0})),this}},{key:"concat",value:function(){for(var e,t=arguments.length,n=new Array(t),r=0;r1?n-1:0),o=1;o1?"since :\n"+u.map(Fe).join("\n"):" "+Fe(u[0]):"as no adapter specified"),"ERR_NOT_SUPPORT")}return n};function Be(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Pe(null,e)}function Le(e){return Be(e),e.headers=Ae.from(e.headers),e.data=je.call(e,e.transformRequest),-1!==["post","put","patch"].indexOf(e.method)&&e.headers.setContentType("application/x-www-form-urlencoded",!1),De(e.adapter||be.adapter)(e).then((function(t){return Be(e),t.data=je.call(e,e.transformResponse,t),t.headers=Ae.from(t.headers),t}),(function(t){return Te(t)||(Be(e),t&&t.response&&(t.response.data=je.call(e,e.transformResponse,t.response),t.response.headers=Ae.from(t.response.headers))),Promise.reject(t)}))}var Ie=function(e){return e instanceof Ae?e.toJSON():e};function qe(e,t){t=t||{};var n={};function r(e,t,n){return G.isPlainObject(e)&&G.isPlainObject(t)?G.merge.call({caseless:n},e,t):G.isPlainObject(t)?G.merge({},t):G.isArray(t)?t.slice():t}function o(e,t,n){return G.isUndefined(t)?G.isUndefined(e)?void 0:r(void 0,e,n):r(e,t,n)}function i(e,t){if(!G.isUndefined(t))return r(void 0,t)}function a(e,t){return G.isUndefined(t)?G.isUndefined(e)?void 0:r(void 0,e):r(void 0,t)}function s(n,o,i){return i in t?r(n,o):i in e?r(void 0,n):void 0}var u={url:i,method:i,data:i,baseURL:a,transformRequest:a,transformResponse:a,paramsSerializer:a,timeout:a,timeoutMessage:a,withCredentials:a,withXSRFToken:a,adapter:a,responseType:a,xsrfCookieName:a,xsrfHeaderName:a,onUploadProgress:a,onDownloadProgress:a,decompress:a,maxContentLength:a,maxBodyLength:a,beforeRedirect:a,transport:a,httpAgent:a,httpsAgent:a,cancelToken:a,socketPath:a,responseEncoding:a,validateStatus:s,headers:function(e,t){return o(Ie(e),Ie(t),!0)}};return G.forEach(Object.keys(Object.assign({},e,t)),(function(r){var i=u[r]||o,a=i(e[r],t[r],r);G.isUndefined(a)&&i!==s||(n[r]=a)})),n}var ze="1.6.4",Me={};["object","boolean","number","function","string","symbol"].forEach((function(e,t){Me[e]=function(r){return n(r)===e||"a"+(t<1?"n ":" ")+e}}));var He={};Me.transitional=function(e,t,n){function r(e,t){return"[Axios v1.6.4] Transitional option '"+e+"'"+t+(n?". "+n:"")}return function(n,o,i){if(!1===e)throw new X(r(o," has been removed"+(t?" in "+t:"")),X.ERR_DEPRECATED);return t&&!He[o]&&(He[o]=!0,console.warn(r(o," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(n,o,i)}};var Je={assertOptions:function(e,t,r){if("object"!==n(e))throw new X("options must be an object",X.ERR_BAD_OPTION_VALUE);for(var o=Object.keys(e),i=o.length;i-- >0;){var a=o[i],s=t[a];if(s){var u=e[a],c=void 0===u||s(u,a,e);if(!0!==c)throw new X("option "+a+" must be "+c,X.ERR_BAD_OPTION_VALUE)}else if(!0!==r)throw new X("Unknown option "+a,X.ERR_BAD_OPTION)}},validators:Me},We=Je.validators,Ke=function(){function e(t){r(this,e),this.defaults=t,this.interceptors={request:new ce,response:new ce}}return i(e,[{key:"request",value:function(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{};var n=t=qe(this.defaults,t),r=n.transitional,o=n.paramsSerializer,i=n.headers;void 0!==r&&Je.assertOptions(r,{silentJSONParsing:We.transitional(We.boolean),forcedJSONParsing:We.transitional(We.boolean),clarifyTimeoutError:We.transitional(We.boolean)},!1),null!=o&&(G.isFunction(o)?t.paramsSerializer={serialize:o}:Je.assertOptions(o,{encode:We.function,serialize:We.function},!0)),t.method=(t.method||this.defaults.method||"get").toLowerCase();var a=i&&G.merge(i.common,i[t.method]);i&&G.forEach(["delete","get","head","post","put","patch","common"],(function(e){delete i[e]})),t.headers=Ae.concat(a,i);var s=[],u=!0;this.interceptors.request.forEach((function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(u=u&&e.synchronous,s.unshift(e.fulfilled,e.rejected))}));var c,f=[];this.interceptors.response.forEach((function(e){f.push(e.fulfilled,e.rejected)}));var l,d=0;if(!u){var p=[Le.bind(this),void 0];for(p.unshift.apply(p,s),p.push.apply(p,f),l=p.length,c=Promise.resolve(t);d0;)o._listeners[t](e);o._listeners=null}})),this.promise.then=function(e){var t,n=new Promise((function(e){o.subscribe(e),t=e})).then(e);return n.cancel=function(){o.unsubscribe(t)},n},t((function(e,t,r){o.reason||(o.reason=new Pe(e,t,r),n(o.reason))}))}return i(e,[{key:"throwIfRequested",value:function(){if(this.reason)throw this.reason}},{key:"subscribe",value:function(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}},{key:"unsubscribe",value:function(e){if(this._listeners){var t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}}}],[{key:"source",value:function(){var t;return{token:new e((function(e){t=e})),cancel:t}}}]),e}();var Xe={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Xe).forEach((function(e){var t=s(e,2),n=t[0],r=t[1];Xe[r]=n}));var $e=Xe;var Qe=function e(t){var n=new Ve(t),r=h(Ve.prototype.request,n);return G.extend(r,Ve.prototype,n,{allOwnKeys:!0}),G.extend(r,n,null,{allOwnKeys:!0}),r.create=function(n){return e(qe(t,n))},r}(be);return Qe.Axios=Ve,Qe.CanceledError=Pe,Qe.CancelToken=Ge,Qe.isCancel=Te,Qe.VERSION=ze,Qe.toFormData=ne,Qe.AxiosError=X,Qe.Cancel=Qe.CanceledError,Qe.all=function(e){return Promise.all(e)},Qe.spread=function(e){return function(t){return e.apply(null,t)}},Qe.isAxiosError=function(e){return G.isObject(e)&&!0===e.isAxiosError},Qe.mergeConfig=qe,Qe.AxiosHeaders=Ae,Qe.formToJSON=function(e){return ye(G.isHTMLForm(e)?new FormData(e):e)},Qe.getAdapter=De,Qe.HttpStatusCode=$e,Qe.default=Qe,Qe})); +//# sourceMappingURL=axios.min.js.map diff --git a/task/node_modules/axios/dist/axios.min.js.map b/task/node_modules/axios/dist/axios.min.js.map new file mode 100644 index 0000000..e93f2cc --- /dev/null +++ b/task/node_modules/axios/dist/axios.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"axios.min.js","sources":["../lib/helpers/bind.js","../lib/utils.js","../lib/core/AxiosError.js","../lib/helpers/toFormData.js","../lib/helpers/AxiosURLSearchParams.js","../lib/helpers/buildURL.js","../lib/core/InterceptorManager.js","../lib/platform/common/utils.js","../lib/defaults/transitional.js","../lib/platform/browser/index.js","../lib/platform/browser/classes/URLSearchParams.js","../lib/platform/browser/classes/FormData.js","../lib/platform/browser/classes/Blob.js","../lib/platform/index.js","../lib/helpers/formDataToJSON.js","../lib/defaults/index.js","../lib/helpers/toURLEncodedForm.js","../lib/helpers/parseHeaders.js","../lib/core/AxiosHeaders.js","../lib/core/transformData.js","../lib/cancel/isCancel.js","../lib/cancel/CanceledError.js","../lib/helpers/cookies.js","../lib/core/buildFullPath.js","../lib/helpers/isAbsoluteURL.js","../lib/helpers/combineURLs.js","../lib/helpers/isURLSameOrigin.js","../lib/adapters/xhr.js","../lib/helpers/speedometer.js","../lib/adapters/adapters.js","../lib/helpers/null.js","../lib/core/settle.js","../lib/helpers/parseProtocol.js","../lib/core/dispatchRequest.js","../lib/core/mergeConfig.js","../lib/env/data.js","../lib/helpers/validator.js","../lib/core/Axios.js","../lib/cancel/CancelToken.js","../lib/helpers/HttpStatusCode.js","../lib/axios.js","../lib/helpers/spread.js","../lib/helpers/isAxiosError.js"],"sourcesContent":["'use strict';\n\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n","'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n let kind;\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) || (\n isFunction(thing.append) && (\n (kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n )\n )\n )\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\nfunction findKey(obj, key) {\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const {caseless} = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else {\n result[targetKey] = val;\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[Symbol.iterator];\n\n const iterator = generator.call(obj);\n\n let result;\n\n while ((result = iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n value = +value;\n return Number.isFinite(value) ? value : defaultValue;\n}\n\nconst ALPHA = 'abcdefghijklmnopqrstuvwxyz'\n\nconst DIGIT = '0123456789';\n\nconst ALPHABET = {\n DIGIT,\n ALPHA,\n ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT\n}\n\nconst generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {\n let str = '';\n const {length} = alphabet;\n while (size--) {\n str += alphabet[Math.random() * length|0]\n }\n\n return str;\n}\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]);\n}\n\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n\n const visit = (source, i) => {\n\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n\n if(!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n\n stack[i] = undefined;\n\n return target;\n }\n }\n\n return source;\n }\n\n return visit(obj, 0);\n}\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n ALPHABET,\n generateString,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable\n};\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n response && (this.response = response);\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils.toJSONObject(this.config),\n code: this.code,\n status: this.response && this.response.status ? this.response.status : null\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n AxiosError.call(axiosError, error.message, code, config, request, response);\n\n axiosError.cause = error;\n\n axiosError.name = error.name;\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\nimport PlatformFormData from '../platform/node/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (PlatformFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n","'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object} params - The parameters to be converted to a FormData object.\n * @param {Object} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?object} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n","const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = (\n (product) => {\n return hasBrowserEnv && ['ReactNative', 'NativeScript', 'NS'].indexOf(product) < 0\n })(typeof navigator !== 'undefined' && navigator.product);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope &&\n typeof self.importScripts === 'function'\n );\n})();\n\nexport {\n hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv\n}\n","'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n","import URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\nimport Blob from './classes/Blob.js'\n\nexport default {\n isBrowser: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob\n },\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n","'use strict';\n\nimport AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';\nexport default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n","'use strict';\n\nexport default typeof FormData !== 'undefined' ? FormData : null;\n","'use strict'\n\nexport default typeof Blob !== 'undefined' ? Blob : null\n","import platform from './node/index.js';\nimport * as utils from './common/utils.js';\n\nexport default {\n ...utils,\n ...platform\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n\n if (name === '__proto__') return true;\n\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: ['xhr', 'http'],\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n if (!hasJSONContentType) {\n return data;\n }\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*',\n 'Content-Type': undefined\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n defaults.headers[method] = {};\n});\n\nexport default defaults;\n","'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n }\n }, options));\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = utils.findKey(self, lHeader);\n\n if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n\n const setHeaders = (headers, _rewrite) =>\n utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite)\n } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n }\n\n get(header, parser) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n\n has(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n }\n\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = utils.findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n }\n\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n\n while (i--) {\n const key = keys[i];\n if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n\n return deleted;\n }\n\n normalize(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = utils.findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n }\n\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n\n toJSON(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n });\n\n return obj;\n }\n\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n\n static concat(first, ...targets) {\n const computed = new this(first);\n\n targets.forEach((target) => computed.set(target));\n\n return computed;\n }\n\n static accessor(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n }\n }\n});\n\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n","'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n","'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n","import utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n // Standard browser envs support document.cookie\n {\n write(name, value, expires, path, domain, secure) {\n const cookie = [name + '=' + encodeURIComponent(value)];\n\n utils.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n\n utils.isString(path) && cookie.push('path=' + path);\n\n utils.isString(domain) && cookie.push('domain=' + domain);\n\n secure === true && cookie.push('secure');\n\n document.cookie = cookie.join('; ');\n },\n\n read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n }\n\n :\n\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {},\n read() {\n return null;\n },\n remove() {}\n };\n\n","'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n","'use strict';\n\nimport utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n// Standard browser envs have full support of the APIs needed to test\n// whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n const msie = /(msie|trident)/i.test(navigator.userAgent);\n const urlParsingNode = document.createElement('a');\n let originURL;\n\n /**\n * Parse a URL to discover its components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n let href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n const parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })();\n","'use strict';\n\nimport utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport cookies from './../helpers/cookies.js';\nimport buildURL from './../helpers/buildURL.js';\nimport buildFullPath from '../core/buildFullPath.js';\nimport isURLSameOrigin from './../helpers/isURLSameOrigin.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport speedometer from '../helpers/speedometer.js';\n\nfunction progressEventReducer(listener, isDownloadStream) {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e\n };\n\n data[isDownloadStream ? 'download' : 'upload'] = true;\n\n listener(data);\n };\n}\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nexport default isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n let requestData = config.data;\n const requestHeaders = AxiosHeaders.from(config.headers).normalize();\n let {responseType, withXSRFToken} = config;\n let onCanceled;\n function done() {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(onCanceled);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', onCanceled);\n }\n }\n\n let contentType;\n\n if (utils.isFormData(requestData)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n requestHeaders.setContentType(false); // Let the browser set it\n } else if ((contentType = requestHeaders.getContentType()) !== false) {\n // fix semicolon duplication issue for ReactNative FormData implementation\n const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : [];\n requestHeaders.setContentType([type || 'multipart/form-data', ...tokens].join('; '));\n }\n }\n\n let request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n const username = config.auth.username || '';\n const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password));\n }\n\n const fullPath = buildFullPath(config.baseURL, config.url);\n\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = config.transitional || transitionalDefaults;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if(platform.hasStandardBrowserEnv) {\n withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(config));\n\n if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(fullPath))) {\n // Add xsrf header\n const xsrfValue = config.xsrfHeaderName && config.xsrfCookieName && cookies.read(config.xsrfCookieName);\n\n if (xsrfValue) {\n requestHeaders.set(config.xsrfHeaderName, xsrfValue);\n }\n }\n }\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = config.responseType;\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true));\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress));\n }\n\n if (config.cancelToken || config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n config.cancelToken && config.cancelToken.subscribe(onCanceled);\n if (config.signal) {\n config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(fullPath);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n","'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n","import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\nimport AxiosError from \"../core/AxiosError.js\";\n\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter\n}\n\nutils.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, 'name', {value});\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', {value});\n }\n});\n\nconst renderReason = (reason) => `- ${reason}`;\n\nconst isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;\n\nexport default {\n getAdapter: (adapters) => {\n adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n const {length} = adapters;\n let nameOrAdapter;\n let adapter;\n\n const rejectedReasons = {};\n\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n let id;\n\n adapter = nameOrAdapter;\n\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n if (adapter === undefined) {\n throw new AxiosError(`Unknown adapter '${id}'`);\n }\n }\n\n if (adapter) {\n break;\n }\n\n rejectedReasons[id || '#' + i] = adapter;\n }\n\n if (!adapter) {\n\n const reasons = Object.entries(rejectedReasons)\n .map(([id, state]) => `adapter ${id} ` +\n (state === false ? 'is not supported by the environment' : 'is not available in the build')\n );\n\n let s = length ?\n (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n 'as no adapter specified';\n\n throw new AxiosError(\n `There is no suitable adapter to dispatch the request ` + s,\n 'ERR_NOT_SUPPORT'\n );\n }\n\n return adapter;\n },\n adapters: knownAdapters\n}\n","// eslint-disable-next-line strict\nexport default null;\n","'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n","'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n","'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport adapters from \"../adapters/adapters.js\";\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n\n const adapter = adapters.getAdapter(config.adapter || defaults.adapter);\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosHeaders from \"./AxiosHeaders.js\";\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? thing.toJSON() : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source, caseless) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge.call({caseless}, target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, caseless) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(a, b, caseless);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a, caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b) => mergeDeepProperties(headersToObject(a), headersToObject(b), true)\n };\n\n utils.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n","export const VERSION = \"1.6.4\";","'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n","'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer, headers} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n }\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n let contextHeaders = headers && utils.merge(\n headers.common,\n headers[config.method]\n );\n\n headers && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift.apply(chain, requestInterceptorChain);\n chain.push.apply(chain, responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n i = 0;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n","'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n","const HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n\nexport default HttpStatusCode;\n","'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\nimport AxiosHeaders from \"./core/AxiosHeaders.js\";\nimport adapters from './adapters/adapters.js';\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders;\n\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\nexport default axios\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n"],"names":["bind","fn","thisArg","apply","arguments","cache","toString","Object","prototype","getPrototypeOf","kindOf","create","thing","str","call","slice","toLowerCase","kindOfTest","type","typeOfTest","_typeof","isArray","Array","isUndefined","isArrayBuffer","isString","isFunction","isNumber","isObject","isPlainObject","val","Symbol","toStringTag","iterator","isDate","isFile","isBlob","isFileList","isURLSearchParams","forEach","obj","i","l","_ref","length","undefined","_ref$allOwnKeys","allOwnKeys","key","keys","getOwnPropertyNames","len","findKey","_key","_global","globalThis","self","window","global","isContextDefined","context","TypedArray","isTypedArray","Uint8Array","isHTMLForm","hasOwnProperty","_ref4","prop","isRegExp","reduceDescriptors","reducer","descriptors","getOwnPropertyDescriptors","reducedDescriptors","descriptor","name","ret","defineProperties","ALPHA","DIGIT","ALPHABET","ALPHA_DIGIT","toUpperCase","isAsyncFn","utils$1","isBuffer","constructor","isFormData","kind","FormData","append","isArrayBufferView","ArrayBuffer","isView","buffer","isBoolean","isStream","pipe","merge","this","caseless","result","assignValue","targetKey","extend","a","b","_ref3","trim","replace","stripBOM","content","charCodeAt","inherits","superConstructor","props","defineProperty","value","assign","toFlatObject","sourceObj","destObj","filter","propFilter","merged","endsWith","searchString","position","String","lastIndex","indexOf","toArray","arr","forEachEntry","next","done","pair","matchAll","regExp","matches","exec","push","hasOwnProp","freezeMethods","enumerable","writable","set","Error","toObjectSet","arrayOrString","delimiter","define","split","toCamelCase","m","p1","p2","noop","toFiniteNumber","defaultValue","Number","isFinite","generateString","size","alphabet","Math","random","isSpecCompliantForm","toJSONObject","stack","visit","source","target","reducedValue","isThenable","then","AxiosError","message","code","config","request","response","captureStackTrace","utils","toJSON","description","number","fileName","lineNumber","columnNumber","status","from","error","customProps","axiosError","cause","isVisitable","removeBrackets","renderKey","path","dots","concat","map","token","join","predicates","test","toFormData","formData","options","TypeError","metaTokens","indexes","option","visitor","defaultVisitor","useBlob","Blob","convertValue","toISOString","Buffer","JSON","stringify","some","isFlatArray","el","index","exposedHelpers","build","pop","encode","charMap","encodeURIComponent","match","AxiosURLSearchParams","params","_pairs","buildURL","url","serializedParams","_encode","serializeFn","serialize","hashmarkIndex","encoder","product","InterceptorManager$1","InterceptorManager","_classCallCheck","handlers","_createClass","fulfilled","rejected","synchronous","runWhen","id","h","transitionalDefaults","silentJSONParsing","forcedJSONParsing","clarifyTimeoutError","platform$1","isBrowser","classes","URLSearchParams","protocols","hasBrowserEnv","document","hasStandardBrowserEnv","navigator","hasStandardBrowserWebWorkerEnv","WorkerGlobalScope","importScripts","platform","formDataToJSON","buildPath","isNumericKey","isLast","arrayToObject","entries","parsePropPath","defaults","transitional","adapter","transformRequest","data","headers","contentType","getContentType","hasJSONContentType","isObjectPayload","setContentType","helpers","isNode","toURLEncodedForm","formSerializer","_FormData","env","rawValue","parser","parse","e","stringifySafely","transformResponse","JSONRequested","responseType","strictJSONParsing","ERR_BAD_RESPONSE","timeout","xsrfCookieName","xsrfHeaderName","maxContentLength","maxBodyLength","validateStatus","common","Accept","method","defaults$1","ignoreDuplicateOf","$internals","normalizeHeader","header","normalizeValue","matchHeaderValue","isHeaderNameFilter","AxiosHeaders","_Symbol$iterator","_Symbol$toStringTag","valueOrRewrite","rewrite","setHeader","_value","_header","_rewrite","lHeader","rawHeaders","parsed","setHeaders","line","substring","tokens","tokensRE","parseTokens","matcher","deleted","deleteHeader","format","normalized","w","char","formatHeader","_this$constructor","_len","targets","asStrings","_ref2","_slicedToArray","get","first","computed","_len2","_key2","accessors","defineAccessor","accessorName","methodName","arg1","arg2","arg3","configurable","buildAccessors","accessor","mapped","headerValue","AxiosHeaders$1","transformData","fns","normalize","isCancel","__CANCEL__","CanceledError","ERR_CANCELED","write","expires","domain","secure","cookie","Date","toGMTString","read","RegExp","decodeURIComponent","remove","now","buildFullPath","baseURL","requestedURL","relativeURL","combineURLs","originURL","msie","userAgent","urlParsingNode","createElement","resolveURL","href","setAttribute","protocol","host","search","hash","hostname","port","pathname","charAt","location","requestURL","progressEventReducer","listener","isDownloadStream","bytesNotified","_speedometer","samplesCount","min","firstSampleTS","bytes","timestamps","head","tail","chunkLength","startedAt","bytesCount","passed","round","speedometer","loaded","total","lengthComputable","progressBytes","rate","progress","estimated","event","knownAdapters","http","xhr","XMLHttpRequest","Promise","resolve","reject","onCanceled","requestData","requestHeaders","withXSRFToken","cancelToken","unsubscribe","signal","removeEventListener","Boolean","auth","username","password","unescape","btoa","fullPath","onloadend","responseHeaders","getAllResponseHeaders","ERR_BAD_REQUEST","floor","settle","err","responseText","statusText","open","paramsSerializer","onreadystatechange","readyState","responseURL","setTimeout","onabort","ECONNABORTED","onerror","ERR_NETWORK","ontimeout","timeoutErrorMessage","ETIMEDOUT","isURLSameOrigin","xsrfValue","cookies","setRequestHeader","withCredentials","onDownloadProgress","addEventListener","onUploadProgress","upload","cancel","abort","subscribe","aborted","send","renderReason","reason","isResolvedHandle","adapters","nameOrAdapter","rejectedReasons","reasons","state","throwIfCancellationRequested","throwIfRequested","dispatchRequest","headersToObject","mergeConfig","config1","config2","getMergedValue","mergeDeepProperties","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","timeoutMessage","decompress","beforeRedirect","transport","httpAgent","httpsAgent","socketPath","responseEncoding","configValue","VERSION","validators","deprecatedWarnings","validators$1","validator","version","formatMessage","opt","desc","opts","ERR_DEPRECATED","console","warn","assertOptions","schema","allowUnknown","ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","Axios","instanceConfig","interceptors","configOrUrl","_config","contextHeaders","requestInterceptorChain","synchronousRequestInterceptors","interceptor","unshift","promise","responseInterceptorChain","chain","newConfig","onFulfilled","onRejected","generateHTTPMethod","isForm","Axios$1","CancelToken$1","CancelToken","executor","resolvePromise","_listeners","onfulfilled","_resolve","splice","c","HttpStatusCode","Continue","SwitchingProtocols","Processing","EarlyHints","Ok","Created","Accepted","NonAuthoritativeInformation","NoContent","ResetContent","PartialContent","MultiStatus","AlreadyReported","ImUsed","MultipleChoices","MovedPermanently","Found","SeeOther","NotModified","UseProxy","Unused","TemporaryRedirect","PermanentRedirect","BadRequest","Unauthorized","PaymentRequired","Forbidden","NotFound","MethodNotAllowed","NotAcceptable","ProxyAuthenticationRequired","RequestTimeout","Conflict","Gone","LengthRequired","PreconditionFailed","PayloadTooLarge","UriTooLong","UnsupportedMediaType","RangeNotSatisfiable","ExpectationFailed","ImATeapot","MisdirectedRequest","UnprocessableEntity","Locked","FailedDependency","TooEarly","UpgradeRequired","PreconditionRequired","TooManyRequests","RequestHeaderFieldsTooLarge","UnavailableForLegalReasons","InternalServerError","NotImplemented","BadGateway","ServiceUnavailable","GatewayTimeout","HttpVersionNotSupported","VariantAlsoNegotiates","InsufficientStorage","LoopDetected","NotExtended","NetworkAuthenticationRequired","HttpStatusCode$1","axios","createInstance","defaultConfig","instance","Cancel","all","promises","spread","callback","isAxiosError","payload","formToJSON","getAdapter"],"mappings":"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"} \ No newline at end of file diff --git a/task/node_modules/axios/dist/browser/axios.cjs b/task/node_modules/axios/dist/browser/axios.cjs new file mode 100644 index 0000000..a844075 --- /dev/null +++ b/task/node_modules/axios/dist/browser/axios.cjs @@ -0,0 +1,3237 @@ +// Axios v1.6.4 Copyright (c) 2024 Matt Zabriskie and contributors +'use strict'; + +function bind(fn, thisArg) { + return function wrap() { + return fn.apply(thisArg, arguments); + }; +} + +// utils is a library of generic helper functions non-specific to axios + +const {toString} = Object.prototype; +const {getPrototypeOf} = Object; + +const kindOf = (cache => thing => { + const str = toString.call(thing); + return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase()); +})(Object.create(null)); + +const kindOfTest = (type) => { + type = type.toLowerCase(); + return (thing) => kindOf(thing) === type +}; + +const typeOfTest = type => thing => typeof thing === type; + +/** + * Determine if a value is an Array + * + * @param {Object} val The value to test + * + * @returns {boolean} True if value is an Array, otherwise false + */ +const {isArray} = Array; + +/** + * Determine if a value is undefined + * + * @param {*} val The value to test + * + * @returns {boolean} True if the value is undefined, otherwise false + */ +const isUndefined = typeOfTest('undefined'); + +/** + * Determine if a value is a Buffer + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a Buffer, otherwise false + */ +function isBuffer(val) { + return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) + && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val); +} + +/** + * Determine if a value is an ArrayBuffer + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is an ArrayBuffer, otherwise false + */ +const isArrayBuffer = kindOfTest('ArrayBuffer'); + + +/** + * Determine if a value is a view on an ArrayBuffer + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false + */ +function isArrayBufferView(val) { + let result; + if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) { + result = ArrayBuffer.isView(val); + } else { + result = (val) && (val.buffer) && (isArrayBuffer(val.buffer)); + } + return result; +} + +/** + * Determine if a value is a String + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a String, otherwise false + */ +const isString = typeOfTest('string'); + +/** + * Determine if a value is a Function + * + * @param {*} val The value to test + * @returns {boolean} True if value is a Function, otherwise false + */ +const isFunction = typeOfTest('function'); + +/** + * Determine if a value is a Number + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a Number, otherwise false + */ +const isNumber = typeOfTest('number'); + +/** + * Determine if a value is an Object + * + * @param {*} thing The value to test + * + * @returns {boolean} True if value is an Object, otherwise false + */ +const isObject = (thing) => thing !== null && typeof thing === 'object'; + +/** + * Determine if a value is a Boolean + * + * @param {*} thing The value to test + * @returns {boolean} True if value is a Boolean, otherwise false + */ +const isBoolean = thing => thing === true || thing === false; + +/** + * Determine if a value is a plain Object + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a plain Object, otherwise false + */ +const isPlainObject = (val) => { + if (kindOf(val) !== 'object') { + return false; + } + + const prototype = getPrototypeOf(val); + return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val); +}; + +/** + * Determine if a value is a Date + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a Date, otherwise false + */ +const isDate = kindOfTest('Date'); + +/** + * Determine if a value is a File + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a File, otherwise false + */ +const isFile = kindOfTest('File'); + +/** + * Determine if a value is a Blob + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a Blob, otherwise false + */ +const isBlob = kindOfTest('Blob'); + +/** + * Determine if a value is a FileList + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a File, otherwise false + */ +const isFileList = kindOfTest('FileList'); + +/** + * Determine if a value is a Stream + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a Stream, otherwise false + */ +const isStream = (val) => isObject(val) && isFunction(val.pipe); + +/** + * Determine if a value is a FormData + * + * @param {*} thing The value to test + * + * @returns {boolean} True if value is an FormData, otherwise false + */ +const isFormData = (thing) => { + let kind; + return thing && ( + (typeof FormData === 'function' && thing instanceof FormData) || ( + isFunction(thing.append) && ( + (kind = kindOf(thing)) === 'formdata' || + // detect form-data instance + (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]') + ) + ) + ) +}; + +/** + * Determine if a value is a URLSearchParams object + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a URLSearchParams object, otherwise false + */ +const isURLSearchParams = kindOfTest('URLSearchParams'); + +/** + * Trim excess whitespace off the beginning and end of a string + * + * @param {String} str The String to trim + * + * @returns {String} The String freed of excess whitespace + */ +const trim = (str) => str.trim ? + str.trim() : str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); + +/** + * Iterate over an Array or an Object invoking a function for each item. + * + * If `obj` is an Array callback will be called passing + * the value, index, and complete array for each item. + * + * If 'obj' is an Object callback will be called passing + * the value, key, and complete object for each property. + * + * @param {Object|Array} obj The object to iterate + * @param {Function} fn The callback to invoke for each item + * + * @param {Boolean} [allOwnKeys = false] + * @returns {any} + */ +function forEach(obj, fn, {allOwnKeys = false} = {}) { + // Don't bother if no value provided + if (obj === null || typeof obj === 'undefined') { + return; + } + + let i; + let l; + + // Force an array if not already something iterable + if (typeof obj !== 'object') { + /*eslint no-param-reassign:0*/ + obj = [obj]; + } + + if (isArray(obj)) { + // Iterate over array values + for (i = 0, l = obj.length; i < l; i++) { + fn.call(null, obj[i], i, obj); + } + } else { + // Iterate over object keys + const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj); + const len = keys.length; + let key; + + for (i = 0; i < len; i++) { + key = keys[i]; + fn.call(null, obj[key], key, obj); + } + } +} + +function findKey(obj, key) { + key = key.toLowerCase(); + const keys = Object.keys(obj); + let i = keys.length; + let _key; + while (i-- > 0) { + _key = keys[i]; + if (key === _key.toLowerCase()) { + return _key; + } + } + return null; +} + +const _global = (() => { + /*eslint no-undef:0*/ + if (typeof globalThis !== "undefined") return globalThis; + return typeof self !== "undefined" ? self : (typeof window !== 'undefined' ? window : global) +})(); + +const isContextDefined = (context) => !isUndefined(context) && context !== _global; + +/** + * Accepts varargs expecting each argument to be an object, then + * immutably merges the properties of each object and returns result. + * + * When multiple objects contain the same key the later object in + * the arguments list will take precedence. + * + * Example: + * + * ```js + * var result = merge({foo: 123}, {foo: 456}); + * console.log(result.foo); // outputs 456 + * ``` + * + * @param {Object} obj1 Object to merge + * + * @returns {Object} Result of all merge properties + */ +function merge(/* obj1, obj2, obj3, ... */) { + const {caseless} = isContextDefined(this) && this || {}; + const result = {}; + const assignValue = (val, key) => { + const targetKey = caseless && findKey(result, key) || key; + if (isPlainObject(result[targetKey]) && isPlainObject(val)) { + result[targetKey] = merge(result[targetKey], val); + } else if (isPlainObject(val)) { + result[targetKey] = merge({}, val); + } else if (isArray(val)) { + result[targetKey] = val.slice(); + } else { + result[targetKey] = val; + } + }; + + for (let i = 0, l = arguments.length; i < l; i++) { + arguments[i] && forEach(arguments[i], assignValue); + } + return result; +} + +/** + * Extends object a by mutably adding to it the properties of object b. + * + * @param {Object} a The object to be extended + * @param {Object} b The object to copy properties from + * @param {Object} thisArg The object to bind function to + * + * @param {Boolean} [allOwnKeys] + * @returns {Object} The resulting value of object a + */ +const extend = (a, b, thisArg, {allOwnKeys}= {}) => { + forEach(b, (val, key) => { + if (thisArg && isFunction(val)) { + a[key] = bind(val, thisArg); + } else { + a[key] = val; + } + }, {allOwnKeys}); + return a; +}; + +/** + * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM) + * + * @param {string} content with BOM + * + * @returns {string} content value without BOM + */ +const stripBOM = (content) => { + if (content.charCodeAt(0) === 0xFEFF) { + content = content.slice(1); + } + return content; +}; + +/** + * Inherit the prototype methods from one constructor into another + * @param {function} constructor + * @param {function} superConstructor + * @param {object} [props] + * @param {object} [descriptors] + * + * @returns {void} + */ +const inherits = (constructor, superConstructor, props, descriptors) => { + constructor.prototype = Object.create(superConstructor.prototype, descriptors); + constructor.prototype.constructor = constructor; + Object.defineProperty(constructor, 'super', { + value: superConstructor.prototype + }); + props && Object.assign(constructor.prototype, props); +}; + +/** + * Resolve object with deep prototype chain to a flat object + * @param {Object} sourceObj source object + * @param {Object} [destObj] + * @param {Function|Boolean} [filter] + * @param {Function} [propFilter] + * + * @returns {Object} + */ +const toFlatObject = (sourceObj, destObj, filter, propFilter) => { + let props; + let i; + let prop; + const merged = {}; + + destObj = destObj || {}; + // eslint-disable-next-line no-eq-null,eqeqeq + if (sourceObj == null) return destObj; + + do { + props = Object.getOwnPropertyNames(sourceObj); + i = props.length; + while (i-- > 0) { + prop = props[i]; + if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) { + destObj[prop] = sourceObj[prop]; + merged[prop] = true; + } + } + sourceObj = filter !== false && getPrototypeOf(sourceObj); + } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype); + + return destObj; +}; + +/** + * Determines whether a string ends with the characters of a specified string + * + * @param {String} str + * @param {String} searchString + * @param {Number} [position= 0] + * + * @returns {boolean} + */ +const endsWith = (str, searchString, position) => { + str = String(str); + if (position === undefined || position > str.length) { + position = str.length; + } + position -= searchString.length; + const lastIndex = str.indexOf(searchString, position); + return lastIndex !== -1 && lastIndex === position; +}; + + +/** + * Returns new array from array like object or null if failed + * + * @param {*} [thing] + * + * @returns {?Array} + */ +const toArray = (thing) => { + if (!thing) return null; + if (isArray(thing)) return thing; + let i = thing.length; + if (!isNumber(i)) return null; + const arr = new Array(i); + while (i-- > 0) { + arr[i] = thing[i]; + } + return arr; +}; + +/** + * Checking if the Uint8Array exists and if it does, it returns a function that checks if the + * thing passed in is an instance of Uint8Array + * + * @param {TypedArray} + * + * @returns {Array} + */ +// eslint-disable-next-line func-names +const isTypedArray = (TypedArray => { + // eslint-disable-next-line func-names + return thing => { + return TypedArray && thing instanceof TypedArray; + }; +})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array)); + +/** + * For each entry in the object, call the function with the key and value. + * + * @param {Object} obj - The object to iterate over. + * @param {Function} fn - The function to call for each entry. + * + * @returns {void} + */ +const forEachEntry = (obj, fn) => { + const generator = obj && obj[Symbol.iterator]; + + const iterator = generator.call(obj); + + let result; + + while ((result = iterator.next()) && !result.done) { + const pair = result.value; + fn.call(obj, pair[0], pair[1]); + } +}; + +/** + * It takes a regular expression and a string, and returns an array of all the matches + * + * @param {string} regExp - The regular expression to match against. + * @param {string} str - The string to search. + * + * @returns {Array} + */ +const matchAll = (regExp, str) => { + let matches; + const arr = []; + + while ((matches = regExp.exec(str)) !== null) { + arr.push(matches); + } + + return arr; +}; + +/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */ +const isHTMLForm = kindOfTest('HTMLFormElement'); + +const toCamelCase = str => { + return str.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g, + function replacer(m, p1, p2) { + return p1.toUpperCase() + p2; + } + ); +}; + +/* Creating a function that will check if an object has a property. */ +const hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype); + +/** + * Determine if a value is a RegExp object + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a RegExp object, otherwise false + */ +const isRegExp = kindOfTest('RegExp'); + +const reduceDescriptors = (obj, reducer) => { + const descriptors = Object.getOwnPropertyDescriptors(obj); + const reducedDescriptors = {}; + + forEach(descriptors, (descriptor, name) => { + let ret; + if ((ret = reducer(descriptor, name, obj)) !== false) { + reducedDescriptors[name] = ret || descriptor; + } + }); + + Object.defineProperties(obj, reducedDescriptors); +}; + +/** + * Makes all methods read-only + * @param {Object} obj + */ + +const freezeMethods = (obj) => { + reduceDescriptors(obj, (descriptor, name) => { + // skip restricted props in strict mode + if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) { + return false; + } + + const value = obj[name]; + + if (!isFunction(value)) return; + + descriptor.enumerable = false; + + if ('writable' in descriptor) { + descriptor.writable = false; + return; + } + + if (!descriptor.set) { + descriptor.set = () => { + throw Error('Can not rewrite read-only method \'' + name + '\''); + }; + } + }); +}; + +const toObjectSet = (arrayOrString, delimiter) => { + const obj = {}; + + const define = (arr) => { + arr.forEach(value => { + obj[value] = true; + }); + }; + + isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter)); + + return obj; +}; + +const noop = () => {}; + +const toFiniteNumber = (value, defaultValue) => { + value = +value; + return Number.isFinite(value) ? value : defaultValue; +}; + +const ALPHA = 'abcdefghijklmnopqrstuvwxyz'; + +const DIGIT = '0123456789'; + +const ALPHABET = { + DIGIT, + ALPHA, + ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT +}; + +const generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => { + let str = ''; + const {length} = alphabet; + while (size--) { + str += alphabet[Math.random() * length|0]; + } + + return str; +}; + +/** + * If the thing is a FormData object, return true, otherwise return false. + * + * @param {unknown} thing - The thing to check. + * + * @returns {boolean} + */ +function isSpecCompliantForm(thing) { + return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]); +} + +const toJSONObject = (obj) => { + const stack = new Array(10); + + const visit = (source, i) => { + + if (isObject(source)) { + if (stack.indexOf(source) >= 0) { + return; + } + + if(!('toJSON' in source)) { + stack[i] = source; + const target = isArray(source) ? [] : {}; + + forEach(source, (value, key) => { + const reducedValue = visit(value, i + 1); + !isUndefined(reducedValue) && (target[key] = reducedValue); + }); + + stack[i] = undefined; + + return target; + } + } + + return source; + }; + + return visit(obj, 0); +}; + +const isAsyncFn = kindOfTest('AsyncFunction'); + +const isThenable = (thing) => + thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch); + +var utils$1 = { + isArray, + isArrayBuffer, + isBuffer, + isFormData, + isArrayBufferView, + isString, + isNumber, + isBoolean, + isObject, + isPlainObject, + isUndefined, + isDate, + isFile, + isBlob, + isRegExp, + isFunction, + isStream, + isURLSearchParams, + isTypedArray, + isFileList, + forEach, + merge, + extend, + trim, + stripBOM, + inherits, + toFlatObject, + kindOf, + kindOfTest, + endsWith, + toArray, + forEachEntry, + matchAll, + isHTMLForm, + hasOwnProperty, + hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection + reduceDescriptors, + freezeMethods, + toObjectSet, + toCamelCase, + noop, + toFiniteNumber, + findKey, + global: _global, + isContextDefined, + ALPHABET, + generateString, + isSpecCompliantForm, + toJSONObject, + isAsyncFn, + isThenable +}; + +/** + * Create an Error with the specified message, config, error code, request and response. + * + * @param {string} message The error message. + * @param {string} [code] The error code (for example, 'ECONNABORTED'). + * @param {Object} [config] The config. + * @param {Object} [request] The request. + * @param {Object} [response] The response. + * + * @returns {Error} The created error. + */ +function AxiosError(message, code, config, request, response) { + Error.call(this); + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } else { + this.stack = (new Error()).stack; + } + + this.message = message; + this.name = 'AxiosError'; + code && (this.code = code); + config && (this.config = config); + request && (this.request = request); + response && (this.response = response); +} + +utils$1.inherits(AxiosError, Error, { + toJSON: function toJSON() { + return { + // Standard + message: this.message, + name: this.name, + // Microsoft + description: this.description, + number: this.number, + // Mozilla + fileName: this.fileName, + lineNumber: this.lineNumber, + columnNumber: this.columnNumber, + stack: this.stack, + // Axios + config: utils$1.toJSONObject(this.config), + code: this.code, + status: this.response && this.response.status ? this.response.status : null + }; + } +}); + +const prototype$1 = AxiosError.prototype; +const descriptors = {}; + +[ + 'ERR_BAD_OPTION_VALUE', + 'ERR_BAD_OPTION', + 'ECONNABORTED', + 'ETIMEDOUT', + 'ERR_NETWORK', + 'ERR_FR_TOO_MANY_REDIRECTS', + 'ERR_DEPRECATED', + 'ERR_BAD_RESPONSE', + 'ERR_BAD_REQUEST', + 'ERR_CANCELED', + 'ERR_NOT_SUPPORT', + 'ERR_INVALID_URL' +// eslint-disable-next-line func-names +].forEach(code => { + descriptors[code] = {value: code}; +}); + +Object.defineProperties(AxiosError, descriptors); +Object.defineProperty(prototype$1, 'isAxiosError', {value: true}); + +// eslint-disable-next-line func-names +AxiosError.from = (error, code, config, request, response, customProps) => { + const axiosError = Object.create(prototype$1); + + utils$1.toFlatObject(error, axiosError, function filter(obj) { + return obj !== Error.prototype; + }, prop => { + return prop !== 'isAxiosError'; + }); + + AxiosError.call(axiosError, error.message, code, config, request, response); + + axiosError.cause = error; + + axiosError.name = error.name; + + customProps && Object.assign(axiosError, customProps); + + return axiosError; +}; + +// eslint-disable-next-line strict +var httpAdapter = null; + +/** + * Determines if the given thing is a array or js object. + * + * @param {string} thing - The object or array to be visited. + * + * @returns {boolean} + */ +function isVisitable(thing) { + return utils$1.isPlainObject(thing) || utils$1.isArray(thing); +} + +/** + * It removes the brackets from the end of a string + * + * @param {string} key - The key of the parameter. + * + * @returns {string} the key without the brackets. + */ +function removeBrackets(key) { + return utils$1.endsWith(key, '[]') ? key.slice(0, -2) : key; +} + +/** + * It takes a path, a key, and a boolean, and returns a string + * + * @param {string} path - The path to the current key. + * @param {string} key - The key of the current object being iterated over. + * @param {string} dots - If true, the key will be rendered with dots instead of brackets. + * + * @returns {string} The path to the current key. + */ +function renderKey(path, key, dots) { + if (!path) return key; + return path.concat(key).map(function each(token, i) { + // eslint-disable-next-line no-param-reassign + token = removeBrackets(token); + return !dots && i ? '[' + token + ']' : token; + }).join(dots ? '.' : ''); +} + +/** + * If the array is an array and none of its elements are visitable, then it's a flat array. + * + * @param {Array} arr - The array to check + * + * @returns {boolean} + */ +function isFlatArray(arr) { + return utils$1.isArray(arr) && !arr.some(isVisitable); +} + +const predicates = utils$1.toFlatObject(utils$1, {}, null, function filter(prop) { + return /^is[A-Z]/.test(prop); +}); + +/** + * Convert a data object to FormData + * + * @param {Object} obj + * @param {?Object} [formData] + * @param {?Object} [options] + * @param {Function} [options.visitor] + * @param {Boolean} [options.metaTokens = true] + * @param {Boolean} [options.dots = false] + * @param {?Boolean} [options.indexes = false] + * + * @returns {Object} + **/ + +/** + * It converts an object into a FormData object + * + * @param {Object} obj - The object to convert to form data. + * @param {string} formData - The FormData object to append to. + * @param {Object} options + * + * @returns + */ +function toFormData(obj, formData, options) { + if (!utils$1.isObject(obj)) { + throw new TypeError('target must be an object'); + } + + // eslint-disable-next-line no-param-reassign + formData = formData || new (FormData)(); + + // eslint-disable-next-line no-param-reassign + options = utils$1.toFlatObject(options, { + metaTokens: true, + dots: false, + indexes: false + }, false, function defined(option, source) { + // eslint-disable-next-line no-eq-null,eqeqeq + return !utils$1.isUndefined(source[option]); + }); + + const metaTokens = options.metaTokens; + // eslint-disable-next-line no-use-before-define + const visitor = options.visitor || defaultVisitor; + const dots = options.dots; + const indexes = options.indexes; + const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob; + const useBlob = _Blob && utils$1.isSpecCompliantForm(formData); + + if (!utils$1.isFunction(visitor)) { + throw new TypeError('visitor must be a function'); + } + + function convertValue(value) { + if (value === null) return ''; + + if (utils$1.isDate(value)) { + return value.toISOString(); + } + + if (!useBlob && utils$1.isBlob(value)) { + throw new AxiosError('Blob is not supported. Use a Buffer instead.'); + } + + if (utils$1.isArrayBuffer(value) || utils$1.isTypedArray(value)) { + return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value); + } + + return value; + } + + /** + * Default visitor. + * + * @param {*} value + * @param {String|Number} key + * @param {Array} path + * @this {FormData} + * + * @returns {boolean} return true to visit the each prop of the value recursively + */ + function defaultVisitor(value, key, path) { + let arr = value; + + if (value && !path && typeof value === 'object') { + if (utils$1.endsWith(key, '{}')) { + // eslint-disable-next-line no-param-reassign + key = metaTokens ? key : key.slice(0, -2); + // eslint-disable-next-line no-param-reassign + value = JSON.stringify(value); + } else if ( + (utils$1.isArray(value) && isFlatArray(value)) || + ((utils$1.isFileList(value) || utils$1.endsWith(key, '[]')) && (arr = utils$1.toArray(value)) + )) { + // eslint-disable-next-line no-param-reassign + key = removeBrackets(key); + + arr.forEach(function each(el, index) { + !(utils$1.isUndefined(el) || el === null) && formData.append( + // eslint-disable-next-line no-nested-ternary + indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'), + convertValue(el) + ); + }); + return false; + } + } + + if (isVisitable(value)) { + return true; + } + + formData.append(renderKey(path, key, dots), convertValue(value)); + + return false; + } + + const stack = []; + + const exposedHelpers = Object.assign(predicates, { + defaultVisitor, + convertValue, + isVisitable + }); + + function build(value, path) { + if (utils$1.isUndefined(value)) return; + + if (stack.indexOf(value) !== -1) { + throw Error('Circular reference detected in ' + path.join('.')); + } + + stack.push(value); + + utils$1.forEach(value, function each(el, key) { + const result = !(utils$1.isUndefined(el) || el === null) && visitor.call( + formData, el, utils$1.isString(key) ? key.trim() : key, path, exposedHelpers + ); + + if (result === true) { + build(el, path ? path.concat(key) : [key]); + } + }); + + stack.pop(); + } + + if (!utils$1.isObject(obj)) { + throw new TypeError('data must be an object'); + } + + build(obj); + + return formData; +} + +/** + * It encodes a string by replacing all characters that are not in the unreserved set with + * their percent-encoded equivalents + * + * @param {string} str - The string to encode. + * + * @returns {string} The encoded string. + */ +function encode$1(str) { + const charMap = { + '!': '%21', + "'": '%27', + '(': '%28', + ')': '%29', + '~': '%7E', + '%20': '+', + '%00': '\x00' + }; + return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) { + return charMap[match]; + }); +} + +/** + * It takes a params object and converts it to a FormData object + * + * @param {Object} params - The parameters to be converted to a FormData object. + * @param {Object} options - The options object passed to the Axios constructor. + * + * @returns {void} + */ +function AxiosURLSearchParams(params, options) { + this._pairs = []; + + params && toFormData(params, this, options); +} + +const prototype = AxiosURLSearchParams.prototype; + +prototype.append = function append(name, value) { + this._pairs.push([name, value]); +}; + +prototype.toString = function toString(encoder) { + const _encode = encoder ? function(value) { + return encoder.call(this, value, encode$1); + } : encode$1; + + return this._pairs.map(function each(pair) { + return _encode(pair[0]) + '=' + _encode(pair[1]); + }, '').join('&'); +}; + +/** + * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their + * URI encoded counterparts + * + * @param {string} val The value to be encoded. + * + * @returns {string} The encoded value. + */ +function encode(val) { + return encodeURIComponent(val). + replace(/%3A/gi, ':'). + replace(/%24/g, '$'). + replace(/%2C/gi, ','). + replace(/%20/g, '+'). + replace(/%5B/gi, '['). + replace(/%5D/gi, ']'); +} + +/** + * Build a URL by appending params to the end + * + * @param {string} url The base of the url (e.g., http://www.google.com) + * @param {object} [params] The params to be appended + * @param {?object} options + * + * @returns {string} The formatted url + */ +function buildURL(url, params, options) { + /*eslint no-param-reassign:0*/ + if (!params) { + return url; + } + + const _encode = options && options.encode || encode; + + const serializeFn = options && options.serialize; + + let serializedParams; + + if (serializeFn) { + serializedParams = serializeFn(params, options); + } else { + serializedParams = utils$1.isURLSearchParams(params) ? + params.toString() : + new AxiosURLSearchParams(params, options).toString(_encode); + } + + if (serializedParams) { + const hashmarkIndex = url.indexOf("#"); + + if (hashmarkIndex !== -1) { + url = url.slice(0, hashmarkIndex); + } + url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams; + } + + return url; +} + +class InterceptorManager { + constructor() { + this.handlers = []; + } + + /** + * Add a new interceptor to the stack + * + * @param {Function} fulfilled The function to handle `then` for a `Promise` + * @param {Function} rejected The function to handle `reject` for a `Promise` + * + * @return {Number} An ID used to remove interceptor later + */ + use(fulfilled, rejected, options) { + this.handlers.push({ + fulfilled, + rejected, + synchronous: options ? options.synchronous : false, + runWhen: options ? options.runWhen : null + }); + return this.handlers.length - 1; + } + + /** + * Remove an interceptor from the stack + * + * @param {Number} id The ID that was returned by `use` + * + * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise + */ + eject(id) { + if (this.handlers[id]) { + this.handlers[id] = null; + } + } + + /** + * Clear all interceptors from the stack + * + * @returns {void} + */ + clear() { + if (this.handlers) { + this.handlers = []; + } + } + + /** + * Iterate over all the registered interceptors + * + * This method is particularly useful for skipping over any + * interceptors that may have become `null` calling `eject`. + * + * @param {Function} fn The function to call for each interceptor + * + * @returns {void} + */ + forEach(fn) { + utils$1.forEach(this.handlers, function forEachHandler(h) { + if (h !== null) { + fn(h); + } + }); + } +} + +var InterceptorManager$1 = InterceptorManager; + +var transitionalDefaults = { + silentJSONParsing: true, + forcedJSONParsing: true, + clarifyTimeoutError: false +}; + +var URLSearchParams$1 = typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams; + +var FormData$1 = typeof FormData !== 'undefined' ? FormData : null; + +var Blob$1 = typeof Blob !== 'undefined' ? Blob : null; + +var platform$1 = { + isBrowser: true, + classes: { + URLSearchParams: URLSearchParams$1, + FormData: FormData$1, + Blob: Blob$1 + }, + protocols: ['http', 'https', 'file', 'blob', 'url', 'data'] +}; + +const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined'; + +/** + * Determine if we're running in a standard browser environment + * + * This allows axios to run in a web worker, and react-native. + * Both environments support XMLHttpRequest, but not fully standard globals. + * + * web workers: + * typeof window -> undefined + * typeof document -> undefined + * + * react-native: + * navigator.product -> 'ReactNative' + * nativescript + * navigator.product -> 'NativeScript' or 'NS' + * + * @returns {boolean} + */ +const hasStandardBrowserEnv = ( + (product) => { + return hasBrowserEnv && ['ReactNative', 'NativeScript', 'NS'].indexOf(product) < 0 + })(typeof navigator !== 'undefined' && navigator.product); + +/** + * Determine if we're running in a standard browser webWorker environment + * + * Although the `isStandardBrowserEnv` method indicates that + * `allows axios to run in a web worker`, the WebWorker will still be + * filtered out due to its judgment standard + * `typeof window !== 'undefined' && typeof document !== 'undefined'`. + * This leads to a problem when axios post `FormData` in webWorker + */ +const hasStandardBrowserWebWorkerEnv = (() => { + return ( + typeof WorkerGlobalScope !== 'undefined' && + // eslint-disable-next-line no-undef + self instanceof WorkerGlobalScope && + typeof self.importScripts === 'function' + ); +})(); + +var utils = /*#__PURE__*/Object.freeze({ + __proto__: null, + hasBrowserEnv: hasBrowserEnv, + hasStandardBrowserWebWorkerEnv: hasStandardBrowserWebWorkerEnv, + hasStandardBrowserEnv: hasStandardBrowserEnv +}); + +var platform = { + ...utils, + ...platform$1 +}; + +function toURLEncodedForm(data, options) { + return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({ + visitor: function(value, key, path, helpers) { + if (platform.isNode && utils$1.isBuffer(value)) { + this.append(key, value.toString('base64')); + return false; + } + + return helpers.defaultVisitor.apply(this, arguments); + } + }, options)); +} + +/** + * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z'] + * + * @param {string} name - The name of the property to get. + * + * @returns An array of strings. + */ +function parsePropPath(name) { + // foo[x][y][z] + // foo.x.y.z + // foo-x-y-z + // foo x y z + return utils$1.matchAll(/\w+|\[(\w*)]/g, name).map(match => { + return match[0] === '[]' ? '' : match[1] || match[0]; + }); +} + +/** + * Convert an array to an object. + * + * @param {Array} arr - The array to convert to an object. + * + * @returns An object with the same keys and values as the array. + */ +function arrayToObject(arr) { + const obj = {}; + const keys = Object.keys(arr); + let i; + const len = keys.length; + let key; + for (i = 0; i < len; i++) { + key = keys[i]; + obj[key] = arr[key]; + } + return obj; +} + +/** + * It takes a FormData object and returns a JavaScript object + * + * @param {string} formData The FormData object to convert to JSON. + * + * @returns {Object | null} The converted object. + */ +function formDataToJSON(formData) { + function buildPath(path, value, target, index) { + let name = path[index++]; + + if (name === '__proto__') return true; + + const isNumericKey = Number.isFinite(+name); + const isLast = index >= path.length; + name = !name && utils$1.isArray(target) ? target.length : name; + + if (isLast) { + if (utils$1.hasOwnProp(target, name)) { + target[name] = [target[name], value]; + } else { + target[name] = value; + } + + return !isNumericKey; + } + + if (!target[name] || !utils$1.isObject(target[name])) { + target[name] = []; + } + + const result = buildPath(path, value, target[name], index); + + if (result && utils$1.isArray(target[name])) { + target[name] = arrayToObject(target[name]); + } + + return !isNumericKey; + } + + if (utils$1.isFormData(formData) && utils$1.isFunction(formData.entries)) { + const obj = {}; + + utils$1.forEachEntry(formData, (name, value) => { + buildPath(parsePropPath(name), value, obj, 0); + }); + + return obj; + } + + return null; +} + +/** + * It takes a string, tries to parse it, and if it fails, it returns the stringified version + * of the input + * + * @param {any} rawValue - The value to be stringified. + * @param {Function} parser - A function that parses a string into a JavaScript object. + * @param {Function} encoder - A function that takes a value and returns a string. + * + * @returns {string} A stringified version of the rawValue. + */ +function stringifySafely(rawValue, parser, encoder) { + if (utils$1.isString(rawValue)) { + try { + (parser || JSON.parse)(rawValue); + return utils$1.trim(rawValue); + } catch (e) { + if (e.name !== 'SyntaxError') { + throw e; + } + } + } + + return (encoder || JSON.stringify)(rawValue); +} + +const defaults = { + + transitional: transitionalDefaults, + + adapter: ['xhr', 'http'], + + transformRequest: [function transformRequest(data, headers) { + const contentType = headers.getContentType() || ''; + const hasJSONContentType = contentType.indexOf('application/json') > -1; + const isObjectPayload = utils$1.isObject(data); + + if (isObjectPayload && utils$1.isHTMLForm(data)) { + data = new FormData(data); + } + + const isFormData = utils$1.isFormData(data); + + if (isFormData) { + if (!hasJSONContentType) { + return data; + } + return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data; + } + + if (utils$1.isArrayBuffer(data) || + utils$1.isBuffer(data) || + utils$1.isStream(data) || + utils$1.isFile(data) || + utils$1.isBlob(data) + ) { + return data; + } + if (utils$1.isArrayBufferView(data)) { + return data.buffer; + } + if (utils$1.isURLSearchParams(data)) { + headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false); + return data.toString(); + } + + let isFileList; + + if (isObjectPayload) { + if (contentType.indexOf('application/x-www-form-urlencoded') > -1) { + return toURLEncodedForm(data, this.formSerializer).toString(); + } + + if ((isFileList = utils$1.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) { + const _FormData = this.env && this.env.FormData; + + return toFormData( + isFileList ? {'files[]': data} : data, + _FormData && new _FormData(), + this.formSerializer + ); + } + } + + if (isObjectPayload || hasJSONContentType ) { + headers.setContentType('application/json', false); + return stringifySafely(data); + } + + return data; + }], + + transformResponse: [function transformResponse(data) { + const transitional = this.transitional || defaults.transitional; + const forcedJSONParsing = transitional && transitional.forcedJSONParsing; + const JSONRequested = this.responseType === 'json'; + + if (data && utils$1.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) { + const silentJSONParsing = transitional && transitional.silentJSONParsing; + const strictJSONParsing = !silentJSONParsing && JSONRequested; + + try { + return JSON.parse(data); + } catch (e) { + if (strictJSONParsing) { + if (e.name === 'SyntaxError') { + throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response); + } + throw e; + } + } + } + + return data; + }], + + /** + * A timeout in milliseconds to abort a request. If set to 0 (default) a + * timeout is not created. + */ + timeout: 0, + + xsrfCookieName: 'XSRF-TOKEN', + xsrfHeaderName: 'X-XSRF-TOKEN', + + maxContentLength: -1, + maxBodyLength: -1, + + env: { + FormData: platform.classes.FormData, + Blob: platform.classes.Blob + }, + + validateStatus: function validateStatus(status) { + return status >= 200 && status < 300; + }, + + headers: { + common: { + 'Accept': 'application/json, text/plain, */*', + 'Content-Type': undefined + } + } +}; + +utils$1.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => { + defaults.headers[method] = {}; +}); + +var defaults$1 = defaults; + +// RawAxiosHeaders whose duplicates are ignored by node +// c.f. https://nodejs.org/api/http.html#http_message_headers +const ignoreDuplicateOf = utils$1.toObjectSet([ + 'age', 'authorization', 'content-length', 'content-type', 'etag', + 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', + 'last-modified', 'location', 'max-forwards', 'proxy-authorization', + 'referer', 'retry-after', 'user-agent' +]); + +/** + * Parse headers into an object + * + * ``` + * Date: Wed, 27 Aug 2014 08:58:49 GMT + * Content-Type: application/json + * Connection: keep-alive + * Transfer-Encoding: chunked + * ``` + * + * @param {String} rawHeaders Headers needing to be parsed + * + * @returns {Object} Headers parsed into an object + */ +var parseHeaders = rawHeaders => { + const parsed = {}; + let key; + let val; + let i; + + rawHeaders && rawHeaders.split('\n').forEach(function parser(line) { + i = line.indexOf(':'); + key = line.substring(0, i).trim().toLowerCase(); + val = line.substring(i + 1).trim(); + + if (!key || (parsed[key] && ignoreDuplicateOf[key])) { + return; + } + + if (key === 'set-cookie') { + if (parsed[key]) { + parsed[key].push(val); + } else { + parsed[key] = [val]; + } + } else { + parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; + } + }); + + return parsed; +}; + +const $internals = Symbol('internals'); + +function normalizeHeader(header) { + return header && String(header).trim().toLowerCase(); +} + +function normalizeValue(value) { + if (value === false || value == null) { + return value; + } + + return utils$1.isArray(value) ? value.map(normalizeValue) : String(value); +} + +function parseTokens(str) { + const tokens = Object.create(null); + const tokensRE = /([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g; + let match; + + while ((match = tokensRE.exec(str))) { + tokens[match[1]] = match[2]; + } + + return tokens; +} + +const isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim()); + +function matchHeaderValue(context, value, header, filter, isHeaderNameFilter) { + if (utils$1.isFunction(filter)) { + return filter.call(this, value, header); + } + + if (isHeaderNameFilter) { + value = header; + } + + if (!utils$1.isString(value)) return; + + if (utils$1.isString(filter)) { + return value.indexOf(filter) !== -1; + } + + if (utils$1.isRegExp(filter)) { + return filter.test(value); + } +} + +function formatHeader(header) { + return header.trim() + .toLowerCase().replace(/([a-z\d])(\w*)/g, (w, char, str) => { + return char.toUpperCase() + str; + }); +} + +function buildAccessors(obj, header) { + const accessorName = utils$1.toCamelCase(' ' + header); + + ['get', 'set', 'has'].forEach(methodName => { + Object.defineProperty(obj, methodName + accessorName, { + value: function(arg1, arg2, arg3) { + return this[methodName].call(this, header, arg1, arg2, arg3); + }, + configurable: true + }); + }); +} + +class AxiosHeaders { + constructor(headers) { + headers && this.set(headers); + } + + set(header, valueOrRewrite, rewrite) { + const self = this; + + function setHeader(_value, _header, _rewrite) { + const lHeader = normalizeHeader(_header); + + if (!lHeader) { + throw new Error('header name must be a non-empty string'); + } + + const key = utils$1.findKey(self, lHeader); + + if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) { + self[key || _header] = normalizeValue(_value); + } + } + + const setHeaders = (headers, _rewrite) => + utils$1.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite)); + + if (utils$1.isPlainObject(header) || header instanceof this.constructor) { + setHeaders(header, valueOrRewrite); + } else if(utils$1.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) { + setHeaders(parseHeaders(header), valueOrRewrite); + } else { + header != null && setHeader(valueOrRewrite, header, rewrite); + } + + return this; + } + + get(header, parser) { + header = normalizeHeader(header); + + if (header) { + const key = utils$1.findKey(this, header); + + if (key) { + const value = this[key]; + + if (!parser) { + return value; + } + + if (parser === true) { + return parseTokens(value); + } + + if (utils$1.isFunction(parser)) { + return parser.call(this, value, key); + } + + if (utils$1.isRegExp(parser)) { + return parser.exec(value); + } + + throw new TypeError('parser must be boolean|regexp|function'); + } + } + } + + has(header, matcher) { + header = normalizeHeader(header); + + if (header) { + const key = utils$1.findKey(this, header); + + return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher))); + } + + return false; + } + + delete(header, matcher) { + const self = this; + let deleted = false; + + function deleteHeader(_header) { + _header = normalizeHeader(_header); + + if (_header) { + const key = utils$1.findKey(self, _header); + + if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) { + delete self[key]; + + deleted = true; + } + } + } + + if (utils$1.isArray(header)) { + header.forEach(deleteHeader); + } else { + deleteHeader(header); + } + + return deleted; + } + + clear(matcher) { + const keys = Object.keys(this); + let i = keys.length; + let deleted = false; + + while (i--) { + const key = keys[i]; + if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) { + delete this[key]; + deleted = true; + } + } + + return deleted; + } + + normalize(format) { + const self = this; + const headers = {}; + + utils$1.forEach(this, (value, header) => { + const key = utils$1.findKey(headers, header); + + if (key) { + self[key] = normalizeValue(value); + delete self[header]; + return; + } + + const normalized = format ? formatHeader(header) : String(header).trim(); + + if (normalized !== header) { + delete self[header]; + } + + self[normalized] = normalizeValue(value); + + headers[normalized] = true; + }); + + return this; + } + + concat(...targets) { + return this.constructor.concat(this, ...targets); + } + + toJSON(asStrings) { + const obj = Object.create(null); + + utils$1.forEach(this, (value, header) => { + value != null && value !== false && (obj[header] = asStrings && utils$1.isArray(value) ? value.join(', ') : value); + }); + + return obj; + } + + [Symbol.iterator]() { + return Object.entries(this.toJSON())[Symbol.iterator](); + } + + toString() { + return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\n'); + } + + get [Symbol.toStringTag]() { + return 'AxiosHeaders'; + } + + static from(thing) { + return thing instanceof this ? thing : new this(thing); + } + + static concat(first, ...targets) { + const computed = new this(first); + + targets.forEach((target) => computed.set(target)); + + return computed; + } + + static accessor(header) { + const internals = this[$internals] = (this[$internals] = { + accessors: {} + }); + + const accessors = internals.accessors; + const prototype = this.prototype; + + function defineAccessor(_header) { + const lHeader = normalizeHeader(_header); + + if (!accessors[lHeader]) { + buildAccessors(prototype, _header); + accessors[lHeader] = true; + } + } + + utils$1.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header); + + return this; + } +} + +AxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']); + +// reserved names hotfix +utils$1.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => { + let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set` + return { + get: () => value, + set(headerValue) { + this[mapped] = headerValue; + } + } +}); + +utils$1.freezeMethods(AxiosHeaders); + +var AxiosHeaders$1 = AxiosHeaders; + +/** + * Transform the data for a request or a response + * + * @param {Array|Function} fns A single function or Array of functions + * @param {?Object} response The response object + * + * @returns {*} The resulting transformed data + */ +function transformData(fns, response) { + const config = this || defaults$1; + const context = response || config; + const headers = AxiosHeaders$1.from(context.headers); + let data = context.data; + + utils$1.forEach(fns, function transform(fn) { + data = fn.call(config, data, headers.normalize(), response ? response.status : undefined); + }); + + headers.normalize(); + + return data; +} + +function isCancel(value) { + return !!(value && value.__CANCEL__); +} + +/** + * A `CanceledError` is an object that is thrown when an operation is canceled. + * + * @param {string=} message The message. + * @param {Object=} config The config. + * @param {Object=} request The request. + * + * @returns {CanceledError} The created error. + */ +function CanceledError(message, config, request) { + // eslint-disable-next-line no-eq-null,eqeqeq + AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request); + this.name = 'CanceledError'; +} + +utils$1.inherits(CanceledError, AxiosError, { + __CANCEL__: true +}); + +/** + * Resolve or reject a Promise based on response status. + * + * @param {Function} resolve A function that resolves the promise. + * @param {Function} reject A function that rejects the promise. + * @param {object} response The response. + * + * @returns {object} The response. + */ +function settle(resolve, reject, response) { + const validateStatus = response.config.validateStatus; + if (!response.status || !validateStatus || validateStatus(response.status)) { + resolve(response); + } else { + reject(new AxiosError( + 'Request failed with status code ' + response.status, + [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4], + response.config, + response.request, + response + )); + } +} + +var cookies = platform.hasStandardBrowserEnv ? + + // Standard browser envs support document.cookie + { + write(name, value, expires, path, domain, secure) { + const cookie = [name + '=' + encodeURIComponent(value)]; + + utils$1.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString()); + + utils$1.isString(path) && cookie.push('path=' + path); + + utils$1.isString(domain) && cookie.push('domain=' + domain); + + secure === true && cookie.push('secure'); + + document.cookie = cookie.join('; '); + }, + + read(name) { + const match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)')); + return (match ? decodeURIComponent(match[3]) : null); + }, + + remove(name) { + this.write(name, '', Date.now() - 86400000); + } + } + + : + + // Non-standard browser env (web workers, react-native) lack needed support. + { + write() {}, + read() { + return null; + }, + remove() {} + }; + +/** + * Determines whether the specified URL is absolute + * + * @param {string} url The URL to test + * + * @returns {boolean} True if the specified URL is absolute, otherwise false + */ +function isAbsoluteURL(url) { + // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL). + // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed + // by any combination of letters, digits, plus, period, or hyphen. + return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url); +} + +/** + * Creates a new URL by combining the specified URLs + * + * @param {string} baseURL The base URL + * @param {string} relativeURL The relative URL + * + * @returns {string} The combined URL + */ +function combineURLs(baseURL, relativeURL) { + return relativeURL + ? baseURL.replace(/\/?\/$/, '') + '/' + relativeURL.replace(/^\/+/, '') + : baseURL; +} + +/** + * Creates a new URL by combining the baseURL with the requestedURL, + * only when the requestedURL is not already an absolute URL. + * If the requestURL is absolute, this function returns the requestedURL untouched. + * + * @param {string} baseURL The base URL + * @param {string} requestedURL Absolute or relative URL to combine + * + * @returns {string} The combined full path + */ +function buildFullPath(baseURL, requestedURL) { + if (baseURL && !isAbsoluteURL(requestedURL)) { + return combineURLs(baseURL, requestedURL); + } + return requestedURL; +} + +var isURLSameOrigin = platform.hasStandardBrowserEnv ? + +// Standard browser envs have full support of the APIs needed to test +// whether the request URL is of the same origin as current location. + (function standardBrowserEnv() { + const msie = /(msie|trident)/i.test(navigator.userAgent); + const urlParsingNode = document.createElement('a'); + let originURL; + + /** + * Parse a URL to discover its components + * + * @param {String} url The URL to be parsed + * @returns {Object} + */ + function resolveURL(url) { + let href = url; + + if (msie) { + // IE needs attribute set twice to normalize properties + urlParsingNode.setAttribute('href', href); + href = urlParsingNode.href; + } + + urlParsingNode.setAttribute('href', href); + + // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils + return { + href: urlParsingNode.href, + protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', + host: urlParsingNode.host, + search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', + hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', + hostname: urlParsingNode.hostname, + port: urlParsingNode.port, + pathname: (urlParsingNode.pathname.charAt(0) === '/') ? + urlParsingNode.pathname : + '/' + urlParsingNode.pathname + }; + } + + originURL = resolveURL(window.location.href); + + /** + * Determine if a URL shares the same origin as the current location + * + * @param {String} requestURL The URL to test + * @returns {boolean} True if URL shares the same origin, otherwise false + */ + return function isURLSameOrigin(requestURL) { + const parsed = (utils$1.isString(requestURL)) ? resolveURL(requestURL) : requestURL; + return (parsed.protocol === originURL.protocol && + parsed.host === originURL.host); + }; + })() : + + // Non standard browser envs (web workers, react-native) lack needed support. + (function nonStandardBrowserEnv() { + return function isURLSameOrigin() { + return true; + }; + })(); + +function parseProtocol(url) { + const match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url); + return match && match[1] || ''; +} + +/** + * Calculate data maxRate + * @param {Number} [samplesCount= 10] + * @param {Number} [min= 1000] + * @returns {Function} + */ +function speedometer(samplesCount, min) { + samplesCount = samplesCount || 10; + const bytes = new Array(samplesCount); + const timestamps = new Array(samplesCount); + let head = 0; + let tail = 0; + let firstSampleTS; + + min = min !== undefined ? min : 1000; + + return function push(chunkLength) { + const now = Date.now(); + + const startedAt = timestamps[tail]; + + if (!firstSampleTS) { + firstSampleTS = now; + } + + bytes[head] = chunkLength; + timestamps[head] = now; + + let i = tail; + let bytesCount = 0; + + while (i !== head) { + bytesCount += bytes[i++]; + i = i % samplesCount; + } + + head = (head + 1) % samplesCount; + + if (head === tail) { + tail = (tail + 1) % samplesCount; + } + + if (now - firstSampleTS < min) { + return; + } + + const passed = startedAt && now - startedAt; + + return passed ? Math.round(bytesCount * 1000 / passed) : undefined; + }; +} + +function progressEventReducer(listener, isDownloadStream) { + let bytesNotified = 0; + const _speedometer = speedometer(50, 250); + + return e => { + const loaded = e.loaded; + const total = e.lengthComputable ? e.total : undefined; + const progressBytes = loaded - bytesNotified; + const rate = _speedometer(progressBytes); + const inRange = loaded <= total; + + bytesNotified = loaded; + + const data = { + loaded, + total, + progress: total ? (loaded / total) : undefined, + bytes: progressBytes, + rate: rate ? rate : undefined, + estimated: rate && total && inRange ? (total - loaded) / rate : undefined, + event: e + }; + + data[isDownloadStream ? 'download' : 'upload'] = true; + + listener(data); + }; +} + +const isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined'; + +var xhrAdapter = isXHRAdapterSupported && function (config) { + return new Promise(function dispatchXhrRequest(resolve, reject) { + let requestData = config.data; + const requestHeaders = AxiosHeaders$1.from(config.headers).normalize(); + let {responseType, withXSRFToken} = config; + let onCanceled; + function done() { + if (config.cancelToken) { + config.cancelToken.unsubscribe(onCanceled); + } + + if (config.signal) { + config.signal.removeEventListener('abort', onCanceled); + } + } + + let contentType; + + if (utils$1.isFormData(requestData)) { + if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) { + requestHeaders.setContentType(false); // Let the browser set it + } else if ((contentType = requestHeaders.getContentType()) !== false) { + // fix semicolon duplication issue for ReactNative FormData implementation + const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : []; + requestHeaders.setContentType([type || 'multipart/form-data', ...tokens].join('; ')); + } + } + + let request = new XMLHttpRequest(); + + // HTTP basic authentication + if (config.auth) { + const username = config.auth.username || ''; + const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : ''; + requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password)); + } + + const fullPath = buildFullPath(config.baseURL, config.url); + + request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true); + + // Set the request timeout in MS + request.timeout = config.timeout; + + function onloadend() { + if (!request) { + return; + } + // Prepare the response + const responseHeaders = AxiosHeaders$1.from( + 'getAllResponseHeaders' in request && request.getAllResponseHeaders() + ); + const responseData = !responseType || responseType === 'text' || responseType === 'json' ? + request.responseText : request.response; + const response = { + data: responseData, + status: request.status, + statusText: request.statusText, + headers: responseHeaders, + config, + request + }; + + settle(function _resolve(value) { + resolve(value); + done(); + }, function _reject(err) { + reject(err); + done(); + }, response); + + // Clean up request + request = null; + } + + if ('onloadend' in request) { + // Use onloadend if available + request.onloadend = onloadend; + } else { + // Listen for ready state to emulate onloadend + request.onreadystatechange = function handleLoad() { + if (!request || request.readyState !== 4) { + return; + } + + // The request errored out and we didn't get a response, this will be + // handled by onerror instead + // With one exception: request that using file: protocol, most browsers + // will return status as 0 even though it's a successful request + if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) { + return; + } + // readystate handler is calling before onerror or ontimeout handlers, + // so we should call onloadend on the next 'tick' + setTimeout(onloadend); + }; + } + + // Handle browser request cancellation (as opposed to a manual cancellation) + request.onabort = function handleAbort() { + if (!request) { + return; + } + + reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request)); + + // Clean up request + request = null; + }; + + // Handle low level network errors + request.onerror = function handleError() { + // Real errors are hidden from us by the browser + // onerror should only fire if it's a network error + reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request)); + + // Clean up request + request = null; + }; + + // Handle timeout + request.ontimeout = function handleTimeout() { + let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded'; + const transitional = config.transitional || transitionalDefaults; + if (config.timeoutErrorMessage) { + timeoutErrorMessage = config.timeoutErrorMessage; + } + reject(new AxiosError( + timeoutErrorMessage, + transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED, + config, + request)); + + // Clean up request + request = null; + }; + + // Add xsrf header + // This is only done if running in a standard browser environment. + // Specifically not if we're in a web worker, or react-native. + if(platform.hasStandardBrowserEnv) { + withXSRFToken && utils$1.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(config)); + + if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(fullPath))) { + // Add xsrf header + const xsrfValue = config.xsrfHeaderName && config.xsrfCookieName && cookies.read(config.xsrfCookieName); + + if (xsrfValue) { + requestHeaders.set(config.xsrfHeaderName, xsrfValue); + } + } + } + + // Remove Content-Type if data is undefined + requestData === undefined && requestHeaders.setContentType(null); + + // Add headers to the request + if ('setRequestHeader' in request) { + utils$1.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) { + request.setRequestHeader(key, val); + }); + } + + // Add withCredentials to request if needed + if (!utils$1.isUndefined(config.withCredentials)) { + request.withCredentials = !!config.withCredentials; + } + + // Add responseType to request if needed + if (responseType && responseType !== 'json') { + request.responseType = config.responseType; + } + + // Handle progress if needed + if (typeof config.onDownloadProgress === 'function') { + request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true)); + } + + // Not all browsers support upload events + if (typeof config.onUploadProgress === 'function' && request.upload) { + request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress)); + } + + if (config.cancelToken || config.signal) { + // Handle cancellation + // eslint-disable-next-line func-names + onCanceled = cancel => { + if (!request) { + return; + } + reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel); + request.abort(); + request = null; + }; + + config.cancelToken && config.cancelToken.subscribe(onCanceled); + if (config.signal) { + config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled); + } + } + + const protocol = parseProtocol(fullPath); + + if (protocol && platform.protocols.indexOf(protocol) === -1) { + reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config)); + return; + } + + + // Send the request + request.send(requestData || null); + }); +}; + +const knownAdapters = { + http: httpAdapter, + xhr: xhrAdapter +}; + +utils$1.forEach(knownAdapters, (fn, value) => { + if (fn) { + try { + Object.defineProperty(fn, 'name', {value}); + } catch (e) { + // eslint-disable-next-line no-empty + } + Object.defineProperty(fn, 'adapterName', {value}); + } +}); + +const renderReason = (reason) => `- ${reason}`; + +const isResolvedHandle = (adapter) => utils$1.isFunction(adapter) || adapter === null || adapter === false; + +var adapters = { + getAdapter: (adapters) => { + adapters = utils$1.isArray(adapters) ? adapters : [adapters]; + + const {length} = adapters; + let nameOrAdapter; + let adapter; + + const rejectedReasons = {}; + + for (let i = 0; i < length; i++) { + nameOrAdapter = adapters[i]; + let id; + + adapter = nameOrAdapter; + + if (!isResolvedHandle(nameOrAdapter)) { + adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()]; + + if (adapter === undefined) { + throw new AxiosError(`Unknown adapter '${id}'`); + } + } + + if (adapter) { + break; + } + + rejectedReasons[id || '#' + i] = adapter; + } + + if (!adapter) { + + const reasons = Object.entries(rejectedReasons) + .map(([id, state]) => `adapter ${id} ` + + (state === false ? 'is not supported by the environment' : 'is not available in the build') + ); + + let s = length ? + (reasons.length > 1 ? 'since :\n' + reasons.map(renderReason).join('\n') : ' ' + renderReason(reasons[0])) : + 'as no adapter specified'; + + throw new AxiosError( + `There is no suitable adapter to dispatch the request ` + s, + 'ERR_NOT_SUPPORT' + ); + } + + return adapter; + }, + adapters: knownAdapters +}; + +/** + * Throws a `CanceledError` if cancellation has been requested. + * + * @param {Object} config The config that is to be used for the request + * + * @returns {void} + */ +function throwIfCancellationRequested(config) { + if (config.cancelToken) { + config.cancelToken.throwIfRequested(); + } + + if (config.signal && config.signal.aborted) { + throw new CanceledError(null, config); + } +} + +/** + * Dispatch a request to the server using the configured adapter. + * + * @param {object} config The config that is to be used for the request + * + * @returns {Promise} The Promise to be fulfilled + */ +function dispatchRequest(config) { + throwIfCancellationRequested(config); + + config.headers = AxiosHeaders$1.from(config.headers); + + // Transform request data + config.data = transformData.call( + config, + config.transformRequest + ); + + if (['post', 'put', 'patch'].indexOf(config.method) !== -1) { + config.headers.setContentType('application/x-www-form-urlencoded', false); + } + + const adapter = adapters.getAdapter(config.adapter || defaults$1.adapter); + + return adapter(config).then(function onAdapterResolution(response) { + throwIfCancellationRequested(config); + + // Transform response data + response.data = transformData.call( + config, + config.transformResponse, + response + ); + + response.headers = AxiosHeaders$1.from(response.headers); + + return response; + }, function onAdapterRejection(reason) { + if (!isCancel(reason)) { + throwIfCancellationRequested(config); + + // Transform response data + if (reason && reason.response) { + reason.response.data = transformData.call( + config, + config.transformResponse, + reason.response + ); + reason.response.headers = AxiosHeaders$1.from(reason.response.headers); + } + } + + return Promise.reject(reason); + }); +} + +const headersToObject = (thing) => thing instanceof AxiosHeaders$1 ? thing.toJSON() : thing; + +/** + * Config-specific merge-function which creates a new config-object + * by merging two configuration objects together. + * + * @param {Object} config1 + * @param {Object} config2 + * + * @returns {Object} New object resulting from merging config2 to config1 + */ +function mergeConfig(config1, config2) { + // eslint-disable-next-line no-param-reassign + config2 = config2 || {}; + const config = {}; + + function getMergedValue(target, source, caseless) { + if (utils$1.isPlainObject(target) && utils$1.isPlainObject(source)) { + return utils$1.merge.call({caseless}, target, source); + } else if (utils$1.isPlainObject(source)) { + return utils$1.merge({}, source); + } else if (utils$1.isArray(source)) { + return source.slice(); + } + return source; + } + + // eslint-disable-next-line consistent-return + function mergeDeepProperties(a, b, caseless) { + if (!utils$1.isUndefined(b)) { + return getMergedValue(a, b, caseless); + } else if (!utils$1.isUndefined(a)) { + return getMergedValue(undefined, a, caseless); + } + } + + // eslint-disable-next-line consistent-return + function valueFromConfig2(a, b) { + if (!utils$1.isUndefined(b)) { + return getMergedValue(undefined, b); + } + } + + // eslint-disable-next-line consistent-return + function defaultToConfig2(a, b) { + if (!utils$1.isUndefined(b)) { + return getMergedValue(undefined, b); + } else if (!utils$1.isUndefined(a)) { + return getMergedValue(undefined, a); + } + } + + // eslint-disable-next-line consistent-return + function mergeDirectKeys(a, b, prop) { + if (prop in config2) { + return getMergedValue(a, b); + } else if (prop in config1) { + return getMergedValue(undefined, a); + } + } + + const mergeMap = { + url: valueFromConfig2, + method: valueFromConfig2, + data: valueFromConfig2, + baseURL: defaultToConfig2, + transformRequest: defaultToConfig2, + transformResponse: defaultToConfig2, + paramsSerializer: defaultToConfig2, + timeout: defaultToConfig2, + timeoutMessage: defaultToConfig2, + withCredentials: defaultToConfig2, + withXSRFToken: defaultToConfig2, + adapter: defaultToConfig2, + responseType: defaultToConfig2, + xsrfCookieName: defaultToConfig2, + xsrfHeaderName: defaultToConfig2, + onUploadProgress: defaultToConfig2, + onDownloadProgress: defaultToConfig2, + decompress: defaultToConfig2, + maxContentLength: defaultToConfig2, + maxBodyLength: defaultToConfig2, + beforeRedirect: defaultToConfig2, + transport: defaultToConfig2, + httpAgent: defaultToConfig2, + httpsAgent: defaultToConfig2, + cancelToken: defaultToConfig2, + socketPath: defaultToConfig2, + responseEncoding: defaultToConfig2, + validateStatus: mergeDirectKeys, + headers: (a, b) => mergeDeepProperties(headersToObject(a), headersToObject(b), true) + }; + + utils$1.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) { + const merge = mergeMap[prop] || mergeDeepProperties; + const configValue = merge(config1[prop], config2[prop], prop); + (utils$1.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue); + }); + + return config; +} + +const VERSION = "1.6.4"; + +const validators$1 = {}; + +// eslint-disable-next-line func-names +['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => { + validators$1[type] = function validator(thing) { + return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type; + }; +}); + +const deprecatedWarnings = {}; + +/** + * Transitional option validator + * + * @param {function|boolean?} validator - set to false if the transitional option has been removed + * @param {string?} version - deprecated version / removed since version + * @param {string?} message - some message with additional info + * + * @returns {function} + */ +validators$1.transitional = function transitional(validator, version, message) { + function formatMessage(opt, desc) { + return '[Axios v' + VERSION + '] Transitional option \'' + opt + '\'' + desc + (message ? '. ' + message : ''); + } + + // eslint-disable-next-line func-names + return (value, opt, opts) => { + if (validator === false) { + throw new AxiosError( + formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')), + AxiosError.ERR_DEPRECATED + ); + } + + if (version && !deprecatedWarnings[opt]) { + deprecatedWarnings[opt] = true; + // eslint-disable-next-line no-console + console.warn( + formatMessage( + opt, + ' has been deprecated since v' + version + ' and will be removed in the near future' + ) + ); + } + + return validator ? validator(value, opt, opts) : true; + }; +}; + +/** + * Assert object's properties type + * + * @param {object} options + * @param {object} schema + * @param {boolean?} allowUnknown + * + * @returns {object} + */ + +function assertOptions(options, schema, allowUnknown) { + if (typeof options !== 'object') { + throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE); + } + const keys = Object.keys(options); + let i = keys.length; + while (i-- > 0) { + const opt = keys[i]; + const validator = schema[opt]; + if (validator) { + const value = options[opt]; + const result = value === undefined || validator(value, opt, options); + if (result !== true) { + throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE); + } + continue; + } + if (allowUnknown !== true) { + throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION); + } + } +} + +var validator = { + assertOptions, + validators: validators$1 +}; + +const validators = validator.validators; + +/** + * Create a new instance of Axios + * + * @param {Object} instanceConfig The default config for the instance + * + * @return {Axios} A new instance of Axios + */ +class Axios { + constructor(instanceConfig) { + this.defaults = instanceConfig; + this.interceptors = { + request: new InterceptorManager$1(), + response: new InterceptorManager$1() + }; + } + + /** + * Dispatch a request + * + * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults) + * @param {?Object} config + * + * @returns {Promise} The Promise to be fulfilled + */ + request(configOrUrl, config) { + /*eslint no-param-reassign:0*/ + // Allow for axios('example/url'[, config]) a la fetch API + if (typeof configOrUrl === 'string') { + config = config || {}; + config.url = configOrUrl; + } else { + config = configOrUrl || {}; + } + + config = mergeConfig(this.defaults, config); + + const {transitional, paramsSerializer, headers} = config; + + if (transitional !== undefined) { + validator.assertOptions(transitional, { + silentJSONParsing: validators.transitional(validators.boolean), + forcedJSONParsing: validators.transitional(validators.boolean), + clarifyTimeoutError: validators.transitional(validators.boolean) + }, false); + } + + if (paramsSerializer != null) { + if (utils$1.isFunction(paramsSerializer)) { + config.paramsSerializer = { + serialize: paramsSerializer + }; + } else { + validator.assertOptions(paramsSerializer, { + encode: validators.function, + serialize: validators.function + }, true); + } + } + + // Set config.method + config.method = (config.method || this.defaults.method || 'get').toLowerCase(); + + // Flatten headers + let contextHeaders = headers && utils$1.merge( + headers.common, + headers[config.method] + ); + + headers && utils$1.forEach( + ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], + (method) => { + delete headers[method]; + } + ); + + config.headers = AxiosHeaders$1.concat(contextHeaders, headers); + + // filter out skipped interceptors + const requestInterceptorChain = []; + let synchronousRequestInterceptors = true; + this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { + if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) { + return; + } + + synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous; + + requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected); + }); + + const responseInterceptorChain = []; + this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { + responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected); + }); + + let promise; + let i = 0; + let len; + + if (!synchronousRequestInterceptors) { + const chain = [dispatchRequest.bind(this), undefined]; + chain.unshift.apply(chain, requestInterceptorChain); + chain.push.apply(chain, responseInterceptorChain); + len = chain.length; + + promise = Promise.resolve(config); + + while (i < len) { + promise = promise.then(chain[i++], chain[i++]); + } + + return promise; + } + + len = requestInterceptorChain.length; + + let newConfig = config; + + i = 0; + + while (i < len) { + const onFulfilled = requestInterceptorChain[i++]; + const onRejected = requestInterceptorChain[i++]; + try { + newConfig = onFulfilled(newConfig); + } catch (error) { + onRejected.call(this, error); + break; + } + } + + try { + promise = dispatchRequest.call(this, newConfig); + } catch (error) { + return Promise.reject(error); + } + + i = 0; + len = responseInterceptorChain.length; + + while (i < len) { + promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]); + } + + return promise; + } + + getUri(config) { + config = mergeConfig(this.defaults, config); + const fullPath = buildFullPath(config.baseURL, config.url); + return buildURL(fullPath, config.params, config.paramsSerializer); + } +} + +// Provide aliases for supported request methods +utils$1.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { + /*eslint func-names:0*/ + Axios.prototype[method] = function(url, config) { + return this.request(mergeConfig(config || {}, { + method, + url, + data: (config || {}).data + })); + }; +}); + +utils$1.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { + /*eslint func-names:0*/ + + function generateHTTPMethod(isForm) { + return function httpMethod(url, data, config) { + return this.request(mergeConfig(config || {}, { + method, + headers: isForm ? { + 'Content-Type': 'multipart/form-data' + } : {}, + url, + data + })); + }; + } + + Axios.prototype[method] = generateHTTPMethod(); + + Axios.prototype[method + 'Form'] = generateHTTPMethod(true); +}); + +var Axios$1 = Axios; + +/** + * A `CancelToken` is an object that can be used to request cancellation of an operation. + * + * @param {Function} executor The executor function. + * + * @returns {CancelToken} + */ +class CancelToken { + constructor(executor) { + if (typeof executor !== 'function') { + throw new TypeError('executor must be a function.'); + } + + let resolvePromise; + + this.promise = new Promise(function promiseExecutor(resolve) { + resolvePromise = resolve; + }); + + const token = this; + + // eslint-disable-next-line func-names + this.promise.then(cancel => { + if (!token._listeners) return; + + let i = token._listeners.length; + + while (i-- > 0) { + token._listeners[i](cancel); + } + token._listeners = null; + }); + + // eslint-disable-next-line func-names + this.promise.then = onfulfilled => { + let _resolve; + // eslint-disable-next-line func-names + const promise = new Promise(resolve => { + token.subscribe(resolve); + _resolve = resolve; + }).then(onfulfilled); + + promise.cancel = function reject() { + token.unsubscribe(_resolve); + }; + + return promise; + }; + + executor(function cancel(message, config, request) { + if (token.reason) { + // Cancellation has already been requested + return; + } + + token.reason = new CanceledError(message, config, request); + resolvePromise(token.reason); + }); + } + + /** + * Throws a `CanceledError` if cancellation has been requested. + */ + throwIfRequested() { + if (this.reason) { + throw this.reason; + } + } + + /** + * Subscribe to the cancel signal + */ + + subscribe(listener) { + if (this.reason) { + listener(this.reason); + return; + } + + if (this._listeners) { + this._listeners.push(listener); + } else { + this._listeners = [listener]; + } + } + + /** + * Unsubscribe from the cancel signal + */ + + unsubscribe(listener) { + if (!this._listeners) { + return; + } + const index = this._listeners.indexOf(listener); + if (index !== -1) { + this._listeners.splice(index, 1); + } + } + + /** + * Returns an object that contains a new `CancelToken` and a function that, when called, + * cancels the `CancelToken`. + */ + static source() { + let cancel; + const token = new CancelToken(function executor(c) { + cancel = c; + }); + return { + token, + cancel + }; + } +} + +var CancelToken$1 = CancelToken; + +/** + * Syntactic sugar for invoking a function and expanding an array for arguments. + * + * Common use case would be to use `Function.prototype.apply`. + * + * ```js + * function f(x, y, z) {} + * var args = [1, 2, 3]; + * f.apply(null, args); + * ``` + * + * With `spread` this example can be re-written. + * + * ```js + * spread(function(x, y, z) {})([1, 2, 3]); + * ``` + * + * @param {Function} callback + * + * @returns {Function} + */ +function spread(callback) { + return function wrap(arr) { + return callback.apply(null, arr); + }; +} + +/** + * Determines whether the payload is an error thrown by Axios + * + * @param {*} payload The value to test + * + * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false + */ +function isAxiosError(payload) { + return utils$1.isObject(payload) && (payload.isAxiosError === true); +} + +const HttpStatusCode = { + Continue: 100, + SwitchingProtocols: 101, + Processing: 102, + EarlyHints: 103, + Ok: 200, + Created: 201, + Accepted: 202, + NonAuthoritativeInformation: 203, + NoContent: 204, + ResetContent: 205, + PartialContent: 206, + MultiStatus: 207, + AlreadyReported: 208, + ImUsed: 226, + MultipleChoices: 300, + MovedPermanently: 301, + Found: 302, + SeeOther: 303, + NotModified: 304, + UseProxy: 305, + Unused: 306, + TemporaryRedirect: 307, + PermanentRedirect: 308, + BadRequest: 400, + Unauthorized: 401, + PaymentRequired: 402, + Forbidden: 403, + NotFound: 404, + MethodNotAllowed: 405, + NotAcceptable: 406, + ProxyAuthenticationRequired: 407, + RequestTimeout: 408, + Conflict: 409, + Gone: 410, + LengthRequired: 411, + PreconditionFailed: 412, + PayloadTooLarge: 413, + UriTooLong: 414, + UnsupportedMediaType: 415, + RangeNotSatisfiable: 416, + ExpectationFailed: 417, + ImATeapot: 418, + MisdirectedRequest: 421, + UnprocessableEntity: 422, + Locked: 423, + FailedDependency: 424, + TooEarly: 425, + UpgradeRequired: 426, + PreconditionRequired: 428, + TooManyRequests: 429, + RequestHeaderFieldsTooLarge: 431, + UnavailableForLegalReasons: 451, + InternalServerError: 500, + NotImplemented: 501, + BadGateway: 502, + ServiceUnavailable: 503, + GatewayTimeout: 504, + HttpVersionNotSupported: 505, + VariantAlsoNegotiates: 506, + InsufficientStorage: 507, + LoopDetected: 508, + NotExtended: 510, + NetworkAuthenticationRequired: 511, +}; + +Object.entries(HttpStatusCode).forEach(([key, value]) => { + HttpStatusCode[value] = key; +}); + +var HttpStatusCode$1 = HttpStatusCode; + +/** + * Create an instance of Axios + * + * @param {Object} defaultConfig The default config for the instance + * + * @returns {Axios} A new instance of Axios + */ +function createInstance(defaultConfig) { + const context = new Axios$1(defaultConfig); + const instance = bind(Axios$1.prototype.request, context); + + // Copy axios.prototype to instance + utils$1.extend(instance, Axios$1.prototype, context, {allOwnKeys: true}); + + // Copy context to instance + utils$1.extend(instance, context, null, {allOwnKeys: true}); + + // Factory for creating new instances + instance.create = function create(instanceConfig) { + return createInstance(mergeConfig(defaultConfig, instanceConfig)); + }; + + return instance; +} + +// Create the default instance to be exported +const axios = createInstance(defaults$1); + +// Expose Axios class to allow class inheritance +axios.Axios = Axios$1; + +// Expose Cancel & CancelToken +axios.CanceledError = CanceledError; +axios.CancelToken = CancelToken$1; +axios.isCancel = isCancel; +axios.VERSION = VERSION; +axios.toFormData = toFormData; + +// Expose AxiosError class +axios.AxiosError = AxiosError; + +// alias for CanceledError for backward compatibility +axios.Cancel = axios.CanceledError; + +// Expose all/spread +axios.all = function all(promises) { + return Promise.all(promises); +}; + +axios.spread = spread; + +// Expose isAxiosError +axios.isAxiosError = isAxiosError; + +// Expose mergeConfig +axios.mergeConfig = mergeConfig; + +axios.AxiosHeaders = AxiosHeaders$1; + +axios.formToJSON = thing => formDataToJSON(utils$1.isHTMLForm(thing) ? new FormData(thing) : thing); + +axios.getAdapter = adapters.getAdapter; + +axios.HttpStatusCode = HttpStatusCode$1; + +axios.default = axios; + +module.exports = axios; +//# sourceMappingURL=axios.cjs.map diff --git a/task/node_modules/axios/dist/browser/axios.cjs.map b/task/node_modules/axios/dist/browser/axios.cjs.map new file mode 100644 index 0000000..2862dbc --- /dev/null +++ b/task/node_modules/axios/dist/browser/axios.cjs.map @@ -0,0 +1 @@ +{"version":3,"file":"axios.cjs","sources":["../../lib/helpers/bind.js","../../lib/utils.js","../../lib/core/AxiosError.js","../../lib/helpers/null.js","../../lib/helpers/toFormData.js","../../lib/helpers/AxiosURLSearchParams.js","../../lib/helpers/buildURL.js","../../lib/core/InterceptorManager.js","../../lib/defaults/transitional.js","../../lib/platform/browser/classes/URLSearchParams.js","../../lib/platform/browser/classes/FormData.js","../../lib/platform/browser/classes/Blob.js","../../lib/platform/browser/index.js","../../lib/platform/common/utils.js","../../lib/platform/index.js","../../lib/helpers/toURLEncodedForm.js","../../lib/helpers/formDataToJSON.js","../../lib/defaults/index.js","../../lib/helpers/parseHeaders.js","../../lib/core/AxiosHeaders.js","../../lib/core/transformData.js","../../lib/cancel/isCancel.js","../../lib/cancel/CanceledError.js","../../lib/core/settle.js","../../lib/helpers/cookies.js","../../lib/helpers/isAbsoluteURL.js","../../lib/helpers/combineURLs.js","../../lib/core/buildFullPath.js","../../lib/helpers/isURLSameOrigin.js","../../lib/helpers/parseProtocol.js","../../lib/helpers/speedometer.js","../../lib/adapters/xhr.js","../../lib/adapters/adapters.js","../../lib/core/dispatchRequest.js","../../lib/core/mergeConfig.js","../../lib/env/data.js","../../lib/helpers/validator.js","../../lib/core/Axios.js","../../lib/cancel/CancelToken.js","../../lib/helpers/spread.js","../../lib/helpers/isAxiosError.js","../../lib/helpers/HttpStatusCode.js","../../lib/axios.js"],"sourcesContent":["'use strict';\n\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n","'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n let kind;\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) || (\n isFunction(thing.append) && (\n (kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n )\n )\n )\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\nfunction findKey(obj, key) {\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const {caseless} = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else {\n result[targetKey] = val;\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[Symbol.iterator];\n\n const iterator = generator.call(obj);\n\n let result;\n\n while ((result = iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n value = +value;\n return Number.isFinite(value) ? value : defaultValue;\n}\n\nconst ALPHA = 'abcdefghijklmnopqrstuvwxyz'\n\nconst DIGIT = '0123456789';\n\nconst ALPHABET = {\n DIGIT,\n ALPHA,\n ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT\n}\n\nconst generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {\n let str = '';\n const {length} = alphabet;\n while (size--) {\n str += alphabet[Math.random() * length|0]\n }\n\n return str;\n}\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]);\n}\n\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n\n const visit = (source, i) => {\n\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n\n if(!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n\n stack[i] = undefined;\n\n return target;\n }\n }\n\n return source;\n }\n\n return visit(obj, 0);\n}\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n ALPHABET,\n generateString,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable\n};\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n response && (this.response = response);\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils.toJSONObject(this.config),\n code: this.code,\n status: this.response && this.response.status ? this.response.status : null\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n AxiosError.call(axiosError, error.message, code, config, request, response);\n\n axiosError.cause = error;\n\n axiosError.name = error.name;\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n","// eslint-disable-next-line strict\nexport default null;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\nimport PlatformFormData from '../platform/node/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (PlatformFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n","'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object} params - The parameters to be converted to a FormData object.\n * @param {Object} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?object} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n","'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n","'use strict';\n\nimport AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';\nexport default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n","'use strict';\n\nexport default typeof FormData !== 'undefined' ? FormData : null;\n","'use strict'\n\nexport default typeof Blob !== 'undefined' ? Blob : null\n","import URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\nimport Blob from './classes/Blob.js'\n\nexport default {\n isBrowser: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob\n },\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n","const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = (\n (product) => {\n return hasBrowserEnv && ['ReactNative', 'NativeScript', 'NS'].indexOf(product) < 0\n })(typeof navigator !== 'undefined' && navigator.product);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope &&\n typeof self.importScripts === 'function'\n );\n})();\n\nexport {\n hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv\n}\n","import platform from './node/index.js';\nimport * as utils from './common/utils.js';\n\nexport default {\n ...utils,\n ...platform\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n }\n }, options));\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n\n if (name === '__proto__') return true;\n\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: ['xhr', 'http'],\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n if (!hasJSONContentType) {\n return data;\n }\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*',\n 'Content-Type': undefined\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n defaults.headers[method] = {};\n});\n\nexport default defaults;\n","'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = utils.findKey(self, lHeader);\n\n if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n\n const setHeaders = (headers, _rewrite) =>\n utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite)\n } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n }\n\n get(header, parser) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n\n has(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n }\n\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = utils.findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n }\n\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n\n while (i--) {\n const key = keys[i];\n if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n\n return deleted;\n }\n\n normalize(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = utils.findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n }\n\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n\n toJSON(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n });\n\n return obj;\n }\n\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n\n static concat(first, ...targets) {\n const computed = new this(first);\n\n targets.forEach((target) => computed.set(target));\n\n return computed;\n }\n\n static accessor(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n }\n }\n});\n\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n","'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n","'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n","'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n","import utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n // Standard browser envs support document.cookie\n {\n write(name, value, expires, path, domain, secure) {\n const cookie = [name + '=' + encodeURIComponent(value)];\n\n utils.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n\n utils.isString(path) && cookie.push('path=' + path);\n\n utils.isString(domain) && cookie.push('domain=' + domain);\n\n secure === true && cookie.push('secure');\n\n document.cookie = cookie.join('; ');\n },\n\n read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n }\n\n :\n\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {},\n read() {\n return null;\n },\n remove() {}\n };\n\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n","'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n","'use strict';\n\nimport utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n// Standard browser envs have full support of the APIs needed to test\n// whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n const msie = /(msie|trident)/i.test(navigator.userAgent);\n const urlParsingNode = document.createElement('a');\n let originURL;\n\n /**\n * Parse a URL to discover its components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n let href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n const parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })();\n","'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n","'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n","'use strict';\n\nimport utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport cookies from './../helpers/cookies.js';\nimport buildURL from './../helpers/buildURL.js';\nimport buildFullPath from '../core/buildFullPath.js';\nimport isURLSameOrigin from './../helpers/isURLSameOrigin.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport speedometer from '../helpers/speedometer.js';\n\nfunction progressEventReducer(listener, isDownloadStream) {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e\n };\n\n data[isDownloadStream ? 'download' : 'upload'] = true;\n\n listener(data);\n };\n}\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nexport default isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n let requestData = config.data;\n const requestHeaders = AxiosHeaders.from(config.headers).normalize();\n let {responseType, withXSRFToken} = config;\n let onCanceled;\n function done() {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(onCanceled);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', onCanceled);\n }\n }\n\n let contentType;\n\n if (utils.isFormData(requestData)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n requestHeaders.setContentType(false); // Let the browser set it\n } else if ((contentType = requestHeaders.getContentType()) !== false) {\n // fix semicolon duplication issue for ReactNative FormData implementation\n const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : [];\n requestHeaders.setContentType([type || 'multipart/form-data', ...tokens].join('; '));\n }\n }\n\n let request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n const username = config.auth.username || '';\n const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password));\n }\n\n const fullPath = buildFullPath(config.baseURL, config.url);\n\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = config.transitional || transitionalDefaults;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if(platform.hasStandardBrowserEnv) {\n withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(config));\n\n if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(fullPath))) {\n // Add xsrf header\n const xsrfValue = config.xsrfHeaderName && config.xsrfCookieName && cookies.read(config.xsrfCookieName);\n\n if (xsrfValue) {\n requestHeaders.set(config.xsrfHeaderName, xsrfValue);\n }\n }\n }\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = config.responseType;\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true));\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress));\n }\n\n if (config.cancelToken || config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n config.cancelToken && config.cancelToken.subscribe(onCanceled);\n if (config.signal) {\n config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(fullPath);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n","import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\nimport AxiosError from \"../core/AxiosError.js\";\n\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter\n}\n\nutils.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, 'name', {value});\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', {value});\n }\n});\n\nconst renderReason = (reason) => `- ${reason}`;\n\nconst isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;\n\nexport default {\n getAdapter: (adapters) => {\n adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n const {length} = adapters;\n let nameOrAdapter;\n let adapter;\n\n const rejectedReasons = {};\n\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n let id;\n\n adapter = nameOrAdapter;\n\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n if (adapter === undefined) {\n throw new AxiosError(`Unknown adapter '${id}'`);\n }\n }\n\n if (adapter) {\n break;\n }\n\n rejectedReasons[id || '#' + i] = adapter;\n }\n\n if (!adapter) {\n\n const reasons = Object.entries(rejectedReasons)\n .map(([id, state]) => `adapter ${id} ` +\n (state === false ? 'is not supported by the environment' : 'is not available in the build')\n );\n\n let s = length ?\n (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n 'as no adapter specified';\n\n throw new AxiosError(\n `There is no suitable adapter to dispatch the request ` + s,\n 'ERR_NOT_SUPPORT'\n );\n }\n\n return adapter;\n },\n adapters: knownAdapters\n}\n","'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport adapters from \"../adapters/adapters.js\";\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n\n const adapter = adapters.getAdapter(config.adapter || defaults.adapter);\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosHeaders from \"./AxiosHeaders.js\";\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? thing.toJSON() : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source, caseless) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge.call({caseless}, target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, caseless) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(a, b, caseless);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a, caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b) => mergeDeepProperties(headersToObject(a), headersToObject(b), true)\n };\n\n utils.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n","export const VERSION = \"1.6.4\";","'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n","'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer, headers} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n }\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n let contextHeaders = headers && utils.merge(\n headers.common,\n headers[config.method]\n );\n\n headers && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift.apply(chain, requestInterceptorChain);\n chain.push.apply(chain, responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n i = 0;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n","'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n","const HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n\nexport default HttpStatusCode;\n","'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\nimport AxiosHeaders from \"./core/AxiosHeaders.js\";\nimport adapters from './adapters/adapters.js';\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders;\n\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\nexport default axios\n"],"names":["utils","prototype","encode","URLSearchParams","FormData","Blob","platform","defaults","AxiosHeaders","validators","InterceptorManager","Axios","CancelToken","HttpStatusCode"],"mappings":"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"} \ No newline at end of file diff --git a/task/node_modules/axios/dist/esm/axios.js b/task/node_modules/axios/dist/esm/axios.js new file mode 100644 index 0000000..581d5ca --- /dev/null +++ b/task/node_modules/axios/dist/esm/axios.js @@ -0,0 +1,3260 @@ +// Axios v1.6.4 Copyright (c) 2024 Matt Zabriskie and contributors +function bind(fn, thisArg) { + return function wrap() { + return fn.apply(thisArg, arguments); + }; +} + +// utils is a library of generic helper functions non-specific to axios + +const {toString} = Object.prototype; +const {getPrototypeOf} = Object; + +const kindOf = (cache => thing => { + const str = toString.call(thing); + return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase()); +})(Object.create(null)); + +const kindOfTest = (type) => { + type = type.toLowerCase(); + return (thing) => kindOf(thing) === type +}; + +const typeOfTest = type => thing => typeof thing === type; + +/** + * Determine if a value is an Array + * + * @param {Object} val The value to test + * + * @returns {boolean} True if value is an Array, otherwise false + */ +const {isArray} = Array; + +/** + * Determine if a value is undefined + * + * @param {*} val The value to test + * + * @returns {boolean} True if the value is undefined, otherwise false + */ +const isUndefined = typeOfTest('undefined'); + +/** + * Determine if a value is a Buffer + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a Buffer, otherwise false + */ +function isBuffer(val) { + return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) + && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val); +} + +/** + * Determine if a value is an ArrayBuffer + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is an ArrayBuffer, otherwise false + */ +const isArrayBuffer = kindOfTest('ArrayBuffer'); + + +/** + * Determine if a value is a view on an ArrayBuffer + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false + */ +function isArrayBufferView(val) { + let result; + if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) { + result = ArrayBuffer.isView(val); + } else { + result = (val) && (val.buffer) && (isArrayBuffer(val.buffer)); + } + return result; +} + +/** + * Determine if a value is a String + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a String, otherwise false + */ +const isString = typeOfTest('string'); + +/** + * Determine if a value is a Function + * + * @param {*} val The value to test + * @returns {boolean} True if value is a Function, otherwise false + */ +const isFunction = typeOfTest('function'); + +/** + * Determine if a value is a Number + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a Number, otherwise false + */ +const isNumber = typeOfTest('number'); + +/** + * Determine if a value is an Object + * + * @param {*} thing The value to test + * + * @returns {boolean} True if value is an Object, otherwise false + */ +const isObject = (thing) => thing !== null && typeof thing === 'object'; + +/** + * Determine if a value is a Boolean + * + * @param {*} thing The value to test + * @returns {boolean} True if value is a Boolean, otherwise false + */ +const isBoolean = thing => thing === true || thing === false; + +/** + * Determine if a value is a plain Object + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a plain Object, otherwise false + */ +const isPlainObject = (val) => { + if (kindOf(val) !== 'object') { + return false; + } + + const prototype = getPrototypeOf(val); + return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val); +}; + +/** + * Determine if a value is a Date + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a Date, otherwise false + */ +const isDate = kindOfTest('Date'); + +/** + * Determine if a value is a File + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a File, otherwise false + */ +const isFile = kindOfTest('File'); + +/** + * Determine if a value is a Blob + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a Blob, otherwise false + */ +const isBlob = kindOfTest('Blob'); + +/** + * Determine if a value is a FileList + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a File, otherwise false + */ +const isFileList = kindOfTest('FileList'); + +/** + * Determine if a value is a Stream + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a Stream, otherwise false + */ +const isStream = (val) => isObject(val) && isFunction(val.pipe); + +/** + * Determine if a value is a FormData + * + * @param {*} thing The value to test + * + * @returns {boolean} True if value is an FormData, otherwise false + */ +const isFormData = (thing) => { + let kind; + return thing && ( + (typeof FormData === 'function' && thing instanceof FormData) || ( + isFunction(thing.append) && ( + (kind = kindOf(thing)) === 'formdata' || + // detect form-data instance + (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]') + ) + ) + ) +}; + +/** + * Determine if a value is a URLSearchParams object + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a URLSearchParams object, otherwise false + */ +const isURLSearchParams = kindOfTest('URLSearchParams'); + +/** + * Trim excess whitespace off the beginning and end of a string + * + * @param {String} str The String to trim + * + * @returns {String} The String freed of excess whitespace + */ +const trim = (str) => str.trim ? + str.trim() : str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); + +/** + * Iterate over an Array or an Object invoking a function for each item. + * + * If `obj` is an Array callback will be called passing + * the value, index, and complete array for each item. + * + * If 'obj' is an Object callback will be called passing + * the value, key, and complete object for each property. + * + * @param {Object|Array} obj The object to iterate + * @param {Function} fn The callback to invoke for each item + * + * @param {Boolean} [allOwnKeys = false] + * @returns {any} + */ +function forEach(obj, fn, {allOwnKeys = false} = {}) { + // Don't bother if no value provided + if (obj === null || typeof obj === 'undefined') { + return; + } + + let i; + let l; + + // Force an array if not already something iterable + if (typeof obj !== 'object') { + /*eslint no-param-reassign:0*/ + obj = [obj]; + } + + if (isArray(obj)) { + // Iterate over array values + for (i = 0, l = obj.length; i < l; i++) { + fn.call(null, obj[i], i, obj); + } + } else { + // Iterate over object keys + const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj); + const len = keys.length; + let key; + + for (i = 0; i < len; i++) { + key = keys[i]; + fn.call(null, obj[key], key, obj); + } + } +} + +function findKey(obj, key) { + key = key.toLowerCase(); + const keys = Object.keys(obj); + let i = keys.length; + let _key; + while (i-- > 0) { + _key = keys[i]; + if (key === _key.toLowerCase()) { + return _key; + } + } + return null; +} + +const _global = (() => { + /*eslint no-undef:0*/ + if (typeof globalThis !== "undefined") return globalThis; + return typeof self !== "undefined" ? self : (typeof window !== 'undefined' ? window : global) +})(); + +const isContextDefined = (context) => !isUndefined(context) && context !== _global; + +/** + * Accepts varargs expecting each argument to be an object, then + * immutably merges the properties of each object and returns result. + * + * When multiple objects contain the same key the later object in + * the arguments list will take precedence. + * + * Example: + * + * ```js + * var result = merge({foo: 123}, {foo: 456}); + * console.log(result.foo); // outputs 456 + * ``` + * + * @param {Object} obj1 Object to merge + * + * @returns {Object} Result of all merge properties + */ +function merge(/* obj1, obj2, obj3, ... */) { + const {caseless} = isContextDefined(this) && this || {}; + const result = {}; + const assignValue = (val, key) => { + const targetKey = caseless && findKey(result, key) || key; + if (isPlainObject(result[targetKey]) && isPlainObject(val)) { + result[targetKey] = merge(result[targetKey], val); + } else if (isPlainObject(val)) { + result[targetKey] = merge({}, val); + } else if (isArray(val)) { + result[targetKey] = val.slice(); + } else { + result[targetKey] = val; + } + }; + + for (let i = 0, l = arguments.length; i < l; i++) { + arguments[i] && forEach(arguments[i], assignValue); + } + return result; +} + +/** + * Extends object a by mutably adding to it the properties of object b. + * + * @param {Object} a The object to be extended + * @param {Object} b The object to copy properties from + * @param {Object} thisArg The object to bind function to + * + * @param {Boolean} [allOwnKeys] + * @returns {Object} The resulting value of object a + */ +const extend = (a, b, thisArg, {allOwnKeys}= {}) => { + forEach(b, (val, key) => { + if (thisArg && isFunction(val)) { + a[key] = bind(val, thisArg); + } else { + a[key] = val; + } + }, {allOwnKeys}); + return a; +}; + +/** + * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM) + * + * @param {string} content with BOM + * + * @returns {string} content value without BOM + */ +const stripBOM = (content) => { + if (content.charCodeAt(0) === 0xFEFF) { + content = content.slice(1); + } + return content; +}; + +/** + * Inherit the prototype methods from one constructor into another + * @param {function} constructor + * @param {function} superConstructor + * @param {object} [props] + * @param {object} [descriptors] + * + * @returns {void} + */ +const inherits = (constructor, superConstructor, props, descriptors) => { + constructor.prototype = Object.create(superConstructor.prototype, descriptors); + constructor.prototype.constructor = constructor; + Object.defineProperty(constructor, 'super', { + value: superConstructor.prototype + }); + props && Object.assign(constructor.prototype, props); +}; + +/** + * Resolve object with deep prototype chain to a flat object + * @param {Object} sourceObj source object + * @param {Object} [destObj] + * @param {Function|Boolean} [filter] + * @param {Function} [propFilter] + * + * @returns {Object} + */ +const toFlatObject = (sourceObj, destObj, filter, propFilter) => { + let props; + let i; + let prop; + const merged = {}; + + destObj = destObj || {}; + // eslint-disable-next-line no-eq-null,eqeqeq + if (sourceObj == null) return destObj; + + do { + props = Object.getOwnPropertyNames(sourceObj); + i = props.length; + while (i-- > 0) { + prop = props[i]; + if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) { + destObj[prop] = sourceObj[prop]; + merged[prop] = true; + } + } + sourceObj = filter !== false && getPrototypeOf(sourceObj); + } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype); + + return destObj; +}; + +/** + * Determines whether a string ends with the characters of a specified string + * + * @param {String} str + * @param {String} searchString + * @param {Number} [position= 0] + * + * @returns {boolean} + */ +const endsWith = (str, searchString, position) => { + str = String(str); + if (position === undefined || position > str.length) { + position = str.length; + } + position -= searchString.length; + const lastIndex = str.indexOf(searchString, position); + return lastIndex !== -1 && lastIndex === position; +}; + + +/** + * Returns new array from array like object or null if failed + * + * @param {*} [thing] + * + * @returns {?Array} + */ +const toArray = (thing) => { + if (!thing) return null; + if (isArray(thing)) return thing; + let i = thing.length; + if (!isNumber(i)) return null; + const arr = new Array(i); + while (i-- > 0) { + arr[i] = thing[i]; + } + return arr; +}; + +/** + * Checking if the Uint8Array exists and if it does, it returns a function that checks if the + * thing passed in is an instance of Uint8Array + * + * @param {TypedArray} + * + * @returns {Array} + */ +// eslint-disable-next-line func-names +const isTypedArray = (TypedArray => { + // eslint-disable-next-line func-names + return thing => { + return TypedArray && thing instanceof TypedArray; + }; +})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array)); + +/** + * For each entry in the object, call the function with the key and value. + * + * @param {Object} obj - The object to iterate over. + * @param {Function} fn - The function to call for each entry. + * + * @returns {void} + */ +const forEachEntry = (obj, fn) => { + const generator = obj && obj[Symbol.iterator]; + + const iterator = generator.call(obj); + + let result; + + while ((result = iterator.next()) && !result.done) { + const pair = result.value; + fn.call(obj, pair[0], pair[1]); + } +}; + +/** + * It takes a regular expression and a string, and returns an array of all the matches + * + * @param {string} regExp - The regular expression to match against. + * @param {string} str - The string to search. + * + * @returns {Array} + */ +const matchAll = (regExp, str) => { + let matches; + const arr = []; + + while ((matches = regExp.exec(str)) !== null) { + arr.push(matches); + } + + return arr; +}; + +/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */ +const isHTMLForm = kindOfTest('HTMLFormElement'); + +const toCamelCase = str => { + return str.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g, + function replacer(m, p1, p2) { + return p1.toUpperCase() + p2; + } + ); +}; + +/* Creating a function that will check if an object has a property. */ +const hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype); + +/** + * Determine if a value is a RegExp object + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a RegExp object, otherwise false + */ +const isRegExp = kindOfTest('RegExp'); + +const reduceDescriptors = (obj, reducer) => { + const descriptors = Object.getOwnPropertyDescriptors(obj); + const reducedDescriptors = {}; + + forEach(descriptors, (descriptor, name) => { + let ret; + if ((ret = reducer(descriptor, name, obj)) !== false) { + reducedDescriptors[name] = ret || descriptor; + } + }); + + Object.defineProperties(obj, reducedDescriptors); +}; + +/** + * Makes all methods read-only + * @param {Object} obj + */ + +const freezeMethods = (obj) => { + reduceDescriptors(obj, (descriptor, name) => { + // skip restricted props in strict mode + if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) { + return false; + } + + const value = obj[name]; + + if (!isFunction(value)) return; + + descriptor.enumerable = false; + + if ('writable' in descriptor) { + descriptor.writable = false; + return; + } + + if (!descriptor.set) { + descriptor.set = () => { + throw Error('Can not rewrite read-only method \'' + name + '\''); + }; + } + }); +}; + +const toObjectSet = (arrayOrString, delimiter) => { + const obj = {}; + + const define = (arr) => { + arr.forEach(value => { + obj[value] = true; + }); + }; + + isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter)); + + return obj; +}; + +const noop = () => {}; + +const toFiniteNumber = (value, defaultValue) => { + value = +value; + return Number.isFinite(value) ? value : defaultValue; +}; + +const ALPHA = 'abcdefghijklmnopqrstuvwxyz'; + +const DIGIT = '0123456789'; + +const ALPHABET = { + DIGIT, + ALPHA, + ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT +}; + +const generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => { + let str = ''; + const {length} = alphabet; + while (size--) { + str += alphabet[Math.random() * length|0]; + } + + return str; +}; + +/** + * If the thing is a FormData object, return true, otherwise return false. + * + * @param {unknown} thing - The thing to check. + * + * @returns {boolean} + */ +function isSpecCompliantForm(thing) { + return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]); +} + +const toJSONObject = (obj) => { + const stack = new Array(10); + + const visit = (source, i) => { + + if (isObject(source)) { + if (stack.indexOf(source) >= 0) { + return; + } + + if(!('toJSON' in source)) { + stack[i] = source; + const target = isArray(source) ? [] : {}; + + forEach(source, (value, key) => { + const reducedValue = visit(value, i + 1); + !isUndefined(reducedValue) && (target[key] = reducedValue); + }); + + stack[i] = undefined; + + return target; + } + } + + return source; + }; + + return visit(obj, 0); +}; + +const isAsyncFn = kindOfTest('AsyncFunction'); + +const isThenable = (thing) => + thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch); + +const utils$1 = { + isArray, + isArrayBuffer, + isBuffer, + isFormData, + isArrayBufferView, + isString, + isNumber, + isBoolean, + isObject, + isPlainObject, + isUndefined, + isDate, + isFile, + isBlob, + isRegExp, + isFunction, + isStream, + isURLSearchParams, + isTypedArray, + isFileList, + forEach, + merge, + extend, + trim, + stripBOM, + inherits, + toFlatObject, + kindOf, + kindOfTest, + endsWith, + toArray, + forEachEntry, + matchAll, + isHTMLForm, + hasOwnProperty, + hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection + reduceDescriptors, + freezeMethods, + toObjectSet, + toCamelCase, + noop, + toFiniteNumber, + findKey, + global: _global, + isContextDefined, + ALPHABET, + generateString, + isSpecCompliantForm, + toJSONObject, + isAsyncFn, + isThenable +}; + +/** + * Create an Error with the specified message, config, error code, request and response. + * + * @param {string} message The error message. + * @param {string} [code] The error code (for example, 'ECONNABORTED'). + * @param {Object} [config] The config. + * @param {Object} [request] The request. + * @param {Object} [response] The response. + * + * @returns {Error} The created error. + */ +function AxiosError$1(message, code, config, request, response) { + Error.call(this); + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } else { + this.stack = (new Error()).stack; + } + + this.message = message; + this.name = 'AxiosError'; + code && (this.code = code); + config && (this.config = config); + request && (this.request = request); + response && (this.response = response); +} + +utils$1.inherits(AxiosError$1, Error, { + toJSON: function toJSON() { + return { + // Standard + message: this.message, + name: this.name, + // Microsoft + description: this.description, + number: this.number, + // Mozilla + fileName: this.fileName, + lineNumber: this.lineNumber, + columnNumber: this.columnNumber, + stack: this.stack, + // Axios + config: utils$1.toJSONObject(this.config), + code: this.code, + status: this.response && this.response.status ? this.response.status : null + }; + } +}); + +const prototype$1 = AxiosError$1.prototype; +const descriptors = {}; + +[ + 'ERR_BAD_OPTION_VALUE', + 'ERR_BAD_OPTION', + 'ECONNABORTED', + 'ETIMEDOUT', + 'ERR_NETWORK', + 'ERR_FR_TOO_MANY_REDIRECTS', + 'ERR_DEPRECATED', + 'ERR_BAD_RESPONSE', + 'ERR_BAD_REQUEST', + 'ERR_CANCELED', + 'ERR_NOT_SUPPORT', + 'ERR_INVALID_URL' +// eslint-disable-next-line func-names +].forEach(code => { + descriptors[code] = {value: code}; +}); + +Object.defineProperties(AxiosError$1, descriptors); +Object.defineProperty(prototype$1, 'isAxiosError', {value: true}); + +// eslint-disable-next-line func-names +AxiosError$1.from = (error, code, config, request, response, customProps) => { + const axiosError = Object.create(prototype$1); + + utils$1.toFlatObject(error, axiosError, function filter(obj) { + return obj !== Error.prototype; + }, prop => { + return prop !== 'isAxiosError'; + }); + + AxiosError$1.call(axiosError, error.message, code, config, request, response); + + axiosError.cause = error; + + axiosError.name = error.name; + + customProps && Object.assign(axiosError, customProps); + + return axiosError; +}; + +// eslint-disable-next-line strict +const httpAdapter = null; + +/** + * Determines if the given thing is a array or js object. + * + * @param {string} thing - The object or array to be visited. + * + * @returns {boolean} + */ +function isVisitable(thing) { + return utils$1.isPlainObject(thing) || utils$1.isArray(thing); +} + +/** + * It removes the brackets from the end of a string + * + * @param {string} key - The key of the parameter. + * + * @returns {string} the key without the brackets. + */ +function removeBrackets(key) { + return utils$1.endsWith(key, '[]') ? key.slice(0, -2) : key; +} + +/** + * It takes a path, a key, and a boolean, and returns a string + * + * @param {string} path - The path to the current key. + * @param {string} key - The key of the current object being iterated over. + * @param {string} dots - If true, the key will be rendered with dots instead of brackets. + * + * @returns {string} The path to the current key. + */ +function renderKey(path, key, dots) { + if (!path) return key; + return path.concat(key).map(function each(token, i) { + // eslint-disable-next-line no-param-reassign + token = removeBrackets(token); + return !dots && i ? '[' + token + ']' : token; + }).join(dots ? '.' : ''); +} + +/** + * If the array is an array and none of its elements are visitable, then it's a flat array. + * + * @param {Array} arr - The array to check + * + * @returns {boolean} + */ +function isFlatArray(arr) { + return utils$1.isArray(arr) && !arr.some(isVisitable); +} + +const predicates = utils$1.toFlatObject(utils$1, {}, null, function filter(prop) { + return /^is[A-Z]/.test(prop); +}); + +/** + * Convert a data object to FormData + * + * @param {Object} obj + * @param {?Object} [formData] + * @param {?Object} [options] + * @param {Function} [options.visitor] + * @param {Boolean} [options.metaTokens = true] + * @param {Boolean} [options.dots = false] + * @param {?Boolean} [options.indexes = false] + * + * @returns {Object} + **/ + +/** + * It converts an object into a FormData object + * + * @param {Object} obj - The object to convert to form data. + * @param {string} formData - The FormData object to append to. + * @param {Object} options + * + * @returns + */ +function toFormData$1(obj, formData, options) { + if (!utils$1.isObject(obj)) { + throw new TypeError('target must be an object'); + } + + // eslint-disable-next-line no-param-reassign + formData = formData || new (FormData)(); + + // eslint-disable-next-line no-param-reassign + options = utils$1.toFlatObject(options, { + metaTokens: true, + dots: false, + indexes: false + }, false, function defined(option, source) { + // eslint-disable-next-line no-eq-null,eqeqeq + return !utils$1.isUndefined(source[option]); + }); + + const metaTokens = options.metaTokens; + // eslint-disable-next-line no-use-before-define + const visitor = options.visitor || defaultVisitor; + const dots = options.dots; + const indexes = options.indexes; + const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob; + const useBlob = _Blob && utils$1.isSpecCompliantForm(formData); + + if (!utils$1.isFunction(visitor)) { + throw new TypeError('visitor must be a function'); + } + + function convertValue(value) { + if (value === null) return ''; + + if (utils$1.isDate(value)) { + return value.toISOString(); + } + + if (!useBlob && utils$1.isBlob(value)) { + throw new AxiosError$1('Blob is not supported. Use a Buffer instead.'); + } + + if (utils$1.isArrayBuffer(value) || utils$1.isTypedArray(value)) { + return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value); + } + + return value; + } + + /** + * Default visitor. + * + * @param {*} value + * @param {String|Number} key + * @param {Array} path + * @this {FormData} + * + * @returns {boolean} return true to visit the each prop of the value recursively + */ + function defaultVisitor(value, key, path) { + let arr = value; + + if (value && !path && typeof value === 'object') { + if (utils$1.endsWith(key, '{}')) { + // eslint-disable-next-line no-param-reassign + key = metaTokens ? key : key.slice(0, -2); + // eslint-disable-next-line no-param-reassign + value = JSON.stringify(value); + } else if ( + (utils$1.isArray(value) && isFlatArray(value)) || + ((utils$1.isFileList(value) || utils$1.endsWith(key, '[]')) && (arr = utils$1.toArray(value)) + )) { + // eslint-disable-next-line no-param-reassign + key = removeBrackets(key); + + arr.forEach(function each(el, index) { + !(utils$1.isUndefined(el) || el === null) && formData.append( + // eslint-disable-next-line no-nested-ternary + indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'), + convertValue(el) + ); + }); + return false; + } + } + + if (isVisitable(value)) { + return true; + } + + formData.append(renderKey(path, key, dots), convertValue(value)); + + return false; + } + + const stack = []; + + const exposedHelpers = Object.assign(predicates, { + defaultVisitor, + convertValue, + isVisitable + }); + + function build(value, path) { + if (utils$1.isUndefined(value)) return; + + if (stack.indexOf(value) !== -1) { + throw Error('Circular reference detected in ' + path.join('.')); + } + + stack.push(value); + + utils$1.forEach(value, function each(el, key) { + const result = !(utils$1.isUndefined(el) || el === null) && visitor.call( + formData, el, utils$1.isString(key) ? key.trim() : key, path, exposedHelpers + ); + + if (result === true) { + build(el, path ? path.concat(key) : [key]); + } + }); + + stack.pop(); + } + + if (!utils$1.isObject(obj)) { + throw new TypeError('data must be an object'); + } + + build(obj); + + return formData; +} + +/** + * It encodes a string by replacing all characters that are not in the unreserved set with + * their percent-encoded equivalents + * + * @param {string} str - The string to encode. + * + * @returns {string} The encoded string. + */ +function encode$1(str) { + const charMap = { + '!': '%21', + "'": '%27', + '(': '%28', + ')': '%29', + '~': '%7E', + '%20': '+', + '%00': '\x00' + }; + return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) { + return charMap[match]; + }); +} + +/** + * It takes a params object and converts it to a FormData object + * + * @param {Object} params - The parameters to be converted to a FormData object. + * @param {Object} options - The options object passed to the Axios constructor. + * + * @returns {void} + */ +function AxiosURLSearchParams(params, options) { + this._pairs = []; + + params && toFormData$1(params, this, options); +} + +const prototype = AxiosURLSearchParams.prototype; + +prototype.append = function append(name, value) { + this._pairs.push([name, value]); +}; + +prototype.toString = function toString(encoder) { + const _encode = encoder ? function(value) { + return encoder.call(this, value, encode$1); + } : encode$1; + + return this._pairs.map(function each(pair) { + return _encode(pair[0]) + '=' + _encode(pair[1]); + }, '').join('&'); +}; + +/** + * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their + * URI encoded counterparts + * + * @param {string} val The value to be encoded. + * + * @returns {string} The encoded value. + */ +function encode(val) { + return encodeURIComponent(val). + replace(/%3A/gi, ':'). + replace(/%24/g, '$'). + replace(/%2C/gi, ','). + replace(/%20/g, '+'). + replace(/%5B/gi, '['). + replace(/%5D/gi, ']'); +} + +/** + * Build a URL by appending params to the end + * + * @param {string} url The base of the url (e.g., http://www.google.com) + * @param {object} [params] The params to be appended + * @param {?object} options + * + * @returns {string} The formatted url + */ +function buildURL(url, params, options) { + /*eslint no-param-reassign:0*/ + if (!params) { + return url; + } + + const _encode = options && options.encode || encode; + + const serializeFn = options && options.serialize; + + let serializedParams; + + if (serializeFn) { + serializedParams = serializeFn(params, options); + } else { + serializedParams = utils$1.isURLSearchParams(params) ? + params.toString() : + new AxiosURLSearchParams(params, options).toString(_encode); + } + + if (serializedParams) { + const hashmarkIndex = url.indexOf("#"); + + if (hashmarkIndex !== -1) { + url = url.slice(0, hashmarkIndex); + } + url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams; + } + + return url; +} + +class InterceptorManager { + constructor() { + this.handlers = []; + } + + /** + * Add a new interceptor to the stack + * + * @param {Function} fulfilled The function to handle `then` for a `Promise` + * @param {Function} rejected The function to handle `reject` for a `Promise` + * + * @return {Number} An ID used to remove interceptor later + */ + use(fulfilled, rejected, options) { + this.handlers.push({ + fulfilled, + rejected, + synchronous: options ? options.synchronous : false, + runWhen: options ? options.runWhen : null + }); + return this.handlers.length - 1; + } + + /** + * Remove an interceptor from the stack + * + * @param {Number} id The ID that was returned by `use` + * + * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise + */ + eject(id) { + if (this.handlers[id]) { + this.handlers[id] = null; + } + } + + /** + * Clear all interceptors from the stack + * + * @returns {void} + */ + clear() { + if (this.handlers) { + this.handlers = []; + } + } + + /** + * Iterate over all the registered interceptors + * + * This method is particularly useful for skipping over any + * interceptors that may have become `null` calling `eject`. + * + * @param {Function} fn The function to call for each interceptor + * + * @returns {void} + */ + forEach(fn) { + utils$1.forEach(this.handlers, function forEachHandler(h) { + if (h !== null) { + fn(h); + } + }); + } +} + +const InterceptorManager$1 = InterceptorManager; + +const transitionalDefaults = { + silentJSONParsing: true, + forcedJSONParsing: true, + clarifyTimeoutError: false +}; + +const URLSearchParams$1 = typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams; + +const FormData$1 = typeof FormData !== 'undefined' ? FormData : null; + +const Blob$1 = typeof Blob !== 'undefined' ? Blob : null; + +const platform$1 = { + isBrowser: true, + classes: { + URLSearchParams: URLSearchParams$1, + FormData: FormData$1, + Blob: Blob$1 + }, + protocols: ['http', 'https', 'file', 'blob', 'url', 'data'] +}; + +const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined'; + +/** + * Determine if we're running in a standard browser environment + * + * This allows axios to run in a web worker, and react-native. + * Both environments support XMLHttpRequest, but not fully standard globals. + * + * web workers: + * typeof window -> undefined + * typeof document -> undefined + * + * react-native: + * navigator.product -> 'ReactNative' + * nativescript + * navigator.product -> 'NativeScript' or 'NS' + * + * @returns {boolean} + */ +const hasStandardBrowserEnv = ( + (product) => { + return hasBrowserEnv && ['ReactNative', 'NativeScript', 'NS'].indexOf(product) < 0 + })(typeof navigator !== 'undefined' && navigator.product); + +/** + * Determine if we're running in a standard browser webWorker environment + * + * Although the `isStandardBrowserEnv` method indicates that + * `allows axios to run in a web worker`, the WebWorker will still be + * filtered out due to its judgment standard + * `typeof window !== 'undefined' && typeof document !== 'undefined'`. + * This leads to a problem when axios post `FormData` in webWorker + */ +const hasStandardBrowserWebWorkerEnv = (() => { + return ( + typeof WorkerGlobalScope !== 'undefined' && + // eslint-disable-next-line no-undef + self instanceof WorkerGlobalScope && + typeof self.importScripts === 'function' + ); +})(); + +const utils = /*#__PURE__*/Object.freeze({ + __proto__: null, + hasBrowserEnv: hasBrowserEnv, + hasStandardBrowserWebWorkerEnv: hasStandardBrowserWebWorkerEnv, + hasStandardBrowserEnv: hasStandardBrowserEnv +}); + +const platform = { + ...utils, + ...platform$1 +}; + +function toURLEncodedForm(data, options) { + return toFormData$1(data, new platform.classes.URLSearchParams(), Object.assign({ + visitor: function(value, key, path, helpers) { + if (platform.isNode && utils$1.isBuffer(value)) { + this.append(key, value.toString('base64')); + return false; + } + + return helpers.defaultVisitor.apply(this, arguments); + } + }, options)); +} + +/** + * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z'] + * + * @param {string} name - The name of the property to get. + * + * @returns An array of strings. + */ +function parsePropPath(name) { + // foo[x][y][z] + // foo.x.y.z + // foo-x-y-z + // foo x y z + return utils$1.matchAll(/\w+|\[(\w*)]/g, name).map(match => { + return match[0] === '[]' ? '' : match[1] || match[0]; + }); +} + +/** + * Convert an array to an object. + * + * @param {Array} arr - The array to convert to an object. + * + * @returns An object with the same keys and values as the array. + */ +function arrayToObject(arr) { + const obj = {}; + const keys = Object.keys(arr); + let i; + const len = keys.length; + let key; + for (i = 0; i < len; i++) { + key = keys[i]; + obj[key] = arr[key]; + } + return obj; +} + +/** + * It takes a FormData object and returns a JavaScript object + * + * @param {string} formData The FormData object to convert to JSON. + * + * @returns {Object | null} The converted object. + */ +function formDataToJSON(formData) { + function buildPath(path, value, target, index) { + let name = path[index++]; + + if (name === '__proto__') return true; + + const isNumericKey = Number.isFinite(+name); + const isLast = index >= path.length; + name = !name && utils$1.isArray(target) ? target.length : name; + + if (isLast) { + if (utils$1.hasOwnProp(target, name)) { + target[name] = [target[name], value]; + } else { + target[name] = value; + } + + return !isNumericKey; + } + + if (!target[name] || !utils$1.isObject(target[name])) { + target[name] = []; + } + + const result = buildPath(path, value, target[name], index); + + if (result && utils$1.isArray(target[name])) { + target[name] = arrayToObject(target[name]); + } + + return !isNumericKey; + } + + if (utils$1.isFormData(formData) && utils$1.isFunction(formData.entries)) { + const obj = {}; + + utils$1.forEachEntry(formData, (name, value) => { + buildPath(parsePropPath(name), value, obj, 0); + }); + + return obj; + } + + return null; +} + +/** + * It takes a string, tries to parse it, and if it fails, it returns the stringified version + * of the input + * + * @param {any} rawValue - The value to be stringified. + * @param {Function} parser - A function that parses a string into a JavaScript object. + * @param {Function} encoder - A function that takes a value and returns a string. + * + * @returns {string} A stringified version of the rawValue. + */ +function stringifySafely(rawValue, parser, encoder) { + if (utils$1.isString(rawValue)) { + try { + (parser || JSON.parse)(rawValue); + return utils$1.trim(rawValue); + } catch (e) { + if (e.name !== 'SyntaxError') { + throw e; + } + } + } + + return (encoder || JSON.stringify)(rawValue); +} + +const defaults = { + + transitional: transitionalDefaults, + + adapter: ['xhr', 'http'], + + transformRequest: [function transformRequest(data, headers) { + const contentType = headers.getContentType() || ''; + const hasJSONContentType = contentType.indexOf('application/json') > -1; + const isObjectPayload = utils$1.isObject(data); + + if (isObjectPayload && utils$1.isHTMLForm(data)) { + data = new FormData(data); + } + + const isFormData = utils$1.isFormData(data); + + if (isFormData) { + if (!hasJSONContentType) { + return data; + } + return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data; + } + + if (utils$1.isArrayBuffer(data) || + utils$1.isBuffer(data) || + utils$1.isStream(data) || + utils$1.isFile(data) || + utils$1.isBlob(data) + ) { + return data; + } + if (utils$1.isArrayBufferView(data)) { + return data.buffer; + } + if (utils$1.isURLSearchParams(data)) { + headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false); + return data.toString(); + } + + let isFileList; + + if (isObjectPayload) { + if (contentType.indexOf('application/x-www-form-urlencoded') > -1) { + return toURLEncodedForm(data, this.formSerializer).toString(); + } + + if ((isFileList = utils$1.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) { + const _FormData = this.env && this.env.FormData; + + return toFormData$1( + isFileList ? {'files[]': data} : data, + _FormData && new _FormData(), + this.formSerializer + ); + } + } + + if (isObjectPayload || hasJSONContentType ) { + headers.setContentType('application/json', false); + return stringifySafely(data); + } + + return data; + }], + + transformResponse: [function transformResponse(data) { + const transitional = this.transitional || defaults.transitional; + const forcedJSONParsing = transitional && transitional.forcedJSONParsing; + const JSONRequested = this.responseType === 'json'; + + if (data && utils$1.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) { + const silentJSONParsing = transitional && transitional.silentJSONParsing; + const strictJSONParsing = !silentJSONParsing && JSONRequested; + + try { + return JSON.parse(data); + } catch (e) { + if (strictJSONParsing) { + if (e.name === 'SyntaxError') { + throw AxiosError$1.from(e, AxiosError$1.ERR_BAD_RESPONSE, this, null, this.response); + } + throw e; + } + } + } + + return data; + }], + + /** + * A timeout in milliseconds to abort a request. If set to 0 (default) a + * timeout is not created. + */ + timeout: 0, + + xsrfCookieName: 'XSRF-TOKEN', + xsrfHeaderName: 'X-XSRF-TOKEN', + + maxContentLength: -1, + maxBodyLength: -1, + + env: { + FormData: platform.classes.FormData, + Blob: platform.classes.Blob + }, + + validateStatus: function validateStatus(status) { + return status >= 200 && status < 300; + }, + + headers: { + common: { + 'Accept': 'application/json, text/plain, */*', + 'Content-Type': undefined + } + } +}; + +utils$1.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => { + defaults.headers[method] = {}; +}); + +const defaults$1 = defaults; + +// RawAxiosHeaders whose duplicates are ignored by node +// c.f. https://nodejs.org/api/http.html#http_message_headers +const ignoreDuplicateOf = utils$1.toObjectSet([ + 'age', 'authorization', 'content-length', 'content-type', 'etag', + 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', + 'last-modified', 'location', 'max-forwards', 'proxy-authorization', + 'referer', 'retry-after', 'user-agent' +]); + +/** + * Parse headers into an object + * + * ``` + * Date: Wed, 27 Aug 2014 08:58:49 GMT + * Content-Type: application/json + * Connection: keep-alive + * Transfer-Encoding: chunked + * ``` + * + * @param {String} rawHeaders Headers needing to be parsed + * + * @returns {Object} Headers parsed into an object + */ +const parseHeaders = rawHeaders => { + const parsed = {}; + let key; + let val; + let i; + + rawHeaders && rawHeaders.split('\n').forEach(function parser(line) { + i = line.indexOf(':'); + key = line.substring(0, i).trim().toLowerCase(); + val = line.substring(i + 1).trim(); + + if (!key || (parsed[key] && ignoreDuplicateOf[key])) { + return; + } + + if (key === 'set-cookie') { + if (parsed[key]) { + parsed[key].push(val); + } else { + parsed[key] = [val]; + } + } else { + parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; + } + }); + + return parsed; +}; + +const $internals = Symbol('internals'); + +function normalizeHeader(header) { + return header && String(header).trim().toLowerCase(); +} + +function normalizeValue(value) { + if (value === false || value == null) { + return value; + } + + return utils$1.isArray(value) ? value.map(normalizeValue) : String(value); +} + +function parseTokens(str) { + const tokens = Object.create(null); + const tokensRE = /([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g; + let match; + + while ((match = tokensRE.exec(str))) { + tokens[match[1]] = match[2]; + } + + return tokens; +} + +const isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim()); + +function matchHeaderValue(context, value, header, filter, isHeaderNameFilter) { + if (utils$1.isFunction(filter)) { + return filter.call(this, value, header); + } + + if (isHeaderNameFilter) { + value = header; + } + + if (!utils$1.isString(value)) return; + + if (utils$1.isString(filter)) { + return value.indexOf(filter) !== -1; + } + + if (utils$1.isRegExp(filter)) { + return filter.test(value); + } +} + +function formatHeader(header) { + return header.trim() + .toLowerCase().replace(/([a-z\d])(\w*)/g, (w, char, str) => { + return char.toUpperCase() + str; + }); +} + +function buildAccessors(obj, header) { + const accessorName = utils$1.toCamelCase(' ' + header); + + ['get', 'set', 'has'].forEach(methodName => { + Object.defineProperty(obj, methodName + accessorName, { + value: function(arg1, arg2, arg3) { + return this[methodName].call(this, header, arg1, arg2, arg3); + }, + configurable: true + }); + }); +} + +class AxiosHeaders$1 { + constructor(headers) { + headers && this.set(headers); + } + + set(header, valueOrRewrite, rewrite) { + const self = this; + + function setHeader(_value, _header, _rewrite) { + const lHeader = normalizeHeader(_header); + + if (!lHeader) { + throw new Error('header name must be a non-empty string'); + } + + const key = utils$1.findKey(self, lHeader); + + if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) { + self[key || _header] = normalizeValue(_value); + } + } + + const setHeaders = (headers, _rewrite) => + utils$1.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite)); + + if (utils$1.isPlainObject(header) || header instanceof this.constructor) { + setHeaders(header, valueOrRewrite); + } else if(utils$1.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) { + setHeaders(parseHeaders(header), valueOrRewrite); + } else { + header != null && setHeader(valueOrRewrite, header, rewrite); + } + + return this; + } + + get(header, parser) { + header = normalizeHeader(header); + + if (header) { + const key = utils$1.findKey(this, header); + + if (key) { + const value = this[key]; + + if (!parser) { + return value; + } + + if (parser === true) { + return parseTokens(value); + } + + if (utils$1.isFunction(parser)) { + return parser.call(this, value, key); + } + + if (utils$1.isRegExp(parser)) { + return parser.exec(value); + } + + throw new TypeError('parser must be boolean|regexp|function'); + } + } + } + + has(header, matcher) { + header = normalizeHeader(header); + + if (header) { + const key = utils$1.findKey(this, header); + + return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher))); + } + + return false; + } + + delete(header, matcher) { + const self = this; + let deleted = false; + + function deleteHeader(_header) { + _header = normalizeHeader(_header); + + if (_header) { + const key = utils$1.findKey(self, _header); + + if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) { + delete self[key]; + + deleted = true; + } + } + } + + if (utils$1.isArray(header)) { + header.forEach(deleteHeader); + } else { + deleteHeader(header); + } + + return deleted; + } + + clear(matcher) { + const keys = Object.keys(this); + let i = keys.length; + let deleted = false; + + while (i--) { + const key = keys[i]; + if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) { + delete this[key]; + deleted = true; + } + } + + return deleted; + } + + normalize(format) { + const self = this; + const headers = {}; + + utils$1.forEach(this, (value, header) => { + const key = utils$1.findKey(headers, header); + + if (key) { + self[key] = normalizeValue(value); + delete self[header]; + return; + } + + const normalized = format ? formatHeader(header) : String(header).trim(); + + if (normalized !== header) { + delete self[header]; + } + + self[normalized] = normalizeValue(value); + + headers[normalized] = true; + }); + + return this; + } + + concat(...targets) { + return this.constructor.concat(this, ...targets); + } + + toJSON(asStrings) { + const obj = Object.create(null); + + utils$1.forEach(this, (value, header) => { + value != null && value !== false && (obj[header] = asStrings && utils$1.isArray(value) ? value.join(', ') : value); + }); + + return obj; + } + + [Symbol.iterator]() { + return Object.entries(this.toJSON())[Symbol.iterator](); + } + + toString() { + return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\n'); + } + + get [Symbol.toStringTag]() { + return 'AxiosHeaders'; + } + + static from(thing) { + return thing instanceof this ? thing : new this(thing); + } + + static concat(first, ...targets) { + const computed = new this(first); + + targets.forEach((target) => computed.set(target)); + + return computed; + } + + static accessor(header) { + const internals = this[$internals] = (this[$internals] = { + accessors: {} + }); + + const accessors = internals.accessors; + const prototype = this.prototype; + + function defineAccessor(_header) { + const lHeader = normalizeHeader(_header); + + if (!accessors[lHeader]) { + buildAccessors(prototype, _header); + accessors[lHeader] = true; + } + } + + utils$1.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header); + + return this; + } +} + +AxiosHeaders$1.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']); + +// reserved names hotfix +utils$1.reduceDescriptors(AxiosHeaders$1.prototype, ({value}, key) => { + let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set` + return { + get: () => value, + set(headerValue) { + this[mapped] = headerValue; + } + } +}); + +utils$1.freezeMethods(AxiosHeaders$1); + +const AxiosHeaders$2 = AxiosHeaders$1; + +/** + * Transform the data for a request or a response + * + * @param {Array|Function} fns A single function or Array of functions + * @param {?Object} response The response object + * + * @returns {*} The resulting transformed data + */ +function transformData(fns, response) { + const config = this || defaults$1; + const context = response || config; + const headers = AxiosHeaders$2.from(context.headers); + let data = context.data; + + utils$1.forEach(fns, function transform(fn) { + data = fn.call(config, data, headers.normalize(), response ? response.status : undefined); + }); + + headers.normalize(); + + return data; +} + +function isCancel$1(value) { + return !!(value && value.__CANCEL__); +} + +/** + * A `CanceledError` is an object that is thrown when an operation is canceled. + * + * @param {string=} message The message. + * @param {Object=} config The config. + * @param {Object=} request The request. + * + * @returns {CanceledError} The created error. + */ +function CanceledError$1(message, config, request) { + // eslint-disable-next-line no-eq-null,eqeqeq + AxiosError$1.call(this, message == null ? 'canceled' : message, AxiosError$1.ERR_CANCELED, config, request); + this.name = 'CanceledError'; +} + +utils$1.inherits(CanceledError$1, AxiosError$1, { + __CANCEL__: true +}); + +/** + * Resolve or reject a Promise based on response status. + * + * @param {Function} resolve A function that resolves the promise. + * @param {Function} reject A function that rejects the promise. + * @param {object} response The response. + * + * @returns {object} The response. + */ +function settle(resolve, reject, response) { + const validateStatus = response.config.validateStatus; + if (!response.status || !validateStatus || validateStatus(response.status)) { + resolve(response); + } else { + reject(new AxiosError$1( + 'Request failed with status code ' + response.status, + [AxiosError$1.ERR_BAD_REQUEST, AxiosError$1.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4], + response.config, + response.request, + response + )); + } +} + +const cookies = platform.hasStandardBrowserEnv ? + + // Standard browser envs support document.cookie + { + write(name, value, expires, path, domain, secure) { + const cookie = [name + '=' + encodeURIComponent(value)]; + + utils$1.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString()); + + utils$1.isString(path) && cookie.push('path=' + path); + + utils$1.isString(domain) && cookie.push('domain=' + domain); + + secure === true && cookie.push('secure'); + + document.cookie = cookie.join('; '); + }, + + read(name) { + const match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)')); + return (match ? decodeURIComponent(match[3]) : null); + }, + + remove(name) { + this.write(name, '', Date.now() - 86400000); + } + } + + : + + // Non-standard browser env (web workers, react-native) lack needed support. + { + write() {}, + read() { + return null; + }, + remove() {} + }; + +/** + * Determines whether the specified URL is absolute + * + * @param {string} url The URL to test + * + * @returns {boolean} True if the specified URL is absolute, otherwise false + */ +function isAbsoluteURL(url) { + // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL). + // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed + // by any combination of letters, digits, plus, period, or hyphen. + return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url); +} + +/** + * Creates a new URL by combining the specified URLs + * + * @param {string} baseURL The base URL + * @param {string} relativeURL The relative URL + * + * @returns {string} The combined URL + */ +function combineURLs(baseURL, relativeURL) { + return relativeURL + ? baseURL.replace(/\/?\/$/, '') + '/' + relativeURL.replace(/^\/+/, '') + : baseURL; +} + +/** + * Creates a new URL by combining the baseURL with the requestedURL, + * only when the requestedURL is not already an absolute URL. + * If the requestURL is absolute, this function returns the requestedURL untouched. + * + * @param {string} baseURL The base URL + * @param {string} requestedURL Absolute or relative URL to combine + * + * @returns {string} The combined full path + */ +function buildFullPath(baseURL, requestedURL) { + if (baseURL && !isAbsoluteURL(requestedURL)) { + return combineURLs(baseURL, requestedURL); + } + return requestedURL; +} + +const isURLSameOrigin = platform.hasStandardBrowserEnv ? + +// Standard browser envs have full support of the APIs needed to test +// whether the request URL is of the same origin as current location. + (function standardBrowserEnv() { + const msie = /(msie|trident)/i.test(navigator.userAgent); + const urlParsingNode = document.createElement('a'); + let originURL; + + /** + * Parse a URL to discover its components + * + * @param {String} url The URL to be parsed + * @returns {Object} + */ + function resolveURL(url) { + let href = url; + + if (msie) { + // IE needs attribute set twice to normalize properties + urlParsingNode.setAttribute('href', href); + href = urlParsingNode.href; + } + + urlParsingNode.setAttribute('href', href); + + // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils + return { + href: urlParsingNode.href, + protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', + host: urlParsingNode.host, + search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', + hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', + hostname: urlParsingNode.hostname, + port: urlParsingNode.port, + pathname: (urlParsingNode.pathname.charAt(0) === '/') ? + urlParsingNode.pathname : + '/' + urlParsingNode.pathname + }; + } + + originURL = resolveURL(window.location.href); + + /** + * Determine if a URL shares the same origin as the current location + * + * @param {String} requestURL The URL to test + * @returns {boolean} True if URL shares the same origin, otherwise false + */ + return function isURLSameOrigin(requestURL) { + const parsed = (utils$1.isString(requestURL)) ? resolveURL(requestURL) : requestURL; + return (parsed.protocol === originURL.protocol && + parsed.host === originURL.host); + }; + })() : + + // Non standard browser envs (web workers, react-native) lack needed support. + (function nonStandardBrowserEnv() { + return function isURLSameOrigin() { + return true; + }; + })(); + +function parseProtocol(url) { + const match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url); + return match && match[1] || ''; +} + +/** + * Calculate data maxRate + * @param {Number} [samplesCount= 10] + * @param {Number} [min= 1000] + * @returns {Function} + */ +function speedometer(samplesCount, min) { + samplesCount = samplesCount || 10; + const bytes = new Array(samplesCount); + const timestamps = new Array(samplesCount); + let head = 0; + let tail = 0; + let firstSampleTS; + + min = min !== undefined ? min : 1000; + + return function push(chunkLength) { + const now = Date.now(); + + const startedAt = timestamps[tail]; + + if (!firstSampleTS) { + firstSampleTS = now; + } + + bytes[head] = chunkLength; + timestamps[head] = now; + + let i = tail; + let bytesCount = 0; + + while (i !== head) { + bytesCount += bytes[i++]; + i = i % samplesCount; + } + + head = (head + 1) % samplesCount; + + if (head === tail) { + tail = (tail + 1) % samplesCount; + } + + if (now - firstSampleTS < min) { + return; + } + + const passed = startedAt && now - startedAt; + + return passed ? Math.round(bytesCount * 1000 / passed) : undefined; + }; +} + +function progressEventReducer(listener, isDownloadStream) { + let bytesNotified = 0; + const _speedometer = speedometer(50, 250); + + return e => { + const loaded = e.loaded; + const total = e.lengthComputable ? e.total : undefined; + const progressBytes = loaded - bytesNotified; + const rate = _speedometer(progressBytes); + const inRange = loaded <= total; + + bytesNotified = loaded; + + const data = { + loaded, + total, + progress: total ? (loaded / total) : undefined, + bytes: progressBytes, + rate: rate ? rate : undefined, + estimated: rate && total && inRange ? (total - loaded) / rate : undefined, + event: e + }; + + data[isDownloadStream ? 'download' : 'upload'] = true; + + listener(data); + }; +} + +const isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined'; + +const xhrAdapter = isXHRAdapterSupported && function (config) { + return new Promise(function dispatchXhrRequest(resolve, reject) { + let requestData = config.data; + const requestHeaders = AxiosHeaders$2.from(config.headers).normalize(); + let {responseType, withXSRFToken} = config; + let onCanceled; + function done() { + if (config.cancelToken) { + config.cancelToken.unsubscribe(onCanceled); + } + + if (config.signal) { + config.signal.removeEventListener('abort', onCanceled); + } + } + + let contentType; + + if (utils$1.isFormData(requestData)) { + if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) { + requestHeaders.setContentType(false); // Let the browser set it + } else if ((contentType = requestHeaders.getContentType()) !== false) { + // fix semicolon duplication issue for ReactNative FormData implementation + const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : []; + requestHeaders.setContentType([type || 'multipart/form-data', ...tokens].join('; ')); + } + } + + let request = new XMLHttpRequest(); + + // HTTP basic authentication + if (config.auth) { + const username = config.auth.username || ''; + const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : ''; + requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password)); + } + + const fullPath = buildFullPath(config.baseURL, config.url); + + request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true); + + // Set the request timeout in MS + request.timeout = config.timeout; + + function onloadend() { + if (!request) { + return; + } + // Prepare the response + const responseHeaders = AxiosHeaders$2.from( + 'getAllResponseHeaders' in request && request.getAllResponseHeaders() + ); + const responseData = !responseType || responseType === 'text' || responseType === 'json' ? + request.responseText : request.response; + const response = { + data: responseData, + status: request.status, + statusText: request.statusText, + headers: responseHeaders, + config, + request + }; + + settle(function _resolve(value) { + resolve(value); + done(); + }, function _reject(err) { + reject(err); + done(); + }, response); + + // Clean up request + request = null; + } + + if ('onloadend' in request) { + // Use onloadend if available + request.onloadend = onloadend; + } else { + // Listen for ready state to emulate onloadend + request.onreadystatechange = function handleLoad() { + if (!request || request.readyState !== 4) { + return; + } + + // The request errored out and we didn't get a response, this will be + // handled by onerror instead + // With one exception: request that using file: protocol, most browsers + // will return status as 0 even though it's a successful request + if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) { + return; + } + // readystate handler is calling before onerror or ontimeout handlers, + // so we should call onloadend on the next 'tick' + setTimeout(onloadend); + }; + } + + // Handle browser request cancellation (as opposed to a manual cancellation) + request.onabort = function handleAbort() { + if (!request) { + return; + } + + reject(new AxiosError$1('Request aborted', AxiosError$1.ECONNABORTED, config, request)); + + // Clean up request + request = null; + }; + + // Handle low level network errors + request.onerror = function handleError() { + // Real errors are hidden from us by the browser + // onerror should only fire if it's a network error + reject(new AxiosError$1('Network Error', AxiosError$1.ERR_NETWORK, config, request)); + + // Clean up request + request = null; + }; + + // Handle timeout + request.ontimeout = function handleTimeout() { + let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded'; + const transitional = config.transitional || transitionalDefaults; + if (config.timeoutErrorMessage) { + timeoutErrorMessage = config.timeoutErrorMessage; + } + reject(new AxiosError$1( + timeoutErrorMessage, + transitional.clarifyTimeoutError ? AxiosError$1.ETIMEDOUT : AxiosError$1.ECONNABORTED, + config, + request)); + + // Clean up request + request = null; + }; + + // Add xsrf header + // This is only done if running in a standard browser environment. + // Specifically not if we're in a web worker, or react-native. + if(platform.hasStandardBrowserEnv) { + withXSRFToken && utils$1.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(config)); + + if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(fullPath))) { + // Add xsrf header + const xsrfValue = config.xsrfHeaderName && config.xsrfCookieName && cookies.read(config.xsrfCookieName); + + if (xsrfValue) { + requestHeaders.set(config.xsrfHeaderName, xsrfValue); + } + } + } + + // Remove Content-Type if data is undefined + requestData === undefined && requestHeaders.setContentType(null); + + // Add headers to the request + if ('setRequestHeader' in request) { + utils$1.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) { + request.setRequestHeader(key, val); + }); + } + + // Add withCredentials to request if needed + if (!utils$1.isUndefined(config.withCredentials)) { + request.withCredentials = !!config.withCredentials; + } + + // Add responseType to request if needed + if (responseType && responseType !== 'json') { + request.responseType = config.responseType; + } + + // Handle progress if needed + if (typeof config.onDownloadProgress === 'function') { + request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true)); + } + + // Not all browsers support upload events + if (typeof config.onUploadProgress === 'function' && request.upload) { + request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress)); + } + + if (config.cancelToken || config.signal) { + // Handle cancellation + // eslint-disable-next-line func-names + onCanceled = cancel => { + if (!request) { + return; + } + reject(!cancel || cancel.type ? new CanceledError$1(null, config, request) : cancel); + request.abort(); + request = null; + }; + + config.cancelToken && config.cancelToken.subscribe(onCanceled); + if (config.signal) { + config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled); + } + } + + const protocol = parseProtocol(fullPath); + + if (protocol && platform.protocols.indexOf(protocol) === -1) { + reject(new AxiosError$1('Unsupported protocol ' + protocol + ':', AxiosError$1.ERR_BAD_REQUEST, config)); + return; + } + + + // Send the request + request.send(requestData || null); + }); +}; + +const knownAdapters = { + http: httpAdapter, + xhr: xhrAdapter +}; + +utils$1.forEach(knownAdapters, (fn, value) => { + if (fn) { + try { + Object.defineProperty(fn, 'name', {value}); + } catch (e) { + // eslint-disable-next-line no-empty + } + Object.defineProperty(fn, 'adapterName', {value}); + } +}); + +const renderReason = (reason) => `- ${reason}`; + +const isResolvedHandle = (adapter) => utils$1.isFunction(adapter) || adapter === null || adapter === false; + +const adapters = { + getAdapter: (adapters) => { + adapters = utils$1.isArray(adapters) ? adapters : [adapters]; + + const {length} = adapters; + let nameOrAdapter; + let adapter; + + const rejectedReasons = {}; + + for (let i = 0; i < length; i++) { + nameOrAdapter = adapters[i]; + let id; + + adapter = nameOrAdapter; + + if (!isResolvedHandle(nameOrAdapter)) { + adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()]; + + if (adapter === undefined) { + throw new AxiosError$1(`Unknown adapter '${id}'`); + } + } + + if (adapter) { + break; + } + + rejectedReasons[id || '#' + i] = adapter; + } + + if (!adapter) { + + const reasons = Object.entries(rejectedReasons) + .map(([id, state]) => `adapter ${id} ` + + (state === false ? 'is not supported by the environment' : 'is not available in the build') + ); + + let s = length ? + (reasons.length > 1 ? 'since :\n' + reasons.map(renderReason).join('\n') : ' ' + renderReason(reasons[0])) : + 'as no adapter specified'; + + throw new AxiosError$1( + `There is no suitable adapter to dispatch the request ` + s, + 'ERR_NOT_SUPPORT' + ); + } + + return adapter; + }, + adapters: knownAdapters +}; + +/** + * Throws a `CanceledError` if cancellation has been requested. + * + * @param {Object} config The config that is to be used for the request + * + * @returns {void} + */ +function throwIfCancellationRequested(config) { + if (config.cancelToken) { + config.cancelToken.throwIfRequested(); + } + + if (config.signal && config.signal.aborted) { + throw new CanceledError$1(null, config); + } +} + +/** + * Dispatch a request to the server using the configured adapter. + * + * @param {object} config The config that is to be used for the request + * + * @returns {Promise} The Promise to be fulfilled + */ +function dispatchRequest(config) { + throwIfCancellationRequested(config); + + config.headers = AxiosHeaders$2.from(config.headers); + + // Transform request data + config.data = transformData.call( + config, + config.transformRequest + ); + + if (['post', 'put', 'patch'].indexOf(config.method) !== -1) { + config.headers.setContentType('application/x-www-form-urlencoded', false); + } + + const adapter = adapters.getAdapter(config.adapter || defaults$1.adapter); + + return adapter(config).then(function onAdapterResolution(response) { + throwIfCancellationRequested(config); + + // Transform response data + response.data = transformData.call( + config, + config.transformResponse, + response + ); + + response.headers = AxiosHeaders$2.from(response.headers); + + return response; + }, function onAdapterRejection(reason) { + if (!isCancel$1(reason)) { + throwIfCancellationRequested(config); + + // Transform response data + if (reason && reason.response) { + reason.response.data = transformData.call( + config, + config.transformResponse, + reason.response + ); + reason.response.headers = AxiosHeaders$2.from(reason.response.headers); + } + } + + return Promise.reject(reason); + }); +} + +const headersToObject = (thing) => thing instanceof AxiosHeaders$2 ? thing.toJSON() : thing; + +/** + * Config-specific merge-function which creates a new config-object + * by merging two configuration objects together. + * + * @param {Object} config1 + * @param {Object} config2 + * + * @returns {Object} New object resulting from merging config2 to config1 + */ +function mergeConfig$1(config1, config2) { + // eslint-disable-next-line no-param-reassign + config2 = config2 || {}; + const config = {}; + + function getMergedValue(target, source, caseless) { + if (utils$1.isPlainObject(target) && utils$1.isPlainObject(source)) { + return utils$1.merge.call({caseless}, target, source); + } else if (utils$1.isPlainObject(source)) { + return utils$1.merge({}, source); + } else if (utils$1.isArray(source)) { + return source.slice(); + } + return source; + } + + // eslint-disable-next-line consistent-return + function mergeDeepProperties(a, b, caseless) { + if (!utils$1.isUndefined(b)) { + return getMergedValue(a, b, caseless); + } else if (!utils$1.isUndefined(a)) { + return getMergedValue(undefined, a, caseless); + } + } + + // eslint-disable-next-line consistent-return + function valueFromConfig2(a, b) { + if (!utils$1.isUndefined(b)) { + return getMergedValue(undefined, b); + } + } + + // eslint-disable-next-line consistent-return + function defaultToConfig2(a, b) { + if (!utils$1.isUndefined(b)) { + return getMergedValue(undefined, b); + } else if (!utils$1.isUndefined(a)) { + return getMergedValue(undefined, a); + } + } + + // eslint-disable-next-line consistent-return + function mergeDirectKeys(a, b, prop) { + if (prop in config2) { + return getMergedValue(a, b); + } else if (prop in config1) { + return getMergedValue(undefined, a); + } + } + + const mergeMap = { + url: valueFromConfig2, + method: valueFromConfig2, + data: valueFromConfig2, + baseURL: defaultToConfig2, + transformRequest: defaultToConfig2, + transformResponse: defaultToConfig2, + paramsSerializer: defaultToConfig2, + timeout: defaultToConfig2, + timeoutMessage: defaultToConfig2, + withCredentials: defaultToConfig2, + withXSRFToken: defaultToConfig2, + adapter: defaultToConfig2, + responseType: defaultToConfig2, + xsrfCookieName: defaultToConfig2, + xsrfHeaderName: defaultToConfig2, + onUploadProgress: defaultToConfig2, + onDownloadProgress: defaultToConfig2, + decompress: defaultToConfig2, + maxContentLength: defaultToConfig2, + maxBodyLength: defaultToConfig2, + beforeRedirect: defaultToConfig2, + transport: defaultToConfig2, + httpAgent: defaultToConfig2, + httpsAgent: defaultToConfig2, + cancelToken: defaultToConfig2, + socketPath: defaultToConfig2, + responseEncoding: defaultToConfig2, + validateStatus: mergeDirectKeys, + headers: (a, b) => mergeDeepProperties(headersToObject(a), headersToObject(b), true) + }; + + utils$1.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) { + const merge = mergeMap[prop] || mergeDeepProperties; + const configValue = merge(config1[prop], config2[prop], prop); + (utils$1.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue); + }); + + return config; +} + +const VERSION$1 = "1.6.4"; + +const validators$1 = {}; + +// eslint-disable-next-line func-names +['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => { + validators$1[type] = function validator(thing) { + return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type; + }; +}); + +const deprecatedWarnings = {}; + +/** + * Transitional option validator + * + * @param {function|boolean?} validator - set to false if the transitional option has been removed + * @param {string?} version - deprecated version / removed since version + * @param {string?} message - some message with additional info + * + * @returns {function} + */ +validators$1.transitional = function transitional(validator, version, message) { + function formatMessage(opt, desc) { + return '[Axios v' + VERSION$1 + '] Transitional option \'' + opt + '\'' + desc + (message ? '. ' + message : ''); + } + + // eslint-disable-next-line func-names + return (value, opt, opts) => { + if (validator === false) { + throw new AxiosError$1( + formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')), + AxiosError$1.ERR_DEPRECATED + ); + } + + if (version && !deprecatedWarnings[opt]) { + deprecatedWarnings[opt] = true; + // eslint-disable-next-line no-console + console.warn( + formatMessage( + opt, + ' has been deprecated since v' + version + ' and will be removed in the near future' + ) + ); + } + + return validator ? validator(value, opt, opts) : true; + }; +}; + +/** + * Assert object's properties type + * + * @param {object} options + * @param {object} schema + * @param {boolean?} allowUnknown + * + * @returns {object} + */ + +function assertOptions(options, schema, allowUnknown) { + if (typeof options !== 'object') { + throw new AxiosError$1('options must be an object', AxiosError$1.ERR_BAD_OPTION_VALUE); + } + const keys = Object.keys(options); + let i = keys.length; + while (i-- > 0) { + const opt = keys[i]; + const validator = schema[opt]; + if (validator) { + const value = options[opt]; + const result = value === undefined || validator(value, opt, options); + if (result !== true) { + throw new AxiosError$1('option ' + opt + ' must be ' + result, AxiosError$1.ERR_BAD_OPTION_VALUE); + } + continue; + } + if (allowUnknown !== true) { + throw new AxiosError$1('Unknown option ' + opt, AxiosError$1.ERR_BAD_OPTION); + } + } +} + +const validator = { + assertOptions, + validators: validators$1 +}; + +const validators = validator.validators; + +/** + * Create a new instance of Axios + * + * @param {Object} instanceConfig The default config for the instance + * + * @return {Axios} A new instance of Axios + */ +class Axios$1 { + constructor(instanceConfig) { + this.defaults = instanceConfig; + this.interceptors = { + request: new InterceptorManager$1(), + response: new InterceptorManager$1() + }; + } + + /** + * Dispatch a request + * + * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults) + * @param {?Object} config + * + * @returns {Promise} The Promise to be fulfilled + */ + request(configOrUrl, config) { + /*eslint no-param-reassign:0*/ + // Allow for axios('example/url'[, config]) a la fetch API + if (typeof configOrUrl === 'string') { + config = config || {}; + config.url = configOrUrl; + } else { + config = configOrUrl || {}; + } + + config = mergeConfig$1(this.defaults, config); + + const {transitional, paramsSerializer, headers} = config; + + if (transitional !== undefined) { + validator.assertOptions(transitional, { + silentJSONParsing: validators.transitional(validators.boolean), + forcedJSONParsing: validators.transitional(validators.boolean), + clarifyTimeoutError: validators.transitional(validators.boolean) + }, false); + } + + if (paramsSerializer != null) { + if (utils$1.isFunction(paramsSerializer)) { + config.paramsSerializer = { + serialize: paramsSerializer + }; + } else { + validator.assertOptions(paramsSerializer, { + encode: validators.function, + serialize: validators.function + }, true); + } + } + + // Set config.method + config.method = (config.method || this.defaults.method || 'get').toLowerCase(); + + // Flatten headers + let contextHeaders = headers && utils$1.merge( + headers.common, + headers[config.method] + ); + + headers && utils$1.forEach( + ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], + (method) => { + delete headers[method]; + } + ); + + config.headers = AxiosHeaders$2.concat(contextHeaders, headers); + + // filter out skipped interceptors + const requestInterceptorChain = []; + let synchronousRequestInterceptors = true; + this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { + if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) { + return; + } + + synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous; + + requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected); + }); + + const responseInterceptorChain = []; + this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { + responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected); + }); + + let promise; + let i = 0; + let len; + + if (!synchronousRequestInterceptors) { + const chain = [dispatchRequest.bind(this), undefined]; + chain.unshift.apply(chain, requestInterceptorChain); + chain.push.apply(chain, responseInterceptorChain); + len = chain.length; + + promise = Promise.resolve(config); + + while (i < len) { + promise = promise.then(chain[i++], chain[i++]); + } + + return promise; + } + + len = requestInterceptorChain.length; + + let newConfig = config; + + i = 0; + + while (i < len) { + const onFulfilled = requestInterceptorChain[i++]; + const onRejected = requestInterceptorChain[i++]; + try { + newConfig = onFulfilled(newConfig); + } catch (error) { + onRejected.call(this, error); + break; + } + } + + try { + promise = dispatchRequest.call(this, newConfig); + } catch (error) { + return Promise.reject(error); + } + + i = 0; + len = responseInterceptorChain.length; + + while (i < len) { + promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]); + } + + return promise; + } + + getUri(config) { + config = mergeConfig$1(this.defaults, config); + const fullPath = buildFullPath(config.baseURL, config.url); + return buildURL(fullPath, config.params, config.paramsSerializer); + } +} + +// Provide aliases for supported request methods +utils$1.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { + /*eslint func-names:0*/ + Axios$1.prototype[method] = function(url, config) { + return this.request(mergeConfig$1(config || {}, { + method, + url, + data: (config || {}).data + })); + }; +}); + +utils$1.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { + /*eslint func-names:0*/ + + function generateHTTPMethod(isForm) { + return function httpMethod(url, data, config) { + return this.request(mergeConfig$1(config || {}, { + method, + headers: isForm ? { + 'Content-Type': 'multipart/form-data' + } : {}, + url, + data + })); + }; + } + + Axios$1.prototype[method] = generateHTTPMethod(); + + Axios$1.prototype[method + 'Form'] = generateHTTPMethod(true); +}); + +const Axios$2 = Axios$1; + +/** + * A `CancelToken` is an object that can be used to request cancellation of an operation. + * + * @param {Function} executor The executor function. + * + * @returns {CancelToken} + */ +class CancelToken$1 { + constructor(executor) { + if (typeof executor !== 'function') { + throw new TypeError('executor must be a function.'); + } + + let resolvePromise; + + this.promise = new Promise(function promiseExecutor(resolve) { + resolvePromise = resolve; + }); + + const token = this; + + // eslint-disable-next-line func-names + this.promise.then(cancel => { + if (!token._listeners) return; + + let i = token._listeners.length; + + while (i-- > 0) { + token._listeners[i](cancel); + } + token._listeners = null; + }); + + // eslint-disable-next-line func-names + this.promise.then = onfulfilled => { + let _resolve; + // eslint-disable-next-line func-names + const promise = new Promise(resolve => { + token.subscribe(resolve); + _resolve = resolve; + }).then(onfulfilled); + + promise.cancel = function reject() { + token.unsubscribe(_resolve); + }; + + return promise; + }; + + executor(function cancel(message, config, request) { + if (token.reason) { + // Cancellation has already been requested + return; + } + + token.reason = new CanceledError$1(message, config, request); + resolvePromise(token.reason); + }); + } + + /** + * Throws a `CanceledError` if cancellation has been requested. + */ + throwIfRequested() { + if (this.reason) { + throw this.reason; + } + } + + /** + * Subscribe to the cancel signal + */ + + subscribe(listener) { + if (this.reason) { + listener(this.reason); + return; + } + + if (this._listeners) { + this._listeners.push(listener); + } else { + this._listeners = [listener]; + } + } + + /** + * Unsubscribe from the cancel signal + */ + + unsubscribe(listener) { + if (!this._listeners) { + return; + } + const index = this._listeners.indexOf(listener); + if (index !== -1) { + this._listeners.splice(index, 1); + } + } + + /** + * Returns an object that contains a new `CancelToken` and a function that, when called, + * cancels the `CancelToken`. + */ + static source() { + let cancel; + const token = new CancelToken$1(function executor(c) { + cancel = c; + }); + return { + token, + cancel + }; + } +} + +const CancelToken$2 = CancelToken$1; + +/** + * Syntactic sugar for invoking a function and expanding an array for arguments. + * + * Common use case would be to use `Function.prototype.apply`. + * + * ```js + * function f(x, y, z) {} + * var args = [1, 2, 3]; + * f.apply(null, args); + * ``` + * + * With `spread` this example can be re-written. + * + * ```js + * spread(function(x, y, z) {})([1, 2, 3]); + * ``` + * + * @param {Function} callback + * + * @returns {Function} + */ +function spread$1(callback) { + return function wrap(arr) { + return callback.apply(null, arr); + }; +} + +/** + * Determines whether the payload is an error thrown by Axios + * + * @param {*} payload The value to test + * + * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false + */ +function isAxiosError$1(payload) { + return utils$1.isObject(payload) && (payload.isAxiosError === true); +} + +const HttpStatusCode$1 = { + Continue: 100, + SwitchingProtocols: 101, + Processing: 102, + EarlyHints: 103, + Ok: 200, + Created: 201, + Accepted: 202, + NonAuthoritativeInformation: 203, + NoContent: 204, + ResetContent: 205, + PartialContent: 206, + MultiStatus: 207, + AlreadyReported: 208, + ImUsed: 226, + MultipleChoices: 300, + MovedPermanently: 301, + Found: 302, + SeeOther: 303, + NotModified: 304, + UseProxy: 305, + Unused: 306, + TemporaryRedirect: 307, + PermanentRedirect: 308, + BadRequest: 400, + Unauthorized: 401, + PaymentRequired: 402, + Forbidden: 403, + NotFound: 404, + MethodNotAllowed: 405, + NotAcceptable: 406, + ProxyAuthenticationRequired: 407, + RequestTimeout: 408, + Conflict: 409, + Gone: 410, + LengthRequired: 411, + PreconditionFailed: 412, + PayloadTooLarge: 413, + UriTooLong: 414, + UnsupportedMediaType: 415, + RangeNotSatisfiable: 416, + ExpectationFailed: 417, + ImATeapot: 418, + MisdirectedRequest: 421, + UnprocessableEntity: 422, + Locked: 423, + FailedDependency: 424, + TooEarly: 425, + UpgradeRequired: 426, + PreconditionRequired: 428, + TooManyRequests: 429, + RequestHeaderFieldsTooLarge: 431, + UnavailableForLegalReasons: 451, + InternalServerError: 500, + NotImplemented: 501, + BadGateway: 502, + ServiceUnavailable: 503, + GatewayTimeout: 504, + HttpVersionNotSupported: 505, + VariantAlsoNegotiates: 506, + InsufficientStorage: 507, + LoopDetected: 508, + NotExtended: 510, + NetworkAuthenticationRequired: 511, +}; + +Object.entries(HttpStatusCode$1).forEach(([key, value]) => { + HttpStatusCode$1[value] = key; +}); + +const HttpStatusCode$2 = HttpStatusCode$1; + +/** + * Create an instance of Axios + * + * @param {Object} defaultConfig The default config for the instance + * + * @returns {Axios} A new instance of Axios + */ +function createInstance(defaultConfig) { + const context = new Axios$2(defaultConfig); + const instance = bind(Axios$2.prototype.request, context); + + // Copy axios.prototype to instance + utils$1.extend(instance, Axios$2.prototype, context, {allOwnKeys: true}); + + // Copy context to instance + utils$1.extend(instance, context, null, {allOwnKeys: true}); + + // Factory for creating new instances + instance.create = function create(instanceConfig) { + return createInstance(mergeConfig$1(defaultConfig, instanceConfig)); + }; + + return instance; +} + +// Create the default instance to be exported +const axios = createInstance(defaults$1); + +// Expose Axios class to allow class inheritance +axios.Axios = Axios$2; + +// Expose Cancel & CancelToken +axios.CanceledError = CanceledError$1; +axios.CancelToken = CancelToken$2; +axios.isCancel = isCancel$1; +axios.VERSION = VERSION$1; +axios.toFormData = toFormData$1; + +// Expose AxiosError class +axios.AxiosError = AxiosError$1; + +// alias for CanceledError for backward compatibility +axios.Cancel = axios.CanceledError; + +// Expose all/spread +axios.all = function all(promises) { + return Promise.all(promises); +}; + +axios.spread = spread$1; + +// Expose isAxiosError +axios.isAxiosError = isAxiosError$1; + +// Expose mergeConfig +axios.mergeConfig = mergeConfig$1; + +axios.AxiosHeaders = AxiosHeaders$2; + +axios.formToJSON = thing => formDataToJSON(utils$1.isHTMLForm(thing) ? new FormData(thing) : thing); + +axios.getAdapter = adapters.getAdapter; + +axios.HttpStatusCode = HttpStatusCode$2; + +axios.default = axios; + +// this module should only have a default export +const axios$1 = axios; + +// This module is intended to unwrap Axios default export as named. +// Keep top-level export same with static properties +// so that it can keep same with es module or cjs +const { + Axios, + AxiosError, + CanceledError, + isCancel, + CancelToken, + VERSION, + all, + Cancel, + isAxiosError, + spread, + toFormData, + AxiosHeaders, + HttpStatusCode, + formToJSON, + getAdapter, + mergeConfig +} = axios$1; + +export { Axios, AxiosError, AxiosHeaders, Cancel, CancelToken, CanceledError, HttpStatusCode, VERSION, all, axios$1 as default, formToJSON, getAdapter, isAxiosError, isCancel, mergeConfig, spread, toFormData }; +//# sourceMappingURL=axios.js.map diff --git a/task/node_modules/axios/dist/esm/axios.js.map b/task/node_modules/axios/dist/esm/axios.js.map new file mode 100644 index 0000000..0dfcb04 --- /dev/null +++ b/task/node_modules/axios/dist/esm/axios.js.map @@ -0,0 +1 @@ +{"version":3,"file":"axios.js","sources":["../../lib/helpers/bind.js","../../lib/utils.js","../../lib/core/AxiosError.js","../../lib/helpers/null.js","../../lib/helpers/toFormData.js","../../lib/helpers/AxiosURLSearchParams.js","../../lib/helpers/buildURL.js","../../lib/core/InterceptorManager.js","../../lib/defaults/transitional.js","../../lib/platform/browser/classes/URLSearchParams.js","../../lib/platform/browser/classes/FormData.js","../../lib/platform/browser/classes/Blob.js","../../lib/platform/browser/index.js","../../lib/platform/common/utils.js","../../lib/platform/index.js","../../lib/helpers/toURLEncodedForm.js","../../lib/helpers/formDataToJSON.js","../../lib/defaults/index.js","../../lib/helpers/parseHeaders.js","../../lib/core/AxiosHeaders.js","../../lib/core/transformData.js","../../lib/cancel/isCancel.js","../../lib/cancel/CanceledError.js","../../lib/core/settle.js","../../lib/helpers/cookies.js","../../lib/helpers/isAbsoluteURL.js","../../lib/helpers/combineURLs.js","../../lib/core/buildFullPath.js","../../lib/helpers/isURLSameOrigin.js","../../lib/helpers/parseProtocol.js","../../lib/helpers/speedometer.js","../../lib/adapters/xhr.js","../../lib/adapters/adapters.js","../../lib/core/dispatchRequest.js","../../lib/core/mergeConfig.js","../../lib/env/data.js","../../lib/helpers/validator.js","../../lib/core/Axios.js","../../lib/cancel/CancelToken.js","../../lib/helpers/spread.js","../../lib/helpers/isAxiosError.js","../../lib/helpers/HttpStatusCode.js","../../lib/axios.js","../../index.js"],"sourcesContent":["'use strict';\n\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n","'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n let kind;\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) || (\n isFunction(thing.append) && (\n (kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n )\n )\n )\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\nfunction findKey(obj, key) {\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const {caseless} = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else {\n result[targetKey] = val;\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[Symbol.iterator];\n\n const iterator = generator.call(obj);\n\n let result;\n\n while ((result = iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n value = +value;\n return Number.isFinite(value) ? value : defaultValue;\n}\n\nconst ALPHA = 'abcdefghijklmnopqrstuvwxyz'\n\nconst DIGIT = '0123456789';\n\nconst ALPHABET = {\n DIGIT,\n ALPHA,\n ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT\n}\n\nconst generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {\n let str = '';\n const {length} = alphabet;\n while (size--) {\n str += alphabet[Math.random() * length|0]\n }\n\n return str;\n}\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]);\n}\n\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n\n const visit = (source, i) => {\n\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n\n if(!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n\n stack[i] = undefined;\n\n return target;\n }\n }\n\n return source;\n }\n\n return visit(obj, 0);\n}\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n ALPHABET,\n generateString,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable\n};\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n response && (this.response = response);\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils.toJSONObject(this.config),\n code: this.code,\n status: this.response && this.response.status ? this.response.status : null\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n AxiosError.call(axiosError, error.message, code, config, request, response);\n\n axiosError.cause = error;\n\n axiosError.name = error.name;\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n","// eslint-disable-next-line strict\nexport default null;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\nimport PlatformFormData from '../platform/node/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (PlatformFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n","'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object} params - The parameters to be converted to a FormData object.\n * @param {Object} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?object} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n","'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n","'use strict';\n\nimport AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';\nexport default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n","'use strict';\n\nexport default typeof FormData !== 'undefined' ? FormData : null;\n","'use strict'\n\nexport default typeof Blob !== 'undefined' ? Blob : null\n","import URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\nimport Blob from './classes/Blob.js'\n\nexport default {\n isBrowser: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob\n },\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n","const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = (\n (product) => {\n return hasBrowserEnv && ['ReactNative', 'NativeScript', 'NS'].indexOf(product) < 0\n })(typeof navigator !== 'undefined' && navigator.product);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope &&\n typeof self.importScripts === 'function'\n );\n})();\n\nexport {\n hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv\n}\n","import platform from './node/index.js';\nimport * as utils from './common/utils.js';\n\nexport default {\n ...utils,\n ...platform\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n }\n }, options));\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n\n if (name === '__proto__') return true;\n\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: ['xhr', 'http'],\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n if (!hasJSONContentType) {\n return data;\n }\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*',\n 'Content-Type': undefined\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n defaults.headers[method] = {};\n});\n\nexport default defaults;\n","'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = utils.findKey(self, lHeader);\n\n if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n\n const setHeaders = (headers, _rewrite) =>\n utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite)\n } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n }\n\n get(header, parser) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n\n has(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n }\n\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = utils.findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n }\n\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n\n while (i--) {\n const key = keys[i];\n if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n\n return deleted;\n }\n\n normalize(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = utils.findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n }\n\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n\n toJSON(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n });\n\n return obj;\n }\n\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n\n static concat(first, ...targets) {\n const computed = new this(first);\n\n targets.forEach((target) => computed.set(target));\n\n return computed;\n }\n\n static accessor(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n }\n }\n});\n\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n","'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n","'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n","'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n","import utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n // Standard browser envs support document.cookie\n {\n write(name, value, expires, path, domain, secure) {\n const cookie = [name + '=' + encodeURIComponent(value)];\n\n utils.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n\n utils.isString(path) && cookie.push('path=' + path);\n\n utils.isString(domain) && cookie.push('domain=' + domain);\n\n secure === true && cookie.push('secure');\n\n document.cookie = cookie.join('; ');\n },\n\n read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n }\n\n :\n\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {},\n read() {\n return null;\n },\n remove() {}\n };\n\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n","'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n","'use strict';\n\nimport utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n// Standard browser envs have full support of the APIs needed to test\n// whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n const msie = /(msie|trident)/i.test(navigator.userAgent);\n const urlParsingNode = document.createElement('a');\n let originURL;\n\n /**\n * Parse a URL to discover its components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n let href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n const parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })();\n","'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n","'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n","'use strict';\n\nimport utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport cookies from './../helpers/cookies.js';\nimport buildURL from './../helpers/buildURL.js';\nimport buildFullPath from '../core/buildFullPath.js';\nimport isURLSameOrigin from './../helpers/isURLSameOrigin.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport speedometer from '../helpers/speedometer.js';\n\nfunction progressEventReducer(listener, isDownloadStream) {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e\n };\n\n data[isDownloadStream ? 'download' : 'upload'] = true;\n\n listener(data);\n };\n}\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nexport default isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n let requestData = config.data;\n const requestHeaders = AxiosHeaders.from(config.headers).normalize();\n let {responseType, withXSRFToken} = config;\n let onCanceled;\n function done() {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(onCanceled);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', onCanceled);\n }\n }\n\n let contentType;\n\n if (utils.isFormData(requestData)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n requestHeaders.setContentType(false); // Let the browser set it\n } else if ((contentType = requestHeaders.getContentType()) !== false) {\n // fix semicolon duplication issue for ReactNative FormData implementation\n const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : [];\n requestHeaders.setContentType([type || 'multipart/form-data', ...tokens].join('; '));\n }\n }\n\n let request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n const username = config.auth.username || '';\n const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password));\n }\n\n const fullPath = buildFullPath(config.baseURL, config.url);\n\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = config.transitional || transitionalDefaults;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if(platform.hasStandardBrowserEnv) {\n withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(config));\n\n if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(fullPath))) {\n // Add xsrf header\n const xsrfValue = config.xsrfHeaderName && config.xsrfCookieName && cookies.read(config.xsrfCookieName);\n\n if (xsrfValue) {\n requestHeaders.set(config.xsrfHeaderName, xsrfValue);\n }\n }\n }\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = config.responseType;\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true));\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress));\n }\n\n if (config.cancelToken || config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n config.cancelToken && config.cancelToken.subscribe(onCanceled);\n if (config.signal) {\n config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(fullPath);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n","import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\nimport AxiosError from \"../core/AxiosError.js\";\n\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter\n}\n\nutils.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, 'name', {value});\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', {value});\n }\n});\n\nconst renderReason = (reason) => `- ${reason}`;\n\nconst isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;\n\nexport default {\n getAdapter: (adapters) => {\n adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n const {length} = adapters;\n let nameOrAdapter;\n let adapter;\n\n const rejectedReasons = {};\n\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n let id;\n\n adapter = nameOrAdapter;\n\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n if (adapter === undefined) {\n throw new AxiosError(`Unknown adapter '${id}'`);\n }\n }\n\n if (adapter) {\n break;\n }\n\n rejectedReasons[id || '#' + i] = adapter;\n }\n\n if (!adapter) {\n\n const reasons = Object.entries(rejectedReasons)\n .map(([id, state]) => `adapter ${id} ` +\n (state === false ? 'is not supported by the environment' : 'is not available in the build')\n );\n\n let s = length ?\n (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n 'as no adapter specified';\n\n throw new AxiosError(\n `There is no suitable adapter to dispatch the request ` + s,\n 'ERR_NOT_SUPPORT'\n );\n }\n\n return adapter;\n },\n adapters: knownAdapters\n}\n","'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport adapters from \"../adapters/adapters.js\";\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n\n const adapter = adapters.getAdapter(config.adapter || defaults.adapter);\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosHeaders from \"./AxiosHeaders.js\";\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? thing.toJSON() : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source, caseless) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge.call({caseless}, target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, caseless) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(a, b, caseless);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a, caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b) => mergeDeepProperties(headersToObject(a), headersToObject(b), true)\n };\n\n utils.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n","export const VERSION = \"1.6.4\";","'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n","'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer, headers} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n }\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n let contextHeaders = headers && utils.merge(\n headers.common,\n headers[config.method]\n );\n\n headers && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift.apply(chain, requestInterceptorChain);\n chain.push.apply(chain, responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n i = 0;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n","'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n","const HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n\nexport default HttpStatusCode;\n","'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\nimport AxiosHeaders from \"./core/AxiosHeaders.js\";\nimport adapters from './adapters/adapters.js';\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders;\n\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\nexport default axios\n","import axios from './lib/axios.js';\n\n// This module is intended to unwrap Axios default export as named.\n// Keep top-level export same with static properties\n// so that it can keep same with es module or cjs\nconst {\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n} = axios;\n\nexport {\n axios as default,\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n}\n"],"names":["AxiosError","utils","prototype","toFormData","encode","URLSearchParams","FormData","Blob","platform","AxiosHeaders","defaults","isCancel","CanceledError","mergeConfig","VERSION","validators","Axios","InterceptorManager","CancelToken","spread","isAxiosError","HttpStatusCode","axios"],"mappings":"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"} \ No newline at end of file diff --git a/task/node_modules/axios/dist/esm/axios.min.js b/task/node_modules/axios/dist/esm/axios.min.js new file mode 100644 index 0000000..1fd73a0 --- /dev/null +++ b/task/node_modules/axios/dist/esm/axios.min.js @@ -0,0 +1,2 @@ +function e(e,t){return function(){return e.apply(t,arguments)}}const{toString:t}=Object.prototype,{getPrototypeOf:n}=Object,r=(o=Object.create(null),e=>{const n=t.call(e);return o[n]||(o[n]=n.slice(8,-1).toLowerCase())});var o;const s=e=>(e=e.toLowerCase(),t=>r(t)===e),i=e=>t=>typeof t===e,{isArray:a}=Array,c=i("undefined");const u=s("ArrayBuffer");const l=i("string"),f=i("function"),d=i("number"),p=e=>null!==e&&"object"==typeof e,h=e=>{if("object"!==r(e))return!1;const t=n(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||Symbol.toStringTag in e||Symbol.iterator in e)},m=s("Date"),y=s("File"),g=s("Blob"),b=s("FileList"),E=s("URLSearchParams");function w(e,t,{allOwnKeys:n=!1}={}){if(null==e)return;let r,o;if("object"!=typeof e&&(e=[e]),a(e))for(r=0,o=e.length;r0;)if(r=n[o],t===r.toLowerCase())return r;return null}const S="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:global,R=e=>!c(e)&&e!==S;const A=(T="undefined"!=typeof Uint8Array&&n(Uint8Array),e=>T&&e instanceof T);var T;const j=s("HTMLFormElement"),C=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),N=s("RegExp"),v=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};w(n,((n,o)=>{let s;!1!==(s=t(n,o,e))&&(r[o]=s||n)})),Object.defineProperties(e,r)},x="abcdefghijklmnopqrstuvwxyz",P={DIGIT:"0123456789",ALPHA:x,ALPHA_DIGIT:x+x.toUpperCase()+"0123456789"};const _=s("AsyncFunction"),F={isArray:a,isArrayBuffer:u,isBuffer:function(e){return null!==e&&!c(e)&&null!==e.constructor&&!c(e.constructor)&&f(e.constructor.isBuffer)&&e.constructor.isBuffer(e)},isFormData:e=>{let t;return e&&("function"==typeof FormData&&e instanceof FormData||f(e.append)&&("formdata"===(t=r(e))||"object"===t&&f(e.toString)&&"[object FormData]"===e.toString()))},isArrayBufferView:function(e){let t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&u(e.buffer),t},isString:l,isNumber:d,isBoolean:e=>!0===e||!1===e,isObject:p,isPlainObject:h,isUndefined:c,isDate:m,isFile:y,isBlob:g,isRegExp:N,isFunction:f,isStream:e=>p(e)&&f(e.pipe),isURLSearchParams:E,isTypedArray:A,isFileList:b,forEach:w,merge:function e(){const{caseless:t}=R(this)&&this||{},n={},r=(r,o)=>{const s=t&&O(n,o)||o;h(n[s])&&h(r)?n[s]=e(n[s],r):h(r)?n[s]=e({},r):a(r)?n[s]=r.slice():n[s]=r};for(let e=0,t=arguments.length;e(w(n,((n,o)=>{r&&f(n)?t[o]=e(n,r):t[o]=n}),{allOwnKeys:o}),t),trim:e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,""),stripBOM:e=>(65279===e.charCodeAt(0)&&(e=e.slice(1)),e),inherits:(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},toFlatObject:(e,t,r,o)=>{let s,i,a;const c={};if(t=t||{},null==e)return t;do{for(s=Object.getOwnPropertyNames(e),i=s.length;i-- >0;)a=s[i],o&&!o(a,e,t)||c[a]||(t[a]=e[a],c[a]=!0);e=!1!==r&&n(e)}while(e&&(!r||r(e,t))&&e!==Object.prototype);return t},kindOf:r,kindOfTest:s,endsWith:(e,t,n)=>{e=String(e),(void 0===n||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return-1!==r&&r===n},toArray:e=>{if(!e)return null;if(a(e))return e;let t=e.length;if(!d(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},forEachEntry:(e,t)=>{const n=(e&&e[Symbol.iterator]).call(e);let r;for(;(r=n.next())&&!r.done;){const n=r.value;t.call(e,n[0],n[1])}},matchAll:(e,t)=>{let n;const r=[];for(;null!==(n=e.exec(t));)r.push(n);return r},isHTMLForm:j,hasOwnProperty:C,hasOwnProp:C,reduceDescriptors:v,freezeMethods:e=>{v(e,((t,n)=>{if(f(e)&&-1!==["arguments","caller","callee"].indexOf(n))return!1;const r=e[n];f(r)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")}))}))},toObjectSet:(e,t)=>{const n={},r=e=>{e.forEach((e=>{n[e]=!0}))};return a(e)?r(e):r(String(e).split(t)),n},toCamelCase:e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,(function(e,t,n){return t.toUpperCase()+n})),noop:()=>{},toFiniteNumber:(e,t)=>(e=+e,Number.isFinite(e)?e:t),findKey:O,global:S,isContextDefined:R,ALPHABET:P,generateString:(e=16,t=P.ALPHA_DIGIT)=>{let n="";const{length:r}=t;for(;e--;)n+=t[Math.random()*r|0];return n},isSpecCompliantForm:function(e){return!!(e&&f(e.append)&&"FormData"===e[Symbol.toStringTag]&&e[Symbol.iterator])},toJSONObject:e=>{const t=new Array(10),n=(e,r)=>{if(p(e)){if(t.indexOf(e)>=0)return;if(!("toJSON"in e)){t[r]=e;const o=a(e)?[]:{};return w(e,((e,t)=>{const s=n(e,r+1);!c(s)&&(o[t]=s)})),t[r]=void 0,o}}return e};return n(e,0)},isAsyncFn:_,isThenable:e=>e&&(p(e)||f(e))&&f(e.then)&&f(e.catch)};function U(e,t,n,r,o){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),o&&(this.response=o)}F.inherits(U,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:F.toJSONObject(this.config),code:this.code,status:this.response&&this.response.status?this.response.status:null}}});const B=U.prototype,D={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach((e=>{D[e]={value:e}})),Object.defineProperties(U,D),Object.defineProperty(B,"isAxiosError",{value:!0}),U.from=(e,t,n,r,o,s)=>{const i=Object.create(B);return F.toFlatObject(e,i,(function(e){return e!==Error.prototype}),(e=>"isAxiosError"!==e)),U.call(i,e.message,t,n,r,o),i.cause=e,i.name=e.name,s&&Object.assign(i,s),i};function L(e){return F.isPlainObject(e)||F.isArray(e)}function k(e){return F.endsWith(e,"[]")?e.slice(0,-2):e}function q(e,t,n){return e?e.concat(t).map((function(e,t){return e=k(e),!n&&t?"["+e+"]":e})).join(n?".":""):t}const I=F.toFlatObject(F,{},null,(function(e){return/^is[A-Z]/.test(e)}));function z(e,t,n){if(!F.isObject(e))throw new TypeError("target must be an object");t=t||new FormData;const r=(n=F.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,(function(e,t){return!F.isUndefined(t[e])}))).metaTokens,o=n.visitor||u,s=n.dots,i=n.indexes,a=(n.Blob||"undefined"!=typeof Blob&&Blob)&&F.isSpecCompliantForm(t);if(!F.isFunction(o))throw new TypeError("visitor must be a function");function c(e){if(null===e)return"";if(F.isDate(e))return e.toISOString();if(!a&&F.isBlob(e))throw new U("Blob is not supported. Use a Buffer instead.");return F.isArrayBuffer(e)||F.isTypedArray(e)?a&&"function"==typeof Blob?new Blob([e]):Buffer.from(e):e}function u(e,n,o){let a=e;if(e&&!o&&"object"==typeof e)if(F.endsWith(n,"{}"))n=r?n:n.slice(0,-2),e=JSON.stringify(e);else if(F.isArray(e)&&function(e){return F.isArray(e)&&!e.some(L)}(e)||(F.isFileList(e)||F.endsWith(n,"[]"))&&(a=F.toArray(e)))return n=k(n),a.forEach((function(e,r){!F.isUndefined(e)&&null!==e&&t.append(!0===i?q([n],r,s):null===i?n:n+"[]",c(e))})),!1;return!!L(e)||(t.append(q(o,n,s),c(e)),!1)}const l=[],f=Object.assign(I,{defaultVisitor:u,convertValue:c,isVisitable:L});if(!F.isObject(e))throw new TypeError("data must be an object");return function e(n,r){if(!F.isUndefined(n)){if(-1!==l.indexOf(n))throw Error("Circular reference detected in "+r.join("."));l.push(n),F.forEach(n,(function(n,s){!0===(!(F.isUndefined(n)||null===n)&&o.call(t,n,F.isString(s)?s.trim():s,r,f))&&e(n,r?r.concat(s):[s])})),l.pop()}}(e),t}function M(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,(function(e){return t[e]}))}function H(e,t){this._pairs=[],e&&z(e,this,t)}const J=H.prototype;function V(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function W(e,t,n){if(!t)return e;const r=n&&n.encode||V,o=n&&n.serialize;let s;if(s=o?o(t,n):F.isURLSearchParams(t)?t.toString():new H(t,n).toString(r),s){const t=e.indexOf("#");-1!==t&&(e=e.slice(0,t)),e+=(-1===e.indexOf("?")?"?":"&")+s}return e}J.append=function(e,t){this._pairs.push([e,t])},J.toString=function(e){const t=e?function(t){return e.call(this,t,M)}:M;return this._pairs.map((function(e){return t(e[0])+"="+t(e[1])}),"").join("&")};const K=class{constructor(){this.handlers=[]}use(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){F.forEach(this.handlers,(function(t){null!==t&&e(t)}))}},G={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},$={isBrowser:!0,classes:{URLSearchParams:"undefined"!=typeof URLSearchParams?URLSearchParams:H,FormData:"undefined"!=typeof FormData?FormData:null,Blob:"undefined"!=typeof Blob?Blob:null},protocols:["http","https","file","blob","url","data"]},X="undefined"!=typeof window&&"undefined"!=typeof document,Q=(Z="undefined"!=typeof navigator&&navigator.product,X&&["ReactNative","NativeScript","NS"].indexOf(Z)<0);var Z;const Y="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&"function"==typeof self.importScripts,ee={...Object.freeze({__proto__:null,hasBrowserEnv:X,hasStandardBrowserWebWorkerEnv:Y,hasStandardBrowserEnv:Q}),...$};function te(e){function t(e,n,r,o){let s=e[o++];if("__proto__"===s)return!0;const i=Number.isFinite(+s),a=o>=e.length;if(s=!s&&F.isArray(r)?r.length:s,a)return F.hasOwnProp(r,s)?r[s]=[r[s],n]:r[s]=n,!i;r[s]&&F.isObject(r[s])||(r[s]=[]);return t(e,n,r[s],o)&&F.isArray(r[s])&&(r[s]=function(e){const t={},n=Object.keys(e);let r;const o=n.length;let s;for(r=0;r{t(function(e){return F.matchAll(/\w+|\[(\w*)]/g,e).map((e=>"[]"===e[0]?"":e[1]||e[0]))}(e),r,n,0)})),n}return null}const ne={transitional:G,adapter:["xhr","http"],transformRequest:[function(e,t){const n=t.getContentType()||"",r=n.indexOf("application/json")>-1,o=F.isObject(e);o&&F.isHTMLForm(e)&&(e=new FormData(e));if(F.isFormData(e))return r&&r?JSON.stringify(te(e)):e;if(F.isArrayBuffer(e)||F.isBuffer(e)||F.isStream(e)||F.isFile(e)||F.isBlob(e))return e;if(F.isArrayBufferView(e))return e.buffer;if(F.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();let s;if(o){if(n.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return z(e,new ee.classes.URLSearchParams,Object.assign({visitor:function(e,t,n,r){return ee.isNode&&F.isBuffer(e)?(this.append(t,e.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)}},t))}(e,this.formSerializer).toString();if((s=F.isFileList(e))||n.indexOf("multipart/form-data")>-1){const t=this.env&&this.env.FormData;return z(s?{"files[]":e}:e,t&&new t,this.formSerializer)}}return o||r?(t.setContentType("application/json",!1),function(e,t,n){if(F.isString(e))try{return(t||JSON.parse)(e),F.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(n||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){const t=this.transitional||ne.transitional,n=t&&t.forcedJSONParsing,r="json"===this.responseType;if(e&&F.isString(e)&&(n&&!this.responseType||r)){const n=!(t&&t.silentJSONParsing)&&r;try{return JSON.parse(e)}catch(e){if(n){if("SyntaxError"===e.name)throw U.from(e,U.ERR_BAD_RESPONSE,this,null,this.response);throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:ee.classes.FormData,Blob:ee.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};F.forEach(["delete","get","head","post","put","patch"],(e=>{ne.headers[e]={}}));const re=ne,oe=F.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),se=Symbol("internals");function ie(e){return e&&String(e).trim().toLowerCase()}function ae(e){return!1===e||null==e?e:F.isArray(e)?e.map(ae):String(e)}function ce(e,t,n,r,o){return F.isFunction(r)?r.call(this,t,n):(o&&(t=n),F.isString(t)?F.isString(r)?-1!==t.indexOf(r):F.isRegExp(r)?r.test(t):void 0:void 0)}class ue{constructor(e){e&&this.set(e)}set(e,t,n){const r=this;function o(e,t,n){const o=ie(t);if(!o)throw new Error("header name must be a non-empty string");const s=F.findKey(r,o);(!s||void 0===r[s]||!0===n||void 0===n&&!1!==r[s])&&(r[s||t]=ae(e))}const s=(e,t)=>F.forEach(e,((e,n)=>o(e,n,t)));return F.isPlainObject(e)||e instanceof this.constructor?s(e,t):F.isString(e)&&(e=e.trim())&&!/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim())?s((e=>{const t={};let n,r,o;return e&&e.split("\n").forEach((function(e){o=e.indexOf(":"),n=e.substring(0,o).trim().toLowerCase(),r=e.substring(o+1).trim(),!n||t[n]&&oe[n]||("set-cookie"===n?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)})),t})(e),t):null!=e&&o(t,e,n),this}get(e,t){if(e=ie(e)){const n=F.findKey(this,e);if(n){const e=this[n];if(!t)return e;if(!0===t)return function(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}(e);if(F.isFunction(t))return t.call(this,e,n);if(F.isRegExp(t))return t.exec(e);throw new TypeError("parser must be boolean|regexp|function")}}}has(e,t){if(e=ie(e)){const n=F.findKey(this,e);return!(!n||void 0===this[n]||t&&!ce(0,this[n],n,t))}return!1}delete(e,t){const n=this;let r=!1;function o(e){if(e=ie(e)){const o=F.findKey(n,e);!o||t&&!ce(0,n[o],o,t)||(delete n[o],r=!0)}}return F.isArray(e)?e.forEach(o):o(e),r}clear(e){const t=Object.keys(this);let n=t.length,r=!1;for(;n--;){const o=t[n];e&&!ce(0,this[o],o,e,!0)||(delete this[o],r=!0)}return r}normalize(e){const t=this,n={};return F.forEach(this,((r,o)=>{const s=F.findKey(n,o);if(s)return t[s]=ae(r),void delete t[o];const i=e?function(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,((e,t,n)=>t.toUpperCase()+n))}(o):String(o).trim();i!==o&&delete t[o],t[i]=ae(r),n[i]=!0})),this}concat(...e){return this.constructor.concat(this,...e)}toJSON(e){const t=Object.create(null);return F.forEach(this,((n,r)=>{null!=n&&!1!==n&&(t[r]=e&&F.isArray(n)?n.join(", "):n)})),t}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map((([e,t])=>e+": "+t)).join("\n")}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(e){return e instanceof this?e:new this(e)}static concat(e,...t){const n=new this(e);return t.forEach((e=>n.set(e))),n}static accessor(e){const t=(this[se]=this[se]={accessors:{}}).accessors,n=this.prototype;function r(e){const r=ie(e);t[r]||(!function(e,t){const n=F.toCamelCase(" "+t);["get","set","has"].forEach((r=>{Object.defineProperty(e,r+n,{value:function(e,n,o){return this[r].call(this,t,e,n,o)},configurable:!0})}))}(n,e),t[r]=!0)}return F.isArray(e)?e.forEach(r):r(e),this}}ue.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]),F.reduceDescriptors(ue.prototype,(({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(e){this[n]=e}}})),F.freezeMethods(ue);const le=ue;function fe(e,t){const n=this||re,r=t||n,o=le.from(r.headers);let s=r.data;return F.forEach(e,(function(e){s=e.call(n,s,o.normalize(),t?t.status:void 0)})),o.normalize(),s}function de(e){return!(!e||!e.__CANCEL__)}function pe(e,t,n){U.call(this,null==e?"canceled":e,U.ERR_CANCELED,t,n),this.name="CanceledError"}F.inherits(pe,U,{__CANCEL__:!0});const he=ee.hasStandardBrowserEnv?{write(e,t,n,r,o,s){const i=[e+"="+encodeURIComponent(t)];F.isNumber(n)&&i.push("expires="+new Date(n).toGMTString()),F.isString(r)&&i.push("path="+r),F.isString(o)&&i.push("domain="+o),!0===s&&i.push("secure"),document.cookie=i.join("; ")},read(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,"",Date.now()-864e5)}}:{write(){},read:()=>null,remove(){}};function me(e,t){return e&&!/^([a-z][a-z\d+\-.]*:)?\/\//i.test(t)?function(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}(e,t):t}const ye=ee.hasStandardBrowserEnv?function(){const e=/(msie|trident)/i.test(navigator.userAgent),t=document.createElement("a");let n;function r(n){let r=n;return e&&(t.setAttribute("href",r),r=t.href),t.setAttribute("href",r),{href:t.href,protocol:t.protocol?t.protocol.replace(/:$/,""):"",host:t.host,search:t.search?t.search.replace(/^\?/,""):"",hash:t.hash?t.hash.replace(/^#/,""):"",hostname:t.hostname,port:t.port,pathname:"/"===t.pathname.charAt(0)?t.pathname:"/"+t.pathname}}return n=r(window.location.href),function(e){const t=F.isString(e)?r(e):e;return t.protocol===n.protocol&&t.host===n.host}}():function(){return!0};function ge(e,t){let n=0;const r=function(e,t){e=e||10;const n=new Array(e),r=new Array(e);let o,s=0,i=0;return t=void 0!==t?t:1e3,function(a){const c=Date.now(),u=r[i];o||(o=c),n[s]=a,r[s]=c;let l=i,f=0;for(;l!==s;)f+=n[l++],l%=e;if(s=(s+1)%e,s===i&&(i=(i+1)%e),c-o{const s=o.loaded,i=o.lengthComputable?o.total:void 0,a=s-n,c=r(a);n=s;const u={loaded:s,total:i,progress:i?s/i:void 0,bytes:a,rate:c||void 0,estimated:c&&i&&s<=i?(i-s)/c:void 0,event:o};u[t?"download":"upload"]=!0,e(u)}}const be={http:null,xhr:"undefined"!=typeof XMLHttpRequest&&function(e){return new Promise((function(t,n){let r=e.data;const o=le.from(e.headers).normalize();let s,i,{responseType:a,withXSRFToken:c}=e;function u(){e.cancelToken&&e.cancelToken.unsubscribe(s),e.signal&&e.signal.removeEventListener("abort",s)}if(F.isFormData(r))if(ee.hasStandardBrowserEnv||ee.hasStandardBrowserWebWorkerEnv)o.setContentType(!1);else if(!1!==(i=o.getContentType())){const[e,...t]=i?i.split(";").map((e=>e.trim())).filter(Boolean):[];o.setContentType([e||"multipart/form-data",...t].join("; "))}let l=new XMLHttpRequest;if(e.auth){const t=e.auth.username||"",n=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";o.set("Authorization","Basic "+btoa(t+":"+n))}const f=me(e.baseURL,e.url);function d(){if(!l)return;const r=le.from("getAllResponseHeaders"in l&&l.getAllResponseHeaders());!function(e,t,n){const r=n.config.validateStatus;n.status&&r&&!r(n.status)?t(new U("Request failed with status code "+n.status,[U.ERR_BAD_REQUEST,U.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n)):e(n)}((function(e){t(e),u()}),(function(e){n(e),u()}),{data:a&&"text"!==a&&"json"!==a?l.response:l.responseText,status:l.status,statusText:l.statusText,headers:r,config:e,request:l}),l=null}if(l.open(e.method.toUpperCase(),W(f,e.params,e.paramsSerializer),!0),l.timeout=e.timeout,"onloadend"in l?l.onloadend=d:l.onreadystatechange=function(){l&&4===l.readyState&&(0!==l.status||l.responseURL&&0===l.responseURL.indexOf("file:"))&&setTimeout(d)},l.onabort=function(){l&&(n(new U("Request aborted",U.ECONNABORTED,e,l)),l=null)},l.onerror=function(){n(new U("Network Error",U.ERR_NETWORK,e,l)),l=null},l.ontimeout=function(){let t=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded";const r=e.transitional||G;e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(new U(t,r.clarifyTimeoutError?U.ETIMEDOUT:U.ECONNABORTED,e,l)),l=null},ee.hasStandardBrowserEnv&&(c&&F.isFunction(c)&&(c=c(e)),c||!1!==c&&ye(f))){const t=e.xsrfHeaderName&&e.xsrfCookieName&&he.read(e.xsrfCookieName);t&&o.set(e.xsrfHeaderName,t)}void 0===r&&o.setContentType(null),"setRequestHeader"in l&&F.forEach(o.toJSON(),(function(e,t){l.setRequestHeader(t,e)})),F.isUndefined(e.withCredentials)||(l.withCredentials=!!e.withCredentials),a&&"json"!==a&&(l.responseType=e.responseType),"function"==typeof e.onDownloadProgress&&l.addEventListener("progress",ge(e.onDownloadProgress,!0)),"function"==typeof e.onUploadProgress&&l.upload&&l.upload.addEventListener("progress",ge(e.onUploadProgress)),(e.cancelToken||e.signal)&&(s=t=>{l&&(n(!t||t.type?new pe(null,e,l):t),l.abort(),l=null)},e.cancelToken&&e.cancelToken.subscribe(s),e.signal&&(e.signal.aborted?s():e.signal.addEventListener("abort",s)));const p=function(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}(f);p&&-1===ee.protocols.indexOf(p)?n(new U("Unsupported protocol "+p+":",U.ERR_BAD_REQUEST,e)):l.send(r||null)}))}};F.forEach(be,((e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch(e){}Object.defineProperty(e,"adapterName",{value:t})}}));const Ee=e=>`- ${e}`,we=e=>F.isFunction(e)||null===e||!1===e,Oe=e=>{e=F.isArray(e)?e:[e];const{length:t}=e;let n,r;const o={};for(let s=0;s`adapter ${e} `+(!1===t?"is not supported by the environment":"is not available in the build")));throw new U("There is no suitable adapter to dispatch the request "+(t?e.length>1?"since :\n"+e.map(Ee).join("\n"):" "+Ee(e[0]):"as no adapter specified"),"ERR_NOT_SUPPORT")}return r};function Se(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new pe(null,e)}function Re(e){Se(e),e.headers=le.from(e.headers),e.data=fe.call(e,e.transformRequest),-1!==["post","put","patch"].indexOf(e.method)&&e.headers.setContentType("application/x-www-form-urlencoded",!1);return Oe(e.adapter||re.adapter)(e).then((function(t){return Se(e),t.data=fe.call(e,e.transformResponse,t),t.headers=le.from(t.headers),t}),(function(t){return de(t)||(Se(e),t&&t.response&&(t.response.data=fe.call(e,e.transformResponse,t.response),t.response.headers=le.from(t.response.headers))),Promise.reject(t)}))}const Ae=e=>e instanceof le?e.toJSON():e;function Te(e,t){t=t||{};const n={};function r(e,t,n){return F.isPlainObject(e)&&F.isPlainObject(t)?F.merge.call({caseless:n},e,t):F.isPlainObject(t)?F.merge({},t):F.isArray(t)?t.slice():t}function o(e,t,n){return F.isUndefined(t)?F.isUndefined(e)?void 0:r(void 0,e,n):r(e,t,n)}function s(e,t){if(!F.isUndefined(t))return r(void 0,t)}function i(e,t){return F.isUndefined(t)?F.isUndefined(e)?void 0:r(void 0,e):r(void 0,t)}function a(n,o,s){return s in t?r(n,o):s in e?r(void 0,n):void 0}const c={url:s,method:s,data:s,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutMessage:i,withCredentials:i,withXSRFToken:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,responseEncoding:i,validateStatus:a,headers:(e,t)=>o(Ae(e),Ae(t),!0)};return F.forEach(Object.keys(Object.assign({},e,t)),(function(r){const s=c[r]||o,i=s(e[r],t[r],r);F.isUndefined(i)&&s!==a||(n[r]=i)})),n}const je={};["object","boolean","number","function","string","symbol"].forEach(((e,t)=>{je[e]=function(n){return typeof n===e||"a"+(t<1?"n ":" ")+e}}));const Ce={};je.transitional=function(e,t,n){function r(e,t){return"[Axios v1.6.4] Transitional option '"+e+"'"+t+(n?". "+n:"")}return(n,o,s)=>{if(!1===e)throw new U(r(o," has been removed"+(t?" in "+t:"")),U.ERR_DEPRECATED);return t&&!Ce[o]&&(Ce[o]=!0,console.warn(r(o," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(n,o,s)}};const Ne={assertOptions:function(e,t,n){if("object"!=typeof e)throw new U("options must be an object",U.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let o=r.length;for(;o-- >0;){const s=r[o],i=t[s];if(i){const t=e[s],n=void 0===t||i(t,s,e);if(!0!==n)throw new U("option "+s+" must be "+n,U.ERR_BAD_OPTION_VALUE)}else if(!0!==n)throw new U("Unknown option "+s,U.ERR_BAD_OPTION)}},validators:je},ve=Ne.validators;class xe{constructor(e){this.defaults=e,this.interceptors={request:new K,response:new K}}request(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{},t=Te(this.defaults,t);const{transitional:n,paramsSerializer:r,headers:o}=t;void 0!==n&&Ne.assertOptions(n,{silentJSONParsing:ve.transitional(ve.boolean),forcedJSONParsing:ve.transitional(ve.boolean),clarifyTimeoutError:ve.transitional(ve.boolean)},!1),null!=r&&(F.isFunction(r)?t.paramsSerializer={serialize:r}:Ne.assertOptions(r,{encode:ve.function,serialize:ve.function},!0)),t.method=(t.method||this.defaults.method||"get").toLowerCase();let s=o&&F.merge(o.common,o[t.method]);o&&F.forEach(["delete","get","head","post","put","patch","common"],(e=>{delete o[e]})),t.headers=le.concat(s,o);const i=[];let a=!0;this.interceptors.request.forEach((function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(a=a&&e.synchronous,i.unshift(e.fulfilled,e.rejected))}));const c=[];let u;this.interceptors.response.forEach((function(e){c.push(e.fulfilled,e.rejected)}));let l,f=0;if(!a){const e=[Re.bind(this),void 0];for(e.unshift.apply(e,i),e.push.apply(e,c),l=e.length,u=Promise.resolve(t);f{if(!n._listeners)return;let t=n._listeners.length;for(;t-- >0;)n._listeners[t](e);n._listeners=null})),this.promise.then=e=>{let t;const r=new Promise((e=>{n.subscribe(e),t=e})).then(e);return r.cancel=function(){n.unsubscribe(t)},r},e((function(e,r,o){n.reason||(n.reason=new pe(e,r,o),t(n.reason))}))}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;const t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}static source(){let e;return{token:new _e((function(t){e=t})),cancel:e}}}const Fe=_e;const Ue={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Ue).forEach((([e,t])=>{Ue[t]=e}));const Be=Ue;const De=function t(n){const r=new Pe(n),o=e(Pe.prototype.request,r);return F.extend(o,Pe.prototype,r,{allOwnKeys:!0}),F.extend(o,r,null,{allOwnKeys:!0}),o.create=function(e){return t(Te(n,e))},o}(re);De.Axios=Pe,De.CanceledError=pe,De.CancelToken=Fe,De.isCancel=de,De.VERSION="1.6.4",De.toFormData=z,De.AxiosError=U,De.Cancel=De.CanceledError,De.all=function(e){return Promise.all(e)},De.spread=function(e){return function(t){return e.apply(null,t)}},De.isAxiosError=function(e){return F.isObject(e)&&!0===e.isAxiosError},De.mergeConfig=Te,De.AxiosHeaders=le,De.formToJSON=e=>te(F.isHTMLForm(e)?new FormData(e):e),De.getAdapter=Oe,De.HttpStatusCode=Be,De.default=De;const Le=De,{Axios:ke,AxiosError:qe,CanceledError:Ie,isCancel:ze,CancelToken:Me,VERSION:He,all:Je,Cancel:Ve,isAxiosError:We,spread:Ke,toFormData:Ge,AxiosHeaders:$e,HttpStatusCode:Xe,formToJSON:Qe,getAdapter:Ze,mergeConfig:Ye}=Le;export{ke as Axios,qe as AxiosError,$e as AxiosHeaders,Ve as Cancel,Me as CancelToken,Ie as CanceledError,Xe as HttpStatusCode,He as VERSION,Je as all,Le as default,Qe as formToJSON,Ze as getAdapter,We as isAxiosError,ze as isCancel,Ye as mergeConfig,Ke as spread,Ge as toFormData}; +//# sourceMappingURL=axios.min.js.map diff --git a/task/node_modules/axios/dist/esm/axios.min.js.map b/task/node_modules/axios/dist/esm/axios.min.js.map new file mode 100644 index 0000000..7399a89 --- /dev/null +++ b/task/node_modules/axios/dist/esm/axios.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"axios.min.js","sources":["../../lib/helpers/bind.js","../../lib/utils.js","../../lib/core/AxiosError.js","../../lib/helpers/toFormData.js","../../lib/helpers/AxiosURLSearchParams.js","../../lib/helpers/buildURL.js","../../lib/core/InterceptorManager.js","../../lib/defaults/transitional.js","../../lib/platform/browser/index.js","../../lib/platform/browser/classes/URLSearchParams.js","../../lib/platform/browser/classes/FormData.js","../../lib/platform/browser/classes/Blob.js","../../lib/platform/common/utils.js","../../lib/platform/index.js","../../lib/helpers/formDataToJSON.js","../../lib/defaults/index.js","../../lib/helpers/toURLEncodedForm.js","../../lib/helpers/parseHeaders.js","../../lib/core/AxiosHeaders.js","../../lib/core/transformData.js","../../lib/cancel/isCancel.js","../../lib/cancel/CanceledError.js","../../lib/helpers/cookies.js","../../lib/core/buildFullPath.js","../../lib/helpers/isAbsoluteURL.js","../../lib/helpers/combineURLs.js","../../lib/helpers/isURLSameOrigin.js","../../lib/adapters/xhr.js","../../lib/helpers/speedometer.js","../../lib/adapters/adapters.js","../../lib/helpers/null.js","../../lib/core/settle.js","../../lib/helpers/parseProtocol.js","../../lib/core/dispatchRequest.js","../../lib/core/mergeConfig.js","../../lib/env/data.js","../../lib/helpers/validator.js","../../lib/core/Axios.js","../../lib/cancel/CancelToken.js","../../lib/helpers/HttpStatusCode.js","../../lib/axios.js","../../lib/helpers/spread.js","../../lib/helpers/isAxiosError.js","../../index.js"],"sourcesContent":["'use strict';\n\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n","'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n let kind;\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) || (\n isFunction(thing.append) && (\n (kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n )\n )\n )\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\nfunction findKey(obj, key) {\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const {caseless} = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else {\n result[targetKey] = val;\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[Symbol.iterator];\n\n const iterator = generator.call(obj);\n\n let result;\n\n while ((result = iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n value = +value;\n return Number.isFinite(value) ? value : defaultValue;\n}\n\nconst ALPHA = 'abcdefghijklmnopqrstuvwxyz'\n\nconst DIGIT = '0123456789';\n\nconst ALPHABET = {\n DIGIT,\n ALPHA,\n ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT\n}\n\nconst generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {\n let str = '';\n const {length} = alphabet;\n while (size--) {\n str += alphabet[Math.random() * length|0]\n }\n\n return str;\n}\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]);\n}\n\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n\n const visit = (source, i) => {\n\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n\n if(!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n\n stack[i] = undefined;\n\n return target;\n }\n }\n\n return source;\n }\n\n return visit(obj, 0);\n}\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n ALPHABET,\n generateString,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable\n};\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n response && (this.response = response);\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils.toJSONObject(this.config),\n code: this.code,\n status: this.response && this.response.status ? this.response.status : null\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n AxiosError.call(axiosError, error.message, code, config, request, response);\n\n axiosError.cause = error;\n\n axiosError.name = error.name;\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\nimport PlatformFormData from '../platform/node/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (PlatformFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n","'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object} params - The parameters to be converted to a FormData object.\n * @param {Object} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?object} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n","'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n","import URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\nimport Blob from './classes/Blob.js'\n\nexport default {\n isBrowser: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob\n },\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n","'use strict';\n\nimport AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';\nexport default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n","'use strict';\n\nexport default typeof FormData !== 'undefined' ? FormData : null;\n","'use strict'\n\nexport default typeof Blob !== 'undefined' ? Blob : null\n","const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = (\n (product) => {\n return hasBrowserEnv && ['ReactNative', 'NativeScript', 'NS'].indexOf(product) < 0\n })(typeof navigator !== 'undefined' && navigator.product);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope &&\n typeof self.importScripts === 'function'\n );\n})();\n\nexport {\n hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv\n}\n","import platform from './node/index.js';\nimport * as utils from './common/utils.js';\n\nexport default {\n ...utils,\n ...platform\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n\n if (name === '__proto__') return true;\n\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: ['xhr', 'http'],\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n if (!hasJSONContentType) {\n return data;\n }\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*',\n 'Content-Type': undefined\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n defaults.headers[method] = {};\n});\n\nexport default defaults;\n","'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n }\n }, options));\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = utils.findKey(self, lHeader);\n\n if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n\n const setHeaders = (headers, _rewrite) =>\n utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite)\n } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n }\n\n get(header, parser) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n\n has(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n }\n\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = utils.findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n }\n\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n\n while (i--) {\n const key = keys[i];\n if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n\n return deleted;\n }\n\n normalize(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = utils.findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n }\n\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n\n toJSON(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n });\n\n return obj;\n }\n\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n\n static concat(first, ...targets) {\n const computed = new this(first);\n\n targets.forEach((target) => computed.set(target));\n\n return computed;\n }\n\n static accessor(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n }\n }\n});\n\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n","'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n","'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n","import utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n // Standard browser envs support document.cookie\n {\n write(name, value, expires, path, domain, secure) {\n const cookie = [name + '=' + encodeURIComponent(value)];\n\n utils.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n\n utils.isString(path) && cookie.push('path=' + path);\n\n utils.isString(domain) && cookie.push('domain=' + domain);\n\n secure === true && cookie.push('secure');\n\n document.cookie = cookie.join('; ');\n },\n\n read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n }\n\n :\n\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {},\n read() {\n return null;\n },\n remove() {}\n };\n\n","'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n","'use strict';\n\nimport utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n// Standard browser envs have full support of the APIs needed to test\n// whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n const msie = /(msie|trident)/i.test(navigator.userAgent);\n const urlParsingNode = document.createElement('a');\n let originURL;\n\n /**\n * Parse a URL to discover its components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n let href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n const parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })();\n","'use strict';\n\nimport utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport cookies from './../helpers/cookies.js';\nimport buildURL from './../helpers/buildURL.js';\nimport buildFullPath from '../core/buildFullPath.js';\nimport isURLSameOrigin from './../helpers/isURLSameOrigin.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport speedometer from '../helpers/speedometer.js';\n\nfunction progressEventReducer(listener, isDownloadStream) {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e\n };\n\n data[isDownloadStream ? 'download' : 'upload'] = true;\n\n listener(data);\n };\n}\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nexport default isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n let requestData = config.data;\n const requestHeaders = AxiosHeaders.from(config.headers).normalize();\n let {responseType, withXSRFToken} = config;\n let onCanceled;\n function done() {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(onCanceled);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', onCanceled);\n }\n }\n\n let contentType;\n\n if (utils.isFormData(requestData)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n requestHeaders.setContentType(false); // Let the browser set it\n } else if ((contentType = requestHeaders.getContentType()) !== false) {\n // fix semicolon duplication issue for ReactNative FormData implementation\n const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : [];\n requestHeaders.setContentType([type || 'multipart/form-data', ...tokens].join('; '));\n }\n }\n\n let request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n const username = config.auth.username || '';\n const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password));\n }\n\n const fullPath = buildFullPath(config.baseURL, config.url);\n\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = config.transitional || transitionalDefaults;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if(platform.hasStandardBrowserEnv) {\n withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(config));\n\n if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(fullPath))) {\n // Add xsrf header\n const xsrfValue = config.xsrfHeaderName && config.xsrfCookieName && cookies.read(config.xsrfCookieName);\n\n if (xsrfValue) {\n requestHeaders.set(config.xsrfHeaderName, xsrfValue);\n }\n }\n }\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = config.responseType;\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true));\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress));\n }\n\n if (config.cancelToken || config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n config.cancelToken && config.cancelToken.subscribe(onCanceled);\n if (config.signal) {\n config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(fullPath);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n","'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n","import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\nimport AxiosError from \"../core/AxiosError.js\";\n\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter\n}\n\nutils.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, 'name', {value});\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', {value});\n }\n});\n\nconst renderReason = (reason) => `- ${reason}`;\n\nconst isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;\n\nexport default {\n getAdapter: (adapters) => {\n adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n const {length} = adapters;\n let nameOrAdapter;\n let adapter;\n\n const rejectedReasons = {};\n\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n let id;\n\n adapter = nameOrAdapter;\n\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n if (adapter === undefined) {\n throw new AxiosError(`Unknown adapter '${id}'`);\n }\n }\n\n if (adapter) {\n break;\n }\n\n rejectedReasons[id || '#' + i] = adapter;\n }\n\n if (!adapter) {\n\n const reasons = Object.entries(rejectedReasons)\n .map(([id, state]) => `adapter ${id} ` +\n (state === false ? 'is not supported by the environment' : 'is not available in the build')\n );\n\n let s = length ?\n (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n 'as no adapter specified';\n\n throw new AxiosError(\n `There is no suitable adapter to dispatch the request ` + s,\n 'ERR_NOT_SUPPORT'\n );\n }\n\n return adapter;\n },\n adapters: knownAdapters\n}\n","// eslint-disable-next-line strict\nexport default null;\n","'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n","'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n","'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport adapters from \"../adapters/adapters.js\";\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n\n const adapter = adapters.getAdapter(config.adapter || defaults.adapter);\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosHeaders from \"./AxiosHeaders.js\";\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? thing.toJSON() : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source, caseless) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge.call({caseless}, target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, caseless) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(a, b, caseless);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a, caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b) => mergeDeepProperties(headersToObject(a), headersToObject(b), true)\n };\n\n utils.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n","export const VERSION = \"1.6.4\";","'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n","'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer, headers} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n }\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n let contextHeaders = headers && utils.merge(\n headers.common,\n headers[config.method]\n );\n\n headers && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift.apply(chain, requestInterceptorChain);\n chain.push.apply(chain, responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n i = 0;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n","'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n","const HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n\nexport default HttpStatusCode;\n","'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\nimport AxiosHeaders from \"./core/AxiosHeaders.js\";\nimport adapters from './adapters/adapters.js';\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders;\n\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\nexport default axios\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n","import axios from './lib/axios.js';\n\n// This module is intended to unwrap Axios default export as named.\n// Keep top-level export same with static properties\n// so that it can keep same with es module or cjs\nconst {\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n} = axios;\n\nexport {\n axios as default,\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n}\n"],"names":["bind","fn","thisArg","apply","arguments","toString","Object","prototype","getPrototypeOf","kindOf","cache","create","thing","str","call","slice","toLowerCase","kindOfTest","type","typeOfTest","isArray","Array","isUndefined","isArrayBuffer","isString","isFunction","isNumber","isObject","isPlainObject","val","Symbol","toStringTag","iterator","isDate","isFile","isBlob","isFileList","isURLSearchParams","forEach","obj","allOwnKeys","i","l","length","keys","getOwnPropertyNames","len","key","findKey","_key","_global","globalThis","self","window","global","isContextDefined","context","isTypedArray","TypedArray","Uint8Array","isHTMLForm","hasOwnProperty","prop","isRegExp","reduceDescriptors","reducer","descriptors","getOwnPropertyDescriptors","reducedDescriptors","descriptor","name","ret","defineProperties","ALPHA","ALPHABET","DIGIT","ALPHA_DIGIT","toUpperCase","isAsyncFn","utils$1","isBuffer","constructor","isFormData","kind","FormData","append","isArrayBufferView","result","ArrayBuffer","isView","buffer","isBoolean","isStream","pipe","merge","caseless","this","assignValue","targetKey","extend","a","b","trim","replace","stripBOM","content","charCodeAt","inherits","superConstructor","props","defineProperty","value","assign","toFlatObject","sourceObj","destObj","filter","propFilter","merged","endsWith","searchString","position","String","undefined","lastIndex","indexOf","toArray","arr","forEachEntry","next","done","pair","matchAll","regExp","matches","exec","push","hasOwnProp","freezeMethods","enumerable","writable","set","Error","toObjectSet","arrayOrString","delimiter","define","split","toCamelCase","m","p1","p2","noop","toFiniteNumber","defaultValue","Number","isFinite","generateString","size","alphabet","Math","random","isSpecCompliantForm","toJSONObject","stack","visit","source","target","reducedValue","isThenable","then","catch","AxiosError","message","code","config","request","response","captureStackTrace","utils","toJSON","description","number","fileName","lineNumber","columnNumber","status","from","error","customProps","axiosError","cause","isVisitable","removeBrackets","renderKey","path","dots","concat","map","token","join","predicates","test","toFormData","formData","options","TypeError","metaTokens","indexes","option","visitor","defaultVisitor","useBlob","Blob","convertValue","toISOString","Buffer","JSON","stringify","some","isFlatArray","el","index","exposedHelpers","build","pop","encode","charMap","encodeURIComponent","match","AxiosURLSearchParams","params","_pairs","buildURL","url","_encode","serializeFn","serialize","serializedParams","hashmarkIndex","encoder","InterceptorManager$1","handlers","use","fulfilled","rejected","synchronous","runWhen","eject","id","clear","h","transitionalDefaults","silentJSONParsing","forcedJSONParsing","clarifyTimeoutError","platform$1","isBrowser","classes","URLSearchParams","protocols","hasBrowserEnv","document","hasStandardBrowserEnv","product","navigator","hasStandardBrowserWebWorkerEnv","WorkerGlobalScope","importScripts","platform","formDataToJSON","buildPath","isNumericKey","isLast","arrayToObject","entries","parsePropPath","defaults","transitional","adapter","transformRequest","data","headers","contentType","getContentType","hasJSONContentType","isObjectPayload","setContentType","helpers","isNode","toURLEncodedForm","formSerializer","_FormData","env","rawValue","parser","parse","e","stringifySafely","transformResponse","JSONRequested","responseType","strictJSONParsing","ERR_BAD_RESPONSE","timeout","xsrfCookieName","xsrfHeaderName","maxContentLength","maxBodyLength","validateStatus","common","Accept","method","defaults$1","ignoreDuplicateOf","$internals","normalizeHeader","header","normalizeValue","matchHeaderValue","isHeaderNameFilter","AxiosHeaders","valueOrRewrite","rewrite","setHeader","_value","_header","_rewrite","lHeader","setHeaders","rawHeaders","parsed","line","substring","parseHeaders","get","tokens","tokensRE","parseTokens","has","matcher","delete","deleted","deleteHeader","normalize","format","normalized","w","char","formatHeader","targets","asStrings","static","first","computed","accessors","defineAccessor","accessorName","methodName","arg1","arg2","arg3","configurable","buildAccessors","accessor","mapped","headerValue","AxiosHeaders$2","transformData","fns","isCancel","__CANCEL__","CanceledError","ERR_CANCELED","cookies","write","expires","domain","secure","cookie","Date","toGMTString","read","RegExp","decodeURIComponent","remove","now","buildFullPath","baseURL","requestedURL","relativeURL","combineURLs","isURLSameOrigin","msie","userAgent","urlParsingNode","createElement","originURL","resolveURL","href","setAttribute","protocol","host","search","hash","hostname","port","pathname","charAt","location","requestURL","progressEventReducer","listener","isDownloadStream","bytesNotified","_speedometer","samplesCount","min","bytes","timestamps","firstSampleTS","head","tail","chunkLength","startedAt","bytesCount","passed","round","speedometer","loaded","total","lengthComputable","progressBytes","rate","progress","estimated","event","knownAdapters","http","xhr","XMLHttpRequest","Promise","resolve","reject","requestData","requestHeaders","onCanceled","withXSRFToken","cancelToken","unsubscribe","signal","removeEventListener","Boolean","auth","username","password","unescape","btoa","fullPath","onloadend","responseHeaders","getAllResponseHeaders","ERR_BAD_REQUEST","floor","settle","err","responseText","statusText","open","paramsSerializer","onreadystatechange","readyState","responseURL","setTimeout","onabort","ECONNABORTED","onerror","ERR_NETWORK","ontimeout","timeoutErrorMessage","ETIMEDOUT","xsrfValue","setRequestHeader","withCredentials","onDownloadProgress","addEventListener","onUploadProgress","upload","cancel","abort","subscribe","aborted","parseProtocol","send","renderReason","reason","isResolvedHandle","adapters","nameOrAdapter","rejectedReasons","reasons","state","throwIfCancellationRequested","throwIfRequested","dispatchRequest","headersToObject","mergeConfig","config1","config2","getMergedValue","mergeDeepProperties","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","timeoutMessage","decompress","beforeRedirect","transport","httpAgent","httpsAgent","socketPath","responseEncoding","configValue","validators","deprecatedWarnings","validator","version","formatMessage","opt","desc","opts","ERR_DEPRECATED","console","warn","assertOptions","schema","allowUnknown","ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","Axios","instanceConfig","interceptors","InterceptorManager","configOrUrl","boolean","function","contextHeaders","requestInterceptorChain","synchronousRequestInterceptors","interceptor","unshift","responseInterceptorChain","promise","chain","newConfig","onFulfilled","onRejected","getUri","generateHTTPMethod","isForm","Axios$2","CancelToken","executor","resolvePromise","_listeners","onfulfilled","_resolve","splice","c","CancelToken$2","HttpStatusCode","Continue","SwitchingProtocols","Processing","EarlyHints","Ok","Created","Accepted","NonAuthoritativeInformation","NoContent","ResetContent","PartialContent","MultiStatus","AlreadyReported","ImUsed","MultipleChoices","MovedPermanently","Found","SeeOther","NotModified","UseProxy","Unused","TemporaryRedirect","PermanentRedirect","BadRequest","Unauthorized","PaymentRequired","Forbidden","NotFound","MethodNotAllowed","NotAcceptable","ProxyAuthenticationRequired","RequestTimeout","Conflict","Gone","LengthRequired","PreconditionFailed","PayloadTooLarge","UriTooLong","UnsupportedMediaType","RangeNotSatisfiable","ExpectationFailed","ImATeapot","MisdirectedRequest","UnprocessableEntity","Locked","FailedDependency","TooEarly","UpgradeRequired","PreconditionRequired","TooManyRequests","RequestHeaderFieldsTooLarge","UnavailableForLegalReasons","InternalServerError","NotImplemented","BadGateway","ServiceUnavailable","GatewayTimeout","HttpVersionNotSupported","VariantAlsoNegotiates","InsufficientStorage","LoopDetected","NotExtended","NetworkAuthenticationRequired","HttpStatusCode$2","axios","createInstance","defaultConfig","instance","VERSION","Cancel","all","promises","spread","callback","isAxiosError","payload","formToJSON","getAdapter","default","axios$1"],"mappings":"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"} \ No newline at end of file diff --git a/task/node_modules/axios/dist/node/axios.cjs b/task/node_modules/axios/dist/node/axios.cjs new file mode 100644 index 0000000..4cff227 --- /dev/null +++ b/task/node_modules/axios/dist/node/axios.cjs @@ -0,0 +1,4330 @@ +// Axios v1.6.4 Copyright (c) 2024 Matt Zabriskie and contributors +'use strict'; + +const FormData$1 = require('form-data'); +const url = require('url'); +const proxyFromEnv = require('proxy-from-env'); +const http = require('http'); +const https = require('https'); +const util = require('util'); +const followRedirects = require('follow-redirects'); +const zlib = require('zlib'); +const stream = require('stream'); +const EventEmitter = require('events'); + +function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } + +const FormData__default = /*#__PURE__*/_interopDefaultLegacy(FormData$1); +const url__default = /*#__PURE__*/_interopDefaultLegacy(url); +const http__default = /*#__PURE__*/_interopDefaultLegacy(http); +const https__default = /*#__PURE__*/_interopDefaultLegacy(https); +const util__default = /*#__PURE__*/_interopDefaultLegacy(util); +const followRedirects__default = /*#__PURE__*/_interopDefaultLegacy(followRedirects); +const zlib__default = /*#__PURE__*/_interopDefaultLegacy(zlib); +const stream__default = /*#__PURE__*/_interopDefaultLegacy(stream); +const EventEmitter__default = /*#__PURE__*/_interopDefaultLegacy(EventEmitter); + +function bind(fn, thisArg) { + return function wrap() { + return fn.apply(thisArg, arguments); + }; +} + +// utils is a library of generic helper functions non-specific to axios + +const {toString} = Object.prototype; +const {getPrototypeOf} = Object; + +const kindOf = (cache => thing => { + const str = toString.call(thing); + return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase()); +})(Object.create(null)); + +const kindOfTest = (type) => { + type = type.toLowerCase(); + return (thing) => kindOf(thing) === type +}; + +const typeOfTest = type => thing => typeof thing === type; + +/** + * Determine if a value is an Array + * + * @param {Object} val The value to test + * + * @returns {boolean} True if value is an Array, otherwise false + */ +const {isArray} = Array; + +/** + * Determine if a value is undefined + * + * @param {*} val The value to test + * + * @returns {boolean} True if the value is undefined, otherwise false + */ +const isUndefined = typeOfTest('undefined'); + +/** + * Determine if a value is a Buffer + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a Buffer, otherwise false + */ +function isBuffer(val) { + return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) + && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val); +} + +/** + * Determine if a value is an ArrayBuffer + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is an ArrayBuffer, otherwise false + */ +const isArrayBuffer = kindOfTest('ArrayBuffer'); + + +/** + * Determine if a value is a view on an ArrayBuffer + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false + */ +function isArrayBufferView(val) { + let result; + if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) { + result = ArrayBuffer.isView(val); + } else { + result = (val) && (val.buffer) && (isArrayBuffer(val.buffer)); + } + return result; +} + +/** + * Determine if a value is a String + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a String, otherwise false + */ +const isString = typeOfTest('string'); + +/** + * Determine if a value is a Function + * + * @param {*} val The value to test + * @returns {boolean} True if value is a Function, otherwise false + */ +const isFunction = typeOfTest('function'); + +/** + * Determine if a value is a Number + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a Number, otherwise false + */ +const isNumber = typeOfTest('number'); + +/** + * Determine if a value is an Object + * + * @param {*} thing The value to test + * + * @returns {boolean} True if value is an Object, otherwise false + */ +const isObject = (thing) => thing !== null && typeof thing === 'object'; + +/** + * Determine if a value is a Boolean + * + * @param {*} thing The value to test + * @returns {boolean} True if value is a Boolean, otherwise false + */ +const isBoolean = thing => thing === true || thing === false; + +/** + * Determine if a value is a plain Object + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a plain Object, otherwise false + */ +const isPlainObject = (val) => { + if (kindOf(val) !== 'object') { + return false; + } + + const prototype = getPrototypeOf(val); + return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val); +}; + +/** + * Determine if a value is a Date + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a Date, otherwise false + */ +const isDate = kindOfTest('Date'); + +/** + * Determine if a value is a File + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a File, otherwise false + */ +const isFile = kindOfTest('File'); + +/** + * Determine if a value is a Blob + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a Blob, otherwise false + */ +const isBlob = kindOfTest('Blob'); + +/** + * Determine if a value is a FileList + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a File, otherwise false + */ +const isFileList = kindOfTest('FileList'); + +/** + * Determine if a value is a Stream + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a Stream, otherwise false + */ +const isStream = (val) => isObject(val) && isFunction(val.pipe); + +/** + * Determine if a value is a FormData + * + * @param {*} thing The value to test + * + * @returns {boolean} True if value is an FormData, otherwise false + */ +const isFormData = (thing) => { + let kind; + return thing && ( + (typeof FormData === 'function' && thing instanceof FormData) || ( + isFunction(thing.append) && ( + (kind = kindOf(thing)) === 'formdata' || + // detect form-data instance + (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]') + ) + ) + ) +}; + +/** + * Determine if a value is a URLSearchParams object + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a URLSearchParams object, otherwise false + */ +const isURLSearchParams = kindOfTest('URLSearchParams'); + +/** + * Trim excess whitespace off the beginning and end of a string + * + * @param {String} str The String to trim + * + * @returns {String} The String freed of excess whitespace + */ +const trim = (str) => str.trim ? + str.trim() : str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); + +/** + * Iterate over an Array or an Object invoking a function for each item. + * + * If `obj` is an Array callback will be called passing + * the value, index, and complete array for each item. + * + * If 'obj' is an Object callback will be called passing + * the value, key, and complete object for each property. + * + * @param {Object|Array} obj The object to iterate + * @param {Function} fn The callback to invoke for each item + * + * @param {Boolean} [allOwnKeys = false] + * @returns {any} + */ +function forEach(obj, fn, {allOwnKeys = false} = {}) { + // Don't bother if no value provided + if (obj === null || typeof obj === 'undefined') { + return; + } + + let i; + let l; + + // Force an array if not already something iterable + if (typeof obj !== 'object') { + /*eslint no-param-reassign:0*/ + obj = [obj]; + } + + if (isArray(obj)) { + // Iterate over array values + for (i = 0, l = obj.length; i < l; i++) { + fn.call(null, obj[i], i, obj); + } + } else { + // Iterate over object keys + const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj); + const len = keys.length; + let key; + + for (i = 0; i < len; i++) { + key = keys[i]; + fn.call(null, obj[key], key, obj); + } + } +} + +function findKey(obj, key) { + key = key.toLowerCase(); + const keys = Object.keys(obj); + let i = keys.length; + let _key; + while (i-- > 0) { + _key = keys[i]; + if (key === _key.toLowerCase()) { + return _key; + } + } + return null; +} + +const _global = (() => { + /*eslint no-undef:0*/ + if (typeof globalThis !== "undefined") return globalThis; + return typeof self !== "undefined" ? self : (typeof window !== 'undefined' ? window : global) +})(); + +const isContextDefined = (context) => !isUndefined(context) && context !== _global; + +/** + * Accepts varargs expecting each argument to be an object, then + * immutably merges the properties of each object and returns result. + * + * When multiple objects contain the same key the later object in + * the arguments list will take precedence. + * + * Example: + * + * ```js + * var result = merge({foo: 123}, {foo: 456}); + * console.log(result.foo); // outputs 456 + * ``` + * + * @param {Object} obj1 Object to merge + * + * @returns {Object} Result of all merge properties + */ +function merge(/* obj1, obj2, obj3, ... */) { + const {caseless} = isContextDefined(this) && this || {}; + const result = {}; + const assignValue = (val, key) => { + const targetKey = caseless && findKey(result, key) || key; + if (isPlainObject(result[targetKey]) && isPlainObject(val)) { + result[targetKey] = merge(result[targetKey], val); + } else if (isPlainObject(val)) { + result[targetKey] = merge({}, val); + } else if (isArray(val)) { + result[targetKey] = val.slice(); + } else { + result[targetKey] = val; + } + }; + + for (let i = 0, l = arguments.length; i < l; i++) { + arguments[i] && forEach(arguments[i], assignValue); + } + return result; +} + +/** + * Extends object a by mutably adding to it the properties of object b. + * + * @param {Object} a The object to be extended + * @param {Object} b The object to copy properties from + * @param {Object} thisArg The object to bind function to + * + * @param {Boolean} [allOwnKeys] + * @returns {Object} The resulting value of object a + */ +const extend = (a, b, thisArg, {allOwnKeys}= {}) => { + forEach(b, (val, key) => { + if (thisArg && isFunction(val)) { + a[key] = bind(val, thisArg); + } else { + a[key] = val; + } + }, {allOwnKeys}); + return a; +}; + +/** + * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM) + * + * @param {string} content with BOM + * + * @returns {string} content value without BOM + */ +const stripBOM = (content) => { + if (content.charCodeAt(0) === 0xFEFF) { + content = content.slice(1); + } + return content; +}; + +/** + * Inherit the prototype methods from one constructor into another + * @param {function} constructor + * @param {function} superConstructor + * @param {object} [props] + * @param {object} [descriptors] + * + * @returns {void} + */ +const inherits = (constructor, superConstructor, props, descriptors) => { + constructor.prototype = Object.create(superConstructor.prototype, descriptors); + constructor.prototype.constructor = constructor; + Object.defineProperty(constructor, 'super', { + value: superConstructor.prototype + }); + props && Object.assign(constructor.prototype, props); +}; + +/** + * Resolve object with deep prototype chain to a flat object + * @param {Object} sourceObj source object + * @param {Object} [destObj] + * @param {Function|Boolean} [filter] + * @param {Function} [propFilter] + * + * @returns {Object} + */ +const toFlatObject = (sourceObj, destObj, filter, propFilter) => { + let props; + let i; + let prop; + const merged = {}; + + destObj = destObj || {}; + // eslint-disable-next-line no-eq-null,eqeqeq + if (sourceObj == null) return destObj; + + do { + props = Object.getOwnPropertyNames(sourceObj); + i = props.length; + while (i-- > 0) { + prop = props[i]; + if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) { + destObj[prop] = sourceObj[prop]; + merged[prop] = true; + } + } + sourceObj = filter !== false && getPrototypeOf(sourceObj); + } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype); + + return destObj; +}; + +/** + * Determines whether a string ends with the characters of a specified string + * + * @param {String} str + * @param {String} searchString + * @param {Number} [position= 0] + * + * @returns {boolean} + */ +const endsWith = (str, searchString, position) => { + str = String(str); + if (position === undefined || position > str.length) { + position = str.length; + } + position -= searchString.length; + const lastIndex = str.indexOf(searchString, position); + return lastIndex !== -1 && lastIndex === position; +}; + + +/** + * Returns new array from array like object or null if failed + * + * @param {*} [thing] + * + * @returns {?Array} + */ +const toArray = (thing) => { + if (!thing) return null; + if (isArray(thing)) return thing; + let i = thing.length; + if (!isNumber(i)) return null; + const arr = new Array(i); + while (i-- > 0) { + arr[i] = thing[i]; + } + return arr; +}; + +/** + * Checking if the Uint8Array exists and if it does, it returns a function that checks if the + * thing passed in is an instance of Uint8Array + * + * @param {TypedArray} + * + * @returns {Array} + */ +// eslint-disable-next-line func-names +const isTypedArray = (TypedArray => { + // eslint-disable-next-line func-names + return thing => { + return TypedArray && thing instanceof TypedArray; + }; +})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array)); + +/** + * For each entry in the object, call the function with the key and value. + * + * @param {Object} obj - The object to iterate over. + * @param {Function} fn - The function to call for each entry. + * + * @returns {void} + */ +const forEachEntry = (obj, fn) => { + const generator = obj && obj[Symbol.iterator]; + + const iterator = generator.call(obj); + + let result; + + while ((result = iterator.next()) && !result.done) { + const pair = result.value; + fn.call(obj, pair[0], pair[1]); + } +}; + +/** + * It takes a regular expression and a string, and returns an array of all the matches + * + * @param {string} regExp - The regular expression to match against. + * @param {string} str - The string to search. + * + * @returns {Array} + */ +const matchAll = (regExp, str) => { + let matches; + const arr = []; + + while ((matches = regExp.exec(str)) !== null) { + arr.push(matches); + } + + return arr; +}; + +/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */ +const isHTMLForm = kindOfTest('HTMLFormElement'); + +const toCamelCase = str => { + return str.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g, + function replacer(m, p1, p2) { + return p1.toUpperCase() + p2; + } + ); +}; + +/* Creating a function that will check if an object has a property. */ +const hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype); + +/** + * Determine if a value is a RegExp object + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a RegExp object, otherwise false + */ +const isRegExp = kindOfTest('RegExp'); + +const reduceDescriptors = (obj, reducer) => { + const descriptors = Object.getOwnPropertyDescriptors(obj); + const reducedDescriptors = {}; + + forEach(descriptors, (descriptor, name) => { + let ret; + if ((ret = reducer(descriptor, name, obj)) !== false) { + reducedDescriptors[name] = ret || descriptor; + } + }); + + Object.defineProperties(obj, reducedDescriptors); +}; + +/** + * Makes all methods read-only + * @param {Object} obj + */ + +const freezeMethods = (obj) => { + reduceDescriptors(obj, (descriptor, name) => { + // skip restricted props in strict mode + if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) { + return false; + } + + const value = obj[name]; + + if (!isFunction(value)) return; + + descriptor.enumerable = false; + + if ('writable' in descriptor) { + descriptor.writable = false; + return; + } + + if (!descriptor.set) { + descriptor.set = () => { + throw Error('Can not rewrite read-only method \'' + name + '\''); + }; + } + }); +}; + +const toObjectSet = (arrayOrString, delimiter) => { + const obj = {}; + + const define = (arr) => { + arr.forEach(value => { + obj[value] = true; + }); + }; + + isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter)); + + return obj; +}; + +const noop = () => {}; + +const toFiniteNumber = (value, defaultValue) => { + value = +value; + return Number.isFinite(value) ? value : defaultValue; +}; + +const ALPHA = 'abcdefghijklmnopqrstuvwxyz'; + +const DIGIT = '0123456789'; + +const ALPHABET = { + DIGIT, + ALPHA, + ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT +}; + +const generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => { + let str = ''; + const {length} = alphabet; + while (size--) { + str += alphabet[Math.random() * length|0]; + } + + return str; +}; + +/** + * If the thing is a FormData object, return true, otherwise return false. + * + * @param {unknown} thing - The thing to check. + * + * @returns {boolean} + */ +function isSpecCompliantForm(thing) { + return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]); +} + +const toJSONObject = (obj) => { + const stack = new Array(10); + + const visit = (source, i) => { + + if (isObject(source)) { + if (stack.indexOf(source) >= 0) { + return; + } + + if(!('toJSON' in source)) { + stack[i] = source; + const target = isArray(source) ? [] : {}; + + forEach(source, (value, key) => { + const reducedValue = visit(value, i + 1); + !isUndefined(reducedValue) && (target[key] = reducedValue); + }); + + stack[i] = undefined; + + return target; + } + } + + return source; + }; + + return visit(obj, 0); +}; + +const isAsyncFn = kindOfTest('AsyncFunction'); + +const isThenable = (thing) => + thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch); + +const utils$1 = { + isArray, + isArrayBuffer, + isBuffer, + isFormData, + isArrayBufferView, + isString, + isNumber, + isBoolean, + isObject, + isPlainObject, + isUndefined, + isDate, + isFile, + isBlob, + isRegExp, + isFunction, + isStream, + isURLSearchParams, + isTypedArray, + isFileList, + forEach, + merge, + extend, + trim, + stripBOM, + inherits, + toFlatObject, + kindOf, + kindOfTest, + endsWith, + toArray, + forEachEntry, + matchAll, + isHTMLForm, + hasOwnProperty, + hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection + reduceDescriptors, + freezeMethods, + toObjectSet, + toCamelCase, + noop, + toFiniteNumber, + findKey, + global: _global, + isContextDefined, + ALPHABET, + generateString, + isSpecCompliantForm, + toJSONObject, + isAsyncFn, + isThenable +}; + +/** + * Create an Error with the specified message, config, error code, request and response. + * + * @param {string} message The error message. + * @param {string} [code] The error code (for example, 'ECONNABORTED'). + * @param {Object} [config] The config. + * @param {Object} [request] The request. + * @param {Object} [response] The response. + * + * @returns {Error} The created error. + */ +function AxiosError(message, code, config, request, response) { + Error.call(this); + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } else { + this.stack = (new Error()).stack; + } + + this.message = message; + this.name = 'AxiosError'; + code && (this.code = code); + config && (this.config = config); + request && (this.request = request); + response && (this.response = response); +} + +utils$1.inherits(AxiosError, Error, { + toJSON: function toJSON() { + return { + // Standard + message: this.message, + name: this.name, + // Microsoft + description: this.description, + number: this.number, + // Mozilla + fileName: this.fileName, + lineNumber: this.lineNumber, + columnNumber: this.columnNumber, + stack: this.stack, + // Axios + config: utils$1.toJSONObject(this.config), + code: this.code, + status: this.response && this.response.status ? this.response.status : null + }; + } +}); + +const prototype$1 = AxiosError.prototype; +const descriptors = {}; + +[ + 'ERR_BAD_OPTION_VALUE', + 'ERR_BAD_OPTION', + 'ECONNABORTED', + 'ETIMEDOUT', + 'ERR_NETWORK', + 'ERR_FR_TOO_MANY_REDIRECTS', + 'ERR_DEPRECATED', + 'ERR_BAD_RESPONSE', + 'ERR_BAD_REQUEST', + 'ERR_CANCELED', + 'ERR_NOT_SUPPORT', + 'ERR_INVALID_URL' +// eslint-disable-next-line func-names +].forEach(code => { + descriptors[code] = {value: code}; +}); + +Object.defineProperties(AxiosError, descriptors); +Object.defineProperty(prototype$1, 'isAxiosError', {value: true}); + +// eslint-disable-next-line func-names +AxiosError.from = (error, code, config, request, response, customProps) => { + const axiosError = Object.create(prototype$1); + + utils$1.toFlatObject(error, axiosError, function filter(obj) { + return obj !== Error.prototype; + }, prop => { + return prop !== 'isAxiosError'; + }); + + AxiosError.call(axiosError, error.message, code, config, request, response); + + axiosError.cause = error; + + axiosError.name = error.name; + + customProps && Object.assign(axiosError, customProps); + + return axiosError; +}; + +/** + * Determines if the given thing is a array or js object. + * + * @param {string} thing - The object or array to be visited. + * + * @returns {boolean} + */ +function isVisitable(thing) { + return utils$1.isPlainObject(thing) || utils$1.isArray(thing); +} + +/** + * It removes the brackets from the end of a string + * + * @param {string} key - The key of the parameter. + * + * @returns {string} the key without the brackets. + */ +function removeBrackets(key) { + return utils$1.endsWith(key, '[]') ? key.slice(0, -2) : key; +} + +/** + * It takes a path, a key, and a boolean, and returns a string + * + * @param {string} path - The path to the current key. + * @param {string} key - The key of the current object being iterated over. + * @param {string} dots - If true, the key will be rendered with dots instead of brackets. + * + * @returns {string} The path to the current key. + */ +function renderKey(path, key, dots) { + if (!path) return key; + return path.concat(key).map(function each(token, i) { + // eslint-disable-next-line no-param-reassign + token = removeBrackets(token); + return !dots && i ? '[' + token + ']' : token; + }).join(dots ? '.' : ''); +} + +/** + * If the array is an array and none of its elements are visitable, then it's a flat array. + * + * @param {Array} arr - The array to check + * + * @returns {boolean} + */ +function isFlatArray(arr) { + return utils$1.isArray(arr) && !arr.some(isVisitable); +} + +const predicates = utils$1.toFlatObject(utils$1, {}, null, function filter(prop) { + return /^is[A-Z]/.test(prop); +}); + +/** + * Convert a data object to FormData + * + * @param {Object} obj + * @param {?Object} [formData] + * @param {?Object} [options] + * @param {Function} [options.visitor] + * @param {Boolean} [options.metaTokens = true] + * @param {Boolean} [options.dots = false] + * @param {?Boolean} [options.indexes = false] + * + * @returns {Object} + **/ + +/** + * It converts an object into a FormData object + * + * @param {Object} obj - The object to convert to form data. + * @param {string} formData - The FormData object to append to. + * @param {Object} options + * + * @returns + */ +function toFormData(obj, formData, options) { + if (!utils$1.isObject(obj)) { + throw new TypeError('target must be an object'); + } + + // eslint-disable-next-line no-param-reassign + formData = formData || new (FormData__default["default"] || FormData)(); + + // eslint-disable-next-line no-param-reassign + options = utils$1.toFlatObject(options, { + metaTokens: true, + dots: false, + indexes: false + }, false, function defined(option, source) { + // eslint-disable-next-line no-eq-null,eqeqeq + return !utils$1.isUndefined(source[option]); + }); + + const metaTokens = options.metaTokens; + // eslint-disable-next-line no-use-before-define + const visitor = options.visitor || defaultVisitor; + const dots = options.dots; + const indexes = options.indexes; + const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob; + const useBlob = _Blob && utils$1.isSpecCompliantForm(formData); + + if (!utils$1.isFunction(visitor)) { + throw new TypeError('visitor must be a function'); + } + + function convertValue(value) { + if (value === null) return ''; + + if (utils$1.isDate(value)) { + return value.toISOString(); + } + + if (!useBlob && utils$1.isBlob(value)) { + throw new AxiosError('Blob is not supported. Use a Buffer instead.'); + } + + if (utils$1.isArrayBuffer(value) || utils$1.isTypedArray(value)) { + return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value); + } + + return value; + } + + /** + * Default visitor. + * + * @param {*} value + * @param {String|Number} key + * @param {Array} path + * @this {FormData} + * + * @returns {boolean} return true to visit the each prop of the value recursively + */ + function defaultVisitor(value, key, path) { + let arr = value; + + if (value && !path && typeof value === 'object') { + if (utils$1.endsWith(key, '{}')) { + // eslint-disable-next-line no-param-reassign + key = metaTokens ? key : key.slice(0, -2); + // eslint-disable-next-line no-param-reassign + value = JSON.stringify(value); + } else if ( + (utils$1.isArray(value) && isFlatArray(value)) || + ((utils$1.isFileList(value) || utils$1.endsWith(key, '[]')) && (arr = utils$1.toArray(value)) + )) { + // eslint-disable-next-line no-param-reassign + key = removeBrackets(key); + + arr.forEach(function each(el, index) { + !(utils$1.isUndefined(el) || el === null) && formData.append( + // eslint-disable-next-line no-nested-ternary + indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'), + convertValue(el) + ); + }); + return false; + } + } + + if (isVisitable(value)) { + return true; + } + + formData.append(renderKey(path, key, dots), convertValue(value)); + + return false; + } + + const stack = []; + + const exposedHelpers = Object.assign(predicates, { + defaultVisitor, + convertValue, + isVisitable + }); + + function build(value, path) { + if (utils$1.isUndefined(value)) return; + + if (stack.indexOf(value) !== -1) { + throw Error('Circular reference detected in ' + path.join('.')); + } + + stack.push(value); + + utils$1.forEach(value, function each(el, key) { + const result = !(utils$1.isUndefined(el) || el === null) && visitor.call( + formData, el, utils$1.isString(key) ? key.trim() : key, path, exposedHelpers + ); + + if (result === true) { + build(el, path ? path.concat(key) : [key]); + } + }); + + stack.pop(); + } + + if (!utils$1.isObject(obj)) { + throw new TypeError('data must be an object'); + } + + build(obj); + + return formData; +} + +/** + * It encodes a string by replacing all characters that are not in the unreserved set with + * their percent-encoded equivalents + * + * @param {string} str - The string to encode. + * + * @returns {string} The encoded string. + */ +function encode$1(str) { + const charMap = { + '!': '%21', + "'": '%27', + '(': '%28', + ')': '%29', + '~': '%7E', + '%20': '+', + '%00': '\x00' + }; + return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) { + return charMap[match]; + }); +} + +/** + * It takes a params object and converts it to a FormData object + * + * @param {Object} params - The parameters to be converted to a FormData object. + * @param {Object} options - The options object passed to the Axios constructor. + * + * @returns {void} + */ +function AxiosURLSearchParams(params, options) { + this._pairs = []; + + params && toFormData(params, this, options); +} + +const prototype = AxiosURLSearchParams.prototype; + +prototype.append = function append(name, value) { + this._pairs.push([name, value]); +}; + +prototype.toString = function toString(encoder) { + const _encode = encoder ? function(value) { + return encoder.call(this, value, encode$1); + } : encode$1; + + return this._pairs.map(function each(pair) { + return _encode(pair[0]) + '=' + _encode(pair[1]); + }, '').join('&'); +}; + +/** + * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their + * URI encoded counterparts + * + * @param {string} val The value to be encoded. + * + * @returns {string} The encoded value. + */ +function encode(val) { + return encodeURIComponent(val). + replace(/%3A/gi, ':'). + replace(/%24/g, '$'). + replace(/%2C/gi, ','). + replace(/%20/g, '+'). + replace(/%5B/gi, '['). + replace(/%5D/gi, ']'); +} + +/** + * Build a URL by appending params to the end + * + * @param {string} url The base of the url (e.g., http://www.google.com) + * @param {object} [params] The params to be appended + * @param {?object} options + * + * @returns {string} The formatted url + */ +function buildURL(url, params, options) { + /*eslint no-param-reassign:0*/ + if (!params) { + return url; + } + + const _encode = options && options.encode || encode; + + const serializeFn = options && options.serialize; + + let serializedParams; + + if (serializeFn) { + serializedParams = serializeFn(params, options); + } else { + serializedParams = utils$1.isURLSearchParams(params) ? + params.toString() : + new AxiosURLSearchParams(params, options).toString(_encode); + } + + if (serializedParams) { + const hashmarkIndex = url.indexOf("#"); + + if (hashmarkIndex !== -1) { + url = url.slice(0, hashmarkIndex); + } + url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams; + } + + return url; +} + +class InterceptorManager { + constructor() { + this.handlers = []; + } + + /** + * Add a new interceptor to the stack + * + * @param {Function} fulfilled The function to handle `then` for a `Promise` + * @param {Function} rejected The function to handle `reject` for a `Promise` + * + * @return {Number} An ID used to remove interceptor later + */ + use(fulfilled, rejected, options) { + this.handlers.push({ + fulfilled, + rejected, + synchronous: options ? options.synchronous : false, + runWhen: options ? options.runWhen : null + }); + return this.handlers.length - 1; + } + + /** + * Remove an interceptor from the stack + * + * @param {Number} id The ID that was returned by `use` + * + * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise + */ + eject(id) { + if (this.handlers[id]) { + this.handlers[id] = null; + } + } + + /** + * Clear all interceptors from the stack + * + * @returns {void} + */ + clear() { + if (this.handlers) { + this.handlers = []; + } + } + + /** + * Iterate over all the registered interceptors + * + * This method is particularly useful for skipping over any + * interceptors that may have become `null` calling `eject`. + * + * @param {Function} fn The function to call for each interceptor + * + * @returns {void} + */ + forEach(fn) { + utils$1.forEach(this.handlers, function forEachHandler(h) { + if (h !== null) { + fn(h); + } + }); + } +} + +const InterceptorManager$1 = InterceptorManager; + +const transitionalDefaults = { + silentJSONParsing: true, + forcedJSONParsing: true, + clarifyTimeoutError: false +}; + +const URLSearchParams = url__default["default"].URLSearchParams; + +const platform$1 = { + isNode: true, + classes: { + URLSearchParams, + FormData: FormData__default["default"], + Blob: typeof Blob !== 'undefined' && Blob || null + }, + protocols: [ 'http', 'https', 'file', 'data' ] +}; + +const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined'; + +/** + * Determine if we're running in a standard browser environment + * + * This allows axios to run in a web worker, and react-native. + * Both environments support XMLHttpRequest, but not fully standard globals. + * + * web workers: + * typeof window -> undefined + * typeof document -> undefined + * + * react-native: + * navigator.product -> 'ReactNative' + * nativescript + * navigator.product -> 'NativeScript' or 'NS' + * + * @returns {boolean} + */ +const hasStandardBrowserEnv = ( + (product) => { + return hasBrowserEnv && ['ReactNative', 'NativeScript', 'NS'].indexOf(product) < 0 + })(typeof navigator !== 'undefined' && navigator.product); + +/** + * Determine if we're running in a standard browser webWorker environment + * + * Although the `isStandardBrowserEnv` method indicates that + * `allows axios to run in a web worker`, the WebWorker will still be + * filtered out due to its judgment standard + * `typeof window !== 'undefined' && typeof document !== 'undefined'`. + * This leads to a problem when axios post `FormData` in webWorker + */ +const hasStandardBrowserWebWorkerEnv = (() => { + return ( + typeof WorkerGlobalScope !== 'undefined' && + // eslint-disable-next-line no-undef + self instanceof WorkerGlobalScope && + typeof self.importScripts === 'function' + ); +})(); + +const utils = /*#__PURE__*/Object.freeze({ + __proto__: null, + hasBrowserEnv: hasBrowserEnv, + hasStandardBrowserWebWorkerEnv: hasStandardBrowserWebWorkerEnv, + hasStandardBrowserEnv: hasStandardBrowserEnv +}); + +const platform = { + ...utils, + ...platform$1 +}; + +function toURLEncodedForm(data, options) { + return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({ + visitor: function(value, key, path, helpers) { + if (platform.isNode && utils$1.isBuffer(value)) { + this.append(key, value.toString('base64')); + return false; + } + + return helpers.defaultVisitor.apply(this, arguments); + } + }, options)); +} + +/** + * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z'] + * + * @param {string} name - The name of the property to get. + * + * @returns An array of strings. + */ +function parsePropPath(name) { + // foo[x][y][z] + // foo.x.y.z + // foo-x-y-z + // foo x y z + return utils$1.matchAll(/\w+|\[(\w*)]/g, name).map(match => { + return match[0] === '[]' ? '' : match[1] || match[0]; + }); +} + +/** + * Convert an array to an object. + * + * @param {Array} arr - The array to convert to an object. + * + * @returns An object with the same keys and values as the array. + */ +function arrayToObject(arr) { + const obj = {}; + const keys = Object.keys(arr); + let i; + const len = keys.length; + let key; + for (i = 0; i < len; i++) { + key = keys[i]; + obj[key] = arr[key]; + } + return obj; +} + +/** + * It takes a FormData object and returns a JavaScript object + * + * @param {string} formData The FormData object to convert to JSON. + * + * @returns {Object | null} The converted object. + */ +function formDataToJSON(formData) { + function buildPath(path, value, target, index) { + let name = path[index++]; + + if (name === '__proto__') return true; + + const isNumericKey = Number.isFinite(+name); + const isLast = index >= path.length; + name = !name && utils$1.isArray(target) ? target.length : name; + + if (isLast) { + if (utils$1.hasOwnProp(target, name)) { + target[name] = [target[name], value]; + } else { + target[name] = value; + } + + return !isNumericKey; + } + + if (!target[name] || !utils$1.isObject(target[name])) { + target[name] = []; + } + + const result = buildPath(path, value, target[name], index); + + if (result && utils$1.isArray(target[name])) { + target[name] = arrayToObject(target[name]); + } + + return !isNumericKey; + } + + if (utils$1.isFormData(formData) && utils$1.isFunction(formData.entries)) { + const obj = {}; + + utils$1.forEachEntry(formData, (name, value) => { + buildPath(parsePropPath(name), value, obj, 0); + }); + + return obj; + } + + return null; +} + +/** + * It takes a string, tries to parse it, and if it fails, it returns the stringified version + * of the input + * + * @param {any} rawValue - The value to be stringified. + * @param {Function} parser - A function that parses a string into a JavaScript object. + * @param {Function} encoder - A function that takes a value and returns a string. + * + * @returns {string} A stringified version of the rawValue. + */ +function stringifySafely(rawValue, parser, encoder) { + if (utils$1.isString(rawValue)) { + try { + (parser || JSON.parse)(rawValue); + return utils$1.trim(rawValue); + } catch (e) { + if (e.name !== 'SyntaxError') { + throw e; + } + } + } + + return (encoder || JSON.stringify)(rawValue); +} + +const defaults = { + + transitional: transitionalDefaults, + + adapter: ['xhr', 'http'], + + transformRequest: [function transformRequest(data, headers) { + const contentType = headers.getContentType() || ''; + const hasJSONContentType = contentType.indexOf('application/json') > -1; + const isObjectPayload = utils$1.isObject(data); + + if (isObjectPayload && utils$1.isHTMLForm(data)) { + data = new FormData(data); + } + + const isFormData = utils$1.isFormData(data); + + if (isFormData) { + if (!hasJSONContentType) { + return data; + } + return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data; + } + + if (utils$1.isArrayBuffer(data) || + utils$1.isBuffer(data) || + utils$1.isStream(data) || + utils$1.isFile(data) || + utils$1.isBlob(data) + ) { + return data; + } + if (utils$1.isArrayBufferView(data)) { + return data.buffer; + } + if (utils$1.isURLSearchParams(data)) { + headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false); + return data.toString(); + } + + let isFileList; + + if (isObjectPayload) { + if (contentType.indexOf('application/x-www-form-urlencoded') > -1) { + return toURLEncodedForm(data, this.formSerializer).toString(); + } + + if ((isFileList = utils$1.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) { + const _FormData = this.env && this.env.FormData; + + return toFormData( + isFileList ? {'files[]': data} : data, + _FormData && new _FormData(), + this.formSerializer + ); + } + } + + if (isObjectPayload || hasJSONContentType ) { + headers.setContentType('application/json', false); + return stringifySafely(data); + } + + return data; + }], + + transformResponse: [function transformResponse(data) { + const transitional = this.transitional || defaults.transitional; + const forcedJSONParsing = transitional && transitional.forcedJSONParsing; + const JSONRequested = this.responseType === 'json'; + + if (data && utils$1.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) { + const silentJSONParsing = transitional && transitional.silentJSONParsing; + const strictJSONParsing = !silentJSONParsing && JSONRequested; + + try { + return JSON.parse(data); + } catch (e) { + if (strictJSONParsing) { + if (e.name === 'SyntaxError') { + throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response); + } + throw e; + } + } + } + + return data; + }], + + /** + * A timeout in milliseconds to abort a request. If set to 0 (default) a + * timeout is not created. + */ + timeout: 0, + + xsrfCookieName: 'XSRF-TOKEN', + xsrfHeaderName: 'X-XSRF-TOKEN', + + maxContentLength: -1, + maxBodyLength: -1, + + env: { + FormData: platform.classes.FormData, + Blob: platform.classes.Blob + }, + + validateStatus: function validateStatus(status) { + return status >= 200 && status < 300; + }, + + headers: { + common: { + 'Accept': 'application/json, text/plain, */*', + 'Content-Type': undefined + } + } +}; + +utils$1.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => { + defaults.headers[method] = {}; +}); + +const defaults$1 = defaults; + +// RawAxiosHeaders whose duplicates are ignored by node +// c.f. https://nodejs.org/api/http.html#http_message_headers +const ignoreDuplicateOf = utils$1.toObjectSet([ + 'age', 'authorization', 'content-length', 'content-type', 'etag', + 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', + 'last-modified', 'location', 'max-forwards', 'proxy-authorization', + 'referer', 'retry-after', 'user-agent' +]); + +/** + * Parse headers into an object + * + * ``` + * Date: Wed, 27 Aug 2014 08:58:49 GMT + * Content-Type: application/json + * Connection: keep-alive + * Transfer-Encoding: chunked + * ``` + * + * @param {String} rawHeaders Headers needing to be parsed + * + * @returns {Object} Headers parsed into an object + */ +const parseHeaders = rawHeaders => { + const parsed = {}; + let key; + let val; + let i; + + rawHeaders && rawHeaders.split('\n').forEach(function parser(line) { + i = line.indexOf(':'); + key = line.substring(0, i).trim().toLowerCase(); + val = line.substring(i + 1).trim(); + + if (!key || (parsed[key] && ignoreDuplicateOf[key])) { + return; + } + + if (key === 'set-cookie') { + if (parsed[key]) { + parsed[key].push(val); + } else { + parsed[key] = [val]; + } + } else { + parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; + } + }); + + return parsed; +}; + +const $internals = Symbol('internals'); + +function normalizeHeader(header) { + return header && String(header).trim().toLowerCase(); +} + +function normalizeValue(value) { + if (value === false || value == null) { + return value; + } + + return utils$1.isArray(value) ? value.map(normalizeValue) : String(value); +} + +function parseTokens(str) { + const tokens = Object.create(null); + const tokensRE = /([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g; + let match; + + while ((match = tokensRE.exec(str))) { + tokens[match[1]] = match[2]; + } + + return tokens; +} + +const isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim()); + +function matchHeaderValue(context, value, header, filter, isHeaderNameFilter) { + if (utils$1.isFunction(filter)) { + return filter.call(this, value, header); + } + + if (isHeaderNameFilter) { + value = header; + } + + if (!utils$1.isString(value)) return; + + if (utils$1.isString(filter)) { + return value.indexOf(filter) !== -1; + } + + if (utils$1.isRegExp(filter)) { + return filter.test(value); + } +} + +function formatHeader(header) { + return header.trim() + .toLowerCase().replace(/([a-z\d])(\w*)/g, (w, char, str) => { + return char.toUpperCase() + str; + }); +} + +function buildAccessors(obj, header) { + const accessorName = utils$1.toCamelCase(' ' + header); + + ['get', 'set', 'has'].forEach(methodName => { + Object.defineProperty(obj, methodName + accessorName, { + value: function(arg1, arg2, arg3) { + return this[methodName].call(this, header, arg1, arg2, arg3); + }, + configurable: true + }); + }); +} + +class AxiosHeaders { + constructor(headers) { + headers && this.set(headers); + } + + set(header, valueOrRewrite, rewrite) { + const self = this; + + function setHeader(_value, _header, _rewrite) { + const lHeader = normalizeHeader(_header); + + if (!lHeader) { + throw new Error('header name must be a non-empty string'); + } + + const key = utils$1.findKey(self, lHeader); + + if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) { + self[key || _header] = normalizeValue(_value); + } + } + + const setHeaders = (headers, _rewrite) => + utils$1.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite)); + + if (utils$1.isPlainObject(header) || header instanceof this.constructor) { + setHeaders(header, valueOrRewrite); + } else if(utils$1.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) { + setHeaders(parseHeaders(header), valueOrRewrite); + } else { + header != null && setHeader(valueOrRewrite, header, rewrite); + } + + return this; + } + + get(header, parser) { + header = normalizeHeader(header); + + if (header) { + const key = utils$1.findKey(this, header); + + if (key) { + const value = this[key]; + + if (!parser) { + return value; + } + + if (parser === true) { + return parseTokens(value); + } + + if (utils$1.isFunction(parser)) { + return parser.call(this, value, key); + } + + if (utils$1.isRegExp(parser)) { + return parser.exec(value); + } + + throw new TypeError('parser must be boolean|regexp|function'); + } + } + } + + has(header, matcher) { + header = normalizeHeader(header); + + if (header) { + const key = utils$1.findKey(this, header); + + return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher))); + } + + return false; + } + + delete(header, matcher) { + const self = this; + let deleted = false; + + function deleteHeader(_header) { + _header = normalizeHeader(_header); + + if (_header) { + const key = utils$1.findKey(self, _header); + + if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) { + delete self[key]; + + deleted = true; + } + } + } + + if (utils$1.isArray(header)) { + header.forEach(deleteHeader); + } else { + deleteHeader(header); + } + + return deleted; + } + + clear(matcher) { + const keys = Object.keys(this); + let i = keys.length; + let deleted = false; + + while (i--) { + const key = keys[i]; + if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) { + delete this[key]; + deleted = true; + } + } + + return deleted; + } + + normalize(format) { + const self = this; + const headers = {}; + + utils$1.forEach(this, (value, header) => { + const key = utils$1.findKey(headers, header); + + if (key) { + self[key] = normalizeValue(value); + delete self[header]; + return; + } + + const normalized = format ? formatHeader(header) : String(header).trim(); + + if (normalized !== header) { + delete self[header]; + } + + self[normalized] = normalizeValue(value); + + headers[normalized] = true; + }); + + return this; + } + + concat(...targets) { + return this.constructor.concat(this, ...targets); + } + + toJSON(asStrings) { + const obj = Object.create(null); + + utils$1.forEach(this, (value, header) => { + value != null && value !== false && (obj[header] = asStrings && utils$1.isArray(value) ? value.join(', ') : value); + }); + + return obj; + } + + [Symbol.iterator]() { + return Object.entries(this.toJSON())[Symbol.iterator](); + } + + toString() { + return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\n'); + } + + get [Symbol.toStringTag]() { + return 'AxiosHeaders'; + } + + static from(thing) { + return thing instanceof this ? thing : new this(thing); + } + + static concat(first, ...targets) { + const computed = new this(first); + + targets.forEach((target) => computed.set(target)); + + return computed; + } + + static accessor(header) { + const internals = this[$internals] = (this[$internals] = { + accessors: {} + }); + + const accessors = internals.accessors; + const prototype = this.prototype; + + function defineAccessor(_header) { + const lHeader = normalizeHeader(_header); + + if (!accessors[lHeader]) { + buildAccessors(prototype, _header); + accessors[lHeader] = true; + } + } + + utils$1.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header); + + return this; + } +} + +AxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']); + +// reserved names hotfix +utils$1.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => { + let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set` + return { + get: () => value, + set(headerValue) { + this[mapped] = headerValue; + } + } +}); + +utils$1.freezeMethods(AxiosHeaders); + +const AxiosHeaders$1 = AxiosHeaders; + +/** + * Transform the data for a request or a response + * + * @param {Array|Function} fns A single function or Array of functions + * @param {?Object} response The response object + * + * @returns {*} The resulting transformed data + */ +function transformData(fns, response) { + const config = this || defaults$1; + const context = response || config; + const headers = AxiosHeaders$1.from(context.headers); + let data = context.data; + + utils$1.forEach(fns, function transform(fn) { + data = fn.call(config, data, headers.normalize(), response ? response.status : undefined); + }); + + headers.normalize(); + + return data; +} + +function isCancel(value) { + return !!(value && value.__CANCEL__); +} + +/** + * A `CanceledError` is an object that is thrown when an operation is canceled. + * + * @param {string=} message The message. + * @param {Object=} config The config. + * @param {Object=} request The request. + * + * @returns {CanceledError} The created error. + */ +function CanceledError(message, config, request) { + // eslint-disable-next-line no-eq-null,eqeqeq + AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request); + this.name = 'CanceledError'; +} + +utils$1.inherits(CanceledError, AxiosError, { + __CANCEL__: true +}); + +/** + * Resolve or reject a Promise based on response status. + * + * @param {Function} resolve A function that resolves the promise. + * @param {Function} reject A function that rejects the promise. + * @param {object} response The response. + * + * @returns {object} The response. + */ +function settle(resolve, reject, response) { + const validateStatus = response.config.validateStatus; + if (!response.status || !validateStatus || validateStatus(response.status)) { + resolve(response); + } else { + reject(new AxiosError( + 'Request failed with status code ' + response.status, + [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4], + response.config, + response.request, + response + )); + } +} + +/** + * Determines whether the specified URL is absolute + * + * @param {string} url The URL to test + * + * @returns {boolean} True if the specified URL is absolute, otherwise false + */ +function isAbsoluteURL(url) { + // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL). + // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed + // by any combination of letters, digits, plus, period, or hyphen. + return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url); +} + +/** + * Creates a new URL by combining the specified URLs + * + * @param {string} baseURL The base URL + * @param {string} relativeURL The relative URL + * + * @returns {string} The combined URL + */ +function combineURLs(baseURL, relativeURL) { + return relativeURL + ? baseURL.replace(/\/?\/$/, '') + '/' + relativeURL.replace(/^\/+/, '') + : baseURL; +} + +/** + * Creates a new URL by combining the baseURL with the requestedURL, + * only when the requestedURL is not already an absolute URL. + * If the requestURL is absolute, this function returns the requestedURL untouched. + * + * @param {string} baseURL The base URL + * @param {string} requestedURL Absolute or relative URL to combine + * + * @returns {string} The combined full path + */ +function buildFullPath(baseURL, requestedURL) { + if (baseURL && !isAbsoluteURL(requestedURL)) { + return combineURLs(baseURL, requestedURL); + } + return requestedURL; +} + +const VERSION = "1.6.4"; + +function parseProtocol(url) { + const match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url); + return match && match[1] || ''; +} + +const DATA_URL_PATTERN = /^(?:([^;]+);)?(?:[^;]+;)?(base64|),([\s\S]*)$/; + +/** + * Parse data uri to a Buffer or Blob + * + * @param {String} uri + * @param {?Boolean} asBlob + * @param {?Object} options + * @param {?Function} options.Blob + * + * @returns {Buffer|Blob} + */ +function fromDataURI(uri, asBlob, options) { + const _Blob = options && options.Blob || platform.classes.Blob; + const protocol = parseProtocol(uri); + + if (asBlob === undefined && _Blob) { + asBlob = true; + } + + if (protocol === 'data') { + uri = protocol.length ? uri.slice(protocol.length + 1) : uri; + + const match = DATA_URL_PATTERN.exec(uri); + + if (!match) { + throw new AxiosError('Invalid URL', AxiosError.ERR_INVALID_URL); + } + + const mime = match[1]; + const isBase64 = match[2]; + const body = match[3]; + const buffer = Buffer.from(decodeURIComponent(body), isBase64 ? 'base64' : 'utf8'); + + if (asBlob) { + if (!_Blob) { + throw new AxiosError('Blob is not supported', AxiosError.ERR_NOT_SUPPORT); + } + + return new _Blob([buffer], {type: mime}); + } + + return buffer; + } + + throw new AxiosError('Unsupported protocol ' + protocol, AxiosError.ERR_NOT_SUPPORT); +} + +/** + * Throttle decorator + * @param {Function} fn + * @param {Number} freq + * @return {Function} + */ +function throttle(fn, freq) { + let timestamp = 0; + const threshold = 1000 / freq; + let timer = null; + return function throttled(force, args) { + const now = Date.now(); + if (force || now - timestamp > threshold) { + if (timer) { + clearTimeout(timer); + timer = null; + } + timestamp = now; + return fn.apply(null, args); + } + if (!timer) { + timer = setTimeout(() => { + timer = null; + timestamp = Date.now(); + return fn.apply(null, args); + }, threshold - (now - timestamp)); + } + }; +} + +/** + * Calculate data maxRate + * @param {Number} [samplesCount= 10] + * @param {Number} [min= 1000] + * @returns {Function} + */ +function speedometer(samplesCount, min) { + samplesCount = samplesCount || 10; + const bytes = new Array(samplesCount); + const timestamps = new Array(samplesCount); + let head = 0; + let tail = 0; + let firstSampleTS; + + min = min !== undefined ? min : 1000; + + return function push(chunkLength) { + const now = Date.now(); + + const startedAt = timestamps[tail]; + + if (!firstSampleTS) { + firstSampleTS = now; + } + + bytes[head] = chunkLength; + timestamps[head] = now; + + let i = tail; + let bytesCount = 0; + + while (i !== head) { + bytesCount += bytes[i++]; + i = i % samplesCount; + } + + head = (head + 1) % samplesCount; + + if (head === tail) { + tail = (tail + 1) % samplesCount; + } + + if (now - firstSampleTS < min) { + return; + } + + const passed = startedAt && now - startedAt; + + return passed ? Math.round(bytesCount * 1000 / passed) : undefined; + }; +} + +const kInternals = Symbol('internals'); + +class AxiosTransformStream extends stream__default["default"].Transform{ + constructor(options) { + options = utils$1.toFlatObject(options, { + maxRate: 0, + chunkSize: 64 * 1024, + minChunkSize: 100, + timeWindow: 500, + ticksRate: 2, + samplesCount: 15 + }, null, (prop, source) => { + return !utils$1.isUndefined(source[prop]); + }); + + super({ + readableHighWaterMark: options.chunkSize + }); + + const self = this; + + const internals = this[kInternals] = { + length: options.length, + timeWindow: options.timeWindow, + ticksRate: options.ticksRate, + chunkSize: options.chunkSize, + maxRate: options.maxRate, + minChunkSize: options.minChunkSize, + bytesSeen: 0, + isCaptured: false, + notifiedBytesLoaded: 0, + ts: Date.now(), + bytes: 0, + onReadCallback: null + }; + + const _speedometer = speedometer(internals.ticksRate * options.samplesCount, internals.timeWindow); + + this.on('newListener', event => { + if (event === 'progress') { + if (!internals.isCaptured) { + internals.isCaptured = true; + } + } + }); + + let bytesNotified = 0; + + internals.updateProgress = throttle(function throttledHandler() { + const totalBytes = internals.length; + const bytesTransferred = internals.bytesSeen; + const progressBytes = bytesTransferred - bytesNotified; + if (!progressBytes || self.destroyed) return; + + const rate = _speedometer(progressBytes); + + bytesNotified = bytesTransferred; + + process.nextTick(() => { + self.emit('progress', { + 'loaded': bytesTransferred, + 'total': totalBytes, + 'progress': totalBytes ? (bytesTransferred / totalBytes) : undefined, + 'bytes': progressBytes, + 'rate': rate ? rate : undefined, + 'estimated': rate && totalBytes && bytesTransferred <= totalBytes ? + (totalBytes - bytesTransferred) / rate : undefined + }); + }); + }, internals.ticksRate); + + const onFinish = () => { + internals.updateProgress(true); + }; + + this.once('end', onFinish); + this.once('error', onFinish); + } + + _read(size) { + const internals = this[kInternals]; + + if (internals.onReadCallback) { + internals.onReadCallback(); + } + + return super._read(size); + } + + _transform(chunk, encoding, callback) { + const self = this; + const internals = this[kInternals]; + const maxRate = internals.maxRate; + + const readableHighWaterMark = this.readableHighWaterMark; + + const timeWindow = internals.timeWindow; + + const divider = 1000 / timeWindow; + const bytesThreshold = (maxRate / divider); + const minChunkSize = internals.minChunkSize !== false ? Math.max(internals.minChunkSize, bytesThreshold * 0.01) : 0; + + function pushChunk(_chunk, _callback) { + const bytes = Buffer.byteLength(_chunk); + internals.bytesSeen += bytes; + internals.bytes += bytes; + + if (internals.isCaptured) { + internals.updateProgress(); + } + + if (self.push(_chunk)) { + process.nextTick(_callback); + } else { + internals.onReadCallback = () => { + internals.onReadCallback = null; + process.nextTick(_callback); + }; + } + } + + const transformChunk = (_chunk, _callback) => { + const chunkSize = Buffer.byteLength(_chunk); + let chunkRemainder = null; + let maxChunkSize = readableHighWaterMark; + let bytesLeft; + let passed = 0; + + if (maxRate) { + const now = Date.now(); + + if (!internals.ts || (passed = (now - internals.ts)) >= timeWindow) { + internals.ts = now; + bytesLeft = bytesThreshold - internals.bytes; + internals.bytes = bytesLeft < 0 ? -bytesLeft : 0; + passed = 0; + } + + bytesLeft = bytesThreshold - internals.bytes; + } + + if (maxRate) { + if (bytesLeft <= 0) { + // next time window + return setTimeout(() => { + _callback(null, _chunk); + }, timeWindow - passed); + } + + if (bytesLeft < maxChunkSize) { + maxChunkSize = bytesLeft; + } + } + + if (maxChunkSize && chunkSize > maxChunkSize && (chunkSize - maxChunkSize) > minChunkSize) { + chunkRemainder = _chunk.subarray(maxChunkSize); + _chunk = _chunk.subarray(0, maxChunkSize); + } + + pushChunk(_chunk, chunkRemainder ? () => { + process.nextTick(_callback, null, chunkRemainder); + } : _callback); + }; + + transformChunk(chunk, function transformNextChunk(err, _chunk) { + if (err) { + return callback(err); + } + + if (_chunk) { + transformChunk(_chunk, transformNextChunk); + } else { + callback(null); + } + }); + } + + setLength(length) { + this[kInternals].length = +length; + return this; + } +} + +const AxiosTransformStream$1 = AxiosTransformStream; + +const {asyncIterator} = Symbol; + +const readBlob = async function* (blob) { + if (blob.stream) { + yield* blob.stream(); + } else if (blob.arrayBuffer) { + yield await blob.arrayBuffer(); + } else if (blob[asyncIterator]) { + yield* blob[asyncIterator](); + } else { + yield blob; + } +}; + +const readBlob$1 = readBlob; + +const BOUNDARY_ALPHABET = utils$1.ALPHABET.ALPHA_DIGIT + '-_'; + +const textEncoder = new util.TextEncoder(); + +const CRLF = '\r\n'; +const CRLF_BYTES = textEncoder.encode(CRLF); +const CRLF_BYTES_COUNT = 2; + +class FormDataPart { + constructor(name, value) { + const {escapeName} = this.constructor; + const isStringValue = utils$1.isString(value); + + let headers = `Content-Disposition: form-data; name="${escapeName(name)}"${ + !isStringValue && value.name ? `; filename="${escapeName(value.name)}"` : '' + }${CRLF}`; + + if (isStringValue) { + value = textEncoder.encode(String(value).replace(/\r?\n|\r\n?/g, CRLF)); + } else { + headers += `Content-Type: ${value.type || "application/octet-stream"}${CRLF}`; + } + + this.headers = textEncoder.encode(headers + CRLF); + + this.contentLength = isStringValue ? value.byteLength : value.size; + + this.size = this.headers.byteLength + this.contentLength + CRLF_BYTES_COUNT; + + this.name = name; + this.value = value; + } + + async *encode(){ + yield this.headers; + + const {value} = this; + + if(utils$1.isTypedArray(value)) { + yield value; + } else { + yield* readBlob$1(value); + } + + yield CRLF_BYTES; + } + + static escapeName(name) { + return String(name).replace(/[\r\n"]/g, (match) => ({ + '\r' : '%0D', + '\n' : '%0A', + '"' : '%22', + }[match])); + } +} + +const formDataToStream = (form, headersHandler, options) => { + const { + tag = 'form-data-boundary', + size = 25, + boundary = tag + '-' + utils$1.generateString(size, BOUNDARY_ALPHABET) + } = options || {}; + + if(!utils$1.isFormData(form)) { + throw TypeError('FormData instance required'); + } + + if (boundary.length < 1 || boundary.length > 70) { + throw Error('boundary must be 10-70 characters long') + } + + const boundaryBytes = textEncoder.encode('--' + boundary + CRLF); + const footerBytes = textEncoder.encode('--' + boundary + '--' + CRLF + CRLF); + let contentLength = footerBytes.byteLength; + + const parts = Array.from(form.entries()).map(([name, value]) => { + const part = new FormDataPart(name, value); + contentLength += part.size; + return part; + }); + + contentLength += boundaryBytes.byteLength * parts.length; + + contentLength = utils$1.toFiniteNumber(contentLength); + + const computedHeaders = { + 'Content-Type': `multipart/form-data; boundary=${boundary}` + }; + + if (Number.isFinite(contentLength)) { + computedHeaders['Content-Length'] = contentLength; + } + + headersHandler && headersHandler(computedHeaders); + + return stream.Readable.from((async function *() { + for(const part of parts) { + yield boundaryBytes; + yield* part.encode(); + } + + yield footerBytes; + })()); +}; + +const formDataToStream$1 = formDataToStream; + +class ZlibHeaderTransformStream extends stream__default["default"].Transform { + __transform(chunk, encoding, callback) { + this.push(chunk); + callback(); + } + + _transform(chunk, encoding, callback) { + if (chunk.length !== 0) { + this._transform = this.__transform; + + // Add Default Compression headers if no zlib headers are present + if (chunk[0] !== 120) { // Hex: 78 + const header = Buffer.alloc(2); + header[0] = 120; // Hex: 78 + header[1] = 156; // Hex: 9C + this.push(header, encoding); + } + } + + this.__transform(chunk, encoding, callback); + } +} + +const ZlibHeaderTransformStream$1 = ZlibHeaderTransformStream; + +const callbackify = (fn, reducer) => { + return utils$1.isAsyncFn(fn) ? function (...args) { + const cb = args.pop(); + fn.apply(this, args).then((value) => { + try { + reducer ? cb(null, ...reducer(value)) : cb(null, value); + } catch (err) { + cb(err); + } + }, cb); + } : fn; +}; + +const callbackify$1 = callbackify; + +const zlibOptions = { + flush: zlib__default["default"].constants.Z_SYNC_FLUSH, + finishFlush: zlib__default["default"].constants.Z_SYNC_FLUSH +}; + +const brotliOptions = { + flush: zlib__default["default"].constants.BROTLI_OPERATION_FLUSH, + finishFlush: zlib__default["default"].constants.BROTLI_OPERATION_FLUSH +}; + +const isBrotliSupported = utils$1.isFunction(zlib__default["default"].createBrotliDecompress); + +const {http: httpFollow, https: httpsFollow} = followRedirects__default["default"]; + +const isHttps = /https:?/; + +const supportedProtocols = platform.protocols.map(protocol => { + return protocol + ':'; +}); + +/** + * If the proxy or config beforeRedirects functions are defined, call them with the options + * object. + * + * @param {Object} options - The options object that was passed to the request. + * + * @returns {Object} + */ +function dispatchBeforeRedirect(options) { + if (options.beforeRedirects.proxy) { + options.beforeRedirects.proxy(options); + } + if (options.beforeRedirects.config) { + options.beforeRedirects.config(options); + } +} + +/** + * If the proxy or config afterRedirects functions are defined, call them with the options + * + * @param {http.ClientRequestArgs} options + * @param {AxiosProxyConfig} configProxy configuration from Axios options object + * @param {string} location + * + * @returns {http.ClientRequestArgs} + */ +function setProxy(options, configProxy, location) { + let proxy = configProxy; + if (!proxy && proxy !== false) { + const proxyUrl = proxyFromEnv.getProxyForUrl(location); + if (proxyUrl) { + proxy = new URL(proxyUrl); + } + } + if (proxy) { + // Basic proxy authorization + if (proxy.username) { + proxy.auth = (proxy.username || '') + ':' + (proxy.password || ''); + } + + if (proxy.auth) { + // Support proxy auth object form + if (proxy.auth.username || proxy.auth.password) { + proxy.auth = (proxy.auth.username || '') + ':' + (proxy.auth.password || ''); + } + const base64 = Buffer + .from(proxy.auth, 'utf8') + .toString('base64'); + options.headers['Proxy-Authorization'] = 'Basic ' + base64; + } + + options.headers.host = options.hostname + (options.port ? ':' + options.port : ''); + const proxyHost = proxy.hostname || proxy.host; + options.hostname = proxyHost; + // Replace 'host' since options is not a URL object + options.host = proxyHost; + options.port = proxy.port; + options.path = location; + if (proxy.protocol) { + options.protocol = proxy.protocol.includes(':') ? proxy.protocol : `${proxy.protocol}:`; + } + } + + options.beforeRedirects.proxy = function beforeRedirect(redirectOptions) { + // Configure proxy for redirected request, passing the original config proxy to apply + // the exact same logic as if the redirected request was performed by axios directly. + setProxy(redirectOptions, configProxy, redirectOptions.href); + }; +} + +const isHttpAdapterSupported = typeof process !== 'undefined' && utils$1.kindOf(process) === 'process'; + +// temporary hotfix + +const wrapAsync = (asyncExecutor) => { + return new Promise((resolve, reject) => { + let onDone; + let isDone; + + const done = (value, isRejected) => { + if (isDone) return; + isDone = true; + onDone && onDone(value, isRejected); + }; + + const _resolve = (value) => { + done(value); + resolve(value); + }; + + const _reject = (reason) => { + done(reason, true); + reject(reason); + }; + + asyncExecutor(_resolve, _reject, (onDoneHandler) => (onDone = onDoneHandler)).catch(_reject); + }) +}; + +const resolveFamily = ({address, family}) => { + if (!utils$1.isString(address)) { + throw TypeError('address must be a string'); + } + return ({ + address, + family: family || (address.indexOf('.') < 0 ? 6 : 4) + }); +}; + +const buildAddressEntry = (address, family) => resolveFamily(utils$1.isObject(address) ? address : {address, family}); + +/*eslint consistent-return:0*/ +const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { + return wrapAsync(async function dispatchHttpRequest(resolve, reject, onDone) { + let {data, lookup, family} = config; + const {responseType, responseEncoding} = config; + const method = config.method.toUpperCase(); + let isDone; + let rejected = false; + let req; + + if (lookup) { + const _lookup = callbackify$1(lookup, (value) => utils$1.isArray(value) ? value : [value]); + // hotfix to support opt.all option which is required for node 20.x + lookup = (hostname, opt, cb) => { + _lookup(hostname, opt, (err, arg0, arg1) => { + const addresses = utils$1.isArray(arg0) ? arg0.map(addr => buildAddressEntry(addr)) : [buildAddressEntry(arg0, arg1)]; + + opt.all ? cb(err, addresses) : cb(err, addresses[0].address, addresses[0].family); + }); + }; + } + + // temporary internal emitter until the AxiosRequest class will be implemented + const emitter = new EventEmitter__default["default"](); + + const onFinished = () => { + if (config.cancelToken) { + config.cancelToken.unsubscribe(abort); + } + + if (config.signal) { + config.signal.removeEventListener('abort', abort); + } + + emitter.removeAllListeners(); + }; + + onDone((value, isRejected) => { + isDone = true; + if (isRejected) { + rejected = true; + onFinished(); + } + }); + + function abort(reason) { + emitter.emit('abort', !reason || reason.type ? new CanceledError(null, config, req) : reason); + } + + emitter.once('abort', reject); + + if (config.cancelToken || config.signal) { + config.cancelToken && config.cancelToken.subscribe(abort); + if (config.signal) { + config.signal.aborted ? abort() : config.signal.addEventListener('abort', abort); + } + } + + // Parse url + const fullPath = buildFullPath(config.baseURL, config.url); + const parsed = new URL(fullPath, 'http://localhost'); + const protocol = parsed.protocol || supportedProtocols[0]; + + if (protocol === 'data:') { + let convertedData; + + if (method !== 'GET') { + return settle(resolve, reject, { + status: 405, + statusText: 'method not allowed', + headers: {}, + config + }); + } + + try { + convertedData = fromDataURI(config.url, responseType === 'blob', { + Blob: config.env && config.env.Blob + }); + } catch (err) { + throw AxiosError.from(err, AxiosError.ERR_BAD_REQUEST, config); + } + + if (responseType === 'text') { + convertedData = convertedData.toString(responseEncoding); + + if (!responseEncoding || responseEncoding === 'utf8') { + convertedData = utils$1.stripBOM(convertedData); + } + } else if (responseType === 'stream') { + convertedData = stream__default["default"].Readable.from(convertedData); + } + + return settle(resolve, reject, { + data: convertedData, + status: 200, + statusText: 'OK', + headers: new AxiosHeaders$1(), + config + }); + } + + if (supportedProtocols.indexOf(protocol) === -1) { + return reject(new AxiosError( + 'Unsupported protocol ' + protocol, + AxiosError.ERR_BAD_REQUEST, + config + )); + } + + const headers = AxiosHeaders$1.from(config.headers).normalize(); + + // Set User-Agent (required by some servers) + // See https://github.com/axios/axios/issues/69 + // User-Agent is specified; handle case where no UA header is desired + // Only set header if it hasn't been set in config + headers.set('User-Agent', 'axios/' + VERSION, false); + + const onDownloadProgress = config.onDownloadProgress; + const onUploadProgress = config.onUploadProgress; + const maxRate = config.maxRate; + let maxUploadRate = undefined; + let maxDownloadRate = undefined; + + // support for spec compliant FormData objects + if (utils$1.isSpecCompliantForm(data)) { + const userBoundary = headers.getContentType(/boundary=([-_\w\d]{10,70})/i); + + data = formDataToStream$1(data, (formHeaders) => { + headers.set(formHeaders); + }, { + tag: `axios-${VERSION}-boundary`, + boundary: userBoundary && userBoundary[1] || undefined + }); + // support for https://www.npmjs.com/package/form-data api + } else if (utils$1.isFormData(data) && utils$1.isFunction(data.getHeaders)) { + headers.set(data.getHeaders()); + + if (!headers.hasContentLength()) { + try { + const knownLength = await util__default["default"].promisify(data.getLength).call(data); + Number.isFinite(knownLength) && knownLength >= 0 && headers.setContentLength(knownLength); + /*eslint no-empty:0*/ + } catch (e) { + } + } + } else if (utils$1.isBlob(data)) { + data.size && headers.setContentType(data.type || 'application/octet-stream'); + headers.setContentLength(data.size || 0); + data = stream__default["default"].Readable.from(readBlob$1(data)); + } else if (data && !utils$1.isStream(data)) { + if (Buffer.isBuffer(data)) ; else if (utils$1.isArrayBuffer(data)) { + data = Buffer.from(new Uint8Array(data)); + } else if (utils$1.isString(data)) { + data = Buffer.from(data, 'utf-8'); + } else { + return reject(new AxiosError( + 'Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream', + AxiosError.ERR_BAD_REQUEST, + config + )); + } + + // Add Content-Length header if data exists + headers.setContentLength(data.length, false); + + if (config.maxBodyLength > -1 && data.length > config.maxBodyLength) { + return reject(new AxiosError( + 'Request body larger than maxBodyLength limit', + AxiosError.ERR_BAD_REQUEST, + config + )); + } + } + + const contentLength = utils$1.toFiniteNumber(headers.getContentLength()); + + if (utils$1.isArray(maxRate)) { + maxUploadRate = maxRate[0]; + maxDownloadRate = maxRate[1]; + } else { + maxUploadRate = maxDownloadRate = maxRate; + } + + if (data && (onUploadProgress || maxUploadRate)) { + if (!utils$1.isStream(data)) { + data = stream__default["default"].Readable.from(data, {objectMode: false}); + } + + data = stream__default["default"].pipeline([data, new AxiosTransformStream$1({ + length: contentLength, + maxRate: utils$1.toFiniteNumber(maxUploadRate) + })], utils$1.noop); + + onUploadProgress && data.on('progress', progress => { + onUploadProgress(Object.assign(progress, { + upload: true + })); + }); + } + + // HTTP basic authentication + let auth = undefined; + if (config.auth) { + const username = config.auth.username || ''; + const password = config.auth.password || ''; + auth = username + ':' + password; + } + + if (!auth && parsed.username) { + const urlUsername = parsed.username; + const urlPassword = parsed.password; + auth = urlUsername + ':' + urlPassword; + } + + auth && headers.delete('authorization'); + + let path; + + try { + path = buildURL( + parsed.pathname + parsed.search, + config.params, + config.paramsSerializer + ).replace(/^\?/, ''); + } catch (err) { + const customErr = new Error(err.message); + customErr.config = config; + customErr.url = config.url; + customErr.exists = true; + return reject(customErr); + } + + headers.set( + 'Accept-Encoding', + 'gzip, compress, deflate' + (isBrotliSupported ? ', br' : ''), false + ); + + const options = { + path, + method: method, + headers: headers.toJSON(), + agents: { http: config.httpAgent, https: config.httpsAgent }, + auth, + protocol, + family, + beforeRedirect: dispatchBeforeRedirect, + beforeRedirects: {} + }; + + // cacheable-lookup integration hotfix + !utils$1.isUndefined(lookup) && (options.lookup = lookup); + + if (config.socketPath) { + options.socketPath = config.socketPath; + } else { + options.hostname = parsed.hostname; + options.port = parsed.port; + setProxy(options, config.proxy, protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path); + } + + let transport; + const isHttpsRequest = isHttps.test(options.protocol); + options.agent = isHttpsRequest ? config.httpsAgent : config.httpAgent; + if (config.transport) { + transport = config.transport; + } else if (config.maxRedirects === 0) { + transport = isHttpsRequest ? https__default["default"] : http__default["default"]; + } else { + if (config.maxRedirects) { + options.maxRedirects = config.maxRedirects; + } + if (config.beforeRedirect) { + options.beforeRedirects.config = config.beforeRedirect; + } + transport = isHttpsRequest ? httpsFollow : httpFollow; + } + + if (config.maxBodyLength > -1) { + options.maxBodyLength = config.maxBodyLength; + } else { + // follow-redirects does not skip comparison, so it should always succeed for axios -1 unlimited + options.maxBodyLength = Infinity; + } + + if (config.insecureHTTPParser) { + options.insecureHTTPParser = config.insecureHTTPParser; + } + + // Create the request + req = transport.request(options, function handleResponse(res) { + if (req.destroyed) return; + + const streams = [res]; + + const responseLength = +res.headers['content-length']; + + if (onDownloadProgress) { + const transformStream = new AxiosTransformStream$1({ + length: utils$1.toFiniteNumber(responseLength), + maxRate: utils$1.toFiniteNumber(maxDownloadRate) + }); + + onDownloadProgress && transformStream.on('progress', progress => { + onDownloadProgress(Object.assign(progress, { + download: true + })); + }); + + streams.push(transformStream); + } + + // decompress the response body transparently if required + let responseStream = res; + + // return the last request in case of redirects + const lastRequest = res.req || req; + + // if decompress disabled we should not decompress + if (config.decompress !== false && res.headers['content-encoding']) { + // if no content, but headers still say that it is encoded, + // remove the header not confuse downstream operations + if (method === 'HEAD' || res.statusCode === 204) { + delete res.headers['content-encoding']; + } + + switch ((res.headers['content-encoding'] || '').toLowerCase()) { + /*eslint default-case:0*/ + case 'gzip': + case 'x-gzip': + case 'compress': + case 'x-compress': + // add the unzipper to the body stream processing pipeline + streams.push(zlib__default["default"].createUnzip(zlibOptions)); + + // remove the content-encoding in order to not confuse downstream operations + delete res.headers['content-encoding']; + break; + case 'deflate': + streams.push(new ZlibHeaderTransformStream$1()); + + // add the unzipper to the body stream processing pipeline + streams.push(zlib__default["default"].createUnzip(zlibOptions)); + + // remove the content-encoding in order to not confuse downstream operations + delete res.headers['content-encoding']; + break; + case 'br': + if (isBrotliSupported) { + streams.push(zlib__default["default"].createBrotliDecompress(brotliOptions)); + delete res.headers['content-encoding']; + } + } + } + + responseStream = streams.length > 1 ? stream__default["default"].pipeline(streams, utils$1.noop) : streams[0]; + + const offListeners = stream__default["default"].finished(responseStream, () => { + offListeners(); + onFinished(); + }); + + const response = { + status: res.statusCode, + statusText: res.statusMessage, + headers: new AxiosHeaders$1(res.headers), + config, + request: lastRequest + }; + + if (responseType === 'stream') { + response.data = responseStream; + settle(resolve, reject, response); + } else { + const responseBuffer = []; + let totalResponseBytes = 0; + + responseStream.on('data', function handleStreamData(chunk) { + responseBuffer.push(chunk); + totalResponseBytes += chunk.length; + + // make sure the content length is not over the maxContentLength if specified + if (config.maxContentLength > -1 && totalResponseBytes > config.maxContentLength) { + // stream.destroy() emit aborted event before calling reject() on Node.js v16 + rejected = true; + responseStream.destroy(); + reject(new AxiosError('maxContentLength size of ' + config.maxContentLength + ' exceeded', + AxiosError.ERR_BAD_RESPONSE, config, lastRequest)); + } + }); + + responseStream.on('aborted', function handlerStreamAborted() { + if (rejected) { + return; + } + + const err = new AxiosError( + 'maxContentLength size of ' + config.maxContentLength + ' exceeded', + AxiosError.ERR_BAD_RESPONSE, + config, + lastRequest + ); + responseStream.destroy(err); + reject(err); + }); + + responseStream.on('error', function handleStreamError(err) { + if (req.destroyed) return; + reject(AxiosError.from(err, null, config, lastRequest)); + }); + + responseStream.on('end', function handleStreamEnd() { + try { + let responseData = responseBuffer.length === 1 ? responseBuffer[0] : Buffer.concat(responseBuffer); + if (responseType !== 'arraybuffer') { + responseData = responseData.toString(responseEncoding); + if (!responseEncoding || responseEncoding === 'utf8') { + responseData = utils$1.stripBOM(responseData); + } + } + response.data = responseData; + } catch (err) { + return reject(AxiosError.from(err, null, config, response.request, response)); + } + settle(resolve, reject, response); + }); + } + + emitter.once('abort', err => { + if (!responseStream.destroyed) { + responseStream.emit('error', err); + responseStream.destroy(); + } + }); + }); + + emitter.once('abort', err => { + reject(err); + req.destroy(err); + }); + + // Handle errors + req.on('error', function handleRequestError(err) { + // @todo remove + // if (req.aborted && err.code !== AxiosError.ERR_FR_TOO_MANY_REDIRECTS) return; + reject(AxiosError.from(err, null, config, req)); + }); + + // set tcp keep alive to prevent drop connection by peer + req.on('socket', function handleRequestSocket(socket) { + // default interval of sending ack packet is 1 minute + socket.setKeepAlive(true, 1000 * 60); + }); + + // Handle request timeout + if (config.timeout) { + // This is forcing a int timeout to avoid problems if the `req` interface doesn't handle other types. + const timeout = parseInt(config.timeout, 10); + + if (Number.isNaN(timeout)) { + reject(new AxiosError( + 'error trying to parse `config.timeout` to int', + AxiosError.ERR_BAD_OPTION_VALUE, + config, + req + )); + + return; + } + + // Sometime, the response will be very slow, and does not respond, the connect event will be block by event loop system. + // And timer callback will be fired, and abort() will be invoked before connection, then get "socket hang up" and code ECONNRESET. + // At this time, if we have a large number of request, nodejs will hang up some socket on background. and the number will up and up. + // And then these socket which be hang up will devouring CPU little by little. + // ClientRequest.setTimeout will be fired on the specify milliseconds, and can make sure that abort() will be fired after connect. + req.setTimeout(timeout, function handleRequestTimeout() { + if (isDone) return; + let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded'; + const transitional = config.transitional || transitionalDefaults; + if (config.timeoutErrorMessage) { + timeoutErrorMessage = config.timeoutErrorMessage; + } + reject(new AxiosError( + timeoutErrorMessage, + transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED, + config, + req + )); + abort(); + }); + } + + + // Send the request + if (utils$1.isStream(data)) { + let ended = false; + let errored = false; + + data.on('end', () => { + ended = true; + }); + + data.once('error', err => { + errored = true; + req.destroy(err); + }); + + data.on('close', () => { + if (!ended && !errored) { + abort(new CanceledError('Request stream has been aborted', config, req)); + } + }); + + data.pipe(req); + } else { + req.end(data); + } + }); +}; + +const cookies = platform.hasStandardBrowserEnv ? + + // Standard browser envs support document.cookie + { + write(name, value, expires, path, domain, secure) { + const cookie = [name + '=' + encodeURIComponent(value)]; + + utils$1.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString()); + + utils$1.isString(path) && cookie.push('path=' + path); + + utils$1.isString(domain) && cookie.push('domain=' + domain); + + secure === true && cookie.push('secure'); + + document.cookie = cookie.join('; '); + }, + + read(name) { + const match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)')); + return (match ? decodeURIComponent(match[3]) : null); + }, + + remove(name) { + this.write(name, '', Date.now() - 86400000); + } + } + + : + + // Non-standard browser env (web workers, react-native) lack needed support. + { + write() {}, + read() { + return null; + }, + remove() {} + }; + +const isURLSameOrigin = platform.hasStandardBrowserEnv ? + +// Standard browser envs have full support of the APIs needed to test +// whether the request URL is of the same origin as current location. + (function standardBrowserEnv() { + const msie = /(msie|trident)/i.test(navigator.userAgent); + const urlParsingNode = document.createElement('a'); + let originURL; + + /** + * Parse a URL to discover its components + * + * @param {String} url The URL to be parsed + * @returns {Object} + */ + function resolveURL(url) { + let href = url; + + if (msie) { + // IE needs attribute set twice to normalize properties + urlParsingNode.setAttribute('href', href); + href = urlParsingNode.href; + } + + urlParsingNode.setAttribute('href', href); + + // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils + return { + href: urlParsingNode.href, + protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', + host: urlParsingNode.host, + search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', + hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', + hostname: urlParsingNode.hostname, + port: urlParsingNode.port, + pathname: (urlParsingNode.pathname.charAt(0) === '/') ? + urlParsingNode.pathname : + '/' + urlParsingNode.pathname + }; + } + + originURL = resolveURL(window.location.href); + + /** + * Determine if a URL shares the same origin as the current location + * + * @param {String} requestURL The URL to test + * @returns {boolean} True if URL shares the same origin, otherwise false + */ + return function isURLSameOrigin(requestURL) { + const parsed = (utils$1.isString(requestURL)) ? resolveURL(requestURL) : requestURL; + return (parsed.protocol === originURL.protocol && + parsed.host === originURL.host); + }; + })() : + + // Non standard browser envs (web workers, react-native) lack needed support. + (function nonStandardBrowserEnv() { + return function isURLSameOrigin() { + return true; + }; + })(); + +function progressEventReducer(listener, isDownloadStream) { + let bytesNotified = 0; + const _speedometer = speedometer(50, 250); + + return e => { + const loaded = e.loaded; + const total = e.lengthComputable ? e.total : undefined; + const progressBytes = loaded - bytesNotified; + const rate = _speedometer(progressBytes); + const inRange = loaded <= total; + + bytesNotified = loaded; + + const data = { + loaded, + total, + progress: total ? (loaded / total) : undefined, + bytes: progressBytes, + rate: rate ? rate : undefined, + estimated: rate && total && inRange ? (total - loaded) / rate : undefined, + event: e + }; + + data[isDownloadStream ? 'download' : 'upload'] = true; + + listener(data); + }; +} + +const isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined'; + +const xhrAdapter = isXHRAdapterSupported && function (config) { + return new Promise(function dispatchXhrRequest(resolve, reject) { + let requestData = config.data; + const requestHeaders = AxiosHeaders$1.from(config.headers).normalize(); + let {responseType, withXSRFToken} = config; + let onCanceled; + function done() { + if (config.cancelToken) { + config.cancelToken.unsubscribe(onCanceled); + } + + if (config.signal) { + config.signal.removeEventListener('abort', onCanceled); + } + } + + let contentType; + + if (utils$1.isFormData(requestData)) { + if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) { + requestHeaders.setContentType(false); // Let the browser set it + } else if ((contentType = requestHeaders.getContentType()) !== false) { + // fix semicolon duplication issue for ReactNative FormData implementation + const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : []; + requestHeaders.setContentType([type || 'multipart/form-data', ...tokens].join('; ')); + } + } + + let request = new XMLHttpRequest(); + + // HTTP basic authentication + if (config.auth) { + const username = config.auth.username || ''; + const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : ''; + requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password)); + } + + const fullPath = buildFullPath(config.baseURL, config.url); + + request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true); + + // Set the request timeout in MS + request.timeout = config.timeout; + + function onloadend() { + if (!request) { + return; + } + // Prepare the response + const responseHeaders = AxiosHeaders$1.from( + 'getAllResponseHeaders' in request && request.getAllResponseHeaders() + ); + const responseData = !responseType || responseType === 'text' || responseType === 'json' ? + request.responseText : request.response; + const response = { + data: responseData, + status: request.status, + statusText: request.statusText, + headers: responseHeaders, + config, + request + }; + + settle(function _resolve(value) { + resolve(value); + done(); + }, function _reject(err) { + reject(err); + done(); + }, response); + + // Clean up request + request = null; + } + + if ('onloadend' in request) { + // Use onloadend if available + request.onloadend = onloadend; + } else { + // Listen for ready state to emulate onloadend + request.onreadystatechange = function handleLoad() { + if (!request || request.readyState !== 4) { + return; + } + + // The request errored out and we didn't get a response, this will be + // handled by onerror instead + // With one exception: request that using file: protocol, most browsers + // will return status as 0 even though it's a successful request + if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) { + return; + } + // readystate handler is calling before onerror or ontimeout handlers, + // so we should call onloadend on the next 'tick' + setTimeout(onloadend); + }; + } + + // Handle browser request cancellation (as opposed to a manual cancellation) + request.onabort = function handleAbort() { + if (!request) { + return; + } + + reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request)); + + // Clean up request + request = null; + }; + + // Handle low level network errors + request.onerror = function handleError() { + // Real errors are hidden from us by the browser + // onerror should only fire if it's a network error + reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request)); + + // Clean up request + request = null; + }; + + // Handle timeout + request.ontimeout = function handleTimeout() { + let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded'; + const transitional = config.transitional || transitionalDefaults; + if (config.timeoutErrorMessage) { + timeoutErrorMessage = config.timeoutErrorMessage; + } + reject(new AxiosError( + timeoutErrorMessage, + transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED, + config, + request)); + + // Clean up request + request = null; + }; + + // Add xsrf header + // This is only done if running in a standard browser environment. + // Specifically not if we're in a web worker, or react-native. + if(platform.hasStandardBrowserEnv) { + withXSRFToken && utils$1.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(config)); + + if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(fullPath))) { + // Add xsrf header + const xsrfValue = config.xsrfHeaderName && config.xsrfCookieName && cookies.read(config.xsrfCookieName); + + if (xsrfValue) { + requestHeaders.set(config.xsrfHeaderName, xsrfValue); + } + } + } + + // Remove Content-Type if data is undefined + requestData === undefined && requestHeaders.setContentType(null); + + // Add headers to the request + if ('setRequestHeader' in request) { + utils$1.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) { + request.setRequestHeader(key, val); + }); + } + + // Add withCredentials to request if needed + if (!utils$1.isUndefined(config.withCredentials)) { + request.withCredentials = !!config.withCredentials; + } + + // Add responseType to request if needed + if (responseType && responseType !== 'json') { + request.responseType = config.responseType; + } + + // Handle progress if needed + if (typeof config.onDownloadProgress === 'function') { + request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true)); + } + + // Not all browsers support upload events + if (typeof config.onUploadProgress === 'function' && request.upload) { + request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress)); + } + + if (config.cancelToken || config.signal) { + // Handle cancellation + // eslint-disable-next-line func-names + onCanceled = cancel => { + if (!request) { + return; + } + reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel); + request.abort(); + request = null; + }; + + config.cancelToken && config.cancelToken.subscribe(onCanceled); + if (config.signal) { + config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled); + } + } + + const protocol = parseProtocol(fullPath); + + if (protocol && platform.protocols.indexOf(protocol) === -1) { + reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config)); + return; + } + + + // Send the request + request.send(requestData || null); + }); +}; + +const knownAdapters = { + http: httpAdapter, + xhr: xhrAdapter +}; + +utils$1.forEach(knownAdapters, (fn, value) => { + if (fn) { + try { + Object.defineProperty(fn, 'name', {value}); + } catch (e) { + // eslint-disable-next-line no-empty + } + Object.defineProperty(fn, 'adapterName', {value}); + } +}); + +const renderReason = (reason) => `- ${reason}`; + +const isResolvedHandle = (adapter) => utils$1.isFunction(adapter) || adapter === null || adapter === false; + +const adapters = { + getAdapter: (adapters) => { + adapters = utils$1.isArray(adapters) ? adapters : [adapters]; + + const {length} = adapters; + let nameOrAdapter; + let adapter; + + const rejectedReasons = {}; + + for (let i = 0; i < length; i++) { + nameOrAdapter = adapters[i]; + let id; + + adapter = nameOrAdapter; + + if (!isResolvedHandle(nameOrAdapter)) { + adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()]; + + if (adapter === undefined) { + throw new AxiosError(`Unknown adapter '${id}'`); + } + } + + if (adapter) { + break; + } + + rejectedReasons[id || '#' + i] = adapter; + } + + if (!adapter) { + + const reasons = Object.entries(rejectedReasons) + .map(([id, state]) => `adapter ${id} ` + + (state === false ? 'is not supported by the environment' : 'is not available in the build') + ); + + let s = length ? + (reasons.length > 1 ? 'since :\n' + reasons.map(renderReason).join('\n') : ' ' + renderReason(reasons[0])) : + 'as no adapter specified'; + + throw new AxiosError( + `There is no suitable adapter to dispatch the request ` + s, + 'ERR_NOT_SUPPORT' + ); + } + + return adapter; + }, + adapters: knownAdapters +}; + +/** + * Throws a `CanceledError` if cancellation has been requested. + * + * @param {Object} config The config that is to be used for the request + * + * @returns {void} + */ +function throwIfCancellationRequested(config) { + if (config.cancelToken) { + config.cancelToken.throwIfRequested(); + } + + if (config.signal && config.signal.aborted) { + throw new CanceledError(null, config); + } +} + +/** + * Dispatch a request to the server using the configured adapter. + * + * @param {object} config The config that is to be used for the request + * + * @returns {Promise} The Promise to be fulfilled + */ +function dispatchRequest(config) { + throwIfCancellationRequested(config); + + config.headers = AxiosHeaders$1.from(config.headers); + + // Transform request data + config.data = transformData.call( + config, + config.transformRequest + ); + + if (['post', 'put', 'patch'].indexOf(config.method) !== -1) { + config.headers.setContentType('application/x-www-form-urlencoded', false); + } + + const adapter = adapters.getAdapter(config.adapter || defaults$1.adapter); + + return adapter(config).then(function onAdapterResolution(response) { + throwIfCancellationRequested(config); + + // Transform response data + response.data = transformData.call( + config, + config.transformResponse, + response + ); + + response.headers = AxiosHeaders$1.from(response.headers); + + return response; + }, function onAdapterRejection(reason) { + if (!isCancel(reason)) { + throwIfCancellationRequested(config); + + // Transform response data + if (reason && reason.response) { + reason.response.data = transformData.call( + config, + config.transformResponse, + reason.response + ); + reason.response.headers = AxiosHeaders$1.from(reason.response.headers); + } + } + + return Promise.reject(reason); + }); +} + +const headersToObject = (thing) => thing instanceof AxiosHeaders$1 ? thing.toJSON() : thing; + +/** + * Config-specific merge-function which creates a new config-object + * by merging two configuration objects together. + * + * @param {Object} config1 + * @param {Object} config2 + * + * @returns {Object} New object resulting from merging config2 to config1 + */ +function mergeConfig(config1, config2) { + // eslint-disable-next-line no-param-reassign + config2 = config2 || {}; + const config = {}; + + function getMergedValue(target, source, caseless) { + if (utils$1.isPlainObject(target) && utils$1.isPlainObject(source)) { + return utils$1.merge.call({caseless}, target, source); + } else if (utils$1.isPlainObject(source)) { + return utils$1.merge({}, source); + } else if (utils$1.isArray(source)) { + return source.slice(); + } + return source; + } + + // eslint-disable-next-line consistent-return + function mergeDeepProperties(a, b, caseless) { + if (!utils$1.isUndefined(b)) { + return getMergedValue(a, b, caseless); + } else if (!utils$1.isUndefined(a)) { + return getMergedValue(undefined, a, caseless); + } + } + + // eslint-disable-next-line consistent-return + function valueFromConfig2(a, b) { + if (!utils$1.isUndefined(b)) { + return getMergedValue(undefined, b); + } + } + + // eslint-disable-next-line consistent-return + function defaultToConfig2(a, b) { + if (!utils$1.isUndefined(b)) { + return getMergedValue(undefined, b); + } else if (!utils$1.isUndefined(a)) { + return getMergedValue(undefined, a); + } + } + + // eslint-disable-next-line consistent-return + function mergeDirectKeys(a, b, prop) { + if (prop in config2) { + return getMergedValue(a, b); + } else if (prop in config1) { + return getMergedValue(undefined, a); + } + } + + const mergeMap = { + url: valueFromConfig2, + method: valueFromConfig2, + data: valueFromConfig2, + baseURL: defaultToConfig2, + transformRequest: defaultToConfig2, + transformResponse: defaultToConfig2, + paramsSerializer: defaultToConfig2, + timeout: defaultToConfig2, + timeoutMessage: defaultToConfig2, + withCredentials: defaultToConfig2, + withXSRFToken: defaultToConfig2, + adapter: defaultToConfig2, + responseType: defaultToConfig2, + xsrfCookieName: defaultToConfig2, + xsrfHeaderName: defaultToConfig2, + onUploadProgress: defaultToConfig2, + onDownloadProgress: defaultToConfig2, + decompress: defaultToConfig2, + maxContentLength: defaultToConfig2, + maxBodyLength: defaultToConfig2, + beforeRedirect: defaultToConfig2, + transport: defaultToConfig2, + httpAgent: defaultToConfig2, + httpsAgent: defaultToConfig2, + cancelToken: defaultToConfig2, + socketPath: defaultToConfig2, + responseEncoding: defaultToConfig2, + validateStatus: mergeDirectKeys, + headers: (a, b) => mergeDeepProperties(headersToObject(a), headersToObject(b), true) + }; + + utils$1.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) { + const merge = mergeMap[prop] || mergeDeepProperties; + const configValue = merge(config1[prop], config2[prop], prop); + (utils$1.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue); + }); + + return config; +} + +const validators$1 = {}; + +// eslint-disable-next-line func-names +['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => { + validators$1[type] = function validator(thing) { + return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type; + }; +}); + +const deprecatedWarnings = {}; + +/** + * Transitional option validator + * + * @param {function|boolean?} validator - set to false if the transitional option has been removed + * @param {string?} version - deprecated version / removed since version + * @param {string?} message - some message with additional info + * + * @returns {function} + */ +validators$1.transitional = function transitional(validator, version, message) { + function formatMessage(opt, desc) { + return '[Axios v' + VERSION + '] Transitional option \'' + opt + '\'' + desc + (message ? '. ' + message : ''); + } + + // eslint-disable-next-line func-names + return (value, opt, opts) => { + if (validator === false) { + throw new AxiosError( + formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')), + AxiosError.ERR_DEPRECATED + ); + } + + if (version && !deprecatedWarnings[opt]) { + deprecatedWarnings[opt] = true; + // eslint-disable-next-line no-console + console.warn( + formatMessage( + opt, + ' has been deprecated since v' + version + ' and will be removed in the near future' + ) + ); + } + + return validator ? validator(value, opt, opts) : true; + }; +}; + +/** + * Assert object's properties type + * + * @param {object} options + * @param {object} schema + * @param {boolean?} allowUnknown + * + * @returns {object} + */ + +function assertOptions(options, schema, allowUnknown) { + if (typeof options !== 'object') { + throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE); + } + const keys = Object.keys(options); + let i = keys.length; + while (i-- > 0) { + const opt = keys[i]; + const validator = schema[opt]; + if (validator) { + const value = options[opt]; + const result = value === undefined || validator(value, opt, options); + if (result !== true) { + throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE); + } + continue; + } + if (allowUnknown !== true) { + throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION); + } + } +} + +const validator = { + assertOptions, + validators: validators$1 +}; + +const validators = validator.validators; + +/** + * Create a new instance of Axios + * + * @param {Object} instanceConfig The default config for the instance + * + * @return {Axios} A new instance of Axios + */ +class Axios { + constructor(instanceConfig) { + this.defaults = instanceConfig; + this.interceptors = { + request: new InterceptorManager$1(), + response: new InterceptorManager$1() + }; + } + + /** + * Dispatch a request + * + * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults) + * @param {?Object} config + * + * @returns {Promise} The Promise to be fulfilled + */ + request(configOrUrl, config) { + /*eslint no-param-reassign:0*/ + // Allow for axios('example/url'[, config]) a la fetch API + if (typeof configOrUrl === 'string') { + config = config || {}; + config.url = configOrUrl; + } else { + config = configOrUrl || {}; + } + + config = mergeConfig(this.defaults, config); + + const {transitional, paramsSerializer, headers} = config; + + if (transitional !== undefined) { + validator.assertOptions(transitional, { + silentJSONParsing: validators.transitional(validators.boolean), + forcedJSONParsing: validators.transitional(validators.boolean), + clarifyTimeoutError: validators.transitional(validators.boolean) + }, false); + } + + if (paramsSerializer != null) { + if (utils$1.isFunction(paramsSerializer)) { + config.paramsSerializer = { + serialize: paramsSerializer + }; + } else { + validator.assertOptions(paramsSerializer, { + encode: validators.function, + serialize: validators.function + }, true); + } + } + + // Set config.method + config.method = (config.method || this.defaults.method || 'get').toLowerCase(); + + // Flatten headers + let contextHeaders = headers && utils$1.merge( + headers.common, + headers[config.method] + ); + + headers && utils$1.forEach( + ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], + (method) => { + delete headers[method]; + } + ); + + config.headers = AxiosHeaders$1.concat(contextHeaders, headers); + + // filter out skipped interceptors + const requestInterceptorChain = []; + let synchronousRequestInterceptors = true; + this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { + if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) { + return; + } + + synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous; + + requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected); + }); + + const responseInterceptorChain = []; + this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { + responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected); + }); + + let promise; + let i = 0; + let len; + + if (!synchronousRequestInterceptors) { + const chain = [dispatchRequest.bind(this), undefined]; + chain.unshift.apply(chain, requestInterceptorChain); + chain.push.apply(chain, responseInterceptorChain); + len = chain.length; + + promise = Promise.resolve(config); + + while (i < len) { + promise = promise.then(chain[i++], chain[i++]); + } + + return promise; + } + + len = requestInterceptorChain.length; + + let newConfig = config; + + i = 0; + + while (i < len) { + const onFulfilled = requestInterceptorChain[i++]; + const onRejected = requestInterceptorChain[i++]; + try { + newConfig = onFulfilled(newConfig); + } catch (error) { + onRejected.call(this, error); + break; + } + } + + try { + promise = dispatchRequest.call(this, newConfig); + } catch (error) { + return Promise.reject(error); + } + + i = 0; + len = responseInterceptorChain.length; + + while (i < len) { + promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]); + } + + return promise; + } + + getUri(config) { + config = mergeConfig(this.defaults, config); + const fullPath = buildFullPath(config.baseURL, config.url); + return buildURL(fullPath, config.params, config.paramsSerializer); + } +} + +// Provide aliases for supported request methods +utils$1.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { + /*eslint func-names:0*/ + Axios.prototype[method] = function(url, config) { + return this.request(mergeConfig(config || {}, { + method, + url, + data: (config || {}).data + })); + }; +}); + +utils$1.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { + /*eslint func-names:0*/ + + function generateHTTPMethod(isForm) { + return function httpMethod(url, data, config) { + return this.request(mergeConfig(config || {}, { + method, + headers: isForm ? { + 'Content-Type': 'multipart/form-data' + } : {}, + url, + data + })); + }; + } + + Axios.prototype[method] = generateHTTPMethod(); + + Axios.prototype[method + 'Form'] = generateHTTPMethod(true); +}); + +const Axios$1 = Axios; + +/** + * A `CancelToken` is an object that can be used to request cancellation of an operation. + * + * @param {Function} executor The executor function. + * + * @returns {CancelToken} + */ +class CancelToken { + constructor(executor) { + if (typeof executor !== 'function') { + throw new TypeError('executor must be a function.'); + } + + let resolvePromise; + + this.promise = new Promise(function promiseExecutor(resolve) { + resolvePromise = resolve; + }); + + const token = this; + + // eslint-disable-next-line func-names + this.promise.then(cancel => { + if (!token._listeners) return; + + let i = token._listeners.length; + + while (i-- > 0) { + token._listeners[i](cancel); + } + token._listeners = null; + }); + + // eslint-disable-next-line func-names + this.promise.then = onfulfilled => { + let _resolve; + // eslint-disable-next-line func-names + const promise = new Promise(resolve => { + token.subscribe(resolve); + _resolve = resolve; + }).then(onfulfilled); + + promise.cancel = function reject() { + token.unsubscribe(_resolve); + }; + + return promise; + }; + + executor(function cancel(message, config, request) { + if (token.reason) { + // Cancellation has already been requested + return; + } + + token.reason = new CanceledError(message, config, request); + resolvePromise(token.reason); + }); + } + + /** + * Throws a `CanceledError` if cancellation has been requested. + */ + throwIfRequested() { + if (this.reason) { + throw this.reason; + } + } + + /** + * Subscribe to the cancel signal + */ + + subscribe(listener) { + if (this.reason) { + listener(this.reason); + return; + } + + if (this._listeners) { + this._listeners.push(listener); + } else { + this._listeners = [listener]; + } + } + + /** + * Unsubscribe from the cancel signal + */ + + unsubscribe(listener) { + if (!this._listeners) { + return; + } + const index = this._listeners.indexOf(listener); + if (index !== -1) { + this._listeners.splice(index, 1); + } + } + + /** + * Returns an object that contains a new `CancelToken` and a function that, when called, + * cancels the `CancelToken`. + */ + static source() { + let cancel; + const token = new CancelToken(function executor(c) { + cancel = c; + }); + return { + token, + cancel + }; + } +} + +const CancelToken$1 = CancelToken; + +/** + * Syntactic sugar for invoking a function and expanding an array for arguments. + * + * Common use case would be to use `Function.prototype.apply`. + * + * ```js + * function f(x, y, z) {} + * var args = [1, 2, 3]; + * f.apply(null, args); + * ``` + * + * With `spread` this example can be re-written. + * + * ```js + * spread(function(x, y, z) {})([1, 2, 3]); + * ``` + * + * @param {Function} callback + * + * @returns {Function} + */ +function spread(callback) { + return function wrap(arr) { + return callback.apply(null, arr); + }; +} + +/** + * Determines whether the payload is an error thrown by Axios + * + * @param {*} payload The value to test + * + * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false + */ +function isAxiosError(payload) { + return utils$1.isObject(payload) && (payload.isAxiosError === true); +} + +const HttpStatusCode = { + Continue: 100, + SwitchingProtocols: 101, + Processing: 102, + EarlyHints: 103, + Ok: 200, + Created: 201, + Accepted: 202, + NonAuthoritativeInformation: 203, + NoContent: 204, + ResetContent: 205, + PartialContent: 206, + MultiStatus: 207, + AlreadyReported: 208, + ImUsed: 226, + MultipleChoices: 300, + MovedPermanently: 301, + Found: 302, + SeeOther: 303, + NotModified: 304, + UseProxy: 305, + Unused: 306, + TemporaryRedirect: 307, + PermanentRedirect: 308, + BadRequest: 400, + Unauthorized: 401, + PaymentRequired: 402, + Forbidden: 403, + NotFound: 404, + MethodNotAllowed: 405, + NotAcceptable: 406, + ProxyAuthenticationRequired: 407, + RequestTimeout: 408, + Conflict: 409, + Gone: 410, + LengthRequired: 411, + PreconditionFailed: 412, + PayloadTooLarge: 413, + UriTooLong: 414, + UnsupportedMediaType: 415, + RangeNotSatisfiable: 416, + ExpectationFailed: 417, + ImATeapot: 418, + MisdirectedRequest: 421, + UnprocessableEntity: 422, + Locked: 423, + FailedDependency: 424, + TooEarly: 425, + UpgradeRequired: 426, + PreconditionRequired: 428, + TooManyRequests: 429, + RequestHeaderFieldsTooLarge: 431, + UnavailableForLegalReasons: 451, + InternalServerError: 500, + NotImplemented: 501, + BadGateway: 502, + ServiceUnavailable: 503, + GatewayTimeout: 504, + HttpVersionNotSupported: 505, + VariantAlsoNegotiates: 506, + InsufficientStorage: 507, + LoopDetected: 508, + NotExtended: 510, + NetworkAuthenticationRequired: 511, +}; + +Object.entries(HttpStatusCode).forEach(([key, value]) => { + HttpStatusCode[value] = key; +}); + +const HttpStatusCode$1 = HttpStatusCode; + +/** + * Create an instance of Axios + * + * @param {Object} defaultConfig The default config for the instance + * + * @returns {Axios} A new instance of Axios + */ +function createInstance(defaultConfig) { + const context = new Axios$1(defaultConfig); + const instance = bind(Axios$1.prototype.request, context); + + // Copy axios.prototype to instance + utils$1.extend(instance, Axios$1.prototype, context, {allOwnKeys: true}); + + // Copy context to instance + utils$1.extend(instance, context, null, {allOwnKeys: true}); + + // Factory for creating new instances + instance.create = function create(instanceConfig) { + return createInstance(mergeConfig(defaultConfig, instanceConfig)); + }; + + return instance; +} + +// Create the default instance to be exported +const axios = createInstance(defaults$1); + +// Expose Axios class to allow class inheritance +axios.Axios = Axios$1; + +// Expose Cancel & CancelToken +axios.CanceledError = CanceledError; +axios.CancelToken = CancelToken$1; +axios.isCancel = isCancel; +axios.VERSION = VERSION; +axios.toFormData = toFormData; + +// Expose AxiosError class +axios.AxiosError = AxiosError; + +// alias for CanceledError for backward compatibility +axios.Cancel = axios.CanceledError; + +// Expose all/spread +axios.all = function all(promises) { + return Promise.all(promises); +}; + +axios.spread = spread; + +// Expose isAxiosError +axios.isAxiosError = isAxiosError; + +// Expose mergeConfig +axios.mergeConfig = mergeConfig; + +axios.AxiosHeaders = AxiosHeaders$1; + +axios.formToJSON = thing => formDataToJSON(utils$1.isHTMLForm(thing) ? new FormData(thing) : thing); + +axios.getAdapter = adapters.getAdapter; + +axios.HttpStatusCode = HttpStatusCode$1; + +axios.default = axios; + +module.exports = axios; +//# sourceMappingURL=axios.cjs.map diff --git a/task/node_modules/axios/dist/node/axios.cjs.map b/task/node_modules/axios/dist/node/axios.cjs.map new file mode 100644 index 0000000..8e3de0d --- /dev/null +++ b/task/node_modules/axios/dist/node/axios.cjs.map @@ -0,0 +1 @@ +{"version":3,"file":"axios.cjs","sources":["../../lib/helpers/bind.js","../../lib/utils.js","../../lib/core/AxiosError.js","../../lib/helpers/toFormData.js","../../lib/helpers/AxiosURLSearchParams.js","../../lib/helpers/buildURL.js","../../lib/core/InterceptorManager.js","../../lib/defaults/transitional.js","../../lib/platform/node/classes/URLSearchParams.js","../../lib/platform/node/index.js","../../lib/platform/common/utils.js","../../lib/platform/index.js","../../lib/helpers/toURLEncodedForm.js","../../lib/helpers/formDataToJSON.js","../../lib/defaults/index.js","../../lib/helpers/parseHeaders.js","../../lib/core/AxiosHeaders.js","../../lib/core/transformData.js","../../lib/cancel/isCancel.js","../../lib/cancel/CanceledError.js","../../lib/core/settle.js","../../lib/helpers/isAbsoluteURL.js","../../lib/helpers/combineURLs.js","../../lib/core/buildFullPath.js","../../lib/env/data.js","../../lib/helpers/parseProtocol.js","../../lib/helpers/fromDataURI.js","../../lib/helpers/throttle.js","../../lib/helpers/speedometer.js","../../lib/helpers/AxiosTransformStream.js","../../lib/helpers/readBlob.js","../../lib/helpers/formDataToStream.js","../../lib/helpers/ZlibHeaderTransformStream.js","../../lib/helpers/callbackify.js","../../lib/adapters/http.js","../../lib/helpers/cookies.js","../../lib/helpers/isURLSameOrigin.js","../../lib/adapters/xhr.js","../../lib/adapters/adapters.js","../../lib/core/dispatchRequest.js","../../lib/core/mergeConfig.js","../../lib/helpers/validator.js","../../lib/core/Axios.js","../../lib/cancel/CancelToken.js","../../lib/helpers/spread.js","../../lib/helpers/isAxiosError.js","../../lib/helpers/HttpStatusCode.js","../../lib/axios.js"],"sourcesContent":["'use strict';\n\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n","'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n let kind;\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) || (\n isFunction(thing.append) && (\n (kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n )\n )\n )\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\nfunction findKey(obj, key) {\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const {caseless} = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else {\n result[targetKey] = val;\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[Symbol.iterator];\n\n const iterator = generator.call(obj);\n\n let result;\n\n while ((result = iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n value = +value;\n return Number.isFinite(value) ? value : defaultValue;\n}\n\nconst ALPHA = 'abcdefghijklmnopqrstuvwxyz'\n\nconst DIGIT = '0123456789';\n\nconst ALPHABET = {\n DIGIT,\n ALPHA,\n ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT\n}\n\nconst generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {\n let str = '';\n const {length} = alphabet;\n while (size--) {\n str += alphabet[Math.random() * length|0]\n }\n\n return str;\n}\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]);\n}\n\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n\n const visit = (source, i) => {\n\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n\n if(!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n\n stack[i] = undefined;\n\n return target;\n }\n }\n\n return source;\n }\n\n return visit(obj, 0);\n}\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n ALPHABET,\n generateString,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable\n};\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n response && (this.response = response);\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils.toJSONObject(this.config),\n code: this.code,\n status: this.response && this.response.status ? this.response.status : null\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n AxiosError.call(axiosError, error.message, code, config, request, response);\n\n axiosError.cause = error;\n\n axiosError.name = error.name;\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\nimport PlatformFormData from '../platform/node/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (PlatformFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n","'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object} params - The parameters to be converted to a FormData object.\n * @param {Object} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?object} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n","'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n","'use strict';\n\nimport url from 'url';\nexport default url.URLSearchParams;\n","import URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\n\nexport default {\n isNode: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob: typeof Blob !== 'undefined' && Blob || null\n },\n protocols: [ 'http', 'https', 'file', 'data' ]\n};\n","const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = (\n (product) => {\n return hasBrowserEnv && ['ReactNative', 'NativeScript', 'NS'].indexOf(product) < 0\n })(typeof navigator !== 'undefined' && navigator.product);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope &&\n typeof self.importScripts === 'function'\n );\n})();\n\nexport {\n hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv\n}\n","import platform from './node/index.js';\nimport * as utils from './common/utils.js';\n\nexport default {\n ...utils,\n ...platform\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n }\n }, options));\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n\n if (name === '__proto__') return true;\n\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: ['xhr', 'http'],\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n if (!hasJSONContentType) {\n return data;\n }\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*',\n 'Content-Type': undefined\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n defaults.headers[method] = {};\n});\n\nexport default defaults;\n","'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = utils.findKey(self, lHeader);\n\n if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n\n const setHeaders = (headers, _rewrite) =>\n utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite)\n } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n }\n\n get(header, parser) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n\n has(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n }\n\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = utils.findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n }\n\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n\n while (i--) {\n const key = keys[i];\n if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n\n return deleted;\n }\n\n normalize(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = utils.findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n }\n\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n\n toJSON(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n });\n\n return obj;\n }\n\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n\n static concat(first, ...targets) {\n const computed = new this(first);\n\n targets.forEach((target) => computed.set(target));\n\n return computed;\n }\n\n static accessor(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n }\n }\n});\n\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n","'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n","'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n","'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n","'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n","export const VERSION = \"1.6.4\";","'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport parseProtocol from './parseProtocol.js';\nimport platform from '../platform/index.js';\n\nconst DATA_URL_PATTERN = /^(?:([^;]+);)?(?:[^;]+;)?(base64|),([\\s\\S]*)$/;\n\n/**\n * Parse data uri to a Buffer or Blob\n *\n * @param {String} uri\n * @param {?Boolean} asBlob\n * @param {?Object} options\n * @param {?Function} options.Blob\n *\n * @returns {Buffer|Blob}\n */\nexport default function fromDataURI(uri, asBlob, options) {\n const _Blob = options && options.Blob || platform.classes.Blob;\n const protocol = parseProtocol(uri);\n\n if (asBlob === undefined && _Blob) {\n asBlob = true;\n }\n\n if (protocol === 'data') {\n uri = protocol.length ? uri.slice(protocol.length + 1) : uri;\n\n const match = DATA_URL_PATTERN.exec(uri);\n\n if (!match) {\n throw new AxiosError('Invalid URL', AxiosError.ERR_INVALID_URL);\n }\n\n const mime = match[1];\n const isBase64 = match[2];\n const body = match[3];\n const buffer = Buffer.from(decodeURIComponent(body), isBase64 ? 'base64' : 'utf8');\n\n if (asBlob) {\n if (!_Blob) {\n throw new AxiosError('Blob is not supported', AxiosError.ERR_NOT_SUPPORT);\n }\n\n return new _Blob([buffer], {type: mime});\n }\n\n return buffer;\n }\n\n throw new AxiosError('Unsupported protocol ' + protocol, AxiosError.ERR_NOT_SUPPORT);\n}\n","'use strict';\n\n/**\n * Throttle decorator\n * @param {Function} fn\n * @param {Number} freq\n * @return {Function}\n */\nfunction throttle(fn, freq) {\n let timestamp = 0;\n const threshold = 1000 / freq;\n let timer = null;\n return function throttled(force, args) {\n const now = Date.now();\n if (force || now - timestamp > threshold) {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n timestamp = now;\n return fn.apply(null, args);\n }\n if (!timer) {\n timer = setTimeout(() => {\n timer = null;\n timestamp = Date.now();\n return fn.apply(null, args);\n }, threshold - (now - timestamp));\n }\n };\n}\n\nexport default throttle;\n","'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n","'use strict';\n\nimport stream from 'stream';\nimport utils from '../utils.js';\nimport throttle from './throttle.js';\nimport speedometer from './speedometer.js';\n\nconst kInternals = Symbol('internals');\n\nclass AxiosTransformStream extends stream.Transform{\n constructor(options) {\n options = utils.toFlatObject(options, {\n maxRate: 0,\n chunkSize: 64 * 1024,\n minChunkSize: 100,\n timeWindow: 500,\n ticksRate: 2,\n samplesCount: 15\n }, null, (prop, source) => {\n return !utils.isUndefined(source[prop]);\n });\n\n super({\n readableHighWaterMark: options.chunkSize\n });\n\n const self = this;\n\n const internals = this[kInternals] = {\n length: options.length,\n timeWindow: options.timeWindow,\n ticksRate: options.ticksRate,\n chunkSize: options.chunkSize,\n maxRate: options.maxRate,\n minChunkSize: options.minChunkSize,\n bytesSeen: 0,\n isCaptured: false,\n notifiedBytesLoaded: 0,\n ts: Date.now(),\n bytes: 0,\n onReadCallback: null\n };\n\n const _speedometer = speedometer(internals.ticksRate * options.samplesCount, internals.timeWindow);\n\n this.on('newListener', event => {\n if (event === 'progress') {\n if (!internals.isCaptured) {\n internals.isCaptured = true;\n }\n }\n });\n\n let bytesNotified = 0;\n\n internals.updateProgress = throttle(function throttledHandler() {\n const totalBytes = internals.length;\n const bytesTransferred = internals.bytesSeen;\n const progressBytes = bytesTransferred - bytesNotified;\n if (!progressBytes || self.destroyed) return;\n\n const rate = _speedometer(progressBytes);\n\n bytesNotified = bytesTransferred;\n\n process.nextTick(() => {\n self.emit('progress', {\n 'loaded': bytesTransferred,\n 'total': totalBytes,\n 'progress': totalBytes ? (bytesTransferred / totalBytes) : undefined,\n 'bytes': progressBytes,\n 'rate': rate ? rate : undefined,\n 'estimated': rate && totalBytes && bytesTransferred <= totalBytes ?\n (totalBytes - bytesTransferred) / rate : undefined\n });\n });\n }, internals.ticksRate);\n\n const onFinish = () => {\n internals.updateProgress(true);\n };\n\n this.once('end', onFinish);\n this.once('error', onFinish);\n }\n\n _read(size) {\n const internals = this[kInternals];\n\n if (internals.onReadCallback) {\n internals.onReadCallback();\n }\n\n return super._read(size);\n }\n\n _transform(chunk, encoding, callback) {\n const self = this;\n const internals = this[kInternals];\n const maxRate = internals.maxRate;\n\n const readableHighWaterMark = this.readableHighWaterMark;\n\n const timeWindow = internals.timeWindow;\n\n const divider = 1000 / timeWindow;\n const bytesThreshold = (maxRate / divider);\n const minChunkSize = internals.minChunkSize !== false ? Math.max(internals.minChunkSize, bytesThreshold * 0.01) : 0;\n\n function pushChunk(_chunk, _callback) {\n const bytes = Buffer.byteLength(_chunk);\n internals.bytesSeen += bytes;\n internals.bytes += bytes;\n\n if (internals.isCaptured) {\n internals.updateProgress();\n }\n\n if (self.push(_chunk)) {\n process.nextTick(_callback);\n } else {\n internals.onReadCallback = () => {\n internals.onReadCallback = null;\n process.nextTick(_callback);\n };\n }\n }\n\n const transformChunk = (_chunk, _callback) => {\n const chunkSize = Buffer.byteLength(_chunk);\n let chunkRemainder = null;\n let maxChunkSize = readableHighWaterMark;\n let bytesLeft;\n let passed = 0;\n\n if (maxRate) {\n const now = Date.now();\n\n if (!internals.ts || (passed = (now - internals.ts)) >= timeWindow) {\n internals.ts = now;\n bytesLeft = bytesThreshold - internals.bytes;\n internals.bytes = bytesLeft < 0 ? -bytesLeft : 0;\n passed = 0;\n }\n\n bytesLeft = bytesThreshold - internals.bytes;\n }\n\n if (maxRate) {\n if (bytesLeft <= 0) {\n // next time window\n return setTimeout(() => {\n _callback(null, _chunk);\n }, timeWindow - passed);\n }\n\n if (bytesLeft < maxChunkSize) {\n maxChunkSize = bytesLeft;\n }\n }\n\n if (maxChunkSize && chunkSize > maxChunkSize && (chunkSize - maxChunkSize) > minChunkSize) {\n chunkRemainder = _chunk.subarray(maxChunkSize);\n _chunk = _chunk.subarray(0, maxChunkSize);\n }\n\n pushChunk(_chunk, chunkRemainder ? () => {\n process.nextTick(_callback, null, chunkRemainder);\n } : _callback);\n };\n\n transformChunk(chunk, function transformNextChunk(err, _chunk) {\n if (err) {\n return callback(err);\n }\n\n if (_chunk) {\n transformChunk(_chunk, transformNextChunk);\n } else {\n callback(null);\n }\n });\n }\n\n setLength(length) {\n this[kInternals].length = +length;\n return this;\n }\n}\n\nexport default AxiosTransformStream;\n","const {asyncIterator} = Symbol;\n\nconst readBlob = async function* (blob) {\n if (blob.stream) {\n yield* blob.stream()\n } else if (blob.arrayBuffer) {\n yield await blob.arrayBuffer()\n } else if (blob[asyncIterator]) {\n yield* blob[asyncIterator]();\n } else {\n yield blob;\n }\n}\n\nexport default readBlob;\n","import {TextEncoder} from 'util';\nimport {Readable} from 'stream';\nimport utils from \"../utils.js\";\nimport readBlob from \"./readBlob.js\";\n\nconst BOUNDARY_ALPHABET = utils.ALPHABET.ALPHA_DIGIT + '-_';\n\nconst textEncoder = new TextEncoder();\n\nconst CRLF = '\\r\\n';\nconst CRLF_BYTES = textEncoder.encode(CRLF);\nconst CRLF_BYTES_COUNT = 2;\n\nclass FormDataPart {\n constructor(name, value) {\n const {escapeName} = this.constructor;\n const isStringValue = utils.isString(value);\n\n let headers = `Content-Disposition: form-data; name=\"${escapeName(name)}\"${\n !isStringValue && value.name ? `; filename=\"${escapeName(value.name)}\"` : ''\n }${CRLF}`;\n\n if (isStringValue) {\n value = textEncoder.encode(String(value).replace(/\\r?\\n|\\r\\n?/g, CRLF));\n } else {\n headers += `Content-Type: ${value.type || \"application/octet-stream\"}${CRLF}`\n }\n\n this.headers = textEncoder.encode(headers + CRLF);\n\n this.contentLength = isStringValue ? value.byteLength : value.size;\n\n this.size = this.headers.byteLength + this.contentLength + CRLF_BYTES_COUNT;\n\n this.name = name;\n this.value = value;\n }\n\n async *encode(){\n yield this.headers;\n\n const {value} = this;\n\n if(utils.isTypedArray(value)) {\n yield value;\n } else {\n yield* readBlob(value);\n }\n\n yield CRLF_BYTES;\n }\n\n static escapeName(name) {\n return String(name).replace(/[\\r\\n\"]/g, (match) => ({\n '\\r' : '%0D',\n '\\n' : '%0A',\n '\"' : '%22',\n }[match]));\n }\n}\n\nconst formDataToStream = (form, headersHandler, options) => {\n const {\n tag = 'form-data-boundary',\n size = 25,\n boundary = tag + '-' + utils.generateString(size, BOUNDARY_ALPHABET)\n } = options || {};\n\n if(!utils.isFormData(form)) {\n throw TypeError('FormData instance required');\n }\n\n if (boundary.length < 1 || boundary.length > 70) {\n throw Error('boundary must be 10-70 characters long')\n }\n\n const boundaryBytes = textEncoder.encode('--' + boundary + CRLF);\n const footerBytes = textEncoder.encode('--' + boundary + '--' + CRLF + CRLF);\n let contentLength = footerBytes.byteLength;\n\n const parts = Array.from(form.entries()).map(([name, value]) => {\n const part = new FormDataPart(name, value);\n contentLength += part.size;\n return part;\n });\n\n contentLength += boundaryBytes.byteLength * parts.length;\n\n contentLength = utils.toFiniteNumber(contentLength);\n\n const computedHeaders = {\n 'Content-Type': `multipart/form-data; boundary=${boundary}`\n }\n\n if (Number.isFinite(contentLength)) {\n computedHeaders['Content-Length'] = contentLength;\n }\n\n headersHandler && headersHandler(computedHeaders);\n\n return Readable.from((async function *() {\n for(const part of parts) {\n yield boundaryBytes;\n yield* part.encode();\n }\n\n yield footerBytes;\n })());\n};\n\nexport default formDataToStream;\n","\"use strict\";\n\nimport stream from \"stream\";\n\nclass ZlibHeaderTransformStream extends stream.Transform {\n __transform(chunk, encoding, callback) {\n this.push(chunk);\n callback();\n }\n\n _transform(chunk, encoding, callback) {\n if (chunk.length !== 0) {\n this._transform = this.__transform;\n\n // Add Default Compression headers if no zlib headers are present\n if (chunk[0] !== 120) { // Hex: 78\n const header = Buffer.alloc(2);\n header[0] = 120; // Hex: 78\n header[1] = 156; // Hex: 9C \n this.push(header, encoding);\n }\n }\n\n this.__transform(chunk, encoding, callback);\n }\n}\n\nexport default ZlibHeaderTransformStream;\n","import utils from \"../utils.js\";\n\nconst callbackify = (fn, reducer) => {\n return utils.isAsyncFn(fn) ? function (...args) {\n const cb = args.pop();\n fn.apply(this, args).then((value) => {\n try {\n reducer ? cb(null, ...reducer(value)) : cb(null, value);\n } catch (err) {\n cb(err);\n }\n }, cb);\n } : fn;\n}\n\nexport default callbackify;\n","'use strict';\n\nimport utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport buildFullPath from '../core/buildFullPath.js';\nimport buildURL from './../helpers/buildURL.js';\nimport {getProxyForUrl} from 'proxy-from-env';\nimport http from 'http';\nimport https from 'https';\nimport util from 'util';\nimport followRedirects from 'follow-redirects';\nimport zlib from 'zlib';\nimport {VERSION} from '../env/data.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport platform from '../platform/index.js';\nimport fromDataURI from '../helpers/fromDataURI.js';\nimport stream from 'stream';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport AxiosTransformStream from '../helpers/AxiosTransformStream.js';\nimport EventEmitter from 'events';\nimport formDataToStream from \"../helpers/formDataToStream.js\";\nimport readBlob from \"../helpers/readBlob.js\";\nimport ZlibHeaderTransformStream from '../helpers/ZlibHeaderTransformStream.js';\nimport callbackify from \"../helpers/callbackify.js\";\n\nconst zlibOptions = {\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH\n};\n\nconst brotliOptions = {\n flush: zlib.constants.BROTLI_OPERATION_FLUSH,\n finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH\n}\n\nconst isBrotliSupported = utils.isFunction(zlib.createBrotliDecompress);\n\nconst {http: httpFollow, https: httpsFollow} = followRedirects;\n\nconst isHttps = /https:?/;\n\nconst supportedProtocols = platform.protocols.map(protocol => {\n return protocol + ':';\n});\n\n/**\n * If the proxy or config beforeRedirects functions are defined, call them with the options\n * object.\n *\n * @param {Object} options - The options object that was passed to the request.\n *\n * @returns {Object}\n */\nfunction dispatchBeforeRedirect(options) {\n if (options.beforeRedirects.proxy) {\n options.beforeRedirects.proxy(options);\n }\n if (options.beforeRedirects.config) {\n options.beforeRedirects.config(options);\n }\n}\n\n/**\n * If the proxy or config afterRedirects functions are defined, call them with the options\n *\n * @param {http.ClientRequestArgs} options\n * @param {AxiosProxyConfig} configProxy configuration from Axios options object\n * @param {string} location\n *\n * @returns {http.ClientRequestArgs}\n */\nfunction setProxy(options, configProxy, location) {\n let proxy = configProxy;\n if (!proxy && proxy !== false) {\n const proxyUrl = getProxyForUrl(location);\n if (proxyUrl) {\n proxy = new URL(proxyUrl);\n }\n }\n if (proxy) {\n // Basic proxy authorization\n if (proxy.username) {\n proxy.auth = (proxy.username || '') + ':' + (proxy.password || '');\n }\n\n if (proxy.auth) {\n // Support proxy auth object form\n if (proxy.auth.username || proxy.auth.password) {\n proxy.auth = (proxy.auth.username || '') + ':' + (proxy.auth.password || '');\n }\n const base64 = Buffer\n .from(proxy.auth, 'utf8')\n .toString('base64');\n options.headers['Proxy-Authorization'] = 'Basic ' + base64;\n }\n\n options.headers.host = options.hostname + (options.port ? ':' + options.port : '');\n const proxyHost = proxy.hostname || proxy.host;\n options.hostname = proxyHost;\n // Replace 'host' since options is not a URL object\n options.host = proxyHost;\n options.port = proxy.port;\n options.path = location;\n if (proxy.protocol) {\n options.protocol = proxy.protocol.includes(':') ? proxy.protocol : `${proxy.protocol}:`;\n }\n }\n\n options.beforeRedirects.proxy = function beforeRedirect(redirectOptions) {\n // Configure proxy for redirected request, passing the original config proxy to apply\n // the exact same logic as if the redirected request was performed by axios directly.\n setProxy(redirectOptions, configProxy, redirectOptions.href);\n };\n}\n\nconst isHttpAdapterSupported = typeof process !== 'undefined' && utils.kindOf(process) === 'process';\n\n// temporary hotfix\n\nconst wrapAsync = (asyncExecutor) => {\n return new Promise((resolve, reject) => {\n let onDone;\n let isDone;\n\n const done = (value, isRejected) => {\n if (isDone) return;\n isDone = true;\n onDone && onDone(value, isRejected);\n }\n\n const _resolve = (value) => {\n done(value);\n resolve(value);\n };\n\n const _reject = (reason) => {\n done(reason, true);\n reject(reason);\n }\n\n asyncExecutor(_resolve, _reject, (onDoneHandler) => (onDone = onDoneHandler)).catch(_reject);\n })\n};\n\nconst resolveFamily = ({address, family}) => {\n if (!utils.isString(address)) {\n throw TypeError('address must be a string');\n }\n return ({\n address,\n family: family || (address.indexOf('.') < 0 ? 6 : 4)\n });\n}\n\nconst buildAddressEntry = (address, family) => resolveFamily(utils.isObject(address) ? address : {address, family});\n\n/*eslint consistent-return:0*/\nexport default isHttpAdapterSupported && function httpAdapter(config) {\n return wrapAsync(async function dispatchHttpRequest(resolve, reject, onDone) {\n let {data, lookup, family} = config;\n const {responseType, responseEncoding} = config;\n const method = config.method.toUpperCase();\n let isDone;\n let rejected = false;\n let req;\n\n if (lookup) {\n const _lookup = callbackify(lookup, (value) => utils.isArray(value) ? value : [value]);\n // hotfix to support opt.all option which is required for node 20.x\n lookup = (hostname, opt, cb) => {\n _lookup(hostname, opt, (err, arg0, arg1) => {\n const addresses = utils.isArray(arg0) ? arg0.map(addr => buildAddressEntry(addr)) : [buildAddressEntry(arg0, arg1)];\n\n opt.all ? cb(err, addresses) : cb(err, addresses[0].address, addresses[0].family);\n });\n }\n }\n\n // temporary internal emitter until the AxiosRequest class will be implemented\n const emitter = new EventEmitter();\n\n const onFinished = () => {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(abort);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', abort);\n }\n\n emitter.removeAllListeners();\n }\n\n onDone((value, isRejected) => {\n isDone = true;\n if (isRejected) {\n rejected = true;\n onFinished();\n }\n });\n\n function abort(reason) {\n emitter.emit('abort', !reason || reason.type ? new CanceledError(null, config, req) : reason);\n }\n\n emitter.once('abort', reject);\n\n if (config.cancelToken || config.signal) {\n config.cancelToken && config.cancelToken.subscribe(abort);\n if (config.signal) {\n config.signal.aborted ? abort() : config.signal.addEventListener('abort', abort);\n }\n }\n\n // Parse url\n const fullPath = buildFullPath(config.baseURL, config.url);\n const parsed = new URL(fullPath, 'http://localhost');\n const protocol = parsed.protocol || supportedProtocols[0];\n\n if (protocol === 'data:') {\n let convertedData;\n\n if (method !== 'GET') {\n return settle(resolve, reject, {\n status: 405,\n statusText: 'method not allowed',\n headers: {},\n config\n });\n }\n\n try {\n convertedData = fromDataURI(config.url, responseType === 'blob', {\n Blob: config.env && config.env.Blob\n });\n } catch (err) {\n throw AxiosError.from(err, AxiosError.ERR_BAD_REQUEST, config);\n }\n\n if (responseType === 'text') {\n convertedData = convertedData.toString(responseEncoding);\n\n if (!responseEncoding || responseEncoding === 'utf8') {\n convertedData = utils.stripBOM(convertedData);\n }\n } else if (responseType === 'stream') {\n convertedData = stream.Readable.from(convertedData);\n }\n\n return settle(resolve, reject, {\n data: convertedData,\n status: 200,\n statusText: 'OK',\n headers: new AxiosHeaders(),\n config\n });\n }\n\n if (supportedProtocols.indexOf(protocol) === -1) {\n return reject(new AxiosError(\n 'Unsupported protocol ' + protocol,\n AxiosError.ERR_BAD_REQUEST,\n config\n ));\n }\n\n const headers = AxiosHeaders.from(config.headers).normalize();\n\n // Set User-Agent (required by some servers)\n // See https://github.com/axios/axios/issues/69\n // User-Agent is specified; handle case where no UA header is desired\n // Only set header if it hasn't been set in config\n headers.set('User-Agent', 'axios/' + VERSION, false);\n\n const onDownloadProgress = config.onDownloadProgress;\n const onUploadProgress = config.onUploadProgress;\n const maxRate = config.maxRate;\n let maxUploadRate = undefined;\n let maxDownloadRate = undefined;\n\n // support for spec compliant FormData objects\n if (utils.isSpecCompliantForm(data)) {\n const userBoundary = headers.getContentType(/boundary=([-_\\w\\d]{10,70})/i);\n\n data = formDataToStream(data, (formHeaders) => {\n headers.set(formHeaders);\n }, {\n tag: `axios-${VERSION}-boundary`,\n boundary: userBoundary && userBoundary[1] || undefined\n });\n // support for https://www.npmjs.com/package/form-data api\n } else if (utils.isFormData(data) && utils.isFunction(data.getHeaders)) {\n headers.set(data.getHeaders());\n\n if (!headers.hasContentLength()) {\n try {\n const knownLength = await util.promisify(data.getLength).call(data);\n Number.isFinite(knownLength) && knownLength >= 0 && headers.setContentLength(knownLength);\n /*eslint no-empty:0*/\n } catch (e) {\n }\n }\n } else if (utils.isBlob(data)) {\n data.size && headers.setContentType(data.type || 'application/octet-stream');\n headers.setContentLength(data.size || 0);\n data = stream.Readable.from(readBlob(data));\n } else if (data && !utils.isStream(data)) {\n if (Buffer.isBuffer(data)) {\n // Nothing to do...\n } else if (utils.isArrayBuffer(data)) {\n data = Buffer.from(new Uint8Array(data));\n } else if (utils.isString(data)) {\n data = Buffer.from(data, 'utf-8');\n } else {\n return reject(new AxiosError(\n 'Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream',\n AxiosError.ERR_BAD_REQUEST,\n config\n ));\n }\n\n // Add Content-Length header if data exists\n headers.setContentLength(data.length, false);\n\n if (config.maxBodyLength > -1 && data.length > config.maxBodyLength) {\n return reject(new AxiosError(\n 'Request body larger than maxBodyLength limit',\n AxiosError.ERR_BAD_REQUEST,\n config\n ));\n }\n }\n\n const contentLength = utils.toFiniteNumber(headers.getContentLength());\n\n if (utils.isArray(maxRate)) {\n maxUploadRate = maxRate[0];\n maxDownloadRate = maxRate[1];\n } else {\n maxUploadRate = maxDownloadRate = maxRate;\n }\n\n if (data && (onUploadProgress || maxUploadRate)) {\n if (!utils.isStream(data)) {\n data = stream.Readable.from(data, {objectMode: false});\n }\n\n data = stream.pipeline([data, new AxiosTransformStream({\n length: contentLength,\n maxRate: utils.toFiniteNumber(maxUploadRate)\n })], utils.noop);\n\n onUploadProgress && data.on('progress', progress => {\n onUploadProgress(Object.assign(progress, {\n upload: true\n }));\n });\n }\n\n // HTTP basic authentication\n let auth = undefined;\n if (config.auth) {\n const username = config.auth.username || '';\n const password = config.auth.password || '';\n auth = username + ':' + password;\n }\n\n if (!auth && parsed.username) {\n const urlUsername = parsed.username;\n const urlPassword = parsed.password;\n auth = urlUsername + ':' + urlPassword;\n }\n\n auth && headers.delete('authorization');\n\n let path;\n\n try {\n path = buildURL(\n parsed.pathname + parsed.search,\n config.params,\n config.paramsSerializer\n ).replace(/^\\?/, '');\n } catch (err) {\n const customErr = new Error(err.message);\n customErr.config = config;\n customErr.url = config.url;\n customErr.exists = true;\n return reject(customErr);\n }\n\n headers.set(\n 'Accept-Encoding',\n 'gzip, compress, deflate' + (isBrotliSupported ? ', br' : ''), false\n );\n\n const options = {\n path,\n method: method,\n headers: headers.toJSON(),\n agents: { http: config.httpAgent, https: config.httpsAgent },\n auth,\n protocol,\n family,\n beforeRedirect: dispatchBeforeRedirect,\n beforeRedirects: {}\n };\n\n // cacheable-lookup integration hotfix\n !utils.isUndefined(lookup) && (options.lookup = lookup);\n\n if (config.socketPath) {\n options.socketPath = config.socketPath;\n } else {\n options.hostname = parsed.hostname;\n options.port = parsed.port;\n setProxy(options, config.proxy, protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path);\n }\n\n let transport;\n const isHttpsRequest = isHttps.test(options.protocol);\n options.agent = isHttpsRequest ? config.httpsAgent : config.httpAgent;\n if (config.transport) {\n transport = config.transport;\n } else if (config.maxRedirects === 0) {\n transport = isHttpsRequest ? https : http;\n } else {\n if (config.maxRedirects) {\n options.maxRedirects = config.maxRedirects;\n }\n if (config.beforeRedirect) {\n options.beforeRedirects.config = config.beforeRedirect;\n }\n transport = isHttpsRequest ? httpsFollow : httpFollow;\n }\n\n if (config.maxBodyLength > -1) {\n options.maxBodyLength = config.maxBodyLength;\n } else {\n // follow-redirects does not skip comparison, so it should always succeed for axios -1 unlimited\n options.maxBodyLength = Infinity;\n }\n\n if (config.insecureHTTPParser) {\n options.insecureHTTPParser = config.insecureHTTPParser;\n }\n\n // Create the request\n req = transport.request(options, function handleResponse(res) {\n if (req.destroyed) return;\n\n const streams = [res];\n\n const responseLength = +res.headers['content-length'];\n\n if (onDownloadProgress) {\n const transformStream = new AxiosTransformStream({\n length: utils.toFiniteNumber(responseLength),\n maxRate: utils.toFiniteNumber(maxDownloadRate)\n });\n\n onDownloadProgress && transformStream.on('progress', progress => {\n onDownloadProgress(Object.assign(progress, {\n download: true\n }));\n });\n\n streams.push(transformStream);\n }\n\n // decompress the response body transparently if required\n let responseStream = res;\n\n // return the last request in case of redirects\n const lastRequest = res.req || req;\n\n // if decompress disabled we should not decompress\n if (config.decompress !== false && res.headers['content-encoding']) {\n // if no content, but headers still say that it is encoded,\n // remove the header not confuse downstream operations\n if (method === 'HEAD' || res.statusCode === 204) {\n delete res.headers['content-encoding'];\n }\n\n switch ((res.headers['content-encoding'] || '').toLowerCase()) {\n /*eslint default-case:0*/\n case 'gzip':\n case 'x-gzip':\n case 'compress':\n case 'x-compress':\n // add the unzipper to the body stream processing pipeline\n streams.push(zlib.createUnzip(zlibOptions));\n\n // remove the content-encoding in order to not confuse downstream operations\n delete res.headers['content-encoding'];\n break;\n case 'deflate':\n streams.push(new ZlibHeaderTransformStream());\n\n // add the unzipper to the body stream processing pipeline\n streams.push(zlib.createUnzip(zlibOptions));\n\n // remove the content-encoding in order to not confuse downstream operations\n delete res.headers['content-encoding'];\n break;\n case 'br':\n if (isBrotliSupported) {\n streams.push(zlib.createBrotliDecompress(brotliOptions));\n delete res.headers['content-encoding'];\n }\n }\n }\n\n responseStream = streams.length > 1 ? stream.pipeline(streams, utils.noop) : streams[0];\n\n const offListeners = stream.finished(responseStream, () => {\n offListeners();\n onFinished();\n });\n\n const response = {\n status: res.statusCode,\n statusText: res.statusMessage,\n headers: new AxiosHeaders(res.headers),\n config,\n request: lastRequest\n };\n\n if (responseType === 'stream') {\n response.data = responseStream;\n settle(resolve, reject, response);\n } else {\n const responseBuffer = [];\n let totalResponseBytes = 0;\n\n responseStream.on('data', function handleStreamData(chunk) {\n responseBuffer.push(chunk);\n totalResponseBytes += chunk.length;\n\n // make sure the content length is not over the maxContentLength if specified\n if (config.maxContentLength > -1 && totalResponseBytes > config.maxContentLength) {\n // stream.destroy() emit aborted event before calling reject() on Node.js v16\n rejected = true;\n responseStream.destroy();\n reject(new AxiosError('maxContentLength size of ' + config.maxContentLength + ' exceeded',\n AxiosError.ERR_BAD_RESPONSE, config, lastRequest));\n }\n });\n\n responseStream.on('aborted', function handlerStreamAborted() {\n if (rejected) {\n return;\n }\n\n const err = new AxiosError(\n 'maxContentLength size of ' + config.maxContentLength + ' exceeded',\n AxiosError.ERR_BAD_RESPONSE,\n config,\n lastRequest\n );\n responseStream.destroy(err);\n reject(err);\n });\n\n responseStream.on('error', function handleStreamError(err) {\n if (req.destroyed) return;\n reject(AxiosError.from(err, null, config, lastRequest));\n });\n\n responseStream.on('end', function handleStreamEnd() {\n try {\n let responseData = responseBuffer.length === 1 ? responseBuffer[0] : Buffer.concat(responseBuffer);\n if (responseType !== 'arraybuffer') {\n responseData = responseData.toString(responseEncoding);\n if (!responseEncoding || responseEncoding === 'utf8') {\n responseData = utils.stripBOM(responseData);\n }\n }\n response.data = responseData;\n } catch (err) {\n return reject(AxiosError.from(err, null, config, response.request, response));\n }\n settle(resolve, reject, response);\n });\n }\n\n emitter.once('abort', err => {\n if (!responseStream.destroyed) {\n responseStream.emit('error', err);\n responseStream.destroy();\n }\n });\n });\n\n emitter.once('abort', err => {\n reject(err);\n req.destroy(err);\n });\n\n // Handle errors\n req.on('error', function handleRequestError(err) {\n // @todo remove\n // if (req.aborted && err.code !== AxiosError.ERR_FR_TOO_MANY_REDIRECTS) return;\n reject(AxiosError.from(err, null, config, req));\n });\n\n // set tcp keep alive to prevent drop connection by peer\n req.on('socket', function handleRequestSocket(socket) {\n // default interval of sending ack packet is 1 minute\n socket.setKeepAlive(true, 1000 * 60);\n });\n\n // Handle request timeout\n if (config.timeout) {\n // This is forcing a int timeout to avoid problems if the `req` interface doesn't handle other types.\n const timeout = parseInt(config.timeout, 10);\n\n if (Number.isNaN(timeout)) {\n reject(new AxiosError(\n 'error trying to parse `config.timeout` to int',\n AxiosError.ERR_BAD_OPTION_VALUE,\n config,\n req\n ));\n\n return;\n }\n\n // Sometime, the response will be very slow, and does not respond, the connect event will be block by event loop system.\n // And timer callback will be fired, and abort() will be invoked before connection, then get \"socket hang up\" and code ECONNRESET.\n // At this time, if we have a large number of request, nodejs will hang up some socket on background. and the number will up and up.\n // And then these socket which be hang up will devouring CPU little by little.\n // ClientRequest.setTimeout will be fired on the specify milliseconds, and can make sure that abort() will be fired after connect.\n req.setTimeout(timeout, function handleRequestTimeout() {\n if (isDone) return;\n let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = config.transitional || transitionalDefaults;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n req\n ));\n abort();\n });\n }\n\n\n // Send the request\n if (utils.isStream(data)) {\n let ended = false;\n let errored = false;\n\n data.on('end', () => {\n ended = true;\n });\n\n data.once('error', err => {\n errored = true;\n req.destroy(err);\n });\n\n data.on('close', () => {\n if (!ended && !errored) {\n abort(new CanceledError('Request stream has been aborted', config, req));\n }\n });\n\n data.pipe(req);\n } else {\n req.end(data);\n }\n });\n}\n\nexport const __setProxy = setProxy;\n","import utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n // Standard browser envs support document.cookie\n {\n write(name, value, expires, path, domain, secure) {\n const cookie = [name + '=' + encodeURIComponent(value)];\n\n utils.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n\n utils.isString(path) && cookie.push('path=' + path);\n\n utils.isString(domain) && cookie.push('domain=' + domain);\n\n secure === true && cookie.push('secure');\n\n document.cookie = cookie.join('; ');\n },\n\n read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n }\n\n :\n\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {},\n read() {\n return null;\n },\n remove() {}\n };\n\n","'use strict';\n\nimport utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n// Standard browser envs have full support of the APIs needed to test\n// whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n const msie = /(msie|trident)/i.test(navigator.userAgent);\n const urlParsingNode = document.createElement('a');\n let originURL;\n\n /**\n * Parse a URL to discover its components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n let href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n const parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })();\n","'use strict';\n\nimport utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport cookies from './../helpers/cookies.js';\nimport buildURL from './../helpers/buildURL.js';\nimport buildFullPath from '../core/buildFullPath.js';\nimport isURLSameOrigin from './../helpers/isURLSameOrigin.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport speedometer from '../helpers/speedometer.js';\n\nfunction progressEventReducer(listener, isDownloadStream) {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e\n };\n\n data[isDownloadStream ? 'download' : 'upload'] = true;\n\n listener(data);\n };\n}\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nexport default isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n let requestData = config.data;\n const requestHeaders = AxiosHeaders.from(config.headers).normalize();\n let {responseType, withXSRFToken} = config;\n let onCanceled;\n function done() {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(onCanceled);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', onCanceled);\n }\n }\n\n let contentType;\n\n if (utils.isFormData(requestData)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n requestHeaders.setContentType(false); // Let the browser set it\n } else if ((contentType = requestHeaders.getContentType()) !== false) {\n // fix semicolon duplication issue for ReactNative FormData implementation\n const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : [];\n requestHeaders.setContentType([type || 'multipart/form-data', ...tokens].join('; '));\n }\n }\n\n let request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n const username = config.auth.username || '';\n const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password));\n }\n\n const fullPath = buildFullPath(config.baseURL, config.url);\n\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = config.transitional || transitionalDefaults;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if(platform.hasStandardBrowserEnv) {\n withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(config));\n\n if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(fullPath))) {\n // Add xsrf header\n const xsrfValue = config.xsrfHeaderName && config.xsrfCookieName && cookies.read(config.xsrfCookieName);\n\n if (xsrfValue) {\n requestHeaders.set(config.xsrfHeaderName, xsrfValue);\n }\n }\n }\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = config.responseType;\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true));\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress));\n }\n\n if (config.cancelToken || config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n config.cancelToken && config.cancelToken.subscribe(onCanceled);\n if (config.signal) {\n config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(fullPath);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n","import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\nimport AxiosError from \"../core/AxiosError.js\";\n\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter\n}\n\nutils.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, 'name', {value});\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', {value});\n }\n});\n\nconst renderReason = (reason) => `- ${reason}`;\n\nconst isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;\n\nexport default {\n getAdapter: (adapters) => {\n adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n const {length} = adapters;\n let nameOrAdapter;\n let adapter;\n\n const rejectedReasons = {};\n\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n let id;\n\n adapter = nameOrAdapter;\n\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n if (adapter === undefined) {\n throw new AxiosError(`Unknown adapter '${id}'`);\n }\n }\n\n if (adapter) {\n break;\n }\n\n rejectedReasons[id || '#' + i] = adapter;\n }\n\n if (!adapter) {\n\n const reasons = Object.entries(rejectedReasons)\n .map(([id, state]) => `adapter ${id} ` +\n (state === false ? 'is not supported by the environment' : 'is not available in the build')\n );\n\n let s = length ?\n (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n 'as no adapter specified';\n\n throw new AxiosError(\n `There is no suitable adapter to dispatch the request ` + s,\n 'ERR_NOT_SUPPORT'\n );\n }\n\n return adapter;\n },\n adapters: knownAdapters\n}\n","'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport adapters from \"../adapters/adapters.js\";\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n\n const adapter = adapters.getAdapter(config.adapter || defaults.adapter);\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosHeaders from \"./AxiosHeaders.js\";\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? thing.toJSON() : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source, caseless) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge.call({caseless}, target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, caseless) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(a, b, caseless);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a, caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b) => mergeDeepProperties(headersToObject(a), headersToObject(b), true)\n };\n\n utils.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n","'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n","'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer, headers} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n }\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n let contextHeaders = headers && utils.merge(\n headers.common,\n headers[config.method]\n );\n\n headers && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift.apply(chain, requestInterceptorChain);\n chain.push.apply(chain, responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n i = 0;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n","'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n","const HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n\nexport default HttpStatusCode;\n","'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\nimport AxiosHeaders from \"./core/AxiosHeaders.js\";\nimport adapters from './adapters/adapters.js';\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders;\n\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\nexport default axios\n"],"names":["utils","prototype","PlatformFormData","encode","url","FormData","platform","defaults","AxiosHeaders","stream","TextEncoder","readBlob","Readable","zlib","followRedirects","getProxyForUrl","callbackify","EventEmitter","formDataToStream","util","AxiosTransformStream","https","http","ZlibHeaderTransformStream","validators","InterceptorManager","Axios","CancelToken","HttpStatusCode"],"mappings":"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"} \ No newline at end of file diff --git a/task/node_modules/axios/index.d.cts b/task/node_modules/axios/index.d.cts new file mode 100644 index 0000000..35a1f0f --- /dev/null +++ b/task/node_modules/axios/index.d.cts @@ -0,0 +1,542 @@ +interface RawAxiosHeaders { + [key: string]: axios.AxiosHeaderValue; +} + +type MethodsHeaders = Partial<{ + [Key in axios.Method as Lowercase]: AxiosHeaders; +} & {common: AxiosHeaders}>; + +type AxiosHeaderMatcher = (this: AxiosHeaders, value: string, name: string, headers: RawAxiosHeaders) => boolean; + +type AxiosHeaderParser = (this: AxiosHeaders, value: axios.AxiosHeaderValue, header: string) => any; + +type CommonRequestHeadersList = 'Accept' | 'Content-Length' | 'User-Agent'| 'Content-Encoding' | 'Authorization'; + +type ContentType = axios.AxiosHeaderValue | 'text/html' | 'text/plain' | 'multipart/form-data' | 'application/json' | 'application/x-www-form-urlencoded' | 'application/octet-stream'; + +type CommonResponseHeadersList = 'Server' | 'Content-Type' | 'Content-Length' | 'Cache-Control'| 'Content-Encoding'; + +declare class AxiosHeaders { + constructor( + headers?: RawAxiosHeaders | AxiosHeaders | string + ); + + [key: string]: any; + + set(headerName?: string, value?: axios.AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders; + set(headers?: RawAxiosHeaders | AxiosHeaders | string, rewrite?: boolean): AxiosHeaders; + + get(headerName: string, parser: RegExp): RegExpExecArray | null; + get(headerName: string, matcher?: true | AxiosHeaderParser): axios.AxiosHeaderValue; + + has(header: string, matcher?: AxiosHeaderMatcher): boolean; + + delete(header: string | string[], matcher?: AxiosHeaderMatcher): boolean; + + clear(matcher?: AxiosHeaderMatcher): boolean; + + normalize(format: boolean): AxiosHeaders; + + concat(...targets: Array): AxiosHeaders; + + toJSON(asStrings?: boolean): RawAxiosHeaders; + + static from(thing?: AxiosHeaders | RawAxiosHeaders | string): AxiosHeaders; + + static accessor(header: string | string[]): AxiosHeaders; + + static concat(...targets: Array): AxiosHeaders; + + setContentType(value: ContentType, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders; + getContentType(parser?: RegExp): RegExpExecArray | null; + getContentType(matcher?: AxiosHeaderMatcher): axios.AxiosHeaderValue; + hasContentType(matcher?: AxiosHeaderMatcher): boolean; + + setContentLength(value: axios.AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders; + getContentLength(parser?: RegExp): RegExpExecArray | null; + getContentLength(matcher?: AxiosHeaderMatcher): axios.AxiosHeaderValue; + hasContentLength(matcher?: AxiosHeaderMatcher): boolean; + + setAccept(value: axios.AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders; + getAccept(parser?: RegExp): RegExpExecArray | null; + getAccept(matcher?: AxiosHeaderMatcher): axios.AxiosHeaderValue; + hasAccept(matcher?: AxiosHeaderMatcher): boolean; + + setUserAgent(value: axios.AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders; + getUserAgent(parser?: RegExp): RegExpExecArray | null; + getUserAgent(matcher?: AxiosHeaderMatcher): axios.AxiosHeaderValue; + hasUserAgent(matcher?: AxiosHeaderMatcher): boolean; + + setContentEncoding(value: axios.AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders; + getContentEncoding(parser?: RegExp): RegExpExecArray | null; + getContentEncoding(matcher?: AxiosHeaderMatcher): axios.AxiosHeaderValue; + hasContentEncoding(matcher?: AxiosHeaderMatcher): boolean; + + setAuthorization(value: axios.AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders; + getAuthorization(parser?: RegExp): RegExpExecArray | null; + getAuthorization(matcher?: AxiosHeaderMatcher): axios.AxiosHeaderValue; + hasAuthorization(matcher?: AxiosHeaderMatcher): boolean; + + [Symbol.iterator](): IterableIterator<[string, axios.AxiosHeaderValue]>; +} + +declare class AxiosError extends Error { + constructor( + message?: string, + code?: string, + config?: axios.InternalAxiosRequestConfig, + request?: any, + response?: axios.AxiosResponse + ); + + config?: axios.InternalAxiosRequestConfig; + code?: string; + request?: any; + response?: axios.AxiosResponse; + isAxiosError: boolean; + status?: number; + toJSON: () => object; + cause?: Error; + static readonly ERR_FR_TOO_MANY_REDIRECTS = "ERR_FR_TOO_MANY_REDIRECTS"; + static readonly ERR_BAD_OPTION_VALUE = "ERR_BAD_OPTION_VALUE"; + static readonly ERR_BAD_OPTION = "ERR_BAD_OPTION"; + static readonly ERR_NETWORK = "ERR_NETWORK"; + static readonly ERR_DEPRECATED = "ERR_DEPRECATED"; + static readonly ERR_BAD_RESPONSE = "ERR_BAD_RESPONSE"; + static readonly ERR_BAD_REQUEST = "ERR_BAD_REQUEST"; + static readonly ERR_NOT_SUPPORT = "ERR_NOT_SUPPORT"; + static readonly ERR_INVALID_URL = "ERR_INVALID_URL"; + static readonly ERR_CANCELED = "ERR_CANCELED"; + static readonly ECONNABORTED = "ECONNABORTED"; + static readonly ETIMEDOUT = "ETIMEDOUT"; +} + +declare class CanceledError extends AxiosError { +} + +declare class Axios { + constructor(config?: axios.AxiosRequestConfig); + defaults: axios.AxiosDefaults; + interceptors: { + request: axios.AxiosInterceptorManager; + response: axios.AxiosInterceptorManager; + }; + getUri(config?: axios.AxiosRequestConfig): string; + request, D = any>(config: axios.AxiosRequestConfig): Promise; + get, D = any>(url: string, config?: axios.AxiosRequestConfig): Promise; + delete, D = any>(url: string, config?: axios.AxiosRequestConfig): Promise; + head, D = any>(url: string, config?: axios.AxiosRequestConfig): Promise; + options, D = any>(url: string, config?: axios.AxiosRequestConfig): Promise; + post, D = any>(url: string, data?: D, config?: axios.AxiosRequestConfig): Promise; + put, D = any>(url: string, data?: D, config?: axios.AxiosRequestConfig): Promise; + patch, D = any>(url: string, data?: D, config?: axios.AxiosRequestConfig): Promise; + postForm, D = any>(url: string, data?: D, config?: axios.AxiosRequestConfig): Promise; + putForm, D = any>(url: string, data?: D, config?: axios.AxiosRequestConfig): Promise; + patchForm, D = any>(url: string, data?: D, config?: axios.AxiosRequestConfig): Promise; +} + +declare enum HttpStatusCode { + Continue = 100, + SwitchingProtocols = 101, + Processing = 102, + EarlyHints = 103, + Ok = 200, + Created = 201, + Accepted = 202, + NonAuthoritativeInformation = 203, + NoContent = 204, + ResetContent = 205, + PartialContent = 206, + MultiStatus = 207, + AlreadyReported = 208, + ImUsed = 226, + MultipleChoices = 300, + MovedPermanently = 301, + Found = 302, + SeeOther = 303, + NotModified = 304, + UseProxy = 305, + Unused = 306, + TemporaryRedirect = 307, + PermanentRedirect = 308, + BadRequest = 400, + Unauthorized = 401, + PaymentRequired = 402, + Forbidden = 403, + NotFound = 404, + MethodNotAllowed = 405, + NotAcceptable = 406, + ProxyAuthenticationRequired = 407, + RequestTimeout = 408, + Conflict = 409, + Gone = 410, + LengthRequired = 411, + PreconditionFailed = 412, + PayloadTooLarge = 413, + UriTooLong = 414, + UnsupportedMediaType = 415, + RangeNotSatisfiable = 416, + ExpectationFailed = 417, + ImATeapot = 418, + MisdirectedRequest = 421, + UnprocessableEntity = 422, + Locked = 423, + FailedDependency = 424, + TooEarly = 425, + UpgradeRequired = 426, + PreconditionRequired = 428, + TooManyRequests = 429, + RequestHeaderFieldsTooLarge = 431, + UnavailableForLegalReasons = 451, + InternalServerError = 500, + NotImplemented = 501, + BadGateway = 502, + ServiceUnavailable = 503, + GatewayTimeout = 504, + HttpVersionNotSupported = 505, + VariantAlsoNegotiates = 506, + InsufficientStorage = 507, + LoopDetected = 508, + NotExtended = 510, + NetworkAuthenticationRequired = 511, +} + +type InternalAxiosError = AxiosError; + +declare namespace axios { + type AxiosError = InternalAxiosError; + + type RawAxiosRequestHeaders = Partial; + + type AxiosRequestHeaders = RawAxiosRequestHeaders & AxiosHeaders; + + type AxiosHeaderValue = AxiosHeaders | string | string[] | number | boolean | null; + + type RawCommonResponseHeaders = { + [Key in CommonResponseHeadersList]: AxiosHeaderValue; + } & { + "set-cookie": string[]; + }; + + type RawAxiosResponseHeaders = Partial; + + type AxiosResponseHeaders = RawAxiosResponseHeaders & AxiosHeaders; + + interface AxiosRequestTransformer { + (this: InternalAxiosRequestConfig, data: any, headers: AxiosRequestHeaders): any; + } + + interface AxiosResponseTransformer { + (this: InternalAxiosRequestConfig, data: any, headers: AxiosResponseHeaders, status?: number): any; + } + + interface AxiosAdapter { + (config: InternalAxiosRequestConfig): AxiosPromise; + } + + interface AxiosBasicCredentials { + username: string; + password: string; + } + + interface AxiosProxyConfig { + host: string; + port: number; + auth?: AxiosBasicCredentials; + protocol?: string; + } + + type Method = + | 'get' | 'GET' + | 'delete' | 'DELETE' + | 'head' | 'HEAD' + | 'options' | 'OPTIONS' + | 'post' | 'POST' + | 'put' | 'PUT' + | 'patch' | 'PATCH' + | 'purge' | 'PURGE' + | 'link' | 'LINK' + | 'unlink' | 'UNLINK'; + + type ResponseType = + | 'arraybuffer' + | 'blob' + | 'document' + | 'json' + | 'text' + | 'stream'; + + type responseEncoding = + | 'ascii' | 'ASCII' + | 'ansi' | 'ANSI' + | 'binary' | 'BINARY' + | 'base64' | 'BASE64' + | 'base64url' | 'BASE64URL' + | 'hex' | 'HEX' + | 'latin1' | 'LATIN1' + | 'ucs-2' | 'UCS-2' + | 'ucs2' | 'UCS2' + | 'utf-8' | 'UTF-8' + | 'utf8' | 'UTF8' + | 'utf16le' | 'UTF16LE'; + + interface TransitionalOptions { + silentJSONParsing?: boolean; + forcedJSONParsing?: boolean; + clarifyTimeoutError?: boolean; + } + + interface GenericAbortSignal { + readonly aborted: boolean; + onabort?: ((...args: any) => any) | null; + addEventListener?: (...args: any) => any; + removeEventListener?: (...args: any) => any; + } + + interface FormDataVisitorHelpers { + defaultVisitor: SerializerVisitor; + convertValue: (value: any) => any; + isVisitable: (value: any) => boolean; + } + + interface SerializerVisitor { + ( + this: GenericFormData, + value: any, + key: string | number, + path: null | Array, + helpers: FormDataVisitorHelpers + ): boolean; + } + + interface SerializerOptions { + visitor?: SerializerVisitor; + dots?: boolean; + metaTokens?: boolean; + indexes?: boolean | null; + } + + // tslint:disable-next-line + interface FormSerializerOptions extends SerializerOptions { + } + + interface ParamEncoder { + (value: any, defaultEncoder: (value: any) => any): any; + } + + interface CustomParamsSerializer { + (params: Record, options?: ParamsSerializerOptions): string; + } + + interface ParamsSerializerOptions extends SerializerOptions { + encode?: ParamEncoder; + serialize?: CustomParamsSerializer; + } + + type MaxUploadRate = number; + + type MaxDownloadRate = number; + + type BrowserProgressEvent = any; + + interface AxiosProgressEvent { + loaded: number; + total?: number; + progress?: number; + bytes: number; + rate?: number; + estimated?: number; + upload?: boolean; + download?: boolean; + event?: BrowserProgressEvent; + } + + type Milliseconds = number; + + type AxiosAdapterName = 'xhr' | 'http' | string; + + type AxiosAdapterConfig = AxiosAdapter | AxiosAdapterName; + + type AddressFamily = 4 | 6 | undefined; + + interface LookupAddressEntry { + address: string; + family?: AddressFamily; + } + + type LookupAddress = string | LookupAddressEntry; + + interface AxiosRequestConfig { + url?: string; + method?: Method | string; + baseURL?: string; + transformRequest?: AxiosRequestTransformer | AxiosRequestTransformer[]; + transformResponse?: AxiosResponseTransformer | AxiosResponseTransformer[]; + headers?: (RawAxiosRequestHeaders & MethodsHeaders) | AxiosHeaders; + params?: any; + paramsSerializer?: ParamsSerializerOptions | CustomParamsSerializer; + data?: D; + timeout?: Milliseconds; + timeoutErrorMessage?: string; + withCredentials?: boolean; + adapter?: AxiosAdapterConfig | AxiosAdapterConfig[]; + auth?: AxiosBasicCredentials; + responseType?: ResponseType; + responseEncoding?: responseEncoding | string; + xsrfCookieName?: string; + xsrfHeaderName?: string; + onUploadProgress?: (progressEvent: AxiosProgressEvent) => void; + onDownloadProgress?: (progressEvent: AxiosProgressEvent) => void; + maxContentLength?: number; + validateStatus?: ((status: number) => boolean) | null; + maxBodyLength?: number; + maxRedirects?: number; + maxRate?: number | [MaxUploadRate, MaxDownloadRate]; + beforeRedirect?: (options: Record, responseDetails: {headers: Record}) => void; + socketPath?: string | null; + transport?: any; + httpAgent?: any; + httpsAgent?: any; + proxy?: AxiosProxyConfig | false; + cancelToken?: CancelToken; + decompress?: boolean; + transitional?: TransitionalOptions; + signal?: GenericAbortSignal; + insecureHTTPParser?: boolean; + env?: { + FormData?: new (...args: any[]) => object; + }; + formSerializer?: FormSerializerOptions; + family?: AddressFamily; + lookup?: ((hostname: string, options: object, cb: (err: Error | null, address: LookupAddress | LookupAddress[], family?: AddressFamily) => void) => void) | + ((hostname: string, options: object) => Promise<[address: LookupAddressEntry | LookupAddressEntry[], family?: AddressFamily] | LookupAddress>); + withXSRFToken?: boolean | ((config: InternalAxiosRequestConfig) => boolean | undefined); + } + + // Alias + type RawAxiosRequestConfig = AxiosRequestConfig; + + interface InternalAxiosRequestConfig extends AxiosRequestConfig { + headers: AxiosRequestHeaders; + } + + interface HeadersDefaults { + common: RawAxiosRequestHeaders; + delete: RawAxiosRequestHeaders; + get: RawAxiosRequestHeaders; + head: RawAxiosRequestHeaders; + post: RawAxiosRequestHeaders; + put: RawAxiosRequestHeaders; + patch: RawAxiosRequestHeaders; + options?: RawAxiosRequestHeaders; + purge?: RawAxiosRequestHeaders; + link?: RawAxiosRequestHeaders; + unlink?: RawAxiosRequestHeaders; + } + + interface AxiosDefaults extends Omit, 'headers'> { + headers: HeadersDefaults; + } + + interface CreateAxiosDefaults extends Omit, 'headers'> { + headers?: RawAxiosRequestHeaders | AxiosHeaders | Partial; + } + + interface AxiosResponse { + data: T; + status: number; + statusText: string; + headers: RawAxiosResponseHeaders | AxiosResponseHeaders; + config: InternalAxiosRequestConfig; + request?: any; + } + + type AxiosPromise = Promise>; + + interface CancelStatic { + new (message?: string): Cancel; + } + + interface Cancel { + message: string | undefined; + } + + interface Canceler { + (message?: string, config?: AxiosRequestConfig, request?: any): void; + } + + interface CancelTokenStatic { + new (executor: (cancel: Canceler) => void): CancelToken; + source(): CancelTokenSource; + } + + interface CancelToken { + promise: Promise; + reason?: Cancel; + throwIfRequested(): void; + } + + interface CancelTokenSource { + token: CancelToken; + cancel: Canceler; + } + + interface AxiosInterceptorOptions { + synchronous?: boolean; + runWhen?: (config: InternalAxiosRequestConfig) => boolean; + } + + interface AxiosInterceptorManager { + use(onFulfilled?: (value: V) => V | Promise, onRejected?: (error: any) => any, options?: AxiosInterceptorOptions): number; + eject(id: number): void; + clear(): void; + } + + interface AxiosInstance extends Axios { + , D = any>(config: AxiosRequestConfig): Promise; + , D = any>(url: string, config?: AxiosRequestConfig): Promise; + + defaults: Omit & { + headers: HeadersDefaults & { + [key: string]: AxiosHeaderValue + } + }; + } + + interface GenericFormData { + append(name: string, value: any, options?: any): any; + } + + interface GenericHTMLFormElement { + name: string; + method: string; + submit(): void; + } + + interface AxiosStatic extends AxiosInstance { + create(config?: CreateAxiosDefaults): AxiosInstance; + Cancel: CancelStatic; + CancelToken: CancelTokenStatic; + Axios: typeof Axios; + AxiosError: typeof AxiosError; + CanceledError: typeof CanceledError; + HttpStatusCode: typeof HttpStatusCode; + readonly VERSION: string; + isCancel(value: any): value is Cancel; + all(values: Array>): Promise; + spread(callback: (...args: T[]) => R): (array: T[]) => R; + isAxiosError(payload: any): payload is AxiosError; + toFormData(sourceObj: object, targetFormData?: GenericFormData, options?: FormSerializerOptions): GenericFormData; + formToJSON(form: GenericFormData|GenericHTMLFormElement): object; + getAdapter(adapters: AxiosAdapterConfig | AxiosAdapterConfig[] | undefined): AxiosAdapter; + AxiosHeaders: typeof AxiosHeaders; + } +} + +declare const axios: axios.AxiosStatic; + +export = axios; diff --git a/task/node_modules/axios/index.d.ts b/task/node_modules/axios/index.d.ts new file mode 100644 index 0000000..3a2840b --- /dev/null +++ b/task/node_modules/axios/index.d.ts @@ -0,0 +1,559 @@ +// TypeScript Version: 4.7 +export type AxiosHeaderValue = AxiosHeaders | string | string[] | number | boolean | null; + +interface RawAxiosHeaders { + [key: string]: AxiosHeaderValue; +} + +type MethodsHeaders = Partial<{ + [Key in Method as Lowercase]: AxiosHeaders; +} & {common: AxiosHeaders}>; + +type AxiosHeaderMatcher = string | RegExp | ((this: AxiosHeaders, value: string, name: string) => boolean); + +type AxiosHeaderParser = (this: AxiosHeaders, value: AxiosHeaderValue, header: string) => any; + +export class AxiosHeaders { + constructor( + headers?: RawAxiosHeaders | AxiosHeaders | string + ); + + [key: string]: any; + + set(headerName?: string, value?: AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders; + set(headers?: RawAxiosHeaders | AxiosHeaders | string, rewrite?: boolean): AxiosHeaders; + + get(headerName: string, parser: RegExp): RegExpExecArray | null; + get(headerName: string, matcher?: true | AxiosHeaderParser): AxiosHeaderValue; + + has(header: string, matcher?: AxiosHeaderMatcher): boolean; + + delete(header: string | string[], matcher?: AxiosHeaderMatcher): boolean; + + clear(matcher?: AxiosHeaderMatcher): boolean; + + normalize(format: boolean): AxiosHeaders; + + concat(...targets: Array): AxiosHeaders; + + toJSON(asStrings?: boolean): RawAxiosHeaders; + + static from(thing?: AxiosHeaders | RawAxiosHeaders | string): AxiosHeaders; + + static accessor(header: string | string[]): AxiosHeaders; + + static concat(...targets: Array): AxiosHeaders; + + setContentType(value: ContentType, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders; + getContentType(parser?: RegExp): RegExpExecArray | null; + getContentType(matcher?: AxiosHeaderMatcher): AxiosHeaderValue; + hasContentType(matcher?: AxiosHeaderMatcher): boolean; + + setContentLength(value: AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders; + getContentLength(parser?: RegExp): RegExpExecArray | null; + getContentLength(matcher?: AxiosHeaderMatcher): AxiosHeaderValue; + hasContentLength(matcher?: AxiosHeaderMatcher): boolean; + + setAccept(value: AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders; + getAccept(parser?: RegExp): RegExpExecArray | null; + getAccept(matcher?: AxiosHeaderMatcher): AxiosHeaderValue; + hasAccept(matcher?: AxiosHeaderMatcher): boolean; + + setUserAgent(value: AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders; + getUserAgent(parser?: RegExp): RegExpExecArray | null; + getUserAgent(matcher?: AxiosHeaderMatcher): AxiosHeaderValue; + hasUserAgent(matcher?: AxiosHeaderMatcher): boolean; + + setContentEncoding(value: AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders; + getContentEncoding(parser?: RegExp): RegExpExecArray | null; + getContentEncoding(matcher?: AxiosHeaderMatcher): AxiosHeaderValue; + hasContentEncoding(matcher?: AxiosHeaderMatcher): boolean; + + setAuthorization(value: AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders; + getAuthorization(parser?: RegExp): RegExpExecArray | null; + getAuthorization(matcher?: AxiosHeaderMatcher): AxiosHeaderValue; + hasAuthorization(matcher?: AxiosHeaderMatcher): boolean; + + [Symbol.iterator](): IterableIterator<[string, AxiosHeaderValue]>; +} + +type CommonRequestHeadersList = 'Accept' | 'Content-Length' | 'User-Agent' | 'Content-Encoding' | 'Authorization'; + +type ContentType = AxiosHeaderValue | 'text/html' | 'text/plain' | 'multipart/form-data' | 'application/json' | 'application/x-www-form-urlencoded' | 'application/octet-stream'; + +export type RawAxiosRequestHeaders = Partial; + +export type AxiosRequestHeaders = RawAxiosRequestHeaders & AxiosHeaders; + +type CommonResponseHeadersList = 'Server' | 'Content-Type' | 'Content-Length' | 'Cache-Control'| 'Content-Encoding'; + +type RawCommonResponseHeaders = { + [Key in CommonResponseHeadersList]: AxiosHeaderValue; +} & { + "set-cookie": string[]; +}; + +export type RawAxiosResponseHeaders = Partial; + +export type AxiosResponseHeaders = RawAxiosResponseHeaders & AxiosHeaders; + +export interface AxiosRequestTransformer { + (this: InternalAxiosRequestConfig, data: any, headers: AxiosRequestHeaders): any; +} + +export interface AxiosResponseTransformer { + (this: InternalAxiosRequestConfig, data: any, headers: AxiosResponseHeaders, status?: number): any; +} + +export interface AxiosAdapter { + (config: InternalAxiosRequestConfig): AxiosPromise; +} + +export interface AxiosBasicCredentials { + username: string; + password: string; +} + +export interface AxiosProxyConfig { + host: string; + port: number; + auth?: AxiosBasicCredentials; + protocol?: string; +} + +export enum HttpStatusCode { + Continue = 100, + SwitchingProtocols = 101, + Processing = 102, + EarlyHints = 103, + Ok = 200, + Created = 201, + Accepted = 202, + NonAuthoritativeInformation = 203, + NoContent = 204, + ResetContent = 205, + PartialContent = 206, + MultiStatus = 207, + AlreadyReported = 208, + ImUsed = 226, + MultipleChoices = 300, + MovedPermanently = 301, + Found = 302, + SeeOther = 303, + NotModified = 304, + UseProxy = 305, + Unused = 306, + TemporaryRedirect = 307, + PermanentRedirect = 308, + BadRequest = 400, + Unauthorized = 401, + PaymentRequired = 402, + Forbidden = 403, + NotFound = 404, + MethodNotAllowed = 405, + NotAcceptable = 406, + ProxyAuthenticationRequired = 407, + RequestTimeout = 408, + Conflict = 409, + Gone = 410, + LengthRequired = 411, + PreconditionFailed = 412, + PayloadTooLarge = 413, + UriTooLong = 414, + UnsupportedMediaType = 415, + RangeNotSatisfiable = 416, + ExpectationFailed = 417, + ImATeapot = 418, + MisdirectedRequest = 421, + UnprocessableEntity = 422, + Locked = 423, + FailedDependency = 424, + TooEarly = 425, + UpgradeRequired = 426, + PreconditionRequired = 428, + TooManyRequests = 429, + RequestHeaderFieldsTooLarge = 431, + UnavailableForLegalReasons = 451, + InternalServerError = 500, + NotImplemented = 501, + BadGateway = 502, + ServiceUnavailable = 503, + GatewayTimeout = 504, + HttpVersionNotSupported = 505, + VariantAlsoNegotiates = 506, + InsufficientStorage = 507, + LoopDetected = 508, + NotExtended = 510, + NetworkAuthenticationRequired = 511, +} + +export type Method = + | 'get' | 'GET' + | 'delete' | 'DELETE' + | 'head' | 'HEAD' + | 'options' | 'OPTIONS' + | 'post' | 'POST' + | 'put' | 'PUT' + | 'patch' | 'PATCH' + | 'purge' | 'PURGE' + | 'link' | 'LINK' + | 'unlink' | 'UNLINK'; + +export type ResponseType = + | 'arraybuffer' + | 'blob' + | 'document' + | 'json' + | 'text' + | 'stream'; + +export type responseEncoding = + | 'ascii' | 'ASCII' + | 'ansi' | 'ANSI' + | 'binary' | 'BINARY' + | 'base64' | 'BASE64' + | 'base64url' | 'BASE64URL' + | 'hex' | 'HEX' + | 'latin1' | 'LATIN1' + | 'ucs-2' | 'UCS-2' + | 'ucs2' | 'UCS2' + | 'utf-8' | 'UTF-8' + | 'utf8' | 'UTF8' + | 'utf16le' | 'UTF16LE'; + +export interface TransitionalOptions { + silentJSONParsing?: boolean; + forcedJSONParsing?: boolean; + clarifyTimeoutError?: boolean; +} + +export interface GenericAbortSignal { + readonly aborted: boolean; + onabort?: ((...args: any) => any) | null; + addEventListener?: (...args: any) => any; + removeEventListener?: (...args: any) => any; +} + +export interface FormDataVisitorHelpers { + defaultVisitor: SerializerVisitor; + convertValue: (value: any) => any; + isVisitable: (value: any) => boolean; +} + +export interface SerializerVisitor { + ( + this: GenericFormData, + value: any, + key: string | number, + path: null | Array, + helpers: FormDataVisitorHelpers + ): boolean; +} + +export interface SerializerOptions { + visitor?: SerializerVisitor; + dots?: boolean; + metaTokens?: boolean; + indexes?: boolean | null; +} + +// tslint:disable-next-line +export interface FormSerializerOptions extends SerializerOptions { +} + +export interface ParamEncoder { + (value: any, defaultEncoder: (value: any) => any): any; +} + +export interface CustomParamsSerializer { + (params: Record, options?: ParamsSerializerOptions): string; +} + +export interface ParamsSerializerOptions extends SerializerOptions { + encode?: ParamEncoder; + serialize?: CustomParamsSerializer; +} + +type MaxUploadRate = number; + +type MaxDownloadRate = number; + +type BrowserProgressEvent = any; + +export interface AxiosProgressEvent { + loaded: number; + total?: number; + progress?: number; + bytes: number; + rate?: number; + estimated?: number; + upload?: boolean; + download?: boolean; + event?: BrowserProgressEvent; +} + +type Milliseconds = number; + +type AxiosAdapterName = 'xhr' | 'http' | string; + +type AxiosAdapterConfig = AxiosAdapter | AxiosAdapterName; + +export type AddressFamily = 4 | 6 | undefined; + +export interface LookupAddressEntry { + address: string; + family?: AddressFamily; +} + +export type LookupAddress = string | LookupAddressEntry; + +export interface AxiosRequestConfig { + url?: string; + method?: Method | string; + baseURL?: string; + transformRequest?: AxiosRequestTransformer | AxiosRequestTransformer[]; + transformResponse?: AxiosResponseTransformer | AxiosResponseTransformer[]; + headers?: (RawAxiosRequestHeaders & MethodsHeaders) | AxiosHeaders; + params?: any; + paramsSerializer?: ParamsSerializerOptions | CustomParamsSerializer; + data?: D; + timeout?: Milliseconds; + timeoutErrorMessage?: string; + withCredentials?: boolean; + adapter?: AxiosAdapterConfig | AxiosAdapterConfig[]; + auth?: AxiosBasicCredentials; + responseType?: ResponseType; + responseEncoding?: responseEncoding | string; + xsrfCookieName?: string; + xsrfHeaderName?: string; + onUploadProgress?: (progressEvent: AxiosProgressEvent) => void; + onDownloadProgress?: (progressEvent: AxiosProgressEvent) => void; + maxContentLength?: number; + validateStatus?: ((status: number) => boolean) | null; + maxBodyLength?: number; + maxRedirects?: number; + maxRate?: number | [MaxUploadRate, MaxDownloadRate]; + beforeRedirect?: (options: Record, responseDetails: { headers: Record }) => void; + socketPath?: string | null; + transport?: any; + httpAgent?: any; + httpsAgent?: any; + proxy?: AxiosProxyConfig | false; + cancelToken?: CancelToken; + decompress?: boolean; + transitional?: TransitionalOptions; + signal?: GenericAbortSignal; + insecureHTTPParser?: boolean; + env?: { + FormData?: new (...args: any[]) => object; + }; + formSerializer?: FormSerializerOptions; + family?: AddressFamily; + lookup?: ((hostname: string, options: object, cb: (err: Error | null, address: LookupAddress | LookupAddress[], family?: AddressFamily) => void) => void) | + ((hostname: string, options: object) => Promise<[address: LookupAddressEntry | LookupAddressEntry[], family?: AddressFamily] | LookupAddress>); + withXSRFToken?: boolean | ((config: InternalAxiosRequestConfig) => boolean | undefined); +} + +// Alias +export type RawAxiosRequestConfig = AxiosRequestConfig; + +export interface InternalAxiosRequestConfig extends AxiosRequestConfig { + headers: AxiosRequestHeaders; +} + +export interface HeadersDefaults { + common: RawAxiosRequestHeaders; + delete: RawAxiosRequestHeaders; + get: RawAxiosRequestHeaders; + head: RawAxiosRequestHeaders; + post: RawAxiosRequestHeaders; + put: RawAxiosRequestHeaders; + patch: RawAxiosRequestHeaders; + options?: RawAxiosRequestHeaders; + purge?: RawAxiosRequestHeaders; + link?: RawAxiosRequestHeaders; + unlink?: RawAxiosRequestHeaders; +} + +export interface AxiosDefaults extends Omit, 'headers'> { + headers: HeadersDefaults; +} + +export interface CreateAxiosDefaults extends Omit, 'headers'> { + headers?: RawAxiosRequestHeaders | AxiosHeaders | Partial; +} + +export interface AxiosResponse { + data: T; + status: number; + statusText: string; + headers: RawAxiosResponseHeaders | AxiosResponseHeaders; + config: InternalAxiosRequestConfig; + request?: any; +} + +export class AxiosError extends Error { + constructor( + message?: string, + code?: string, + config?: InternalAxiosRequestConfig, + request?: any, + response?: AxiosResponse + ); + + config?: InternalAxiosRequestConfig; + code?: string; + request?: any; + response?: AxiosResponse; + isAxiosError: boolean; + status?: number; + toJSON: () => object; + cause?: Error; + static from( + error: Error | unknown, + code?: string, + config?: InternalAxiosRequestConfig, + request?: any, + response?: AxiosResponse, + customProps?: object, +): AxiosError; + static readonly ERR_FR_TOO_MANY_REDIRECTS = "ERR_FR_TOO_MANY_REDIRECTS"; + static readonly ERR_BAD_OPTION_VALUE = "ERR_BAD_OPTION_VALUE"; + static readonly ERR_BAD_OPTION = "ERR_BAD_OPTION"; + static readonly ERR_NETWORK = "ERR_NETWORK"; + static readonly ERR_DEPRECATED = "ERR_DEPRECATED"; + static readonly ERR_BAD_RESPONSE = "ERR_BAD_RESPONSE"; + static readonly ERR_BAD_REQUEST = "ERR_BAD_REQUEST"; + static readonly ERR_NOT_SUPPORT = "ERR_NOT_SUPPORT"; + static readonly ERR_INVALID_URL = "ERR_INVALID_URL"; + static readonly ERR_CANCELED = "ERR_CANCELED"; + static readonly ECONNABORTED = "ECONNABORTED"; + static readonly ETIMEDOUT = "ETIMEDOUT"; +} + +export class CanceledError extends AxiosError { +} + +export type AxiosPromise = Promise>; + +export interface CancelStatic { + new (message?: string): Cancel; +} + +export interface Cancel { + message: string | undefined; +} + +export interface Canceler { + (message?: string, config?: AxiosRequestConfig, request?: any): void; +} + +export interface CancelTokenStatic { + new (executor: (cancel: Canceler) => void): CancelToken; + source(): CancelTokenSource; +} + +export interface CancelToken { + promise: Promise; + reason?: Cancel; + throwIfRequested(): void; +} + +export interface CancelTokenSource { + token: CancelToken; + cancel: Canceler; +} + +export interface AxiosInterceptorOptions { + synchronous?: boolean; + runWhen?: (config: InternalAxiosRequestConfig) => boolean; +} + +export interface AxiosInterceptorManager { + use(onFulfilled?: ((value: V) => V | Promise) | null, onRejected?: ((error: any) => any) | null, options?: AxiosInterceptorOptions): number; + eject(id: number): void; + clear(): void; +} + +export class Axios { + constructor(config?: AxiosRequestConfig); + defaults: AxiosDefaults; + interceptors: { + request: AxiosInterceptorManager; + response: AxiosInterceptorManager; + }; + getUri(config?: AxiosRequestConfig): string; + request, D = any>(config: AxiosRequestConfig): Promise; + get, D = any>(url: string, config?: AxiosRequestConfig): Promise; + delete, D = any>(url: string, config?: AxiosRequestConfig): Promise; + head, D = any>(url: string, config?: AxiosRequestConfig): Promise; + options, D = any>(url: string, config?: AxiosRequestConfig): Promise; + post, D = any>(url: string, data?: D, config?: AxiosRequestConfig): Promise; + put, D = any>(url: string, data?: D, config?: AxiosRequestConfig): Promise; + patch, D = any>(url: string, data?: D, config?: AxiosRequestConfig): Promise; + postForm, D = any>(url: string, data?: D, config?: AxiosRequestConfig): Promise; + putForm, D = any>(url: string, data?: D, config?: AxiosRequestConfig): Promise; + patchForm, D = any>(url: string, data?: D, config?: AxiosRequestConfig): Promise; +} + +export interface AxiosInstance extends Axios { + , D = any>(config: AxiosRequestConfig): Promise; + , D = any>(url: string, config?: AxiosRequestConfig): Promise; + + defaults: Omit & { + headers: HeadersDefaults & { + [key: string]: AxiosHeaderValue + } + }; +} + +export interface GenericFormData { + append(name: string, value: any, options?: any): any; +} + +export interface GenericHTMLFormElement { + name: string; + method: string; + submit(): void; +} + +export function getAdapter(adapters: AxiosAdapterConfig | AxiosAdapterConfig[] | undefined): AxiosAdapter; + +export function toFormData(sourceObj: object, targetFormData?: GenericFormData, options?: FormSerializerOptions): GenericFormData; + +export function formToJSON(form: GenericFormData|GenericHTMLFormElement): object; + +export function isAxiosError(payload: any): payload is AxiosError; + +export function spread(callback: (...args: T[]) => R): (array: T[]) => R; + +export function isCancel(value: any): value is Cancel; + +export function all(values: Array>): Promise; + +export interface AxiosStatic extends AxiosInstance { + create(config?: CreateAxiosDefaults): AxiosInstance; + Cancel: CancelStatic; + CancelToken: CancelTokenStatic; + Axios: typeof Axios; + AxiosError: typeof AxiosError; + HttpStatusCode: typeof HttpStatusCode; + readonly VERSION: string; + isCancel: typeof isCancel; + all: typeof all; + spread: typeof spread; + isAxiosError: typeof isAxiosError; + toFormData: typeof toFormData; + formToJSON: typeof formToJSON; + getAdapter: typeof getAdapter; + CanceledError: typeof CanceledError; + AxiosHeaders: typeof AxiosHeaders; +} + +declare const axios: AxiosStatic; + +export default axios; diff --git a/task/node_modules/axios/index.js b/task/node_modules/axios/index.js new file mode 100644 index 0000000..fba3990 --- /dev/null +++ b/task/node_modules/axios/index.js @@ -0,0 +1,43 @@ +import axios from './lib/axios.js'; + +// This module is intended to unwrap Axios default export as named. +// Keep top-level export same with static properties +// so that it can keep same with es module or cjs +const { + Axios, + AxiosError, + CanceledError, + isCancel, + CancelToken, + VERSION, + all, + Cancel, + isAxiosError, + spread, + toFormData, + AxiosHeaders, + HttpStatusCode, + formToJSON, + getAdapter, + mergeConfig +} = axios; + +export { + axios as default, + Axios, + AxiosError, + CanceledError, + isCancel, + CancelToken, + VERSION, + all, + Cancel, + isAxiosError, + spread, + toFormData, + AxiosHeaders, + HttpStatusCode, + formToJSON, + getAdapter, + mergeConfig +} diff --git a/task/node_modules/axios/lib/adapters/README.md b/task/node_modules/axios/lib/adapters/README.md new file mode 100644 index 0000000..68f1118 --- /dev/null +++ b/task/node_modules/axios/lib/adapters/README.md @@ -0,0 +1,37 @@ +# axios // adapters + +The modules under `adapters/` are modules that handle dispatching a request and settling a returned `Promise` once a response is received. + +## Example + +```js +var settle = require('./../core/settle'); + +module.exports = function myAdapter(config) { + // At this point: + // - config has been merged with defaults + // - request transformers have already run + // - request interceptors have already run + + // Make the request using config provided + // Upon response settle the Promise + + return new Promise(function(resolve, reject) { + + var response = { + data: responseData, + status: request.status, + statusText: request.statusText, + headers: responseHeaders, + config: config, + request: request + }; + + settle(resolve, reject, response); + + // From here: + // - response transformers will run + // - response interceptors will run + }); +} +``` diff --git a/task/node_modules/axios/lib/adapters/adapters.js b/task/node_modules/axios/lib/adapters/adapters.js new file mode 100644 index 0000000..550997d --- /dev/null +++ b/task/node_modules/axios/lib/adapters/adapters.js @@ -0,0 +1,77 @@ +import utils from '../utils.js'; +import httpAdapter from './http.js'; +import xhrAdapter from './xhr.js'; +import AxiosError from "../core/AxiosError.js"; + +const knownAdapters = { + http: httpAdapter, + xhr: xhrAdapter +} + +utils.forEach(knownAdapters, (fn, value) => { + if (fn) { + try { + Object.defineProperty(fn, 'name', {value}); + } catch (e) { + // eslint-disable-next-line no-empty + } + Object.defineProperty(fn, 'adapterName', {value}); + } +}); + +const renderReason = (reason) => `- ${reason}`; + +const isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false; + +export default { + getAdapter: (adapters) => { + adapters = utils.isArray(adapters) ? adapters : [adapters]; + + const {length} = adapters; + let nameOrAdapter; + let adapter; + + const rejectedReasons = {}; + + for (let i = 0; i < length; i++) { + nameOrAdapter = adapters[i]; + let id; + + adapter = nameOrAdapter; + + if (!isResolvedHandle(nameOrAdapter)) { + adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()]; + + if (adapter === undefined) { + throw new AxiosError(`Unknown adapter '${id}'`); + } + } + + if (adapter) { + break; + } + + rejectedReasons[id || '#' + i] = adapter; + } + + if (!adapter) { + + const reasons = Object.entries(rejectedReasons) + .map(([id, state]) => `adapter ${id} ` + + (state === false ? 'is not supported by the environment' : 'is not available in the build') + ); + + let s = length ? + (reasons.length > 1 ? 'since :\n' + reasons.map(renderReason).join('\n') : ' ' + renderReason(reasons[0])) : + 'as no adapter specified'; + + throw new AxiosError( + `There is no suitable adapter to dispatch the request ` + s, + 'ERR_NOT_SUPPORT' + ); + } + + return adapter; + }, + adapters: knownAdapters +} diff --git a/task/node_modules/axios/lib/adapters/http.js b/task/node_modules/axios/lib/adapters/http.js new file mode 100755 index 0000000..03f0f96 --- /dev/null +++ b/task/node_modules/axios/lib/adapters/http.js @@ -0,0 +1,681 @@ +'use strict'; + +import utils from './../utils.js'; +import settle from './../core/settle.js'; +import buildFullPath from '../core/buildFullPath.js'; +import buildURL from './../helpers/buildURL.js'; +import {getProxyForUrl} from 'proxy-from-env'; +import http from 'http'; +import https from 'https'; +import util from 'util'; +import followRedirects from 'follow-redirects'; +import zlib from 'zlib'; +import {VERSION} from '../env/data.js'; +import transitionalDefaults from '../defaults/transitional.js'; +import AxiosError from '../core/AxiosError.js'; +import CanceledError from '../cancel/CanceledError.js'; +import platform from '../platform/index.js'; +import fromDataURI from '../helpers/fromDataURI.js'; +import stream from 'stream'; +import AxiosHeaders from '../core/AxiosHeaders.js'; +import AxiosTransformStream from '../helpers/AxiosTransformStream.js'; +import EventEmitter from 'events'; +import formDataToStream from "../helpers/formDataToStream.js"; +import readBlob from "../helpers/readBlob.js"; +import ZlibHeaderTransformStream from '../helpers/ZlibHeaderTransformStream.js'; +import callbackify from "../helpers/callbackify.js"; + +const zlibOptions = { + flush: zlib.constants.Z_SYNC_FLUSH, + finishFlush: zlib.constants.Z_SYNC_FLUSH +}; + +const brotliOptions = { + flush: zlib.constants.BROTLI_OPERATION_FLUSH, + finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH +} + +const isBrotliSupported = utils.isFunction(zlib.createBrotliDecompress); + +const {http: httpFollow, https: httpsFollow} = followRedirects; + +const isHttps = /https:?/; + +const supportedProtocols = platform.protocols.map(protocol => { + return protocol + ':'; +}); + +/** + * If the proxy or config beforeRedirects functions are defined, call them with the options + * object. + * + * @param {Object} options - The options object that was passed to the request. + * + * @returns {Object} + */ +function dispatchBeforeRedirect(options) { + if (options.beforeRedirects.proxy) { + options.beforeRedirects.proxy(options); + } + if (options.beforeRedirects.config) { + options.beforeRedirects.config(options); + } +} + +/** + * If the proxy or config afterRedirects functions are defined, call them with the options + * + * @param {http.ClientRequestArgs} options + * @param {AxiosProxyConfig} configProxy configuration from Axios options object + * @param {string} location + * + * @returns {http.ClientRequestArgs} + */ +function setProxy(options, configProxy, location) { + let proxy = configProxy; + if (!proxy && proxy !== false) { + const proxyUrl = getProxyForUrl(location); + if (proxyUrl) { + proxy = new URL(proxyUrl); + } + } + if (proxy) { + // Basic proxy authorization + if (proxy.username) { + proxy.auth = (proxy.username || '') + ':' + (proxy.password || ''); + } + + if (proxy.auth) { + // Support proxy auth object form + if (proxy.auth.username || proxy.auth.password) { + proxy.auth = (proxy.auth.username || '') + ':' + (proxy.auth.password || ''); + } + const base64 = Buffer + .from(proxy.auth, 'utf8') + .toString('base64'); + options.headers['Proxy-Authorization'] = 'Basic ' + base64; + } + + options.headers.host = options.hostname + (options.port ? ':' + options.port : ''); + const proxyHost = proxy.hostname || proxy.host; + options.hostname = proxyHost; + // Replace 'host' since options is not a URL object + options.host = proxyHost; + options.port = proxy.port; + options.path = location; + if (proxy.protocol) { + options.protocol = proxy.protocol.includes(':') ? proxy.protocol : `${proxy.protocol}:`; + } + } + + options.beforeRedirects.proxy = function beforeRedirect(redirectOptions) { + // Configure proxy for redirected request, passing the original config proxy to apply + // the exact same logic as if the redirected request was performed by axios directly. + setProxy(redirectOptions, configProxy, redirectOptions.href); + }; +} + +const isHttpAdapterSupported = typeof process !== 'undefined' && utils.kindOf(process) === 'process'; + +// temporary hotfix + +const wrapAsync = (asyncExecutor) => { + return new Promise((resolve, reject) => { + let onDone; + let isDone; + + const done = (value, isRejected) => { + if (isDone) return; + isDone = true; + onDone && onDone(value, isRejected); + } + + const _resolve = (value) => { + done(value); + resolve(value); + }; + + const _reject = (reason) => { + done(reason, true); + reject(reason); + } + + asyncExecutor(_resolve, _reject, (onDoneHandler) => (onDone = onDoneHandler)).catch(_reject); + }) +}; + +const resolveFamily = ({address, family}) => { + if (!utils.isString(address)) { + throw TypeError('address must be a string'); + } + return ({ + address, + family: family || (address.indexOf('.') < 0 ? 6 : 4) + }); +} + +const buildAddressEntry = (address, family) => resolveFamily(utils.isObject(address) ? address : {address, family}); + +/*eslint consistent-return:0*/ +export default isHttpAdapterSupported && function httpAdapter(config) { + return wrapAsync(async function dispatchHttpRequest(resolve, reject, onDone) { + let {data, lookup, family} = config; + const {responseType, responseEncoding} = config; + const method = config.method.toUpperCase(); + let isDone; + let rejected = false; + let req; + + if (lookup) { + const _lookup = callbackify(lookup, (value) => utils.isArray(value) ? value : [value]); + // hotfix to support opt.all option which is required for node 20.x + lookup = (hostname, opt, cb) => { + _lookup(hostname, opt, (err, arg0, arg1) => { + const addresses = utils.isArray(arg0) ? arg0.map(addr => buildAddressEntry(addr)) : [buildAddressEntry(arg0, arg1)]; + + opt.all ? cb(err, addresses) : cb(err, addresses[0].address, addresses[0].family); + }); + } + } + + // temporary internal emitter until the AxiosRequest class will be implemented + const emitter = new EventEmitter(); + + const onFinished = () => { + if (config.cancelToken) { + config.cancelToken.unsubscribe(abort); + } + + if (config.signal) { + config.signal.removeEventListener('abort', abort); + } + + emitter.removeAllListeners(); + } + + onDone((value, isRejected) => { + isDone = true; + if (isRejected) { + rejected = true; + onFinished(); + } + }); + + function abort(reason) { + emitter.emit('abort', !reason || reason.type ? new CanceledError(null, config, req) : reason); + } + + emitter.once('abort', reject); + + if (config.cancelToken || config.signal) { + config.cancelToken && config.cancelToken.subscribe(abort); + if (config.signal) { + config.signal.aborted ? abort() : config.signal.addEventListener('abort', abort); + } + } + + // Parse url + const fullPath = buildFullPath(config.baseURL, config.url); + const parsed = new URL(fullPath, 'http://localhost'); + const protocol = parsed.protocol || supportedProtocols[0]; + + if (protocol === 'data:') { + let convertedData; + + if (method !== 'GET') { + return settle(resolve, reject, { + status: 405, + statusText: 'method not allowed', + headers: {}, + config + }); + } + + try { + convertedData = fromDataURI(config.url, responseType === 'blob', { + Blob: config.env && config.env.Blob + }); + } catch (err) { + throw AxiosError.from(err, AxiosError.ERR_BAD_REQUEST, config); + } + + if (responseType === 'text') { + convertedData = convertedData.toString(responseEncoding); + + if (!responseEncoding || responseEncoding === 'utf8') { + convertedData = utils.stripBOM(convertedData); + } + } else if (responseType === 'stream') { + convertedData = stream.Readable.from(convertedData); + } + + return settle(resolve, reject, { + data: convertedData, + status: 200, + statusText: 'OK', + headers: new AxiosHeaders(), + config + }); + } + + if (supportedProtocols.indexOf(protocol) === -1) { + return reject(new AxiosError( + 'Unsupported protocol ' + protocol, + AxiosError.ERR_BAD_REQUEST, + config + )); + } + + const headers = AxiosHeaders.from(config.headers).normalize(); + + // Set User-Agent (required by some servers) + // See https://github.com/axios/axios/issues/69 + // User-Agent is specified; handle case where no UA header is desired + // Only set header if it hasn't been set in config + headers.set('User-Agent', 'axios/' + VERSION, false); + + const onDownloadProgress = config.onDownloadProgress; + const onUploadProgress = config.onUploadProgress; + const maxRate = config.maxRate; + let maxUploadRate = undefined; + let maxDownloadRate = undefined; + + // support for spec compliant FormData objects + if (utils.isSpecCompliantForm(data)) { + const userBoundary = headers.getContentType(/boundary=([-_\w\d]{10,70})/i); + + data = formDataToStream(data, (formHeaders) => { + headers.set(formHeaders); + }, { + tag: `axios-${VERSION}-boundary`, + boundary: userBoundary && userBoundary[1] || undefined + }); + // support for https://www.npmjs.com/package/form-data api + } else if (utils.isFormData(data) && utils.isFunction(data.getHeaders)) { + headers.set(data.getHeaders()); + + if (!headers.hasContentLength()) { + try { + const knownLength = await util.promisify(data.getLength).call(data); + Number.isFinite(knownLength) && knownLength >= 0 && headers.setContentLength(knownLength); + /*eslint no-empty:0*/ + } catch (e) { + } + } + } else if (utils.isBlob(data)) { + data.size && headers.setContentType(data.type || 'application/octet-stream'); + headers.setContentLength(data.size || 0); + data = stream.Readable.from(readBlob(data)); + } else if (data && !utils.isStream(data)) { + if (Buffer.isBuffer(data)) { + // Nothing to do... + } else if (utils.isArrayBuffer(data)) { + data = Buffer.from(new Uint8Array(data)); + } else if (utils.isString(data)) { + data = Buffer.from(data, 'utf-8'); + } else { + return reject(new AxiosError( + 'Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream', + AxiosError.ERR_BAD_REQUEST, + config + )); + } + + // Add Content-Length header if data exists + headers.setContentLength(data.length, false); + + if (config.maxBodyLength > -1 && data.length > config.maxBodyLength) { + return reject(new AxiosError( + 'Request body larger than maxBodyLength limit', + AxiosError.ERR_BAD_REQUEST, + config + )); + } + } + + const contentLength = utils.toFiniteNumber(headers.getContentLength()); + + if (utils.isArray(maxRate)) { + maxUploadRate = maxRate[0]; + maxDownloadRate = maxRate[1]; + } else { + maxUploadRate = maxDownloadRate = maxRate; + } + + if (data && (onUploadProgress || maxUploadRate)) { + if (!utils.isStream(data)) { + data = stream.Readable.from(data, {objectMode: false}); + } + + data = stream.pipeline([data, new AxiosTransformStream({ + length: contentLength, + maxRate: utils.toFiniteNumber(maxUploadRate) + })], utils.noop); + + onUploadProgress && data.on('progress', progress => { + onUploadProgress(Object.assign(progress, { + upload: true + })); + }); + } + + // HTTP basic authentication + let auth = undefined; + if (config.auth) { + const username = config.auth.username || ''; + const password = config.auth.password || ''; + auth = username + ':' + password; + } + + if (!auth && parsed.username) { + const urlUsername = parsed.username; + const urlPassword = parsed.password; + auth = urlUsername + ':' + urlPassword; + } + + auth && headers.delete('authorization'); + + let path; + + try { + path = buildURL( + parsed.pathname + parsed.search, + config.params, + config.paramsSerializer + ).replace(/^\?/, ''); + } catch (err) { + const customErr = new Error(err.message); + customErr.config = config; + customErr.url = config.url; + customErr.exists = true; + return reject(customErr); + } + + headers.set( + 'Accept-Encoding', + 'gzip, compress, deflate' + (isBrotliSupported ? ', br' : ''), false + ); + + const options = { + path, + method: method, + headers: headers.toJSON(), + agents: { http: config.httpAgent, https: config.httpsAgent }, + auth, + protocol, + family, + beforeRedirect: dispatchBeforeRedirect, + beforeRedirects: {} + }; + + // cacheable-lookup integration hotfix + !utils.isUndefined(lookup) && (options.lookup = lookup); + + if (config.socketPath) { + options.socketPath = config.socketPath; + } else { + options.hostname = parsed.hostname; + options.port = parsed.port; + setProxy(options, config.proxy, protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path); + } + + let transport; + const isHttpsRequest = isHttps.test(options.protocol); + options.agent = isHttpsRequest ? config.httpsAgent : config.httpAgent; + if (config.transport) { + transport = config.transport; + } else if (config.maxRedirects === 0) { + transport = isHttpsRequest ? https : http; + } else { + if (config.maxRedirects) { + options.maxRedirects = config.maxRedirects; + } + if (config.beforeRedirect) { + options.beforeRedirects.config = config.beforeRedirect; + } + transport = isHttpsRequest ? httpsFollow : httpFollow; + } + + if (config.maxBodyLength > -1) { + options.maxBodyLength = config.maxBodyLength; + } else { + // follow-redirects does not skip comparison, so it should always succeed for axios -1 unlimited + options.maxBodyLength = Infinity; + } + + if (config.insecureHTTPParser) { + options.insecureHTTPParser = config.insecureHTTPParser; + } + + // Create the request + req = transport.request(options, function handleResponse(res) { + if (req.destroyed) return; + + const streams = [res]; + + const responseLength = +res.headers['content-length']; + + if (onDownloadProgress) { + const transformStream = new AxiosTransformStream({ + length: utils.toFiniteNumber(responseLength), + maxRate: utils.toFiniteNumber(maxDownloadRate) + }); + + onDownloadProgress && transformStream.on('progress', progress => { + onDownloadProgress(Object.assign(progress, { + download: true + })); + }); + + streams.push(transformStream); + } + + // decompress the response body transparently if required + let responseStream = res; + + // return the last request in case of redirects + const lastRequest = res.req || req; + + // if decompress disabled we should not decompress + if (config.decompress !== false && res.headers['content-encoding']) { + // if no content, but headers still say that it is encoded, + // remove the header not confuse downstream operations + if (method === 'HEAD' || res.statusCode === 204) { + delete res.headers['content-encoding']; + } + + switch ((res.headers['content-encoding'] || '').toLowerCase()) { + /*eslint default-case:0*/ + case 'gzip': + case 'x-gzip': + case 'compress': + case 'x-compress': + // add the unzipper to the body stream processing pipeline + streams.push(zlib.createUnzip(zlibOptions)); + + // remove the content-encoding in order to not confuse downstream operations + delete res.headers['content-encoding']; + break; + case 'deflate': + streams.push(new ZlibHeaderTransformStream()); + + // add the unzipper to the body stream processing pipeline + streams.push(zlib.createUnzip(zlibOptions)); + + // remove the content-encoding in order to not confuse downstream operations + delete res.headers['content-encoding']; + break; + case 'br': + if (isBrotliSupported) { + streams.push(zlib.createBrotliDecompress(brotliOptions)); + delete res.headers['content-encoding']; + } + } + } + + responseStream = streams.length > 1 ? stream.pipeline(streams, utils.noop) : streams[0]; + + const offListeners = stream.finished(responseStream, () => { + offListeners(); + onFinished(); + }); + + const response = { + status: res.statusCode, + statusText: res.statusMessage, + headers: new AxiosHeaders(res.headers), + config, + request: lastRequest + }; + + if (responseType === 'stream') { + response.data = responseStream; + settle(resolve, reject, response); + } else { + const responseBuffer = []; + let totalResponseBytes = 0; + + responseStream.on('data', function handleStreamData(chunk) { + responseBuffer.push(chunk); + totalResponseBytes += chunk.length; + + // make sure the content length is not over the maxContentLength if specified + if (config.maxContentLength > -1 && totalResponseBytes > config.maxContentLength) { + // stream.destroy() emit aborted event before calling reject() on Node.js v16 + rejected = true; + responseStream.destroy(); + reject(new AxiosError('maxContentLength size of ' + config.maxContentLength + ' exceeded', + AxiosError.ERR_BAD_RESPONSE, config, lastRequest)); + } + }); + + responseStream.on('aborted', function handlerStreamAborted() { + if (rejected) { + return; + } + + const err = new AxiosError( + 'maxContentLength size of ' + config.maxContentLength + ' exceeded', + AxiosError.ERR_BAD_RESPONSE, + config, + lastRequest + ); + responseStream.destroy(err); + reject(err); + }); + + responseStream.on('error', function handleStreamError(err) { + if (req.destroyed) return; + reject(AxiosError.from(err, null, config, lastRequest)); + }); + + responseStream.on('end', function handleStreamEnd() { + try { + let responseData = responseBuffer.length === 1 ? responseBuffer[0] : Buffer.concat(responseBuffer); + if (responseType !== 'arraybuffer') { + responseData = responseData.toString(responseEncoding); + if (!responseEncoding || responseEncoding === 'utf8') { + responseData = utils.stripBOM(responseData); + } + } + response.data = responseData; + } catch (err) { + return reject(AxiosError.from(err, null, config, response.request, response)); + } + settle(resolve, reject, response); + }); + } + + emitter.once('abort', err => { + if (!responseStream.destroyed) { + responseStream.emit('error', err); + responseStream.destroy(); + } + }); + }); + + emitter.once('abort', err => { + reject(err); + req.destroy(err); + }); + + // Handle errors + req.on('error', function handleRequestError(err) { + // @todo remove + // if (req.aborted && err.code !== AxiosError.ERR_FR_TOO_MANY_REDIRECTS) return; + reject(AxiosError.from(err, null, config, req)); + }); + + // set tcp keep alive to prevent drop connection by peer + req.on('socket', function handleRequestSocket(socket) { + // default interval of sending ack packet is 1 minute + socket.setKeepAlive(true, 1000 * 60); + }); + + // Handle request timeout + if (config.timeout) { + // This is forcing a int timeout to avoid problems if the `req` interface doesn't handle other types. + const timeout = parseInt(config.timeout, 10); + + if (Number.isNaN(timeout)) { + reject(new AxiosError( + 'error trying to parse `config.timeout` to int', + AxiosError.ERR_BAD_OPTION_VALUE, + config, + req + )); + + return; + } + + // Sometime, the response will be very slow, and does not respond, the connect event will be block by event loop system. + // And timer callback will be fired, and abort() will be invoked before connection, then get "socket hang up" and code ECONNRESET. + // At this time, if we have a large number of request, nodejs will hang up some socket on background. and the number will up and up. + // And then these socket which be hang up will devouring CPU little by little. + // ClientRequest.setTimeout will be fired on the specify milliseconds, and can make sure that abort() will be fired after connect. + req.setTimeout(timeout, function handleRequestTimeout() { + if (isDone) return; + let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded'; + const transitional = config.transitional || transitionalDefaults; + if (config.timeoutErrorMessage) { + timeoutErrorMessage = config.timeoutErrorMessage; + } + reject(new AxiosError( + timeoutErrorMessage, + transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED, + config, + req + )); + abort(); + }); + } + + + // Send the request + if (utils.isStream(data)) { + let ended = false; + let errored = false; + + data.on('end', () => { + ended = true; + }); + + data.once('error', err => { + errored = true; + req.destroy(err); + }); + + data.on('close', () => { + if (!ended && !errored) { + abort(new CanceledError('Request stream has been aborted', config, req)); + } + }); + + data.pipe(req); + } else { + req.end(data); + } + }); +} + +export const __setProxy = setProxy; diff --git a/task/node_modules/axios/lib/adapters/xhr.js b/task/node_modules/axios/lib/adapters/xhr.js new file mode 100644 index 0000000..26126b2 --- /dev/null +++ b/task/node_modules/axios/lib/adapters/xhr.js @@ -0,0 +1,260 @@ +'use strict'; + +import utils from './../utils.js'; +import settle from './../core/settle.js'; +import cookies from './../helpers/cookies.js'; +import buildURL from './../helpers/buildURL.js'; +import buildFullPath from '../core/buildFullPath.js'; +import isURLSameOrigin from './../helpers/isURLSameOrigin.js'; +import transitionalDefaults from '../defaults/transitional.js'; +import AxiosError from '../core/AxiosError.js'; +import CanceledError from '../cancel/CanceledError.js'; +import parseProtocol from '../helpers/parseProtocol.js'; +import platform from '../platform/index.js'; +import AxiosHeaders from '../core/AxiosHeaders.js'; +import speedometer from '../helpers/speedometer.js'; + +function progressEventReducer(listener, isDownloadStream) { + let bytesNotified = 0; + const _speedometer = speedometer(50, 250); + + return e => { + const loaded = e.loaded; + const total = e.lengthComputable ? e.total : undefined; + const progressBytes = loaded - bytesNotified; + const rate = _speedometer(progressBytes); + const inRange = loaded <= total; + + bytesNotified = loaded; + + const data = { + loaded, + total, + progress: total ? (loaded / total) : undefined, + bytes: progressBytes, + rate: rate ? rate : undefined, + estimated: rate && total && inRange ? (total - loaded) / rate : undefined, + event: e + }; + + data[isDownloadStream ? 'download' : 'upload'] = true; + + listener(data); + }; +} + +const isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined'; + +export default isXHRAdapterSupported && function (config) { + return new Promise(function dispatchXhrRequest(resolve, reject) { + let requestData = config.data; + const requestHeaders = AxiosHeaders.from(config.headers).normalize(); + let {responseType, withXSRFToken} = config; + let onCanceled; + function done() { + if (config.cancelToken) { + config.cancelToken.unsubscribe(onCanceled); + } + + if (config.signal) { + config.signal.removeEventListener('abort', onCanceled); + } + } + + let contentType; + + if (utils.isFormData(requestData)) { + if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) { + requestHeaders.setContentType(false); // Let the browser set it + } else if ((contentType = requestHeaders.getContentType()) !== false) { + // fix semicolon duplication issue for ReactNative FormData implementation + const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : []; + requestHeaders.setContentType([type || 'multipart/form-data', ...tokens].join('; ')); + } + } + + let request = new XMLHttpRequest(); + + // HTTP basic authentication + if (config.auth) { + const username = config.auth.username || ''; + const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : ''; + requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password)); + } + + const fullPath = buildFullPath(config.baseURL, config.url); + + request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true); + + // Set the request timeout in MS + request.timeout = config.timeout; + + function onloadend() { + if (!request) { + return; + } + // Prepare the response + const responseHeaders = AxiosHeaders.from( + 'getAllResponseHeaders' in request && request.getAllResponseHeaders() + ); + const responseData = !responseType || responseType === 'text' || responseType === 'json' ? + request.responseText : request.response; + const response = { + data: responseData, + status: request.status, + statusText: request.statusText, + headers: responseHeaders, + config, + request + }; + + settle(function _resolve(value) { + resolve(value); + done(); + }, function _reject(err) { + reject(err); + done(); + }, response); + + // Clean up request + request = null; + } + + if ('onloadend' in request) { + // Use onloadend if available + request.onloadend = onloadend; + } else { + // Listen for ready state to emulate onloadend + request.onreadystatechange = function handleLoad() { + if (!request || request.readyState !== 4) { + return; + } + + // The request errored out and we didn't get a response, this will be + // handled by onerror instead + // With one exception: request that using file: protocol, most browsers + // will return status as 0 even though it's a successful request + if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) { + return; + } + // readystate handler is calling before onerror or ontimeout handlers, + // so we should call onloadend on the next 'tick' + setTimeout(onloadend); + }; + } + + // Handle browser request cancellation (as opposed to a manual cancellation) + request.onabort = function handleAbort() { + if (!request) { + return; + } + + reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request)); + + // Clean up request + request = null; + }; + + // Handle low level network errors + request.onerror = function handleError() { + // Real errors are hidden from us by the browser + // onerror should only fire if it's a network error + reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request)); + + // Clean up request + request = null; + }; + + // Handle timeout + request.ontimeout = function handleTimeout() { + let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded'; + const transitional = config.transitional || transitionalDefaults; + if (config.timeoutErrorMessage) { + timeoutErrorMessage = config.timeoutErrorMessage; + } + reject(new AxiosError( + timeoutErrorMessage, + transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED, + config, + request)); + + // Clean up request + request = null; + }; + + // Add xsrf header + // This is only done if running in a standard browser environment. + // Specifically not if we're in a web worker, or react-native. + if(platform.hasStandardBrowserEnv) { + withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(config)); + + if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(fullPath))) { + // Add xsrf header + const xsrfValue = config.xsrfHeaderName && config.xsrfCookieName && cookies.read(config.xsrfCookieName); + + if (xsrfValue) { + requestHeaders.set(config.xsrfHeaderName, xsrfValue); + } + } + } + + // Remove Content-Type if data is undefined + requestData === undefined && requestHeaders.setContentType(null); + + // Add headers to the request + if ('setRequestHeader' in request) { + utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) { + request.setRequestHeader(key, val); + }); + } + + // Add withCredentials to request if needed + if (!utils.isUndefined(config.withCredentials)) { + request.withCredentials = !!config.withCredentials; + } + + // Add responseType to request if needed + if (responseType && responseType !== 'json') { + request.responseType = config.responseType; + } + + // Handle progress if needed + if (typeof config.onDownloadProgress === 'function') { + request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true)); + } + + // Not all browsers support upload events + if (typeof config.onUploadProgress === 'function' && request.upload) { + request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress)); + } + + if (config.cancelToken || config.signal) { + // Handle cancellation + // eslint-disable-next-line func-names + onCanceled = cancel => { + if (!request) { + return; + } + reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel); + request.abort(); + request = null; + }; + + config.cancelToken && config.cancelToken.subscribe(onCanceled); + if (config.signal) { + config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled); + } + } + + const protocol = parseProtocol(fullPath); + + if (protocol && platform.protocols.indexOf(protocol) === -1) { + reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config)); + return; + } + + + // Send the request + request.send(requestData || null); + }); +} diff --git a/task/node_modules/axios/lib/axios.js b/task/node_modules/axios/lib/axios.js new file mode 100644 index 0000000..873f246 --- /dev/null +++ b/task/node_modules/axios/lib/axios.js @@ -0,0 +1,89 @@ +'use strict'; + +import utils from './utils.js'; +import bind from './helpers/bind.js'; +import Axios from './core/Axios.js'; +import mergeConfig from './core/mergeConfig.js'; +import defaults from './defaults/index.js'; +import formDataToJSON from './helpers/formDataToJSON.js'; +import CanceledError from './cancel/CanceledError.js'; +import CancelToken from './cancel/CancelToken.js'; +import isCancel from './cancel/isCancel.js'; +import {VERSION} from './env/data.js'; +import toFormData from './helpers/toFormData.js'; +import AxiosError from './core/AxiosError.js'; +import spread from './helpers/spread.js'; +import isAxiosError from './helpers/isAxiosError.js'; +import AxiosHeaders from "./core/AxiosHeaders.js"; +import adapters from './adapters/adapters.js'; +import HttpStatusCode from './helpers/HttpStatusCode.js'; + +/** + * Create an instance of Axios + * + * @param {Object} defaultConfig The default config for the instance + * + * @returns {Axios} A new instance of Axios + */ +function createInstance(defaultConfig) { + const context = new Axios(defaultConfig); + const instance = bind(Axios.prototype.request, context); + + // Copy axios.prototype to instance + utils.extend(instance, Axios.prototype, context, {allOwnKeys: true}); + + // Copy context to instance + utils.extend(instance, context, null, {allOwnKeys: true}); + + // Factory for creating new instances + instance.create = function create(instanceConfig) { + return createInstance(mergeConfig(defaultConfig, instanceConfig)); + }; + + return instance; +} + +// Create the default instance to be exported +const axios = createInstance(defaults); + +// Expose Axios class to allow class inheritance +axios.Axios = Axios; + +// Expose Cancel & CancelToken +axios.CanceledError = CanceledError; +axios.CancelToken = CancelToken; +axios.isCancel = isCancel; +axios.VERSION = VERSION; +axios.toFormData = toFormData; + +// Expose AxiosError class +axios.AxiosError = AxiosError; + +// alias for CanceledError for backward compatibility +axios.Cancel = axios.CanceledError; + +// Expose all/spread +axios.all = function all(promises) { + return Promise.all(promises); +}; + +axios.spread = spread; + +// Expose isAxiosError +axios.isAxiosError = isAxiosError; + +// Expose mergeConfig +axios.mergeConfig = mergeConfig; + +axios.AxiosHeaders = AxiosHeaders; + +axios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing); + +axios.getAdapter = adapters.getAdapter; + +axios.HttpStatusCode = HttpStatusCode; + +axios.default = axios; + +// this module should only have a default export +export default axios diff --git a/task/node_modules/axios/lib/cancel/CancelToken.js b/task/node_modules/axios/lib/cancel/CancelToken.js new file mode 100644 index 0000000..20d8f68 --- /dev/null +++ b/task/node_modules/axios/lib/cancel/CancelToken.js @@ -0,0 +1,121 @@ +'use strict'; + +import CanceledError from './CanceledError.js'; + +/** + * A `CancelToken` is an object that can be used to request cancellation of an operation. + * + * @param {Function} executor The executor function. + * + * @returns {CancelToken} + */ +class CancelToken { + constructor(executor) { + if (typeof executor !== 'function') { + throw new TypeError('executor must be a function.'); + } + + let resolvePromise; + + this.promise = new Promise(function promiseExecutor(resolve) { + resolvePromise = resolve; + }); + + const token = this; + + // eslint-disable-next-line func-names + this.promise.then(cancel => { + if (!token._listeners) return; + + let i = token._listeners.length; + + while (i-- > 0) { + token._listeners[i](cancel); + } + token._listeners = null; + }); + + // eslint-disable-next-line func-names + this.promise.then = onfulfilled => { + let _resolve; + // eslint-disable-next-line func-names + const promise = new Promise(resolve => { + token.subscribe(resolve); + _resolve = resolve; + }).then(onfulfilled); + + promise.cancel = function reject() { + token.unsubscribe(_resolve); + }; + + return promise; + }; + + executor(function cancel(message, config, request) { + if (token.reason) { + // Cancellation has already been requested + return; + } + + token.reason = new CanceledError(message, config, request); + resolvePromise(token.reason); + }); + } + + /** + * Throws a `CanceledError` if cancellation has been requested. + */ + throwIfRequested() { + if (this.reason) { + throw this.reason; + } + } + + /** + * Subscribe to the cancel signal + */ + + subscribe(listener) { + if (this.reason) { + listener(this.reason); + return; + } + + if (this._listeners) { + this._listeners.push(listener); + } else { + this._listeners = [listener]; + } + } + + /** + * Unsubscribe from the cancel signal + */ + + unsubscribe(listener) { + if (!this._listeners) { + return; + } + const index = this._listeners.indexOf(listener); + if (index !== -1) { + this._listeners.splice(index, 1); + } + } + + /** + * Returns an object that contains a new `CancelToken` and a function that, when called, + * cancels the `CancelToken`. + */ + static source() { + let cancel; + const token = new CancelToken(function executor(c) { + cancel = c; + }); + return { + token, + cancel + }; + } +} + +export default CancelToken; diff --git a/task/node_modules/axios/lib/cancel/CanceledError.js b/task/node_modules/axios/lib/cancel/CanceledError.js new file mode 100644 index 0000000..880066e --- /dev/null +++ b/task/node_modules/axios/lib/cancel/CanceledError.js @@ -0,0 +1,25 @@ +'use strict'; + +import AxiosError from '../core/AxiosError.js'; +import utils from '../utils.js'; + +/** + * A `CanceledError` is an object that is thrown when an operation is canceled. + * + * @param {string=} message The message. + * @param {Object=} config The config. + * @param {Object=} request The request. + * + * @returns {CanceledError} The created error. + */ +function CanceledError(message, config, request) { + // eslint-disable-next-line no-eq-null,eqeqeq + AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request); + this.name = 'CanceledError'; +} + +utils.inherits(CanceledError, AxiosError, { + __CANCEL__: true +}); + +export default CanceledError; diff --git a/task/node_modules/axios/lib/cancel/isCancel.js b/task/node_modules/axios/lib/cancel/isCancel.js new file mode 100644 index 0000000..a444a12 --- /dev/null +++ b/task/node_modules/axios/lib/cancel/isCancel.js @@ -0,0 +1,5 @@ +'use strict'; + +export default function isCancel(value) { + return !!(value && value.__CANCEL__); +} diff --git a/task/node_modules/axios/lib/core/Axios.js b/task/node_modules/axios/lib/core/Axios.js new file mode 100644 index 0000000..465d765 --- /dev/null +++ b/task/node_modules/axios/lib/core/Axios.js @@ -0,0 +1,201 @@ +'use strict'; + +import utils from './../utils.js'; +import buildURL from '../helpers/buildURL.js'; +import InterceptorManager from './InterceptorManager.js'; +import dispatchRequest from './dispatchRequest.js'; +import mergeConfig from './mergeConfig.js'; +import buildFullPath from './buildFullPath.js'; +import validator from '../helpers/validator.js'; +import AxiosHeaders from './AxiosHeaders.js'; + +const validators = validator.validators; + +/** + * Create a new instance of Axios + * + * @param {Object} instanceConfig The default config for the instance + * + * @return {Axios} A new instance of Axios + */ +class Axios { + constructor(instanceConfig) { + this.defaults = instanceConfig; + this.interceptors = { + request: new InterceptorManager(), + response: new InterceptorManager() + }; + } + + /** + * Dispatch a request + * + * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults) + * @param {?Object} config + * + * @returns {Promise} The Promise to be fulfilled + */ + request(configOrUrl, config) { + /*eslint no-param-reassign:0*/ + // Allow for axios('example/url'[, config]) a la fetch API + if (typeof configOrUrl === 'string') { + config = config || {}; + config.url = configOrUrl; + } else { + config = configOrUrl || {}; + } + + config = mergeConfig(this.defaults, config); + + const {transitional, paramsSerializer, headers} = config; + + if (transitional !== undefined) { + validator.assertOptions(transitional, { + silentJSONParsing: validators.transitional(validators.boolean), + forcedJSONParsing: validators.transitional(validators.boolean), + clarifyTimeoutError: validators.transitional(validators.boolean) + }, false); + } + + if (paramsSerializer != null) { + if (utils.isFunction(paramsSerializer)) { + config.paramsSerializer = { + serialize: paramsSerializer + } + } else { + validator.assertOptions(paramsSerializer, { + encode: validators.function, + serialize: validators.function + }, true); + } + } + + // Set config.method + config.method = (config.method || this.defaults.method || 'get').toLowerCase(); + + // Flatten headers + let contextHeaders = headers && utils.merge( + headers.common, + headers[config.method] + ); + + headers && utils.forEach( + ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], + (method) => { + delete headers[method]; + } + ); + + config.headers = AxiosHeaders.concat(contextHeaders, headers); + + // filter out skipped interceptors + const requestInterceptorChain = []; + let synchronousRequestInterceptors = true; + this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { + if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) { + return; + } + + synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous; + + requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected); + }); + + const responseInterceptorChain = []; + this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { + responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected); + }); + + let promise; + let i = 0; + let len; + + if (!synchronousRequestInterceptors) { + const chain = [dispatchRequest.bind(this), undefined]; + chain.unshift.apply(chain, requestInterceptorChain); + chain.push.apply(chain, responseInterceptorChain); + len = chain.length; + + promise = Promise.resolve(config); + + while (i < len) { + promise = promise.then(chain[i++], chain[i++]); + } + + return promise; + } + + len = requestInterceptorChain.length; + + let newConfig = config; + + i = 0; + + while (i < len) { + const onFulfilled = requestInterceptorChain[i++]; + const onRejected = requestInterceptorChain[i++]; + try { + newConfig = onFulfilled(newConfig); + } catch (error) { + onRejected.call(this, error); + break; + } + } + + try { + promise = dispatchRequest.call(this, newConfig); + } catch (error) { + return Promise.reject(error); + } + + i = 0; + len = responseInterceptorChain.length; + + while (i < len) { + promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]); + } + + return promise; + } + + getUri(config) { + config = mergeConfig(this.defaults, config); + const fullPath = buildFullPath(config.baseURL, config.url); + return buildURL(fullPath, config.params, config.paramsSerializer); + } +} + +// Provide aliases for supported request methods +utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { + /*eslint func-names:0*/ + Axios.prototype[method] = function(url, config) { + return this.request(mergeConfig(config || {}, { + method, + url, + data: (config || {}).data + })); + }; +}); + +utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { + /*eslint func-names:0*/ + + function generateHTTPMethod(isForm) { + return function httpMethod(url, data, config) { + return this.request(mergeConfig(config || {}, { + method, + headers: isForm ? { + 'Content-Type': 'multipart/form-data' + } : {}, + url, + data + })); + }; + } + + Axios.prototype[method] = generateHTTPMethod(); + + Axios.prototype[method + 'Form'] = generateHTTPMethod(true); +}); + +export default Axios; diff --git a/task/node_modules/axios/lib/core/AxiosError.js b/task/node_modules/axios/lib/core/AxiosError.js new file mode 100644 index 0000000..7141a8c --- /dev/null +++ b/task/node_modules/axios/lib/core/AxiosError.js @@ -0,0 +1,100 @@ +'use strict'; + +import utils from '../utils.js'; + +/** + * Create an Error with the specified message, config, error code, request and response. + * + * @param {string} message The error message. + * @param {string} [code] The error code (for example, 'ECONNABORTED'). + * @param {Object} [config] The config. + * @param {Object} [request] The request. + * @param {Object} [response] The response. + * + * @returns {Error} The created error. + */ +function AxiosError(message, code, config, request, response) { + Error.call(this); + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } else { + this.stack = (new Error()).stack; + } + + this.message = message; + this.name = 'AxiosError'; + code && (this.code = code); + config && (this.config = config); + request && (this.request = request); + response && (this.response = response); +} + +utils.inherits(AxiosError, Error, { + toJSON: function toJSON() { + return { + // Standard + message: this.message, + name: this.name, + // Microsoft + description: this.description, + number: this.number, + // Mozilla + fileName: this.fileName, + lineNumber: this.lineNumber, + columnNumber: this.columnNumber, + stack: this.stack, + // Axios + config: utils.toJSONObject(this.config), + code: this.code, + status: this.response && this.response.status ? this.response.status : null + }; + } +}); + +const prototype = AxiosError.prototype; +const descriptors = {}; + +[ + 'ERR_BAD_OPTION_VALUE', + 'ERR_BAD_OPTION', + 'ECONNABORTED', + 'ETIMEDOUT', + 'ERR_NETWORK', + 'ERR_FR_TOO_MANY_REDIRECTS', + 'ERR_DEPRECATED', + 'ERR_BAD_RESPONSE', + 'ERR_BAD_REQUEST', + 'ERR_CANCELED', + 'ERR_NOT_SUPPORT', + 'ERR_INVALID_URL' +// eslint-disable-next-line func-names +].forEach(code => { + descriptors[code] = {value: code}; +}); + +Object.defineProperties(AxiosError, descriptors); +Object.defineProperty(prototype, 'isAxiosError', {value: true}); + +// eslint-disable-next-line func-names +AxiosError.from = (error, code, config, request, response, customProps) => { + const axiosError = Object.create(prototype); + + utils.toFlatObject(error, axiosError, function filter(obj) { + return obj !== Error.prototype; + }, prop => { + return prop !== 'isAxiosError'; + }); + + AxiosError.call(axiosError, error.message, code, config, request, response); + + axiosError.cause = error; + + axiosError.name = error.name; + + customProps && Object.assign(axiosError, customProps); + + return axiosError; +}; + +export default AxiosError; diff --git a/task/node_modules/axios/lib/core/AxiosHeaders.js b/task/node_modules/axios/lib/core/AxiosHeaders.js new file mode 100644 index 0000000..558ad8f --- /dev/null +++ b/task/node_modules/axios/lib/core/AxiosHeaders.js @@ -0,0 +1,298 @@ +'use strict'; + +import utils from '../utils.js'; +import parseHeaders from '../helpers/parseHeaders.js'; + +const $internals = Symbol('internals'); + +function normalizeHeader(header) { + return header && String(header).trim().toLowerCase(); +} + +function normalizeValue(value) { + if (value === false || value == null) { + return value; + } + + return utils.isArray(value) ? value.map(normalizeValue) : String(value); +} + +function parseTokens(str) { + const tokens = Object.create(null); + const tokensRE = /([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g; + let match; + + while ((match = tokensRE.exec(str))) { + tokens[match[1]] = match[2]; + } + + return tokens; +} + +const isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim()); + +function matchHeaderValue(context, value, header, filter, isHeaderNameFilter) { + if (utils.isFunction(filter)) { + return filter.call(this, value, header); + } + + if (isHeaderNameFilter) { + value = header; + } + + if (!utils.isString(value)) return; + + if (utils.isString(filter)) { + return value.indexOf(filter) !== -1; + } + + if (utils.isRegExp(filter)) { + return filter.test(value); + } +} + +function formatHeader(header) { + return header.trim() + .toLowerCase().replace(/([a-z\d])(\w*)/g, (w, char, str) => { + return char.toUpperCase() + str; + }); +} + +function buildAccessors(obj, header) { + const accessorName = utils.toCamelCase(' ' + header); + + ['get', 'set', 'has'].forEach(methodName => { + Object.defineProperty(obj, methodName + accessorName, { + value: function(arg1, arg2, arg3) { + return this[methodName].call(this, header, arg1, arg2, arg3); + }, + configurable: true + }); + }); +} + +class AxiosHeaders { + constructor(headers) { + headers && this.set(headers); + } + + set(header, valueOrRewrite, rewrite) { + const self = this; + + function setHeader(_value, _header, _rewrite) { + const lHeader = normalizeHeader(_header); + + if (!lHeader) { + throw new Error('header name must be a non-empty string'); + } + + const key = utils.findKey(self, lHeader); + + if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) { + self[key || _header] = normalizeValue(_value); + } + } + + const setHeaders = (headers, _rewrite) => + utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite)); + + if (utils.isPlainObject(header) || header instanceof this.constructor) { + setHeaders(header, valueOrRewrite) + } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) { + setHeaders(parseHeaders(header), valueOrRewrite); + } else { + header != null && setHeader(valueOrRewrite, header, rewrite); + } + + return this; + } + + get(header, parser) { + header = normalizeHeader(header); + + if (header) { + const key = utils.findKey(this, header); + + if (key) { + const value = this[key]; + + if (!parser) { + return value; + } + + if (parser === true) { + return parseTokens(value); + } + + if (utils.isFunction(parser)) { + return parser.call(this, value, key); + } + + if (utils.isRegExp(parser)) { + return parser.exec(value); + } + + throw new TypeError('parser must be boolean|regexp|function'); + } + } + } + + has(header, matcher) { + header = normalizeHeader(header); + + if (header) { + const key = utils.findKey(this, header); + + return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher))); + } + + return false; + } + + delete(header, matcher) { + const self = this; + let deleted = false; + + function deleteHeader(_header) { + _header = normalizeHeader(_header); + + if (_header) { + const key = utils.findKey(self, _header); + + if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) { + delete self[key]; + + deleted = true; + } + } + } + + if (utils.isArray(header)) { + header.forEach(deleteHeader); + } else { + deleteHeader(header); + } + + return deleted; + } + + clear(matcher) { + const keys = Object.keys(this); + let i = keys.length; + let deleted = false; + + while (i--) { + const key = keys[i]; + if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) { + delete this[key]; + deleted = true; + } + } + + return deleted; + } + + normalize(format) { + const self = this; + const headers = {}; + + utils.forEach(this, (value, header) => { + const key = utils.findKey(headers, header); + + if (key) { + self[key] = normalizeValue(value); + delete self[header]; + return; + } + + const normalized = format ? formatHeader(header) : String(header).trim(); + + if (normalized !== header) { + delete self[header]; + } + + self[normalized] = normalizeValue(value); + + headers[normalized] = true; + }); + + return this; + } + + concat(...targets) { + return this.constructor.concat(this, ...targets); + } + + toJSON(asStrings) { + const obj = Object.create(null); + + utils.forEach(this, (value, header) => { + value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value); + }); + + return obj; + } + + [Symbol.iterator]() { + return Object.entries(this.toJSON())[Symbol.iterator](); + } + + toString() { + return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\n'); + } + + get [Symbol.toStringTag]() { + return 'AxiosHeaders'; + } + + static from(thing) { + return thing instanceof this ? thing : new this(thing); + } + + static concat(first, ...targets) { + const computed = new this(first); + + targets.forEach((target) => computed.set(target)); + + return computed; + } + + static accessor(header) { + const internals = this[$internals] = (this[$internals] = { + accessors: {} + }); + + const accessors = internals.accessors; + const prototype = this.prototype; + + function defineAccessor(_header) { + const lHeader = normalizeHeader(_header); + + if (!accessors[lHeader]) { + buildAccessors(prototype, _header); + accessors[lHeader] = true; + } + } + + utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header); + + return this; + } +} + +AxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']); + +// reserved names hotfix +utils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => { + let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set` + return { + get: () => value, + set(headerValue) { + this[mapped] = headerValue; + } + } +}); + +utils.freezeMethods(AxiosHeaders); + +export default AxiosHeaders; diff --git a/task/node_modules/axios/lib/core/InterceptorManager.js b/task/node_modules/axios/lib/core/InterceptorManager.js new file mode 100644 index 0000000..6657a9d --- /dev/null +++ b/task/node_modules/axios/lib/core/InterceptorManager.js @@ -0,0 +1,71 @@ +'use strict'; + +import utils from './../utils.js'; + +class InterceptorManager { + constructor() { + this.handlers = []; + } + + /** + * Add a new interceptor to the stack + * + * @param {Function} fulfilled The function to handle `then` for a `Promise` + * @param {Function} rejected The function to handle `reject` for a `Promise` + * + * @return {Number} An ID used to remove interceptor later + */ + use(fulfilled, rejected, options) { + this.handlers.push({ + fulfilled, + rejected, + synchronous: options ? options.synchronous : false, + runWhen: options ? options.runWhen : null + }); + return this.handlers.length - 1; + } + + /** + * Remove an interceptor from the stack + * + * @param {Number} id The ID that was returned by `use` + * + * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise + */ + eject(id) { + if (this.handlers[id]) { + this.handlers[id] = null; + } + } + + /** + * Clear all interceptors from the stack + * + * @returns {void} + */ + clear() { + if (this.handlers) { + this.handlers = []; + } + } + + /** + * Iterate over all the registered interceptors + * + * This method is particularly useful for skipping over any + * interceptors that may have become `null` calling `eject`. + * + * @param {Function} fn The function to call for each interceptor + * + * @returns {void} + */ + forEach(fn) { + utils.forEach(this.handlers, function forEachHandler(h) { + if (h !== null) { + fn(h); + } + }); + } +} + +export default InterceptorManager; diff --git a/task/node_modules/axios/lib/core/README.md b/task/node_modules/axios/lib/core/README.md new file mode 100644 index 0000000..84559ce --- /dev/null +++ b/task/node_modules/axios/lib/core/README.md @@ -0,0 +1,8 @@ +# axios // core + +The modules found in `core/` should be modules that are specific to the domain logic of axios. These modules would most likely not make sense to be consumed outside of the axios module, as their logic is too specific. Some examples of core modules are: + +- Dispatching requests + - Requests sent via `adapters/` (see lib/adapters/README.md) +- Managing interceptors +- Handling config diff --git a/task/node_modules/axios/lib/core/buildFullPath.js b/task/node_modules/axios/lib/core/buildFullPath.js new file mode 100644 index 0000000..b60927c --- /dev/null +++ b/task/node_modules/axios/lib/core/buildFullPath.js @@ -0,0 +1,21 @@ +'use strict'; + +import isAbsoluteURL from '../helpers/isAbsoluteURL.js'; +import combineURLs from '../helpers/combineURLs.js'; + +/** + * Creates a new URL by combining the baseURL with the requestedURL, + * only when the requestedURL is not already an absolute URL. + * If the requestURL is absolute, this function returns the requestedURL untouched. + * + * @param {string} baseURL The base URL + * @param {string} requestedURL Absolute or relative URL to combine + * + * @returns {string} The combined full path + */ +export default function buildFullPath(baseURL, requestedURL) { + if (baseURL && !isAbsoluteURL(requestedURL)) { + return combineURLs(baseURL, requestedURL); + } + return requestedURL; +} diff --git a/task/node_modules/axios/lib/core/dispatchRequest.js b/task/node_modules/axios/lib/core/dispatchRequest.js new file mode 100644 index 0000000..9e306aa --- /dev/null +++ b/task/node_modules/axios/lib/core/dispatchRequest.js @@ -0,0 +1,81 @@ +'use strict'; + +import transformData from './transformData.js'; +import isCancel from '../cancel/isCancel.js'; +import defaults from '../defaults/index.js'; +import CanceledError from '../cancel/CanceledError.js'; +import AxiosHeaders from '../core/AxiosHeaders.js'; +import adapters from "../adapters/adapters.js"; + +/** + * Throws a `CanceledError` if cancellation has been requested. + * + * @param {Object} config The config that is to be used for the request + * + * @returns {void} + */ +function throwIfCancellationRequested(config) { + if (config.cancelToken) { + config.cancelToken.throwIfRequested(); + } + + if (config.signal && config.signal.aborted) { + throw new CanceledError(null, config); + } +} + +/** + * Dispatch a request to the server using the configured adapter. + * + * @param {object} config The config that is to be used for the request + * + * @returns {Promise} The Promise to be fulfilled + */ +export default function dispatchRequest(config) { + throwIfCancellationRequested(config); + + config.headers = AxiosHeaders.from(config.headers); + + // Transform request data + config.data = transformData.call( + config, + config.transformRequest + ); + + if (['post', 'put', 'patch'].indexOf(config.method) !== -1) { + config.headers.setContentType('application/x-www-form-urlencoded', false); + } + + const adapter = adapters.getAdapter(config.adapter || defaults.adapter); + + return adapter(config).then(function onAdapterResolution(response) { + throwIfCancellationRequested(config); + + // Transform response data + response.data = transformData.call( + config, + config.transformResponse, + response + ); + + response.headers = AxiosHeaders.from(response.headers); + + return response; + }, function onAdapterRejection(reason) { + if (!isCancel(reason)) { + throwIfCancellationRequested(config); + + // Transform response data + if (reason && reason.response) { + reason.response.data = transformData.call( + config, + config.transformResponse, + reason.response + ); + reason.response.headers = AxiosHeaders.from(reason.response.headers); + } + } + + return Promise.reject(reason); + }); +} diff --git a/task/node_modules/axios/lib/core/mergeConfig.js b/task/node_modules/axios/lib/core/mergeConfig.js new file mode 100644 index 0000000..bbbf96d --- /dev/null +++ b/task/node_modules/axios/lib/core/mergeConfig.js @@ -0,0 +1,106 @@ +'use strict'; + +import utils from '../utils.js'; +import AxiosHeaders from "./AxiosHeaders.js"; + +const headersToObject = (thing) => thing instanceof AxiosHeaders ? thing.toJSON() : thing; + +/** + * Config-specific merge-function which creates a new config-object + * by merging two configuration objects together. + * + * @param {Object} config1 + * @param {Object} config2 + * + * @returns {Object} New object resulting from merging config2 to config1 + */ +export default function mergeConfig(config1, config2) { + // eslint-disable-next-line no-param-reassign + config2 = config2 || {}; + const config = {}; + + function getMergedValue(target, source, caseless) { + if (utils.isPlainObject(target) && utils.isPlainObject(source)) { + return utils.merge.call({caseless}, target, source); + } else if (utils.isPlainObject(source)) { + return utils.merge({}, source); + } else if (utils.isArray(source)) { + return source.slice(); + } + return source; + } + + // eslint-disable-next-line consistent-return + function mergeDeepProperties(a, b, caseless) { + if (!utils.isUndefined(b)) { + return getMergedValue(a, b, caseless); + } else if (!utils.isUndefined(a)) { + return getMergedValue(undefined, a, caseless); + } + } + + // eslint-disable-next-line consistent-return + function valueFromConfig2(a, b) { + if (!utils.isUndefined(b)) { + return getMergedValue(undefined, b); + } + } + + // eslint-disable-next-line consistent-return + function defaultToConfig2(a, b) { + if (!utils.isUndefined(b)) { + return getMergedValue(undefined, b); + } else if (!utils.isUndefined(a)) { + return getMergedValue(undefined, a); + } + } + + // eslint-disable-next-line consistent-return + function mergeDirectKeys(a, b, prop) { + if (prop in config2) { + return getMergedValue(a, b); + } else if (prop in config1) { + return getMergedValue(undefined, a); + } + } + + const mergeMap = { + url: valueFromConfig2, + method: valueFromConfig2, + data: valueFromConfig2, + baseURL: defaultToConfig2, + transformRequest: defaultToConfig2, + transformResponse: defaultToConfig2, + paramsSerializer: defaultToConfig2, + timeout: defaultToConfig2, + timeoutMessage: defaultToConfig2, + withCredentials: defaultToConfig2, + withXSRFToken: defaultToConfig2, + adapter: defaultToConfig2, + responseType: defaultToConfig2, + xsrfCookieName: defaultToConfig2, + xsrfHeaderName: defaultToConfig2, + onUploadProgress: defaultToConfig2, + onDownloadProgress: defaultToConfig2, + decompress: defaultToConfig2, + maxContentLength: defaultToConfig2, + maxBodyLength: defaultToConfig2, + beforeRedirect: defaultToConfig2, + transport: defaultToConfig2, + httpAgent: defaultToConfig2, + httpsAgent: defaultToConfig2, + cancelToken: defaultToConfig2, + socketPath: defaultToConfig2, + responseEncoding: defaultToConfig2, + validateStatus: mergeDirectKeys, + headers: (a, b) => mergeDeepProperties(headersToObject(a), headersToObject(b), true) + }; + + utils.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) { + const merge = mergeMap[prop] || mergeDeepProperties; + const configValue = merge(config1[prop], config2[prop], prop); + (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue); + }); + + return config; +} diff --git a/task/node_modules/axios/lib/core/settle.js b/task/node_modules/axios/lib/core/settle.js new file mode 100644 index 0000000..ac905c4 --- /dev/null +++ b/task/node_modules/axios/lib/core/settle.js @@ -0,0 +1,27 @@ +'use strict'; + +import AxiosError from './AxiosError.js'; + +/** + * Resolve or reject a Promise based on response status. + * + * @param {Function} resolve A function that resolves the promise. + * @param {Function} reject A function that rejects the promise. + * @param {object} response The response. + * + * @returns {object} The response. + */ +export default function settle(resolve, reject, response) { + const validateStatus = response.config.validateStatus; + if (!response.status || !validateStatus || validateStatus(response.status)) { + resolve(response); + } else { + reject(new AxiosError( + 'Request failed with status code ' + response.status, + [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4], + response.config, + response.request, + response + )); + } +} diff --git a/task/node_modules/axios/lib/core/transformData.js b/task/node_modules/axios/lib/core/transformData.js new file mode 100644 index 0000000..eeb5a8a --- /dev/null +++ b/task/node_modules/axios/lib/core/transformData.js @@ -0,0 +1,28 @@ +'use strict'; + +import utils from './../utils.js'; +import defaults from '../defaults/index.js'; +import AxiosHeaders from '../core/AxiosHeaders.js'; + +/** + * Transform the data for a request or a response + * + * @param {Array|Function} fns A single function or Array of functions + * @param {?Object} response The response object + * + * @returns {*} The resulting transformed data + */ +export default function transformData(fns, response) { + const config = this || defaults; + const context = response || config; + const headers = AxiosHeaders.from(context.headers); + let data = context.data; + + utils.forEach(fns, function transform(fn) { + data = fn.call(config, data, headers.normalize(), response ? response.status : undefined); + }); + + headers.normalize(); + + return data; +} diff --git a/task/node_modules/axios/lib/defaults/index.js b/task/node_modules/axios/lib/defaults/index.js new file mode 100644 index 0000000..a883bfe --- /dev/null +++ b/task/node_modules/axios/lib/defaults/index.js @@ -0,0 +1,159 @@ +'use strict'; + +import utils from '../utils.js'; +import AxiosError from '../core/AxiosError.js'; +import transitionalDefaults from './transitional.js'; +import toFormData from '../helpers/toFormData.js'; +import toURLEncodedForm from '../helpers/toURLEncodedForm.js'; +import platform from '../platform/index.js'; +import formDataToJSON from '../helpers/formDataToJSON.js'; + +/** + * It takes a string, tries to parse it, and if it fails, it returns the stringified version + * of the input + * + * @param {any} rawValue - The value to be stringified. + * @param {Function} parser - A function that parses a string into a JavaScript object. + * @param {Function} encoder - A function that takes a value and returns a string. + * + * @returns {string} A stringified version of the rawValue. + */ +function stringifySafely(rawValue, parser, encoder) { + if (utils.isString(rawValue)) { + try { + (parser || JSON.parse)(rawValue); + return utils.trim(rawValue); + } catch (e) { + if (e.name !== 'SyntaxError') { + throw e; + } + } + } + + return (encoder || JSON.stringify)(rawValue); +} + +const defaults = { + + transitional: transitionalDefaults, + + adapter: ['xhr', 'http'], + + transformRequest: [function transformRequest(data, headers) { + const contentType = headers.getContentType() || ''; + const hasJSONContentType = contentType.indexOf('application/json') > -1; + const isObjectPayload = utils.isObject(data); + + if (isObjectPayload && utils.isHTMLForm(data)) { + data = new FormData(data); + } + + const isFormData = utils.isFormData(data); + + if (isFormData) { + if (!hasJSONContentType) { + return data; + } + return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data; + } + + if (utils.isArrayBuffer(data) || + utils.isBuffer(data) || + utils.isStream(data) || + utils.isFile(data) || + utils.isBlob(data) + ) { + return data; + } + if (utils.isArrayBufferView(data)) { + return data.buffer; + } + if (utils.isURLSearchParams(data)) { + headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false); + return data.toString(); + } + + let isFileList; + + if (isObjectPayload) { + if (contentType.indexOf('application/x-www-form-urlencoded') > -1) { + return toURLEncodedForm(data, this.formSerializer).toString(); + } + + if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) { + const _FormData = this.env && this.env.FormData; + + return toFormData( + isFileList ? {'files[]': data} : data, + _FormData && new _FormData(), + this.formSerializer + ); + } + } + + if (isObjectPayload || hasJSONContentType ) { + headers.setContentType('application/json', false); + return stringifySafely(data); + } + + return data; + }], + + transformResponse: [function transformResponse(data) { + const transitional = this.transitional || defaults.transitional; + const forcedJSONParsing = transitional && transitional.forcedJSONParsing; + const JSONRequested = this.responseType === 'json'; + + if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) { + const silentJSONParsing = transitional && transitional.silentJSONParsing; + const strictJSONParsing = !silentJSONParsing && JSONRequested; + + try { + return JSON.parse(data); + } catch (e) { + if (strictJSONParsing) { + if (e.name === 'SyntaxError') { + throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response); + } + throw e; + } + } + } + + return data; + }], + + /** + * A timeout in milliseconds to abort a request. If set to 0 (default) a + * timeout is not created. + */ + timeout: 0, + + xsrfCookieName: 'XSRF-TOKEN', + xsrfHeaderName: 'X-XSRF-TOKEN', + + maxContentLength: -1, + maxBodyLength: -1, + + env: { + FormData: platform.classes.FormData, + Blob: platform.classes.Blob + }, + + validateStatus: function validateStatus(status) { + return status >= 200 && status < 300; + }, + + headers: { + common: { + 'Accept': 'application/json, text/plain, */*', + 'Content-Type': undefined + } + } +}; + +utils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => { + defaults.headers[method] = {}; +}); + +export default defaults; diff --git a/task/node_modules/axios/lib/defaults/transitional.js b/task/node_modules/axios/lib/defaults/transitional.js new file mode 100644 index 0000000..f891331 --- /dev/null +++ b/task/node_modules/axios/lib/defaults/transitional.js @@ -0,0 +1,7 @@ +'use strict'; + +export default { + silentJSONParsing: true, + forcedJSONParsing: true, + clarifyTimeoutError: false +}; diff --git a/task/node_modules/axios/lib/env/README.md b/task/node_modules/axios/lib/env/README.md new file mode 100644 index 0000000..b41baff --- /dev/null +++ b/task/node_modules/axios/lib/env/README.md @@ -0,0 +1,3 @@ +# axios // env + +The `data.js` file is updated automatically when the package version is upgrading. Please do not edit it manually. diff --git a/task/node_modules/axios/lib/env/classes/FormData.js b/task/node_modules/axios/lib/env/classes/FormData.js new file mode 100644 index 0000000..862adb9 --- /dev/null +++ b/task/node_modules/axios/lib/env/classes/FormData.js @@ -0,0 +1,2 @@ +import _FormData from 'form-data'; +export default typeof FormData !== 'undefined' ? FormData : _FormData; diff --git a/task/node_modules/axios/lib/env/data.js b/task/node_modules/axios/lib/env/data.js new file mode 100644 index 0000000..43179e4 --- /dev/null +++ b/task/node_modules/axios/lib/env/data.js @@ -0,0 +1 @@ +export const VERSION = "1.6.4"; \ No newline at end of file diff --git a/task/node_modules/axios/lib/helpers/AxiosTransformStream.js b/task/node_modules/axios/lib/helpers/AxiosTransformStream.js new file mode 100644 index 0000000..8e8c6d4 --- /dev/null +++ b/task/node_modules/axios/lib/helpers/AxiosTransformStream.js @@ -0,0 +1,191 @@ +'use strict'; + +import stream from 'stream'; +import utils from '../utils.js'; +import throttle from './throttle.js'; +import speedometer from './speedometer.js'; + +const kInternals = Symbol('internals'); + +class AxiosTransformStream extends stream.Transform{ + constructor(options) { + options = utils.toFlatObject(options, { + maxRate: 0, + chunkSize: 64 * 1024, + minChunkSize: 100, + timeWindow: 500, + ticksRate: 2, + samplesCount: 15 + }, null, (prop, source) => { + return !utils.isUndefined(source[prop]); + }); + + super({ + readableHighWaterMark: options.chunkSize + }); + + const self = this; + + const internals = this[kInternals] = { + length: options.length, + timeWindow: options.timeWindow, + ticksRate: options.ticksRate, + chunkSize: options.chunkSize, + maxRate: options.maxRate, + minChunkSize: options.minChunkSize, + bytesSeen: 0, + isCaptured: false, + notifiedBytesLoaded: 0, + ts: Date.now(), + bytes: 0, + onReadCallback: null + }; + + const _speedometer = speedometer(internals.ticksRate * options.samplesCount, internals.timeWindow); + + this.on('newListener', event => { + if (event === 'progress') { + if (!internals.isCaptured) { + internals.isCaptured = true; + } + } + }); + + let bytesNotified = 0; + + internals.updateProgress = throttle(function throttledHandler() { + const totalBytes = internals.length; + const bytesTransferred = internals.bytesSeen; + const progressBytes = bytesTransferred - bytesNotified; + if (!progressBytes || self.destroyed) return; + + const rate = _speedometer(progressBytes); + + bytesNotified = bytesTransferred; + + process.nextTick(() => { + self.emit('progress', { + 'loaded': bytesTransferred, + 'total': totalBytes, + 'progress': totalBytes ? (bytesTransferred / totalBytes) : undefined, + 'bytes': progressBytes, + 'rate': rate ? rate : undefined, + 'estimated': rate && totalBytes && bytesTransferred <= totalBytes ? + (totalBytes - bytesTransferred) / rate : undefined + }); + }); + }, internals.ticksRate); + + const onFinish = () => { + internals.updateProgress(true); + }; + + this.once('end', onFinish); + this.once('error', onFinish); + } + + _read(size) { + const internals = this[kInternals]; + + if (internals.onReadCallback) { + internals.onReadCallback(); + } + + return super._read(size); + } + + _transform(chunk, encoding, callback) { + const self = this; + const internals = this[kInternals]; + const maxRate = internals.maxRate; + + const readableHighWaterMark = this.readableHighWaterMark; + + const timeWindow = internals.timeWindow; + + const divider = 1000 / timeWindow; + const bytesThreshold = (maxRate / divider); + const minChunkSize = internals.minChunkSize !== false ? Math.max(internals.minChunkSize, bytesThreshold * 0.01) : 0; + + function pushChunk(_chunk, _callback) { + const bytes = Buffer.byteLength(_chunk); + internals.bytesSeen += bytes; + internals.bytes += bytes; + + if (internals.isCaptured) { + internals.updateProgress(); + } + + if (self.push(_chunk)) { + process.nextTick(_callback); + } else { + internals.onReadCallback = () => { + internals.onReadCallback = null; + process.nextTick(_callback); + }; + } + } + + const transformChunk = (_chunk, _callback) => { + const chunkSize = Buffer.byteLength(_chunk); + let chunkRemainder = null; + let maxChunkSize = readableHighWaterMark; + let bytesLeft; + let passed = 0; + + if (maxRate) { + const now = Date.now(); + + if (!internals.ts || (passed = (now - internals.ts)) >= timeWindow) { + internals.ts = now; + bytesLeft = bytesThreshold - internals.bytes; + internals.bytes = bytesLeft < 0 ? -bytesLeft : 0; + passed = 0; + } + + bytesLeft = bytesThreshold - internals.bytes; + } + + if (maxRate) { + if (bytesLeft <= 0) { + // next time window + return setTimeout(() => { + _callback(null, _chunk); + }, timeWindow - passed); + } + + if (bytesLeft < maxChunkSize) { + maxChunkSize = bytesLeft; + } + } + + if (maxChunkSize && chunkSize > maxChunkSize && (chunkSize - maxChunkSize) > minChunkSize) { + chunkRemainder = _chunk.subarray(maxChunkSize); + _chunk = _chunk.subarray(0, maxChunkSize); + } + + pushChunk(_chunk, chunkRemainder ? () => { + process.nextTick(_callback, null, chunkRemainder); + } : _callback); + }; + + transformChunk(chunk, function transformNextChunk(err, _chunk) { + if (err) { + return callback(err); + } + + if (_chunk) { + transformChunk(_chunk, transformNextChunk); + } else { + callback(null); + } + }); + } + + setLength(length) { + this[kInternals].length = +length; + return this; + } +} + +export default AxiosTransformStream; diff --git a/task/node_modules/axios/lib/helpers/AxiosURLSearchParams.js b/task/node_modules/axios/lib/helpers/AxiosURLSearchParams.js new file mode 100644 index 0000000..b9aa9f0 --- /dev/null +++ b/task/node_modules/axios/lib/helpers/AxiosURLSearchParams.js @@ -0,0 +1,58 @@ +'use strict'; + +import toFormData from './toFormData.js'; + +/** + * It encodes a string by replacing all characters that are not in the unreserved set with + * their percent-encoded equivalents + * + * @param {string} str - The string to encode. + * + * @returns {string} The encoded string. + */ +function encode(str) { + const charMap = { + '!': '%21', + "'": '%27', + '(': '%28', + ')': '%29', + '~': '%7E', + '%20': '+', + '%00': '\x00' + }; + return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) { + return charMap[match]; + }); +} + +/** + * It takes a params object and converts it to a FormData object + * + * @param {Object} params - The parameters to be converted to a FormData object. + * @param {Object} options - The options object passed to the Axios constructor. + * + * @returns {void} + */ +function AxiosURLSearchParams(params, options) { + this._pairs = []; + + params && toFormData(params, this, options); +} + +const prototype = AxiosURLSearchParams.prototype; + +prototype.append = function append(name, value) { + this._pairs.push([name, value]); +}; + +prototype.toString = function toString(encoder) { + const _encode = encoder ? function(value) { + return encoder.call(this, value, encode); + } : encode; + + return this._pairs.map(function each(pair) { + return _encode(pair[0]) + '=' + _encode(pair[1]); + }, '').join('&'); +}; + +export default AxiosURLSearchParams; diff --git a/task/node_modules/axios/lib/helpers/HttpStatusCode.js b/task/node_modules/axios/lib/helpers/HttpStatusCode.js new file mode 100644 index 0000000..b3e7adc --- /dev/null +++ b/task/node_modules/axios/lib/helpers/HttpStatusCode.js @@ -0,0 +1,71 @@ +const HttpStatusCode = { + Continue: 100, + SwitchingProtocols: 101, + Processing: 102, + EarlyHints: 103, + Ok: 200, + Created: 201, + Accepted: 202, + NonAuthoritativeInformation: 203, + NoContent: 204, + ResetContent: 205, + PartialContent: 206, + MultiStatus: 207, + AlreadyReported: 208, + ImUsed: 226, + MultipleChoices: 300, + MovedPermanently: 301, + Found: 302, + SeeOther: 303, + NotModified: 304, + UseProxy: 305, + Unused: 306, + TemporaryRedirect: 307, + PermanentRedirect: 308, + BadRequest: 400, + Unauthorized: 401, + PaymentRequired: 402, + Forbidden: 403, + NotFound: 404, + MethodNotAllowed: 405, + NotAcceptable: 406, + ProxyAuthenticationRequired: 407, + RequestTimeout: 408, + Conflict: 409, + Gone: 410, + LengthRequired: 411, + PreconditionFailed: 412, + PayloadTooLarge: 413, + UriTooLong: 414, + UnsupportedMediaType: 415, + RangeNotSatisfiable: 416, + ExpectationFailed: 417, + ImATeapot: 418, + MisdirectedRequest: 421, + UnprocessableEntity: 422, + Locked: 423, + FailedDependency: 424, + TooEarly: 425, + UpgradeRequired: 426, + PreconditionRequired: 428, + TooManyRequests: 429, + RequestHeaderFieldsTooLarge: 431, + UnavailableForLegalReasons: 451, + InternalServerError: 500, + NotImplemented: 501, + BadGateway: 502, + ServiceUnavailable: 503, + GatewayTimeout: 504, + HttpVersionNotSupported: 505, + VariantAlsoNegotiates: 506, + InsufficientStorage: 507, + LoopDetected: 508, + NotExtended: 510, + NetworkAuthenticationRequired: 511, +}; + +Object.entries(HttpStatusCode).forEach(([key, value]) => { + HttpStatusCode[value] = key; +}); + +export default HttpStatusCode; diff --git a/task/node_modules/axios/lib/helpers/README.md b/task/node_modules/axios/lib/helpers/README.md new file mode 100644 index 0000000..4ae3419 --- /dev/null +++ b/task/node_modules/axios/lib/helpers/README.md @@ -0,0 +1,7 @@ +# axios // helpers + +The modules found in `helpers/` should be generic modules that are _not_ specific to the domain logic of axios. These modules could theoretically be published to npm on their own and consumed by other modules or apps. Some examples of generic modules are things like: + +- Browser polyfills +- Managing cookies +- Parsing HTTP headers diff --git a/task/node_modules/axios/lib/helpers/ZlibHeaderTransformStream.js b/task/node_modules/axios/lib/helpers/ZlibHeaderTransformStream.js new file mode 100644 index 0000000..d1791f0 --- /dev/null +++ b/task/node_modules/axios/lib/helpers/ZlibHeaderTransformStream.js @@ -0,0 +1,28 @@ +"use strict"; + +import stream from "stream"; + +class ZlibHeaderTransformStream extends stream.Transform { + __transform(chunk, encoding, callback) { + this.push(chunk); + callback(); + } + + _transform(chunk, encoding, callback) { + if (chunk.length !== 0) { + this._transform = this.__transform; + + // Add Default Compression headers if no zlib headers are present + if (chunk[0] !== 120) { // Hex: 78 + const header = Buffer.alloc(2); + header[0] = 120; // Hex: 78 + header[1] = 156; // Hex: 9C + this.push(header, encoding); + } + } + + this.__transform(chunk, encoding, callback); + } +} + +export default ZlibHeaderTransformStream; diff --git a/task/node_modules/axios/lib/helpers/bind.js b/task/node_modules/axios/lib/helpers/bind.js new file mode 100644 index 0000000..b3aa83b --- /dev/null +++ b/task/node_modules/axios/lib/helpers/bind.js @@ -0,0 +1,7 @@ +'use strict'; + +export default function bind(fn, thisArg) { + return function wrap() { + return fn.apply(thisArg, arguments); + }; +} diff --git a/task/node_modules/axios/lib/helpers/buildURL.js b/task/node_modules/axios/lib/helpers/buildURL.js new file mode 100644 index 0000000..d769fdf --- /dev/null +++ b/task/node_modules/axios/lib/helpers/buildURL.js @@ -0,0 +1,63 @@ +'use strict'; + +import utils from '../utils.js'; +import AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js'; + +/** + * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their + * URI encoded counterparts + * + * @param {string} val The value to be encoded. + * + * @returns {string} The encoded value. + */ +function encode(val) { + return encodeURIComponent(val). + replace(/%3A/gi, ':'). + replace(/%24/g, '$'). + replace(/%2C/gi, ','). + replace(/%20/g, '+'). + replace(/%5B/gi, '['). + replace(/%5D/gi, ']'); +} + +/** + * Build a URL by appending params to the end + * + * @param {string} url The base of the url (e.g., http://www.google.com) + * @param {object} [params] The params to be appended + * @param {?object} options + * + * @returns {string} The formatted url + */ +export default function buildURL(url, params, options) { + /*eslint no-param-reassign:0*/ + if (!params) { + return url; + } + + const _encode = options && options.encode || encode; + + const serializeFn = options && options.serialize; + + let serializedParams; + + if (serializeFn) { + serializedParams = serializeFn(params, options); + } else { + serializedParams = utils.isURLSearchParams(params) ? + params.toString() : + new AxiosURLSearchParams(params, options).toString(_encode); + } + + if (serializedParams) { + const hashmarkIndex = url.indexOf("#"); + + if (hashmarkIndex !== -1) { + url = url.slice(0, hashmarkIndex); + } + url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams; + } + + return url; +} diff --git a/task/node_modules/axios/lib/helpers/callbackify.js b/task/node_modules/axios/lib/helpers/callbackify.js new file mode 100644 index 0000000..4603bad --- /dev/null +++ b/task/node_modules/axios/lib/helpers/callbackify.js @@ -0,0 +1,16 @@ +import utils from "../utils.js"; + +const callbackify = (fn, reducer) => { + return utils.isAsyncFn(fn) ? function (...args) { + const cb = args.pop(); + fn.apply(this, args).then((value) => { + try { + reducer ? cb(null, ...reducer(value)) : cb(null, value); + } catch (err) { + cb(err); + } + }, cb); + } : fn; +} + +export default callbackify; diff --git a/task/node_modules/axios/lib/helpers/combineURLs.js b/task/node_modules/axios/lib/helpers/combineURLs.js new file mode 100644 index 0000000..9f04f02 --- /dev/null +++ b/task/node_modules/axios/lib/helpers/combineURLs.js @@ -0,0 +1,15 @@ +'use strict'; + +/** + * Creates a new URL by combining the specified URLs + * + * @param {string} baseURL The base URL + * @param {string} relativeURL The relative URL + * + * @returns {string} The combined URL + */ +export default function combineURLs(baseURL, relativeURL) { + return relativeURL + ? baseURL.replace(/\/?\/$/, '') + '/' + relativeURL.replace(/^\/+/, '') + : baseURL; +} diff --git a/task/node_modules/axios/lib/helpers/cookies.js b/task/node_modules/axios/lib/helpers/cookies.js new file mode 100644 index 0000000..d039ac4 --- /dev/null +++ b/task/node_modules/axios/lib/helpers/cookies.js @@ -0,0 +1,42 @@ +import utils from './../utils.js'; +import platform from '../platform/index.js'; + +export default platform.hasStandardBrowserEnv ? + + // Standard browser envs support document.cookie + { + write(name, value, expires, path, domain, secure) { + const cookie = [name + '=' + encodeURIComponent(value)]; + + utils.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString()); + + utils.isString(path) && cookie.push('path=' + path); + + utils.isString(domain) && cookie.push('domain=' + domain); + + secure === true && cookie.push('secure'); + + document.cookie = cookie.join('; '); + }, + + read(name) { + const match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)')); + return (match ? decodeURIComponent(match[3]) : null); + }, + + remove(name) { + this.write(name, '', Date.now() - 86400000); + } + } + + : + + // Non-standard browser env (web workers, react-native) lack needed support. + { + write() {}, + read() { + return null; + }, + remove() {} + }; + diff --git a/task/node_modules/axios/lib/helpers/deprecatedMethod.js b/task/node_modules/axios/lib/helpers/deprecatedMethod.js new file mode 100644 index 0000000..9e8fae6 --- /dev/null +++ b/task/node_modules/axios/lib/helpers/deprecatedMethod.js @@ -0,0 +1,26 @@ +'use strict'; + +/*eslint no-console:0*/ + +/** + * Supply a warning to the developer that a method they are using + * has been deprecated. + * + * @param {string} method The name of the deprecated method + * @param {string} [instead] The alternate method to use if applicable + * @param {string} [docs] The documentation URL to get further details + * + * @returns {void} + */ +export default function deprecatedMethod(method, instead, docs) { + try { + console.warn( + 'DEPRECATED method `' + method + '`.' + + (instead ? ' Use `' + instead + '` instead.' : '') + + ' This method will be removed in a future release.'); + + if (docs) { + console.warn('For more information about usage see ' + docs); + } + } catch (e) { /* Ignore */ } +} diff --git a/task/node_modules/axios/lib/helpers/formDataToJSON.js b/task/node_modules/axios/lib/helpers/formDataToJSON.js new file mode 100644 index 0000000..906ce60 --- /dev/null +++ b/task/node_modules/axios/lib/helpers/formDataToJSON.js @@ -0,0 +1,95 @@ +'use strict'; + +import utils from '../utils.js'; + +/** + * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z'] + * + * @param {string} name - The name of the property to get. + * + * @returns An array of strings. + */ +function parsePropPath(name) { + // foo[x][y][z] + // foo.x.y.z + // foo-x-y-z + // foo x y z + return utils.matchAll(/\w+|\[(\w*)]/g, name).map(match => { + return match[0] === '[]' ? '' : match[1] || match[0]; + }); +} + +/** + * Convert an array to an object. + * + * @param {Array} arr - The array to convert to an object. + * + * @returns An object with the same keys and values as the array. + */ +function arrayToObject(arr) { + const obj = {}; + const keys = Object.keys(arr); + let i; + const len = keys.length; + let key; + for (i = 0; i < len; i++) { + key = keys[i]; + obj[key] = arr[key]; + } + return obj; +} + +/** + * It takes a FormData object and returns a JavaScript object + * + * @param {string} formData The FormData object to convert to JSON. + * + * @returns {Object | null} The converted object. + */ +function formDataToJSON(formData) { + function buildPath(path, value, target, index) { + let name = path[index++]; + + if (name === '__proto__') return true; + + const isNumericKey = Number.isFinite(+name); + const isLast = index >= path.length; + name = !name && utils.isArray(target) ? target.length : name; + + if (isLast) { + if (utils.hasOwnProp(target, name)) { + target[name] = [target[name], value]; + } else { + target[name] = value; + } + + return !isNumericKey; + } + + if (!target[name] || !utils.isObject(target[name])) { + target[name] = []; + } + + const result = buildPath(path, value, target[name], index); + + if (result && utils.isArray(target[name])) { + target[name] = arrayToObject(target[name]); + } + + return !isNumericKey; + } + + if (utils.isFormData(formData) && utils.isFunction(formData.entries)) { + const obj = {}; + + utils.forEachEntry(formData, (name, value) => { + buildPath(parsePropPath(name), value, obj, 0); + }); + + return obj; + } + + return null; +} + +export default formDataToJSON; diff --git a/task/node_modules/axios/lib/helpers/formDataToStream.js b/task/node_modules/axios/lib/helpers/formDataToStream.js new file mode 100644 index 0000000..9187e73 --- /dev/null +++ b/task/node_modules/axios/lib/helpers/formDataToStream.js @@ -0,0 +1,111 @@ +import {TextEncoder} from 'util'; +import {Readable} from 'stream'; +import utils from "../utils.js"; +import readBlob from "./readBlob.js"; + +const BOUNDARY_ALPHABET = utils.ALPHABET.ALPHA_DIGIT + '-_'; + +const textEncoder = new TextEncoder(); + +const CRLF = '\r\n'; +const CRLF_BYTES = textEncoder.encode(CRLF); +const CRLF_BYTES_COUNT = 2; + +class FormDataPart { + constructor(name, value) { + const {escapeName} = this.constructor; + const isStringValue = utils.isString(value); + + let headers = `Content-Disposition: form-data; name="${escapeName(name)}"${ + !isStringValue && value.name ? `; filename="${escapeName(value.name)}"` : '' + }${CRLF}`; + + if (isStringValue) { + value = textEncoder.encode(String(value).replace(/\r?\n|\r\n?/g, CRLF)); + } else { + headers += `Content-Type: ${value.type || "application/octet-stream"}${CRLF}` + } + + this.headers = textEncoder.encode(headers + CRLF); + + this.contentLength = isStringValue ? value.byteLength : value.size; + + this.size = this.headers.byteLength + this.contentLength + CRLF_BYTES_COUNT; + + this.name = name; + this.value = value; + } + + async *encode(){ + yield this.headers; + + const {value} = this; + + if(utils.isTypedArray(value)) { + yield value; + } else { + yield* readBlob(value); + } + + yield CRLF_BYTES; + } + + static escapeName(name) { + return String(name).replace(/[\r\n"]/g, (match) => ({ + '\r' : '%0D', + '\n' : '%0A', + '"' : '%22', + }[match])); + } +} + +const formDataToStream = (form, headersHandler, options) => { + const { + tag = 'form-data-boundary', + size = 25, + boundary = tag + '-' + utils.generateString(size, BOUNDARY_ALPHABET) + } = options || {}; + + if(!utils.isFormData(form)) { + throw TypeError('FormData instance required'); + } + + if (boundary.length < 1 || boundary.length > 70) { + throw Error('boundary must be 10-70 characters long') + } + + const boundaryBytes = textEncoder.encode('--' + boundary + CRLF); + const footerBytes = textEncoder.encode('--' + boundary + '--' + CRLF + CRLF); + let contentLength = footerBytes.byteLength; + + const parts = Array.from(form.entries()).map(([name, value]) => { + const part = new FormDataPart(name, value); + contentLength += part.size; + return part; + }); + + contentLength += boundaryBytes.byteLength * parts.length; + + contentLength = utils.toFiniteNumber(contentLength); + + const computedHeaders = { + 'Content-Type': `multipart/form-data; boundary=${boundary}` + } + + if (Number.isFinite(contentLength)) { + computedHeaders['Content-Length'] = contentLength; + } + + headersHandler && headersHandler(computedHeaders); + + return Readable.from((async function *() { + for(const part of parts) { + yield boundaryBytes; + yield* part.encode(); + } + + yield footerBytes; + })()); +}; + +export default formDataToStream; diff --git a/task/node_modules/axios/lib/helpers/fromDataURI.js b/task/node_modules/axios/lib/helpers/fromDataURI.js new file mode 100644 index 0000000..eb71d3f --- /dev/null +++ b/task/node_modules/axios/lib/helpers/fromDataURI.js @@ -0,0 +1,53 @@ +'use strict'; + +import AxiosError from '../core/AxiosError.js'; +import parseProtocol from './parseProtocol.js'; +import platform from '../platform/index.js'; + +const DATA_URL_PATTERN = /^(?:([^;]+);)?(?:[^;]+;)?(base64|),([\s\S]*)$/; + +/** + * Parse data uri to a Buffer or Blob + * + * @param {String} uri + * @param {?Boolean} asBlob + * @param {?Object} options + * @param {?Function} options.Blob + * + * @returns {Buffer|Blob} + */ +export default function fromDataURI(uri, asBlob, options) { + const _Blob = options && options.Blob || platform.classes.Blob; + const protocol = parseProtocol(uri); + + if (asBlob === undefined && _Blob) { + asBlob = true; + } + + if (protocol === 'data') { + uri = protocol.length ? uri.slice(protocol.length + 1) : uri; + + const match = DATA_URL_PATTERN.exec(uri); + + if (!match) { + throw new AxiosError('Invalid URL', AxiosError.ERR_INVALID_URL); + } + + const mime = match[1]; + const isBase64 = match[2]; + const body = match[3]; + const buffer = Buffer.from(decodeURIComponent(body), isBase64 ? 'base64' : 'utf8'); + + if (asBlob) { + if (!_Blob) { + throw new AxiosError('Blob is not supported', AxiosError.ERR_NOT_SUPPORT); + } + + return new _Blob([buffer], {type: mime}); + } + + return buffer; + } + + throw new AxiosError('Unsupported protocol ' + protocol, AxiosError.ERR_NOT_SUPPORT); +} diff --git a/task/node_modules/axios/lib/helpers/isAbsoluteURL.js b/task/node_modules/axios/lib/helpers/isAbsoluteURL.js new file mode 100644 index 0000000..4747a45 --- /dev/null +++ b/task/node_modules/axios/lib/helpers/isAbsoluteURL.js @@ -0,0 +1,15 @@ +'use strict'; + +/** + * Determines whether the specified URL is absolute + * + * @param {string} url The URL to test + * + * @returns {boolean} True if the specified URL is absolute, otherwise false + */ +export default function isAbsoluteURL(url) { + // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL). + // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed + // by any combination of letters, digits, plus, period, or hyphen. + return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url); +} diff --git a/task/node_modules/axios/lib/helpers/isAxiosError.js b/task/node_modules/axios/lib/helpers/isAxiosError.js new file mode 100644 index 0000000..da6cd63 --- /dev/null +++ b/task/node_modules/axios/lib/helpers/isAxiosError.js @@ -0,0 +1,14 @@ +'use strict'; + +import utils from './../utils.js'; + +/** + * Determines whether the payload is an error thrown by Axios + * + * @param {*} payload The value to test + * + * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false + */ +export default function isAxiosError(payload) { + return utils.isObject(payload) && (payload.isAxiosError === true); +} diff --git a/task/node_modules/axios/lib/helpers/isURLSameOrigin.js b/task/node_modules/axios/lib/helpers/isURLSameOrigin.js new file mode 100644 index 0000000..a8678a4 --- /dev/null +++ b/task/node_modules/axios/lib/helpers/isURLSameOrigin.js @@ -0,0 +1,67 @@ +'use strict'; + +import utils from './../utils.js'; +import platform from '../platform/index.js'; + +export default platform.hasStandardBrowserEnv ? + +// Standard browser envs have full support of the APIs needed to test +// whether the request URL is of the same origin as current location. + (function standardBrowserEnv() { + const msie = /(msie|trident)/i.test(navigator.userAgent); + const urlParsingNode = document.createElement('a'); + let originURL; + + /** + * Parse a URL to discover its components + * + * @param {String} url The URL to be parsed + * @returns {Object} + */ + function resolveURL(url) { + let href = url; + + if (msie) { + // IE needs attribute set twice to normalize properties + urlParsingNode.setAttribute('href', href); + href = urlParsingNode.href; + } + + urlParsingNode.setAttribute('href', href); + + // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils + return { + href: urlParsingNode.href, + protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', + host: urlParsingNode.host, + search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', + hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', + hostname: urlParsingNode.hostname, + port: urlParsingNode.port, + pathname: (urlParsingNode.pathname.charAt(0) === '/') ? + urlParsingNode.pathname : + '/' + urlParsingNode.pathname + }; + } + + originURL = resolveURL(window.location.href); + + /** + * Determine if a URL shares the same origin as the current location + * + * @param {String} requestURL The URL to test + * @returns {boolean} True if URL shares the same origin, otherwise false + */ + return function isURLSameOrigin(requestURL) { + const parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL; + return (parsed.protocol === originURL.protocol && + parsed.host === originURL.host); + }; + })() : + + // Non standard browser envs (web workers, react-native) lack needed support. + (function nonStandardBrowserEnv() { + return function isURLSameOrigin() { + return true; + }; + })(); diff --git a/task/node_modules/axios/lib/helpers/null.js b/task/node_modules/axios/lib/helpers/null.js new file mode 100644 index 0000000..b9f82c4 --- /dev/null +++ b/task/node_modules/axios/lib/helpers/null.js @@ -0,0 +1,2 @@ +// eslint-disable-next-line strict +export default null; diff --git a/task/node_modules/axios/lib/helpers/parseHeaders.js b/task/node_modules/axios/lib/helpers/parseHeaders.js new file mode 100644 index 0000000..50af948 --- /dev/null +++ b/task/node_modules/axios/lib/helpers/parseHeaders.js @@ -0,0 +1,55 @@ +'use strict'; + +import utils from './../utils.js'; + +// RawAxiosHeaders whose duplicates are ignored by node +// c.f. https://nodejs.org/api/http.html#http_message_headers +const ignoreDuplicateOf = utils.toObjectSet([ + 'age', 'authorization', 'content-length', 'content-type', 'etag', + 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', + 'last-modified', 'location', 'max-forwards', 'proxy-authorization', + 'referer', 'retry-after', 'user-agent' +]); + +/** + * Parse headers into an object + * + * ``` + * Date: Wed, 27 Aug 2014 08:58:49 GMT + * Content-Type: application/json + * Connection: keep-alive + * Transfer-Encoding: chunked + * ``` + * + * @param {String} rawHeaders Headers needing to be parsed + * + * @returns {Object} Headers parsed into an object + */ +export default rawHeaders => { + const parsed = {}; + let key; + let val; + let i; + + rawHeaders && rawHeaders.split('\n').forEach(function parser(line) { + i = line.indexOf(':'); + key = line.substring(0, i).trim().toLowerCase(); + val = line.substring(i + 1).trim(); + + if (!key || (parsed[key] && ignoreDuplicateOf[key])) { + return; + } + + if (key === 'set-cookie') { + if (parsed[key]) { + parsed[key].push(val); + } else { + parsed[key] = [val]; + } + } else { + parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; + } + }); + + return parsed; +}; diff --git a/task/node_modules/axios/lib/helpers/parseProtocol.js b/task/node_modules/axios/lib/helpers/parseProtocol.js new file mode 100644 index 0000000..586ec96 --- /dev/null +++ b/task/node_modules/axios/lib/helpers/parseProtocol.js @@ -0,0 +1,6 @@ +'use strict'; + +export default function parseProtocol(url) { + const match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url); + return match && match[1] || ''; +} diff --git a/task/node_modules/axios/lib/helpers/readBlob.js b/task/node_modules/axios/lib/helpers/readBlob.js new file mode 100644 index 0000000..6de748e --- /dev/null +++ b/task/node_modules/axios/lib/helpers/readBlob.js @@ -0,0 +1,15 @@ +const {asyncIterator} = Symbol; + +const readBlob = async function* (blob) { + if (blob.stream) { + yield* blob.stream() + } else if (blob.arrayBuffer) { + yield await blob.arrayBuffer() + } else if (blob[asyncIterator]) { + yield* blob[asyncIterator](); + } else { + yield blob; + } +} + +export default readBlob; diff --git a/task/node_modules/axios/lib/helpers/speedometer.js b/task/node_modules/axios/lib/helpers/speedometer.js new file mode 100644 index 0000000..3b3c666 --- /dev/null +++ b/task/node_modules/axios/lib/helpers/speedometer.js @@ -0,0 +1,55 @@ +'use strict'; + +/** + * Calculate data maxRate + * @param {Number} [samplesCount= 10] + * @param {Number} [min= 1000] + * @returns {Function} + */ +function speedometer(samplesCount, min) { + samplesCount = samplesCount || 10; + const bytes = new Array(samplesCount); + const timestamps = new Array(samplesCount); + let head = 0; + let tail = 0; + let firstSampleTS; + + min = min !== undefined ? min : 1000; + + return function push(chunkLength) { + const now = Date.now(); + + const startedAt = timestamps[tail]; + + if (!firstSampleTS) { + firstSampleTS = now; + } + + bytes[head] = chunkLength; + timestamps[head] = now; + + let i = tail; + let bytesCount = 0; + + while (i !== head) { + bytesCount += bytes[i++]; + i = i % samplesCount; + } + + head = (head + 1) % samplesCount; + + if (head === tail) { + tail = (tail + 1) % samplesCount; + } + + if (now - firstSampleTS < min) { + return; + } + + const passed = startedAt && now - startedAt; + + return passed ? Math.round(bytesCount * 1000 / passed) : undefined; + }; +} + +export default speedometer; diff --git a/task/node_modules/axios/lib/helpers/spread.js b/task/node_modules/axios/lib/helpers/spread.js new file mode 100644 index 0000000..13479cb --- /dev/null +++ b/task/node_modules/axios/lib/helpers/spread.js @@ -0,0 +1,28 @@ +'use strict'; + +/** + * Syntactic sugar for invoking a function and expanding an array for arguments. + * + * Common use case would be to use `Function.prototype.apply`. + * + * ```js + * function f(x, y, z) {} + * var args = [1, 2, 3]; + * f.apply(null, args); + * ``` + * + * With `spread` this example can be re-written. + * + * ```js + * spread(function(x, y, z) {})([1, 2, 3]); + * ``` + * + * @param {Function} callback + * + * @returns {Function} + */ +export default function spread(callback) { + return function wrap(arr) { + return callback.apply(null, arr); + }; +} diff --git a/task/node_modules/axios/lib/helpers/throttle.js b/task/node_modules/axios/lib/helpers/throttle.js new file mode 100644 index 0000000..6969df1 --- /dev/null +++ b/task/node_modules/axios/lib/helpers/throttle.js @@ -0,0 +1,33 @@ +'use strict'; + +/** + * Throttle decorator + * @param {Function} fn + * @param {Number} freq + * @return {Function} + */ +function throttle(fn, freq) { + let timestamp = 0; + const threshold = 1000 / freq; + let timer = null; + return function throttled(force, args) { + const now = Date.now(); + if (force || now - timestamp > threshold) { + if (timer) { + clearTimeout(timer); + timer = null; + } + timestamp = now; + return fn.apply(null, args); + } + if (!timer) { + timer = setTimeout(() => { + timer = null; + timestamp = Date.now(); + return fn.apply(null, args); + }, threshold - (now - timestamp)); + } + }; +} + +export default throttle; diff --git a/task/node_modules/axios/lib/helpers/toFormData.js b/task/node_modules/axios/lib/helpers/toFormData.js new file mode 100644 index 0000000..a41e966 --- /dev/null +++ b/task/node_modules/axios/lib/helpers/toFormData.js @@ -0,0 +1,219 @@ +'use strict'; + +import utils from '../utils.js'; +import AxiosError from '../core/AxiosError.js'; +// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored +import PlatformFormData from '../platform/node/classes/FormData.js'; + +/** + * Determines if the given thing is a array or js object. + * + * @param {string} thing - The object or array to be visited. + * + * @returns {boolean} + */ +function isVisitable(thing) { + return utils.isPlainObject(thing) || utils.isArray(thing); +} + +/** + * It removes the brackets from the end of a string + * + * @param {string} key - The key of the parameter. + * + * @returns {string} the key without the brackets. + */ +function removeBrackets(key) { + return utils.endsWith(key, '[]') ? key.slice(0, -2) : key; +} + +/** + * It takes a path, a key, and a boolean, and returns a string + * + * @param {string} path - The path to the current key. + * @param {string} key - The key of the current object being iterated over. + * @param {string} dots - If true, the key will be rendered with dots instead of brackets. + * + * @returns {string} The path to the current key. + */ +function renderKey(path, key, dots) { + if (!path) return key; + return path.concat(key).map(function each(token, i) { + // eslint-disable-next-line no-param-reassign + token = removeBrackets(token); + return !dots && i ? '[' + token + ']' : token; + }).join(dots ? '.' : ''); +} + +/** + * If the array is an array and none of its elements are visitable, then it's a flat array. + * + * @param {Array} arr - The array to check + * + * @returns {boolean} + */ +function isFlatArray(arr) { + return utils.isArray(arr) && !arr.some(isVisitable); +} + +const predicates = utils.toFlatObject(utils, {}, null, function filter(prop) { + return /^is[A-Z]/.test(prop); +}); + +/** + * Convert a data object to FormData + * + * @param {Object} obj + * @param {?Object} [formData] + * @param {?Object} [options] + * @param {Function} [options.visitor] + * @param {Boolean} [options.metaTokens = true] + * @param {Boolean} [options.dots = false] + * @param {?Boolean} [options.indexes = false] + * + * @returns {Object} + **/ + +/** + * It converts an object into a FormData object + * + * @param {Object} obj - The object to convert to form data. + * @param {string} formData - The FormData object to append to. + * @param {Object} options + * + * @returns + */ +function toFormData(obj, formData, options) { + if (!utils.isObject(obj)) { + throw new TypeError('target must be an object'); + } + + // eslint-disable-next-line no-param-reassign + formData = formData || new (PlatformFormData || FormData)(); + + // eslint-disable-next-line no-param-reassign + options = utils.toFlatObject(options, { + metaTokens: true, + dots: false, + indexes: false + }, false, function defined(option, source) { + // eslint-disable-next-line no-eq-null,eqeqeq + return !utils.isUndefined(source[option]); + }); + + const metaTokens = options.metaTokens; + // eslint-disable-next-line no-use-before-define + const visitor = options.visitor || defaultVisitor; + const dots = options.dots; + const indexes = options.indexes; + const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob; + const useBlob = _Blob && utils.isSpecCompliantForm(formData); + + if (!utils.isFunction(visitor)) { + throw new TypeError('visitor must be a function'); + } + + function convertValue(value) { + if (value === null) return ''; + + if (utils.isDate(value)) { + return value.toISOString(); + } + + if (!useBlob && utils.isBlob(value)) { + throw new AxiosError('Blob is not supported. Use a Buffer instead.'); + } + + if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) { + return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value); + } + + return value; + } + + /** + * Default visitor. + * + * @param {*} value + * @param {String|Number} key + * @param {Array} path + * @this {FormData} + * + * @returns {boolean} return true to visit the each prop of the value recursively + */ + function defaultVisitor(value, key, path) { + let arr = value; + + if (value && !path && typeof value === 'object') { + if (utils.endsWith(key, '{}')) { + // eslint-disable-next-line no-param-reassign + key = metaTokens ? key : key.slice(0, -2); + // eslint-disable-next-line no-param-reassign + value = JSON.stringify(value); + } else if ( + (utils.isArray(value) && isFlatArray(value)) || + ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value)) + )) { + // eslint-disable-next-line no-param-reassign + key = removeBrackets(key); + + arr.forEach(function each(el, index) { + !(utils.isUndefined(el) || el === null) && formData.append( + // eslint-disable-next-line no-nested-ternary + indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'), + convertValue(el) + ); + }); + return false; + } + } + + if (isVisitable(value)) { + return true; + } + + formData.append(renderKey(path, key, dots), convertValue(value)); + + return false; + } + + const stack = []; + + const exposedHelpers = Object.assign(predicates, { + defaultVisitor, + convertValue, + isVisitable + }); + + function build(value, path) { + if (utils.isUndefined(value)) return; + + if (stack.indexOf(value) !== -1) { + throw Error('Circular reference detected in ' + path.join('.')); + } + + stack.push(value); + + utils.forEach(value, function each(el, key) { + const result = !(utils.isUndefined(el) || el === null) && visitor.call( + formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers + ); + + if (result === true) { + build(el, path ? path.concat(key) : [key]); + } + }); + + stack.pop(); + } + + if (!utils.isObject(obj)) { + throw new TypeError('data must be an object'); + } + + build(obj); + + return formData; +} + +export default toFormData; diff --git a/task/node_modules/axios/lib/helpers/toURLEncodedForm.js b/task/node_modules/axios/lib/helpers/toURLEncodedForm.js new file mode 100644 index 0000000..988a38a --- /dev/null +++ b/task/node_modules/axios/lib/helpers/toURLEncodedForm.js @@ -0,0 +1,18 @@ +'use strict'; + +import utils from '../utils.js'; +import toFormData from './toFormData.js'; +import platform from '../platform/index.js'; + +export default function toURLEncodedForm(data, options) { + return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({ + visitor: function(value, key, path, helpers) { + if (platform.isNode && utils.isBuffer(value)) { + this.append(key, value.toString('base64')); + return false; + } + + return helpers.defaultVisitor.apply(this, arguments); + } + }, options)); +} diff --git a/task/node_modules/axios/lib/helpers/validator.js b/task/node_modules/axios/lib/helpers/validator.js new file mode 100644 index 0000000..14b4696 --- /dev/null +++ b/task/node_modules/axios/lib/helpers/validator.js @@ -0,0 +1,91 @@ +'use strict'; + +import {VERSION} from '../env/data.js'; +import AxiosError from '../core/AxiosError.js'; + +const validators = {}; + +// eslint-disable-next-line func-names +['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => { + validators[type] = function validator(thing) { + return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type; + }; +}); + +const deprecatedWarnings = {}; + +/** + * Transitional option validator + * + * @param {function|boolean?} validator - set to false if the transitional option has been removed + * @param {string?} version - deprecated version / removed since version + * @param {string?} message - some message with additional info + * + * @returns {function} + */ +validators.transitional = function transitional(validator, version, message) { + function formatMessage(opt, desc) { + return '[Axios v' + VERSION + '] Transitional option \'' + opt + '\'' + desc + (message ? '. ' + message : ''); + } + + // eslint-disable-next-line func-names + return (value, opt, opts) => { + if (validator === false) { + throw new AxiosError( + formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')), + AxiosError.ERR_DEPRECATED + ); + } + + if (version && !deprecatedWarnings[opt]) { + deprecatedWarnings[opt] = true; + // eslint-disable-next-line no-console + console.warn( + formatMessage( + opt, + ' has been deprecated since v' + version + ' and will be removed in the near future' + ) + ); + } + + return validator ? validator(value, opt, opts) : true; + }; +}; + +/** + * Assert object's properties type + * + * @param {object} options + * @param {object} schema + * @param {boolean?} allowUnknown + * + * @returns {object} + */ + +function assertOptions(options, schema, allowUnknown) { + if (typeof options !== 'object') { + throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE); + } + const keys = Object.keys(options); + let i = keys.length; + while (i-- > 0) { + const opt = keys[i]; + const validator = schema[opt]; + if (validator) { + const value = options[opt]; + const result = value === undefined || validator(value, opt, options); + if (result !== true) { + throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE); + } + continue; + } + if (allowUnknown !== true) { + throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION); + } + } +} + +export default { + assertOptions, + validators +}; diff --git a/task/node_modules/axios/lib/platform/browser/classes/Blob.js b/task/node_modules/axios/lib/platform/browser/classes/Blob.js new file mode 100644 index 0000000..6c506c4 --- /dev/null +++ b/task/node_modules/axios/lib/platform/browser/classes/Blob.js @@ -0,0 +1,3 @@ +'use strict' + +export default typeof Blob !== 'undefined' ? Blob : null diff --git a/task/node_modules/axios/lib/platform/browser/classes/FormData.js b/task/node_modules/axios/lib/platform/browser/classes/FormData.js new file mode 100644 index 0000000..f36d31b --- /dev/null +++ b/task/node_modules/axios/lib/platform/browser/classes/FormData.js @@ -0,0 +1,3 @@ +'use strict'; + +export default typeof FormData !== 'undefined' ? FormData : null; diff --git a/task/node_modules/axios/lib/platform/browser/classes/URLSearchParams.js b/task/node_modules/axios/lib/platform/browser/classes/URLSearchParams.js new file mode 100644 index 0000000..b7dae95 --- /dev/null +++ b/task/node_modules/axios/lib/platform/browser/classes/URLSearchParams.js @@ -0,0 +1,4 @@ +'use strict'; + +import AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js'; +export default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams; diff --git a/task/node_modules/axios/lib/platform/browser/index.js b/task/node_modules/axios/lib/platform/browser/index.js new file mode 100644 index 0000000..08c206f --- /dev/null +++ b/task/node_modules/axios/lib/platform/browser/index.js @@ -0,0 +1,13 @@ +import URLSearchParams from './classes/URLSearchParams.js' +import FormData from './classes/FormData.js' +import Blob from './classes/Blob.js' + +export default { + isBrowser: true, + classes: { + URLSearchParams, + FormData, + Blob + }, + protocols: ['http', 'https', 'file', 'blob', 'url', 'data'] +}; diff --git a/task/node_modules/axios/lib/platform/common/utils.js b/task/node_modules/axios/lib/platform/common/utils.js new file mode 100644 index 0000000..56fe79a --- /dev/null +++ b/task/node_modules/axios/lib/platform/common/utils.js @@ -0,0 +1,47 @@ +const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined'; + +/** + * Determine if we're running in a standard browser environment + * + * This allows axios to run in a web worker, and react-native. + * Both environments support XMLHttpRequest, but not fully standard globals. + * + * web workers: + * typeof window -> undefined + * typeof document -> undefined + * + * react-native: + * navigator.product -> 'ReactNative' + * nativescript + * navigator.product -> 'NativeScript' or 'NS' + * + * @returns {boolean} + */ +const hasStandardBrowserEnv = ( + (product) => { + return hasBrowserEnv && ['ReactNative', 'NativeScript', 'NS'].indexOf(product) < 0 + })(typeof navigator !== 'undefined' && navigator.product); + +/** + * Determine if we're running in a standard browser webWorker environment + * + * Although the `isStandardBrowserEnv` method indicates that + * `allows axios to run in a web worker`, the WebWorker will still be + * filtered out due to its judgment standard + * `typeof window !== 'undefined' && typeof document !== 'undefined'`. + * This leads to a problem when axios post `FormData` in webWorker + */ +const hasStandardBrowserWebWorkerEnv = (() => { + return ( + typeof WorkerGlobalScope !== 'undefined' && + // eslint-disable-next-line no-undef + self instanceof WorkerGlobalScope && + typeof self.importScripts === 'function' + ); +})(); + +export { + hasBrowserEnv, + hasStandardBrowserWebWorkerEnv, + hasStandardBrowserEnv +} diff --git a/task/node_modules/axios/lib/platform/index.js b/task/node_modules/axios/lib/platform/index.js new file mode 100644 index 0000000..860ba21 --- /dev/null +++ b/task/node_modules/axios/lib/platform/index.js @@ -0,0 +1,7 @@ +import platform from './node/index.js'; +import * as utils from './common/utils.js'; + +export default { + ...utils, + ...platform +} diff --git a/task/node_modules/axios/lib/platform/node/classes/FormData.js b/task/node_modules/axios/lib/platform/node/classes/FormData.js new file mode 100644 index 0000000..b07f947 --- /dev/null +++ b/task/node_modules/axios/lib/platform/node/classes/FormData.js @@ -0,0 +1,3 @@ +import FormData from 'form-data'; + +export default FormData; diff --git a/task/node_modules/axios/lib/platform/node/classes/URLSearchParams.js b/task/node_modules/axios/lib/platform/node/classes/URLSearchParams.js new file mode 100644 index 0000000..fba5842 --- /dev/null +++ b/task/node_modules/axios/lib/platform/node/classes/URLSearchParams.js @@ -0,0 +1,4 @@ +'use strict'; + +import url from 'url'; +export default url.URLSearchParams; diff --git a/task/node_modules/axios/lib/platform/node/index.js b/task/node_modules/axios/lib/platform/node/index.js new file mode 100644 index 0000000..aef514a --- /dev/null +++ b/task/node_modules/axios/lib/platform/node/index.js @@ -0,0 +1,12 @@ +import URLSearchParams from './classes/URLSearchParams.js' +import FormData from './classes/FormData.js' + +export default { + isNode: true, + classes: { + URLSearchParams, + FormData, + Blob: typeof Blob !== 'undefined' && Blob || null + }, + protocols: [ 'http', 'https', 'file', 'data' ] +}; diff --git a/task/node_modules/axios/lib/utils.js b/task/node_modules/axios/lib/utils.js new file mode 100644 index 0000000..a386b77 --- /dev/null +++ b/task/node_modules/axios/lib/utils.js @@ -0,0 +1,723 @@ +'use strict'; + +import bind from './helpers/bind.js'; + +// utils is a library of generic helper functions non-specific to axios + +const {toString} = Object.prototype; +const {getPrototypeOf} = Object; + +const kindOf = (cache => thing => { + const str = toString.call(thing); + return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase()); +})(Object.create(null)); + +const kindOfTest = (type) => { + type = type.toLowerCase(); + return (thing) => kindOf(thing) === type +} + +const typeOfTest = type => thing => typeof thing === type; + +/** + * Determine if a value is an Array + * + * @param {Object} val The value to test + * + * @returns {boolean} True if value is an Array, otherwise false + */ +const {isArray} = Array; + +/** + * Determine if a value is undefined + * + * @param {*} val The value to test + * + * @returns {boolean} True if the value is undefined, otherwise false + */ +const isUndefined = typeOfTest('undefined'); + +/** + * Determine if a value is a Buffer + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a Buffer, otherwise false + */ +function isBuffer(val) { + return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) + && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val); +} + +/** + * Determine if a value is an ArrayBuffer + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is an ArrayBuffer, otherwise false + */ +const isArrayBuffer = kindOfTest('ArrayBuffer'); + + +/** + * Determine if a value is a view on an ArrayBuffer + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false + */ +function isArrayBufferView(val) { + let result; + if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) { + result = ArrayBuffer.isView(val); + } else { + result = (val) && (val.buffer) && (isArrayBuffer(val.buffer)); + } + return result; +} + +/** + * Determine if a value is a String + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a String, otherwise false + */ +const isString = typeOfTest('string'); + +/** + * Determine if a value is a Function + * + * @param {*} val The value to test + * @returns {boolean} True if value is a Function, otherwise false + */ +const isFunction = typeOfTest('function'); + +/** + * Determine if a value is a Number + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a Number, otherwise false + */ +const isNumber = typeOfTest('number'); + +/** + * Determine if a value is an Object + * + * @param {*} thing The value to test + * + * @returns {boolean} True if value is an Object, otherwise false + */ +const isObject = (thing) => thing !== null && typeof thing === 'object'; + +/** + * Determine if a value is a Boolean + * + * @param {*} thing The value to test + * @returns {boolean} True if value is a Boolean, otherwise false + */ +const isBoolean = thing => thing === true || thing === false; + +/** + * Determine if a value is a plain Object + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a plain Object, otherwise false + */ +const isPlainObject = (val) => { + if (kindOf(val) !== 'object') { + return false; + } + + const prototype = getPrototypeOf(val); + return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val); +} + +/** + * Determine if a value is a Date + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a Date, otherwise false + */ +const isDate = kindOfTest('Date'); + +/** + * Determine if a value is a File + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a File, otherwise false + */ +const isFile = kindOfTest('File'); + +/** + * Determine if a value is a Blob + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a Blob, otherwise false + */ +const isBlob = kindOfTest('Blob'); + +/** + * Determine if a value is a FileList + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a File, otherwise false + */ +const isFileList = kindOfTest('FileList'); + +/** + * Determine if a value is a Stream + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a Stream, otherwise false + */ +const isStream = (val) => isObject(val) && isFunction(val.pipe); + +/** + * Determine if a value is a FormData + * + * @param {*} thing The value to test + * + * @returns {boolean} True if value is an FormData, otherwise false + */ +const isFormData = (thing) => { + let kind; + return thing && ( + (typeof FormData === 'function' && thing instanceof FormData) || ( + isFunction(thing.append) && ( + (kind = kindOf(thing)) === 'formdata' || + // detect form-data instance + (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]') + ) + ) + ) +} + +/** + * Determine if a value is a URLSearchParams object + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a URLSearchParams object, otherwise false + */ +const isURLSearchParams = kindOfTest('URLSearchParams'); + +/** + * Trim excess whitespace off the beginning and end of a string + * + * @param {String} str The String to trim + * + * @returns {String} The String freed of excess whitespace + */ +const trim = (str) => str.trim ? + str.trim() : str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); + +/** + * Iterate over an Array or an Object invoking a function for each item. + * + * If `obj` is an Array callback will be called passing + * the value, index, and complete array for each item. + * + * If 'obj' is an Object callback will be called passing + * the value, key, and complete object for each property. + * + * @param {Object|Array} obj The object to iterate + * @param {Function} fn The callback to invoke for each item + * + * @param {Boolean} [allOwnKeys = false] + * @returns {any} + */ +function forEach(obj, fn, {allOwnKeys = false} = {}) { + // Don't bother if no value provided + if (obj === null || typeof obj === 'undefined') { + return; + } + + let i; + let l; + + // Force an array if not already something iterable + if (typeof obj !== 'object') { + /*eslint no-param-reassign:0*/ + obj = [obj]; + } + + if (isArray(obj)) { + // Iterate over array values + for (i = 0, l = obj.length; i < l; i++) { + fn.call(null, obj[i], i, obj); + } + } else { + // Iterate over object keys + const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj); + const len = keys.length; + let key; + + for (i = 0; i < len; i++) { + key = keys[i]; + fn.call(null, obj[key], key, obj); + } + } +} + +function findKey(obj, key) { + key = key.toLowerCase(); + const keys = Object.keys(obj); + let i = keys.length; + let _key; + while (i-- > 0) { + _key = keys[i]; + if (key === _key.toLowerCase()) { + return _key; + } + } + return null; +} + +const _global = (() => { + /*eslint no-undef:0*/ + if (typeof globalThis !== "undefined") return globalThis; + return typeof self !== "undefined" ? self : (typeof window !== 'undefined' ? window : global) +})(); + +const isContextDefined = (context) => !isUndefined(context) && context !== _global; + +/** + * Accepts varargs expecting each argument to be an object, then + * immutably merges the properties of each object and returns result. + * + * When multiple objects contain the same key the later object in + * the arguments list will take precedence. + * + * Example: + * + * ```js + * var result = merge({foo: 123}, {foo: 456}); + * console.log(result.foo); // outputs 456 + * ``` + * + * @param {Object} obj1 Object to merge + * + * @returns {Object} Result of all merge properties + */ +function merge(/* obj1, obj2, obj3, ... */) { + const {caseless} = isContextDefined(this) && this || {}; + const result = {}; + const assignValue = (val, key) => { + const targetKey = caseless && findKey(result, key) || key; + if (isPlainObject(result[targetKey]) && isPlainObject(val)) { + result[targetKey] = merge(result[targetKey], val); + } else if (isPlainObject(val)) { + result[targetKey] = merge({}, val); + } else if (isArray(val)) { + result[targetKey] = val.slice(); + } else { + result[targetKey] = val; + } + } + + for (let i = 0, l = arguments.length; i < l; i++) { + arguments[i] && forEach(arguments[i], assignValue); + } + return result; +} + +/** + * Extends object a by mutably adding to it the properties of object b. + * + * @param {Object} a The object to be extended + * @param {Object} b The object to copy properties from + * @param {Object} thisArg The object to bind function to + * + * @param {Boolean} [allOwnKeys] + * @returns {Object} The resulting value of object a + */ +const extend = (a, b, thisArg, {allOwnKeys}= {}) => { + forEach(b, (val, key) => { + if (thisArg && isFunction(val)) { + a[key] = bind(val, thisArg); + } else { + a[key] = val; + } + }, {allOwnKeys}); + return a; +} + +/** + * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM) + * + * @param {string} content with BOM + * + * @returns {string} content value without BOM + */ +const stripBOM = (content) => { + if (content.charCodeAt(0) === 0xFEFF) { + content = content.slice(1); + } + return content; +} + +/** + * Inherit the prototype methods from one constructor into another + * @param {function} constructor + * @param {function} superConstructor + * @param {object} [props] + * @param {object} [descriptors] + * + * @returns {void} + */ +const inherits = (constructor, superConstructor, props, descriptors) => { + constructor.prototype = Object.create(superConstructor.prototype, descriptors); + constructor.prototype.constructor = constructor; + Object.defineProperty(constructor, 'super', { + value: superConstructor.prototype + }); + props && Object.assign(constructor.prototype, props); +} + +/** + * Resolve object with deep prototype chain to a flat object + * @param {Object} sourceObj source object + * @param {Object} [destObj] + * @param {Function|Boolean} [filter] + * @param {Function} [propFilter] + * + * @returns {Object} + */ +const toFlatObject = (sourceObj, destObj, filter, propFilter) => { + let props; + let i; + let prop; + const merged = {}; + + destObj = destObj || {}; + // eslint-disable-next-line no-eq-null,eqeqeq + if (sourceObj == null) return destObj; + + do { + props = Object.getOwnPropertyNames(sourceObj); + i = props.length; + while (i-- > 0) { + prop = props[i]; + if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) { + destObj[prop] = sourceObj[prop]; + merged[prop] = true; + } + } + sourceObj = filter !== false && getPrototypeOf(sourceObj); + } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype); + + return destObj; +} + +/** + * Determines whether a string ends with the characters of a specified string + * + * @param {String} str + * @param {String} searchString + * @param {Number} [position= 0] + * + * @returns {boolean} + */ +const endsWith = (str, searchString, position) => { + str = String(str); + if (position === undefined || position > str.length) { + position = str.length; + } + position -= searchString.length; + const lastIndex = str.indexOf(searchString, position); + return lastIndex !== -1 && lastIndex === position; +} + + +/** + * Returns new array from array like object or null if failed + * + * @param {*} [thing] + * + * @returns {?Array} + */ +const toArray = (thing) => { + if (!thing) return null; + if (isArray(thing)) return thing; + let i = thing.length; + if (!isNumber(i)) return null; + const arr = new Array(i); + while (i-- > 0) { + arr[i] = thing[i]; + } + return arr; +} + +/** + * Checking if the Uint8Array exists and if it does, it returns a function that checks if the + * thing passed in is an instance of Uint8Array + * + * @param {TypedArray} + * + * @returns {Array} + */ +// eslint-disable-next-line func-names +const isTypedArray = (TypedArray => { + // eslint-disable-next-line func-names + return thing => { + return TypedArray && thing instanceof TypedArray; + }; +})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array)); + +/** + * For each entry in the object, call the function with the key and value. + * + * @param {Object} obj - The object to iterate over. + * @param {Function} fn - The function to call for each entry. + * + * @returns {void} + */ +const forEachEntry = (obj, fn) => { + const generator = obj && obj[Symbol.iterator]; + + const iterator = generator.call(obj); + + let result; + + while ((result = iterator.next()) && !result.done) { + const pair = result.value; + fn.call(obj, pair[0], pair[1]); + } +} + +/** + * It takes a regular expression and a string, and returns an array of all the matches + * + * @param {string} regExp - The regular expression to match against. + * @param {string} str - The string to search. + * + * @returns {Array} + */ +const matchAll = (regExp, str) => { + let matches; + const arr = []; + + while ((matches = regExp.exec(str)) !== null) { + arr.push(matches); + } + + return arr; +} + +/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */ +const isHTMLForm = kindOfTest('HTMLFormElement'); + +const toCamelCase = str => { + return str.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g, + function replacer(m, p1, p2) { + return p1.toUpperCase() + p2; + } + ); +}; + +/* Creating a function that will check if an object has a property. */ +const hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype); + +/** + * Determine if a value is a RegExp object + * + * @param {*} val The value to test + * + * @returns {boolean} True if value is a RegExp object, otherwise false + */ +const isRegExp = kindOfTest('RegExp'); + +const reduceDescriptors = (obj, reducer) => { + const descriptors = Object.getOwnPropertyDescriptors(obj); + const reducedDescriptors = {}; + + forEach(descriptors, (descriptor, name) => { + let ret; + if ((ret = reducer(descriptor, name, obj)) !== false) { + reducedDescriptors[name] = ret || descriptor; + } + }); + + Object.defineProperties(obj, reducedDescriptors); +} + +/** + * Makes all methods read-only + * @param {Object} obj + */ + +const freezeMethods = (obj) => { + reduceDescriptors(obj, (descriptor, name) => { + // skip restricted props in strict mode + if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) { + return false; + } + + const value = obj[name]; + + if (!isFunction(value)) return; + + descriptor.enumerable = false; + + if ('writable' in descriptor) { + descriptor.writable = false; + return; + } + + if (!descriptor.set) { + descriptor.set = () => { + throw Error('Can not rewrite read-only method \'' + name + '\''); + }; + } + }); +} + +const toObjectSet = (arrayOrString, delimiter) => { + const obj = {}; + + const define = (arr) => { + arr.forEach(value => { + obj[value] = true; + }); + } + + isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter)); + + return obj; +} + +const noop = () => {} + +const toFiniteNumber = (value, defaultValue) => { + value = +value; + return Number.isFinite(value) ? value : defaultValue; +} + +const ALPHA = 'abcdefghijklmnopqrstuvwxyz' + +const DIGIT = '0123456789'; + +const ALPHABET = { + DIGIT, + ALPHA, + ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT +} + +const generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => { + let str = ''; + const {length} = alphabet; + while (size--) { + str += alphabet[Math.random() * length|0] + } + + return str; +} + +/** + * If the thing is a FormData object, return true, otherwise return false. + * + * @param {unknown} thing - The thing to check. + * + * @returns {boolean} + */ +function isSpecCompliantForm(thing) { + return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]); +} + +const toJSONObject = (obj) => { + const stack = new Array(10); + + const visit = (source, i) => { + + if (isObject(source)) { + if (stack.indexOf(source) >= 0) { + return; + } + + if(!('toJSON' in source)) { + stack[i] = source; + const target = isArray(source) ? [] : {}; + + forEach(source, (value, key) => { + const reducedValue = visit(value, i + 1); + !isUndefined(reducedValue) && (target[key] = reducedValue); + }); + + stack[i] = undefined; + + return target; + } + } + + return source; + } + + return visit(obj, 0); +} + +const isAsyncFn = kindOfTest('AsyncFunction'); + +const isThenable = (thing) => + thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch); + +export default { + isArray, + isArrayBuffer, + isBuffer, + isFormData, + isArrayBufferView, + isString, + isNumber, + isBoolean, + isObject, + isPlainObject, + isUndefined, + isDate, + isFile, + isBlob, + isRegExp, + isFunction, + isStream, + isURLSearchParams, + isTypedArray, + isFileList, + forEach, + merge, + extend, + trim, + stripBOM, + inherits, + toFlatObject, + kindOf, + kindOfTest, + endsWith, + toArray, + forEachEntry, + matchAll, + isHTMLForm, + hasOwnProperty, + hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection + reduceDescriptors, + freezeMethods, + toObjectSet, + toCamelCase, + noop, + toFiniteNumber, + findKey, + global: _global, + isContextDefined, + ALPHABET, + generateString, + isSpecCompliantForm, + toJSONObject, + isAsyncFn, + isThenable +}; diff --git a/task/node_modules/axios/node_modules/form-data/License b/task/node_modules/axios/node_modules/form-data/License new file mode 100644 index 0000000..c7ff12a --- /dev/null +++ b/task/node_modules/axios/node_modules/form-data/License @@ -0,0 +1,19 @@ +Copyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) and contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. diff --git a/task/node_modules/axios/node_modules/form-data/README.md.bak b/task/node_modules/axios/node_modules/form-data/README.md.bak new file mode 100644 index 0000000..298a1a2 --- /dev/null +++ b/task/node_modules/axios/node_modules/form-data/README.md.bak @@ -0,0 +1,358 @@ +# Form-Data [![NPM Module](https://img.shields.io/npm/v/form-data.svg)](https://www.npmjs.com/package/form-data) [![Join the chat at https://gitter.im/form-data/form-data](http://form-data.github.io/images/gitterbadge.svg)](https://gitter.im/form-data/form-data) + +A library to create readable ```"multipart/form-data"``` streams. Can be used to submit forms and file uploads to other web applications. + +The API of this library is inspired by the [XMLHttpRequest-2 FormData Interface][xhr2-fd]. + +[xhr2-fd]: http://dev.w3.org/2006/webapi/XMLHttpRequest-2/Overview.html#the-formdata-interface + +[![Linux Build](https://img.shields.io/travis/form-data/form-data/v4.0.0.svg?label=linux:6.x-12.x)](https://travis-ci.org/form-data/form-data) +[![MacOS Build](https://img.shields.io/travis/form-data/form-data/v4.0.0.svg?label=macos:6.x-12.x)](https://travis-ci.org/form-data/form-data) +[![Windows Build](https://img.shields.io/travis/form-data/form-data/v4.0.0.svg?label=windows:6.x-12.x)](https://travis-ci.org/form-data/form-data) + +[![Coverage Status](https://img.shields.io/coveralls/form-data/form-data/v4.0.0.svg?label=code+coverage)](https://coveralls.io/github/form-data/form-data?branch=master) +[![Dependency Status](https://img.shields.io/david/form-data/form-data.svg)](https://david-dm.org/form-data/form-data) + +## Install + +``` +npm install --save form-data +``` + +## Usage + +In this example we are constructing a form with 3 fields that contain a string, +a buffer and a file stream. + +``` javascript +var FormData = require('form-data'); +var fs = require('fs'); + +var form = new FormData(); +form.append('my_field', 'my value'); +form.append('my_buffer', new Buffer(10)); +form.append('my_file', fs.createReadStream('/foo/bar.jpg')); +``` + +Also you can use http-response stream: + +``` javascript +var FormData = require('form-data'); +var http = require('http'); + +var form = new FormData(); + +http.request('http://nodejs.org/images/logo.png', function(response) { + form.append('my_field', 'my value'); + form.append('my_buffer', new Buffer(10)); + form.append('my_logo', response); +}); +``` + +Or @mikeal's [request](https://github.com/request/request) stream: + +``` javascript +var FormData = require('form-data'); +var request = require('request'); + +var form = new FormData(); + +form.append('my_field', 'my value'); +form.append('my_buffer', new Buffer(10)); +form.append('my_logo', request('http://nodejs.org/images/logo.png')); +``` + +In order to submit this form to a web application, call ```submit(url, [callback])``` method: + +``` javascript +form.submit('http://example.org/', function(err, res) { + // res – response object (http.IncomingMessage) // + res.resume(); +}); + +``` + +For more advanced request manipulations ```submit()``` method returns ```http.ClientRequest``` object, or you can choose from one of the alternative submission methods. + +### Custom options + +You can provide custom options, such as `maxDataSize`: + +``` javascript +var FormData = require('form-data'); + +var form = new FormData({ maxDataSize: 20971520 }); +form.append('my_field', 'my value'); +form.append('my_buffer', /* something big */); +``` + +List of available options could be found in [combined-stream](https://github.com/felixge/node-combined-stream/blob/master/lib/combined_stream.js#L7-L15) + +### Alternative submission methods + +You can use node's http client interface: + +``` javascript +var http = require('http'); + +var request = http.request({ + method: 'post', + host: 'example.org', + path: '/upload', + headers: form.getHeaders() +}); + +form.pipe(request); + +request.on('response', function(res) { + console.log(res.statusCode); +}); +``` + +Or if you would prefer the `'Content-Length'` header to be set for you: + +``` javascript +form.submit('example.org/upload', function(err, res) { + console.log(res.statusCode); +}); +``` + +To use custom headers and pre-known length in parts: + +``` javascript +var CRLF = '\r\n'; +var form = new FormData(); + +var options = { + header: CRLF + '--' + form.getBoundary() + CRLF + 'X-Custom-Header: 123' + CRLF + CRLF, + knownLength: 1 +}; + +form.append('my_buffer', buffer, options); + +form.submit('http://example.com/', function(err, res) { + if (err) throw err; + console.log('Done'); +}); +``` + +Form-Data can recognize and fetch all the required information from common types of streams (```fs.readStream```, ```http.response``` and ```mikeal's request```), for some other types of streams you'd need to provide "file"-related information manually: + +``` javascript +someModule.stream(function(err, stdout, stderr) { + if (err) throw err; + + var form = new FormData(); + + form.append('file', stdout, { + filename: 'unicycle.jpg', // ... or: + filepath: 'photos/toys/unicycle.jpg', + contentType: 'image/jpeg', + knownLength: 19806 + }); + + form.submit('http://example.com/', function(err, res) { + if (err) throw err; + console.log('Done'); + }); +}); +``` + +The `filepath` property overrides `filename` and may contain a relative path. This is typically used when uploading [multiple files from a directory](https://wicg.github.io/entries-api/#dom-htmlinputelement-webkitdirectory). + +For edge cases, like POST request to URL with query string or to pass HTTP auth credentials, object can be passed to `form.submit()` as first parameter: + +``` javascript +form.submit({ + host: 'example.com', + path: '/probably.php?extra=params', + auth: 'username:password' +}, function(err, res) { + console.log(res.statusCode); +}); +``` + +In case you need to also send custom HTTP headers with the POST request, you can use the `headers` key in first parameter of `form.submit()`: + +``` javascript +form.submit({ + host: 'example.com', + path: '/surelynot.php', + headers: {'x-test-header': 'test-header-value'} +}, function(err, res) { + console.log(res.statusCode); +}); +``` + +### Methods + +- [_Void_ append( **String** _field_, **Mixed** _value_ [, **Mixed** _options_] )](https://github.com/form-data/form-data#void-append-string-field-mixed-value--mixed-options-). +- [_Headers_ getHeaders( [**Headers** _userHeaders_] )](https://github.com/form-data/form-data#array-getheaders-array-userheaders-) +- [_String_ getBoundary()](https://github.com/form-data/form-data#string-getboundary) +- [_Void_ setBoundary()](https://github.com/form-data/form-data#void-setboundary) +- [_Buffer_ getBuffer()](https://github.com/form-data/form-data#buffer-getbuffer) +- [_Integer_ getLengthSync()](https://github.com/form-data/form-data#integer-getlengthsync) +- [_Integer_ getLength( **function** _callback_ )](https://github.com/form-data/form-data#integer-getlength-function-callback-) +- [_Boolean_ hasKnownLength()](https://github.com/form-data/form-data#boolean-hasknownlength) +- [_Request_ submit( _params_, **function** _callback_ )](https://github.com/form-data/form-data#request-submit-params-function-callback-) +- [_String_ toString()](https://github.com/form-data/form-data#string-tostring) + +#### _Void_ append( **String** _field_, **Mixed** _value_ [, **Mixed** _options_] ) +Append data to the form. You can submit about any format (string, integer, boolean, buffer, etc.). However, Arrays are not supported and need to be turned into strings by the user. +```javascript +var form = new FormData(); +form.append( 'my_string', 'my value' ); +form.append( 'my_integer', 1 ); +form.append( 'my_boolean', true ); +form.append( 'my_buffer', new Buffer(10) ); +form.append( 'my_array_as_json', JSON.stringify( ['bird','cute'] ) ) +``` + +You may provide a string for options, or an object. +```javascript +// Set filename by providing a string for options +form.append( 'my_file', fs.createReadStream('/foo/bar.jpg'), 'bar.jpg' ); + +// provide an object. +form.append( 'my_file', fs.createReadStream('/foo/bar.jpg'), {filename: 'bar.jpg', contentType: 'image/jpeg', knownLength: 19806} ); +``` + +#### _Headers_ getHeaders( [**Headers** _userHeaders_] ) +This method adds the correct `content-type` header to the provided array of `userHeaders`. + +#### _String_ getBoundary() +Return the boundary of the formData. By default, the boundary consists of 26 `-` followed by 24 numbers +for example: +```javascript +--------------------------515890814546601021194782 +``` + +#### _Void_ setBoundary(String _boundary_) +Set the boundary string, overriding the default behavior described above. + +_Note: The boundary must be unique and may not appear in the data._ + +#### _Buffer_ getBuffer() +Return the full formdata request package, as a Buffer. You can insert this Buffer in e.g. Axios to send multipart data. +```javascript +var form = new FormData(); +form.append( 'my_buffer', Buffer.from([0x4a,0x42,0x20,0x52,0x6f,0x63,0x6b,0x73]) ); +form.append( 'my_file', fs.readFileSync('/foo/bar.jpg') ); + +axios.post( 'https://example.com/path/to/api', + form.getBuffer(), + form.getHeaders() + ) +``` +**Note:** Because the output is of type Buffer, you can only append types that are accepted by Buffer: *string, Buffer, ArrayBuffer, Array, or Array-like Object*. A ReadStream for example will result in an error. + +#### _Integer_ getLengthSync() +Same as `getLength` but synchronous. + +_Note: getLengthSync __doesn't__ calculate streams length._ + +#### _Integer_ getLength( **function** _callback_ ) +Returns the `Content-Length` async. The callback is used to handle errors and continue once the length has been calculated +```javascript +this.getLength(function(err, length) { + if (err) { + this._error(err); + return; + } + + // add content length + request.setHeader('Content-Length', length); + + ... +}.bind(this)); +``` + +#### _Boolean_ hasKnownLength() +Checks if the length of added values is known. + +#### _Request_ submit( _params_, **function** _callback_ ) +Submit the form to a web application. +```javascript +var form = new FormData(); +form.append( 'my_string', 'Hello World' ); + +form.submit( 'http://example.com/', function(err, res) { + // res – response object (http.IncomingMessage) // + res.resume(); +} ); +``` + +#### _String_ toString() +Returns the form data as a string. Don't use this if you are sending files or buffers, use `getBuffer()` instead. + +### Integration with other libraries + +#### Request + +Form submission using [request](https://github.com/request/request): + +```javascript +var formData = { + my_field: 'my_value', + my_file: fs.createReadStream(__dirname + '/unicycle.jpg'), +}; + +request.post({url:'http://service.com/upload', formData: formData}, function(err, httpResponse, body) { + if (err) { + return console.error('upload failed:', err); + } + console.log('Upload successful! Server responded with:', body); +}); +``` + +For more details see [request readme](https://github.com/request/request#multipartform-data-multipart-form-uploads). + +#### node-fetch + +You can also submit a form using [node-fetch](https://github.com/bitinn/node-fetch): + +```javascript +var form = new FormData(); + +form.append('a', 1); + +fetch('http://example.com', { method: 'POST', body: form }) + .then(function(res) { + return res.json(); + }).then(function(json) { + console.log(json); + }); +``` + +#### axios + +In Node.js you can post a file using [axios](https://github.com/axios/axios): +```javascript +const form = new FormData(); +const stream = fs.createReadStream(PATH_TO_FILE); + +form.append('image', stream); + +// In Node.js environment you need to set boundary in the header field 'Content-Type' by calling method `getHeaders` +const formHeaders = form.getHeaders(); + +axios.post('http://example.com', form, { + headers: { + ...formHeaders, + }, +}) +.then(response => response) +.catch(error => error) +``` + +## Notes + +- ```getLengthSync()``` method DOESN'T calculate length for streams, use ```knownLength``` options as workaround. +- ```getLength(cb)``` will send an error as first parameter of callback if stream length cannot be calculated (e.g. send in custom streams w/o using ```knownLength```). +- ```submit``` will not add `content-length` if form length is unknown or not calculable. +- Starting version `2.x` FormData has dropped support for `node@0.10.x`. +- Starting version `3.x` FormData has dropped support for `node@4.x`. + +## License + +Form-Data is released under the [MIT](License) license. diff --git a/task/node_modules/axios/node_modules/form-data/Readme.md b/task/node_modules/axios/node_modules/form-data/Readme.md new file mode 100644 index 0000000..298a1a2 --- /dev/null +++ b/task/node_modules/axios/node_modules/form-data/Readme.md @@ -0,0 +1,358 @@ +# Form-Data [![NPM Module](https://img.shields.io/npm/v/form-data.svg)](https://www.npmjs.com/package/form-data) [![Join the chat at https://gitter.im/form-data/form-data](http://form-data.github.io/images/gitterbadge.svg)](https://gitter.im/form-data/form-data) + +A library to create readable ```"multipart/form-data"``` streams. Can be used to submit forms and file uploads to other web applications. + +The API of this library is inspired by the [XMLHttpRequest-2 FormData Interface][xhr2-fd]. + +[xhr2-fd]: http://dev.w3.org/2006/webapi/XMLHttpRequest-2/Overview.html#the-formdata-interface + +[![Linux Build](https://img.shields.io/travis/form-data/form-data/v4.0.0.svg?label=linux:6.x-12.x)](https://travis-ci.org/form-data/form-data) +[![MacOS Build](https://img.shields.io/travis/form-data/form-data/v4.0.0.svg?label=macos:6.x-12.x)](https://travis-ci.org/form-data/form-data) +[![Windows Build](https://img.shields.io/travis/form-data/form-data/v4.0.0.svg?label=windows:6.x-12.x)](https://travis-ci.org/form-data/form-data) + +[![Coverage Status](https://img.shields.io/coveralls/form-data/form-data/v4.0.0.svg?label=code+coverage)](https://coveralls.io/github/form-data/form-data?branch=master) +[![Dependency Status](https://img.shields.io/david/form-data/form-data.svg)](https://david-dm.org/form-data/form-data) + +## Install + +``` +npm install --save form-data +``` + +## Usage + +In this example we are constructing a form with 3 fields that contain a string, +a buffer and a file stream. + +``` javascript +var FormData = require('form-data'); +var fs = require('fs'); + +var form = new FormData(); +form.append('my_field', 'my value'); +form.append('my_buffer', new Buffer(10)); +form.append('my_file', fs.createReadStream('/foo/bar.jpg')); +``` + +Also you can use http-response stream: + +``` javascript +var FormData = require('form-data'); +var http = require('http'); + +var form = new FormData(); + +http.request('http://nodejs.org/images/logo.png', function(response) { + form.append('my_field', 'my value'); + form.append('my_buffer', new Buffer(10)); + form.append('my_logo', response); +}); +``` + +Or @mikeal's [request](https://github.com/request/request) stream: + +``` javascript +var FormData = require('form-data'); +var request = require('request'); + +var form = new FormData(); + +form.append('my_field', 'my value'); +form.append('my_buffer', new Buffer(10)); +form.append('my_logo', request('http://nodejs.org/images/logo.png')); +``` + +In order to submit this form to a web application, call ```submit(url, [callback])``` method: + +``` javascript +form.submit('http://example.org/', function(err, res) { + // res – response object (http.IncomingMessage) // + res.resume(); +}); + +``` + +For more advanced request manipulations ```submit()``` method returns ```http.ClientRequest``` object, or you can choose from one of the alternative submission methods. + +### Custom options + +You can provide custom options, such as `maxDataSize`: + +``` javascript +var FormData = require('form-data'); + +var form = new FormData({ maxDataSize: 20971520 }); +form.append('my_field', 'my value'); +form.append('my_buffer', /* something big */); +``` + +List of available options could be found in [combined-stream](https://github.com/felixge/node-combined-stream/blob/master/lib/combined_stream.js#L7-L15) + +### Alternative submission methods + +You can use node's http client interface: + +``` javascript +var http = require('http'); + +var request = http.request({ + method: 'post', + host: 'example.org', + path: '/upload', + headers: form.getHeaders() +}); + +form.pipe(request); + +request.on('response', function(res) { + console.log(res.statusCode); +}); +``` + +Or if you would prefer the `'Content-Length'` header to be set for you: + +``` javascript +form.submit('example.org/upload', function(err, res) { + console.log(res.statusCode); +}); +``` + +To use custom headers and pre-known length in parts: + +``` javascript +var CRLF = '\r\n'; +var form = new FormData(); + +var options = { + header: CRLF + '--' + form.getBoundary() + CRLF + 'X-Custom-Header: 123' + CRLF + CRLF, + knownLength: 1 +}; + +form.append('my_buffer', buffer, options); + +form.submit('http://example.com/', function(err, res) { + if (err) throw err; + console.log('Done'); +}); +``` + +Form-Data can recognize and fetch all the required information from common types of streams (```fs.readStream```, ```http.response``` and ```mikeal's request```), for some other types of streams you'd need to provide "file"-related information manually: + +``` javascript +someModule.stream(function(err, stdout, stderr) { + if (err) throw err; + + var form = new FormData(); + + form.append('file', stdout, { + filename: 'unicycle.jpg', // ... or: + filepath: 'photos/toys/unicycle.jpg', + contentType: 'image/jpeg', + knownLength: 19806 + }); + + form.submit('http://example.com/', function(err, res) { + if (err) throw err; + console.log('Done'); + }); +}); +``` + +The `filepath` property overrides `filename` and may contain a relative path. This is typically used when uploading [multiple files from a directory](https://wicg.github.io/entries-api/#dom-htmlinputelement-webkitdirectory). + +For edge cases, like POST request to URL with query string or to pass HTTP auth credentials, object can be passed to `form.submit()` as first parameter: + +``` javascript +form.submit({ + host: 'example.com', + path: '/probably.php?extra=params', + auth: 'username:password' +}, function(err, res) { + console.log(res.statusCode); +}); +``` + +In case you need to also send custom HTTP headers with the POST request, you can use the `headers` key in first parameter of `form.submit()`: + +``` javascript +form.submit({ + host: 'example.com', + path: '/surelynot.php', + headers: {'x-test-header': 'test-header-value'} +}, function(err, res) { + console.log(res.statusCode); +}); +``` + +### Methods + +- [_Void_ append( **String** _field_, **Mixed** _value_ [, **Mixed** _options_] )](https://github.com/form-data/form-data#void-append-string-field-mixed-value--mixed-options-). +- [_Headers_ getHeaders( [**Headers** _userHeaders_] )](https://github.com/form-data/form-data#array-getheaders-array-userheaders-) +- [_String_ getBoundary()](https://github.com/form-data/form-data#string-getboundary) +- [_Void_ setBoundary()](https://github.com/form-data/form-data#void-setboundary) +- [_Buffer_ getBuffer()](https://github.com/form-data/form-data#buffer-getbuffer) +- [_Integer_ getLengthSync()](https://github.com/form-data/form-data#integer-getlengthsync) +- [_Integer_ getLength( **function** _callback_ )](https://github.com/form-data/form-data#integer-getlength-function-callback-) +- [_Boolean_ hasKnownLength()](https://github.com/form-data/form-data#boolean-hasknownlength) +- [_Request_ submit( _params_, **function** _callback_ )](https://github.com/form-data/form-data#request-submit-params-function-callback-) +- [_String_ toString()](https://github.com/form-data/form-data#string-tostring) + +#### _Void_ append( **String** _field_, **Mixed** _value_ [, **Mixed** _options_] ) +Append data to the form. You can submit about any format (string, integer, boolean, buffer, etc.). However, Arrays are not supported and need to be turned into strings by the user. +```javascript +var form = new FormData(); +form.append( 'my_string', 'my value' ); +form.append( 'my_integer', 1 ); +form.append( 'my_boolean', true ); +form.append( 'my_buffer', new Buffer(10) ); +form.append( 'my_array_as_json', JSON.stringify( ['bird','cute'] ) ) +``` + +You may provide a string for options, or an object. +```javascript +// Set filename by providing a string for options +form.append( 'my_file', fs.createReadStream('/foo/bar.jpg'), 'bar.jpg' ); + +// provide an object. +form.append( 'my_file', fs.createReadStream('/foo/bar.jpg'), {filename: 'bar.jpg', contentType: 'image/jpeg', knownLength: 19806} ); +``` + +#### _Headers_ getHeaders( [**Headers** _userHeaders_] ) +This method adds the correct `content-type` header to the provided array of `userHeaders`. + +#### _String_ getBoundary() +Return the boundary of the formData. By default, the boundary consists of 26 `-` followed by 24 numbers +for example: +```javascript +--------------------------515890814546601021194782 +``` + +#### _Void_ setBoundary(String _boundary_) +Set the boundary string, overriding the default behavior described above. + +_Note: The boundary must be unique and may not appear in the data._ + +#### _Buffer_ getBuffer() +Return the full formdata request package, as a Buffer. You can insert this Buffer in e.g. Axios to send multipart data. +```javascript +var form = new FormData(); +form.append( 'my_buffer', Buffer.from([0x4a,0x42,0x20,0x52,0x6f,0x63,0x6b,0x73]) ); +form.append( 'my_file', fs.readFileSync('/foo/bar.jpg') ); + +axios.post( 'https://example.com/path/to/api', + form.getBuffer(), + form.getHeaders() + ) +``` +**Note:** Because the output is of type Buffer, you can only append types that are accepted by Buffer: *string, Buffer, ArrayBuffer, Array, or Array-like Object*. A ReadStream for example will result in an error. + +#### _Integer_ getLengthSync() +Same as `getLength` but synchronous. + +_Note: getLengthSync __doesn't__ calculate streams length._ + +#### _Integer_ getLength( **function** _callback_ ) +Returns the `Content-Length` async. The callback is used to handle errors and continue once the length has been calculated +```javascript +this.getLength(function(err, length) { + if (err) { + this._error(err); + return; + } + + // add content length + request.setHeader('Content-Length', length); + + ... +}.bind(this)); +``` + +#### _Boolean_ hasKnownLength() +Checks if the length of added values is known. + +#### _Request_ submit( _params_, **function** _callback_ ) +Submit the form to a web application. +```javascript +var form = new FormData(); +form.append( 'my_string', 'Hello World' ); + +form.submit( 'http://example.com/', function(err, res) { + // res – response object (http.IncomingMessage) // + res.resume(); +} ); +``` + +#### _String_ toString() +Returns the form data as a string. Don't use this if you are sending files or buffers, use `getBuffer()` instead. + +### Integration with other libraries + +#### Request + +Form submission using [request](https://github.com/request/request): + +```javascript +var formData = { + my_field: 'my_value', + my_file: fs.createReadStream(__dirname + '/unicycle.jpg'), +}; + +request.post({url:'http://service.com/upload', formData: formData}, function(err, httpResponse, body) { + if (err) { + return console.error('upload failed:', err); + } + console.log('Upload successful! Server responded with:', body); +}); +``` + +For more details see [request readme](https://github.com/request/request#multipartform-data-multipart-form-uploads). + +#### node-fetch + +You can also submit a form using [node-fetch](https://github.com/bitinn/node-fetch): + +```javascript +var form = new FormData(); + +form.append('a', 1); + +fetch('http://example.com', { method: 'POST', body: form }) + .then(function(res) { + return res.json(); + }).then(function(json) { + console.log(json); + }); +``` + +#### axios + +In Node.js you can post a file using [axios](https://github.com/axios/axios): +```javascript +const form = new FormData(); +const stream = fs.createReadStream(PATH_TO_FILE); + +form.append('image', stream); + +// In Node.js environment you need to set boundary in the header field 'Content-Type' by calling method `getHeaders` +const formHeaders = form.getHeaders(); + +axios.post('http://example.com', form, { + headers: { + ...formHeaders, + }, +}) +.then(response => response) +.catch(error => error) +``` + +## Notes + +- ```getLengthSync()``` method DOESN'T calculate length for streams, use ```knownLength``` options as workaround. +- ```getLength(cb)``` will send an error as first parameter of callback if stream length cannot be calculated (e.g. send in custom streams w/o using ```knownLength```). +- ```submit``` will not add `content-length` if form length is unknown or not calculable. +- Starting version `2.x` FormData has dropped support for `node@0.10.x`. +- Starting version `3.x` FormData has dropped support for `node@4.x`. + +## License + +Form-Data is released under the [MIT](License) license. diff --git a/task/node_modules/axios/node_modules/form-data/index.d.ts b/task/node_modules/axios/node_modules/form-data/index.d.ts new file mode 100644 index 0000000..295e9e9 --- /dev/null +++ b/task/node_modules/axios/node_modules/form-data/index.d.ts @@ -0,0 +1,62 @@ +// Definitions by: Carlos Ballesteros Velasco +// Leon Yu +// BendingBender +// Maple Miao + +/// +import * as stream from 'stream'; +import * as http from 'http'; + +export = FormData; + +// Extracted because @types/node doesn't export interfaces. +interface ReadableOptions { + highWaterMark?: number; + encoding?: string; + objectMode?: boolean; + read?(this: stream.Readable, size: number): void; + destroy?(this: stream.Readable, error: Error | null, callback: (error: Error | null) => void): void; + autoDestroy?: boolean; +} + +interface Options extends ReadableOptions { + writable?: boolean; + readable?: boolean; + dataSize?: number; + maxDataSize?: number; + pauseStreams?: boolean; +} + +declare class FormData extends stream.Readable { + constructor(options?: Options); + append(key: string, value: any, options?: FormData.AppendOptions | string): void; + getHeaders(userHeaders?: FormData.Headers): FormData.Headers; + submit( + params: string | FormData.SubmitOptions, + callback?: (error: Error | null, response: http.IncomingMessage) => void + ): http.ClientRequest; + getBuffer(): Buffer; + setBoundary(boundary: string): void; + getBoundary(): string; + getLength(callback: (err: Error | null, length: number) => void): void; + getLengthSync(): number; + hasKnownLength(): boolean; +} + +declare namespace FormData { + interface Headers { + [key: string]: any; + } + + interface AppendOptions { + header?: string | Headers; + knownLength?: number; + filename?: string; + filepath?: string; + contentType?: string; + } + + interface SubmitOptions extends http.RequestOptions { + protocol?: 'https:' | 'http:'; + } +} diff --git a/task/node_modules/axios/node_modules/form-data/lib/browser.js b/task/node_modules/axios/node_modules/form-data/lib/browser.js new file mode 100644 index 0000000..09e7c70 --- /dev/null +++ b/task/node_modules/axios/node_modules/form-data/lib/browser.js @@ -0,0 +1,2 @@ +/* eslint-env browser */ +module.exports = typeof self == 'object' ? self.FormData : window.FormData; diff --git a/task/node_modules/axios/node_modules/form-data/lib/form_data.js b/task/node_modules/axios/node_modules/form-data/lib/form_data.js new file mode 100644 index 0000000..18dc819 --- /dev/null +++ b/task/node_modules/axios/node_modules/form-data/lib/form_data.js @@ -0,0 +1,501 @@ +var CombinedStream = require('combined-stream'); +var util = require('util'); +var path = require('path'); +var http = require('http'); +var https = require('https'); +var parseUrl = require('url').parse; +var fs = require('fs'); +var Stream = require('stream').Stream; +var mime = require('mime-types'); +var asynckit = require('asynckit'); +var populate = require('./populate.js'); + +// Public API +module.exports = FormData; + +// make it a Stream +util.inherits(FormData, CombinedStream); + +/** + * Create readable "multipart/form-data" streams. + * Can be used to submit forms + * and file uploads to other web applications. + * + * @constructor + * @param {Object} options - Properties to be added/overriden for FormData and CombinedStream + */ +function FormData(options) { + if (!(this instanceof FormData)) { + return new FormData(options); + } + + this._overheadLength = 0; + this._valueLength = 0; + this._valuesToMeasure = []; + + CombinedStream.call(this); + + options = options || {}; + for (var option in options) { + this[option] = options[option]; + } +} + +FormData.LINE_BREAK = '\r\n'; +FormData.DEFAULT_CONTENT_TYPE = 'application/octet-stream'; + +FormData.prototype.append = function(field, value, options) { + + options = options || {}; + + // allow filename as single option + if (typeof options == 'string') { + options = {filename: options}; + } + + var append = CombinedStream.prototype.append.bind(this); + + // all that streamy business can't handle numbers + if (typeof value == 'number') { + value = '' + value; + } + + // https://github.com/felixge/node-form-data/issues/38 + if (util.isArray(value)) { + // Please convert your array into string + // the way web server expects it + this._error(new Error('Arrays are not supported.')); + return; + } + + var header = this._multiPartHeader(field, value, options); + var footer = this._multiPartFooter(); + + append(header); + append(value); + append(footer); + + // pass along options.knownLength + this._trackLength(header, value, options); +}; + +FormData.prototype._trackLength = function(header, value, options) { + var valueLength = 0; + + // used w/ getLengthSync(), when length is known. + // e.g. for streaming directly from a remote server, + // w/ a known file a size, and not wanting to wait for + // incoming file to finish to get its size. + if (options.knownLength != null) { + valueLength += +options.knownLength; + } else if (Buffer.isBuffer(value)) { + valueLength = value.length; + } else if (typeof value === 'string') { + valueLength = Buffer.byteLength(value); + } + + this._valueLength += valueLength; + + // @check why add CRLF? does this account for custom/multiple CRLFs? + this._overheadLength += + Buffer.byteLength(header) + + FormData.LINE_BREAK.length; + + // empty or either doesn't have path or not an http response or not a stream + if (!value || ( !value.path && !(value.readable && value.hasOwnProperty('httpVersion')) && !(value instanceof Stream))) { + return; + } + + // no need to bother with the length + if (!options.knownLength) { + this._valuesToMeasure.push(value); + } +}; + +FormData.prototype._lengthRetriever = function(value, callback) { + + if (value.hasOwnProperty('fd')) { + + // take read range into a account + // `end` = Infinity –> read file till the end + // + // TODO: Looks like there is bug in Node fs.createReadStream + // it doesn't respect `end` options without `start` options + // Fix it when node fixes it. + // https://github.com/joyent/node/issues/7819 + if (value.end != undefined && value.end != Infinity && value.start != undefined) { + + // when end specified + // no need to calculate range + // inclusive, starts with 0 + callback(null, value.end + 1 - (value.start ? value.start : 0)); + + // not that fast snoopy + } else { + // still need to fetch file size from fs + fs.stat(value.path, function(err, stat) { + + var fileSize; + + if (err) { + callback(err); + return; + } + + // update final size based on the range options + fileSize = stat.size - (value.start ? value.start : 0); + callback(null, fileSize); + }); + } + + // or http response + } else if (value.hasOwnProperty('httpVersion')) { + callback(null, +value.headers['content-length']); + + // or request stream http://github.com/mikeal/request + } else if (value.hasOwnProperty('httpModule')) { + // wait till response come back + value.on('response', function(response) { + value.pause(); + callback(null, +response.headers['content-length']); + }); + value.resume(); + + // something else + } else { + callback('Unknown stream'); + } +}; + +FormData.prototype._multiPartHeader = function(field, value, options) { + // custom header specified (as string)? + // it becomes responsible for boundary + // (e.g. to handle extra CRLFs on .NET servers) + if (typeof options.header == 'string') { + return options.header; + } + + var contentDisposition = this._getContentDisposition(value, options); + var contentType = this._getContentType(value, options); + + var contents = ''; + var headers = { + // add custom disposition as third element or keep it two elements if not + 'Content-Disposition': ['form-data', 'name="' + field + '"'].concat(contentDisposition || []), + // if no content type. allow it to be empty array + 'Content-Type': [].concat(contentType || []) + }; + + // allow custom headers. + if (typeof options.header == 'object') { + populate(headers, options.header); + } + + var header; + for (var prop in headers) { + if (!headers.hasOwnProperty(prop)) continue; + header = headers[prop]; + + // skip nullish headers. + if (header == null) { + continue; + } + + // convert all headers to arrays. + if (!Array.isArray(header)) { + header = [header]; + } + + // add non-empty headers. + if (header.length) { + contents += prop + ': ' + header.join('; ') + FormData.LINE_BREAK; + } + } + + return '--' + this.getBoundary() + FormData.LINE_BREAK + contents + FormData.LINE_BREAK; +}; + +FormData.prototype._getContentDisposition = function(value, options) { + + var filename + , contentDisposition + ; + + if (typeof options.filepath === 'string') { + // custom filepath for relative paths + filename = path.normalize(options.filepath).replace(/\\/g, '/'); + } else if (options.filename || value.name || value.path) { + // custom filename take precedence + // formidable and the browser add a name property + // fs- and request- streams have path property + filename = path.basename(options.filename || value.name || value.path); + } else if (value.readable && value.hasOwnProperty('httpVersion')) { + // or try http response + filename = path.basename(value.client._httpMessage.path || ''); + } + + if (filename) { + contentDisposition = 'filename="' + filename + '"'; + } + + return contentDisposition; +}; + +FormData.prototype._getContentType = function(value, options) { + + // use custom content-type above all + var contentType = options.contentType; + + // or try `name` from formidable, browser + if (!contentType && value.name) { + contentType = mime.lookup(value.name); + } + + // or try `path` from fs-, request- streams + if (!contentType && value.path) { + contentType = mime.lookup(value.path); + } + + // or if it's http-reponse + if (!contentType && value.readable && value.hasOwnProperty('httpVersion')) { + contentType = value.headers['content-type']; + } + + // or guess it from the filepath or filename + if (!contentType && (options.filepath || options.filename)) { + contentType = mime.lookup(options.filepath || options.filename); + } + + // fallback to the default content type if `value` is not simple value + if (!contentType && typeof value == 'object') { + contentType = FormData.DEFAULT_CONTENT_TYPE; + } + + return contentType; +}; + +FormData.prototype._multiPartFooter = function() { + return function(next) { + var footer = FormData.LINE_BREAK; + + var lastPart = (this._streams.length === 0); + if (lastPart) { + footer += this._lastBoundary(); + } + + next(footer); + }.bind(this); +}; + +FormData.prototype._lastBoundary = function() { + return '--' + this.getBoundary() + '--' + FormData.LINE_BREAK; +}; + +FormData.prototype.getHeaders = function(userHeaders) { + var header; + var formHeaders = { + 'content-type': 'multipart/form-data; boundary=' + this.getBoundary() + }; + + for (header in userHeaders) { + if (userHeaders.hasOwnProperty(header)) { + formHeaders[header.toLowerCase()] = userHeaders[header]; + } + } + + return formHeaders; +}; + +FormData.prototype.setBoundary = function(boundary) { + this._boundary = boundary; +}; + +FormData.prototype.getBoundary = function() { + if (!this._boundary) { + this._generateBoundary(); + } + + return this._boundary; +}; + +FormData.prototype.getBuffer = function() { + var dataBuffer = new Buffer.alloc( 0 ); + var boundary = this.getBoundary(); + + // Create the form content. Add Line breaks to the end of data. + for (var i = 0, len = this._streams.length; i < len; i++) { + if (typeof this._streams[i] !== 'function') { + + // Add content to the buffer. + if(Buffer.isBuffer(this._streams[i])) { + dataBuffer = Buffer.concat( [dataBuffer, this._streams[i]]); + }else { + dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(this._streams[i])]); + } + + // Add break after content. + if (typeof this._streams[i] !== 'string' || this._streams[i].substring( 2, boundary.length + 2 ) !== boundary) { + dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(FormData.LINE_BREAK)] ); + } + } + } + + // Add the footer and return the Buffer object. + return Buffer.concat( [dataBuffer, Buffer.from(this._lastBoundary())] ); +}; + +FormData.prototype._generateBoundary = function() { + // This generates a 50 character boundary similar to those used by Firefox. + // They are optimized for boyer-moore parsing. + var boundary = '--------------------------'; + for (var i = 0; i < 24; i++) { + boundary += Math.floor(Math.random() * 10).toString(16); + } + + this._boundary = boundary; +}; + +// Note: getLengthSync DOESN'T calculate streams length +// As workaround one can calculate file size manually +// and add it as knownLength option +FormData.prototype.getLengthSync = function() { + var knownLength = this._overheadLength + this._valueLength; + + // Don't get confused, there are 3 "internal" streams for each keyval pair + // so it basically checks if there is any value added to the form + if (this._streams.length) { + knownLength += this._lastBoundary().length; + } + + // https://github.com/form-data/form-data/issues/40 + if (!this.hasKnownLength()) { + // Some async length retrievers are present + // therefore synchronous length calculation is false. + // Please use getLength(callback) to get proper length + this._error(new Error('Cannot calculate proper length in synchronous way.')); + } + + return knownLength; +}; + +// Public API to check if length of added values is known +// https://github.com/form-data/form-data/issues/196 +// https://github.com/form-data/form-data/issues/262 +FormData.prototype.hasKnownLength = function() { + var hasKnownLength = true; + + if (this._valuesToMeasure.length) { + hasKnownLength = false; + } + + return hasKnownLength; +}; + +FormData.prototype.getLength = function(cb) { + var knownLength = this._overheadLength + this._valueLength; + + if (this._streams.length) { + knownLength += this._lastBoundary().length; + } + + if (!this._valuesToMeasure.length) { + process.nextTick(cb.bind(this, null, knownLength)); + return; + } + + asynckit.parallel(this._valuesToMeasure, this._lengthRetriever, function(err, values) { + if (err) { + cb(err); + return; + } + + values.forEach(function(length) { + knownLength += length; + }); + + cb(null, knownLength); + }); +}; + +FormData.prototype.submit = function(params, cb) { + var request + , options + , defaults = {method: 'post'} + ; + + // parse provided url if it's string + // or treat it as options object + if (typeof params == 'string') { + + params = parseUrl(params); + options = populate({ + port: params.port, + path: params.pathname, + host: params.hostname, + protocol: params.protocol + }, defaults); + + // use custom params + } else { + + options = populate(params, defaults); + // if no port provided use default one + if (!options.port) { + options.port = options.protocol == 'https:' ? 443 : 80; + } + } + + // put that good code in getHeaders to some use + options.headers = this.getHeaders(params.headers); + + // https if specified, fallback to http in any other case + if (options.protocol == 'https:') { + request = https.request(options); + } else { + request = http.request(options); + } + + // get content length and fire away + this.getLength(function(err, length) { + if (err && err !== 'Unknown stream') { + this._error(err); + return; + } + + // add content length + if (length) { + request.setHeader('Content-Length', length); + } + + this.pipe(request); + if (cb) { + var onResponse; + + var callback = function (error, responce) { + request.removeListener('error', callback); + request.removeListener('response', onResponse); + + return cb.call(this, error, responce); + }; + + onResponse = callback.bind(this, null); + + request.on('error', callback); + request.on('response', onResponse); + } + }.bind(this)); + + return request; +}; + +FormData.prototype._error = function(err) { + if (!this.error) { + this.error = err; + this.pause(); + this.emit('error', err); + } +}; + +FormData.prototype.toString = function () { + return '[object FormData]'; +}; diff --git a/task/node_modules/axios/node_modules/form-data/lib/populate.js b/task/node_modules/axios/node_modules/form-data/lib/populate.js new file mode 100644 index 0000000..4d35738 --- /dev/null +++ b/task/node_modules/axios/node_modules/form-data/lib/populate.js @@ -0,0 +1,10 @@ +// populates missing values +module.exports = function(dst, src) { + + Object.keys(src).forEach(function(prop) + { + dst[prop] = dst[prop] || src[prop]; + }); + + return dst; +}; diff --git a/task/node_modules/axios/node_modules/form-data/package.json b/task/node_modules/axios/node_modules/form-data/package.json new file mode 100644 index 0000000..0f20240 --- /dev/null +++ b/task/node_modules/axios/node_modules/form-data/package.json @@ -0,0 +1,68 @@ +{ + "author": "Felix Geisendörfer (http://debuggable.com/)", + "name": "form-data", + "description": "A library to create readable \"multipart/form-data\" streams. Can be used to submit forms and file uploads to other web applications.", + "version": "4.0.0", + "repository": { + "type": "git", + "url": "git://github.com/form-data/form-data.git" + }, + "main": "./lib/form_data", + "browser": "./lib/browser", + "typings": "./index.d.ts", + "scripts": { + "pretest": "rimraf coverage test/tmp", + "test": "istanbul cover test/run.js", + "posttest": "istanbul report lcov text", + "lint": "eslint lib/*.js test/*.js test/integration/*.js", + "report": "istanbul report lcov text", + "ci-lint": "is-node-modern 8 && npm run lint || is-node-not-modern 8", + "ci-test": "npm run test && npm run browser && npm run report", + "predebug": "rimraf coverage test/tmp", + "debug": "verbose=1 ./test/run.js", + "browser": "browserify -t browserify-istanbul test/run-browser.js | obake --coverage", + "check": "istanbul check-coverage coverage/coverage*.json", + "files": "pkgfiles --sort=name", + "get-version": "node -e \"console.log(require('./package.json').version)\"", + "update-readme": "sed -i.bak 's/\\/master\\.svg/\\/v'$(npm --silent run get-version)'.svg/g' README.md", + "restore-readme": "mv README.md.bak README.md", + "prepublish": "in-publish && npm run update-readme || not-in-publish", + "postpublish": "npm run restore-readme" + }, + "pre-commit": [ + "lint", + "ci-test", + "check" + ], + "engines": { + "node": ">= 6" + }, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "devDependencies": { + "@types/node": "^12.0.10", + "browserify": "^13.1.1", + "browserify-istanbul": "^2.0.0", + "coveralls": "^3.0.4", + "cross-spawn": "^6.0.5", + "eslint": "^6.0.1", + "fake": "^0.2.2", + "far": "^0.0.7", + "formidable": "^1.0.17", + "in-publish": "^2.0.0", + "is-node-modern": "^1.0.0", + "istanbul": "^0.4.5", + "obake": "^0.1.2", + "puppeteer": "^1.19.0", + "pkgfiles": "^2.3.0", + "pre-commit": "^1.1.3", + "request": "^2.88.0", + "rimraf": "^2.7.1", + "tape": "^4.6.2", + "typescript": "^3.5.2" + }, + "license": "MIT" +} diff --git a/task/node_modules/axios/package.json b/task/node_modules/axios/package.json new file mode 100644 index 0000000..6109252 --- /dev/null +++ b/task/node_modules/axios/package.json @@ -0,0 +1,218 @@ +{ + "name": "axios", + "version": "1.6.4", + "description": "Promise based HTTP client for the browser and node.js", + "main": "index.js", + "exports": { + ".": { + "types": { + "require": "./index.d.cts", + "default": "./index.d.ts" + }, + "browser": { + "require": "./dist/browser/axios.cjs", + "default": "./index.js" + }, + "default": { + "require": "./dist/node/axios.cjs", + "default": "./index.js" + } + }, + "./lib/adapters/http.js": "./lib/adapters/http.js", + "./lib/adapters/xhr.js": "./lib/adapters/xhr.js", + "./unsafe/*": "./lib/*", + "./unsafe/core/settle.js": "./lib/core/settle.js", + "./unsafe/core/buildFullPath.js": "./lib/core/buildFullPath.js", + "./unsafe/helpers/isAbsoluteURL.js": "./lib/helpers/isAbsoluteURL.js", + "./unsafe/helpers/buildURL.js": "./lib/helpers/buildURL.js", + "./unsafe/helpers/combineURLs.js": "./lib/helpers/combineURLs.js", + "./unsafe/adapters/http.js": "./lib/adapters/http.js", + "./unsafe/adapters/xhr.js": "./lib/adapters/xhr.js", + "./unsafe/utils.js": "./lib/utils.js", + "./package.json": "./package.json" + }, + "type": "module", + "types": "index.d.ts", + "scripts": { + "test": "npm run test:eslint && npm run test:mocha && npm run test:karma && npm run test:dtslint && npm run test:exports", + "test:eslint": "node bin/ssl_hotfix.js eslint lib/**/*.js", + "test:dtslint": "dtslint --localTs node_modules/typescript/lib", + "test:mocha": "node bin/ssl_hotfix.js mocha test/unit/**/*.js --timeout 30000 --exit", + "test:exports": "node bin/ssl_hotfix.js mocha test/module/test.js --timeout 30000 --exit", + "test:karma": "node bin/ssl_hotfix.js cross-env LISTEN_ADDR=:: karma start karma.conf.cjs --single-run", + "test:karma:firefox": "node bin/ssl_hotfix.js cross-env LISTEN_ADDR=:: Browsers=Firefox karma start karma.conf.cjs --single-run", + "test:karma:server": "node bin/ssl_hotfix.js cross-env karma start karma.conf.cjs", + "test:build:version": "node ./bin/check-build-version.js", + "start": "node ./sandbox/server.js", + "preversion": "gulp version", + "version": "npm run build && git add dist && git add package.json", + "prepublishOnly": "npm run test:build:version", + "postpublish": "git push && git push --tags", + "build": "gulp clear && cross-env NODE_ENV=production rollup -c -m", + "examples": "node ./examples/server.js", + "coveralls": "cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js", + "fix": "eslint --fix lib/**/*.js", + "prepare": "husky install && npm run prepare:hooks", + "prepare:hooks": "npx husky set .husky/commit-msg \"npx commitlint --edit $1\"", + "release:dry": "release-it --dry-run --no-npm", + "release:info": "release-it --release-version", + "release:beta:no-npm": "release-it --preRelease=beta --no-npm", + "release:beta": "release-it --preRelease=beta", + "release:no-npm": "release-it --no-npm", + "release:changelog:fix": "node ./bin/injectContributorsList.js && git add CHANGELOG.md", + "release": "release-it" + }, + "repository": { + "type": "git", + "url": "https://github.com/axios/axios.git" + }, + "keywords": [ + "xhr", + "http", + "ajax", + "promise", + "node" + ], + "author": "Matt Zabriskie", + "license": "MIT", + "bugs": { + "url": "https://github.com/axios/axios/issues" + }, + "homepage": "https://axios-http.com", + "devDependencies": { + "@babel/core": "^7.18.2", + "@babel/preset-env": "^7.18.2", + "@commitlint/cli": "^17.3.0", + "@commitlint/config-conventional": "^17.3.0", + "@release-it/conventional-changelog": "^5.1.1", + "@rollup/plugin-babel": "^5.3.1", + "@rollup/plugin-commonjs": "^15.1.0", + "@rollup/plugin-json": "^4.1.0", + "@rollup/plugin-multi-entry": "^4.0.0", + "@rollup/plugin-node-resolve": "^9.0.0", + "abortcontroller-polyfill": "^1.7.3", + "auto-changelog": "^2.4.0", + "body-parser": "^1.20.0", + "chalk": "^5.2.0", + "coveralls": "^3.1.1", + "cross-env": "^7.0.3", + "dev-null": "^0.1.1", + "dtslint": "^4.2.1", + "es6-promise": "^4.2.8", + "eslint": "^8.17.0", + "express": "^4.18.1", + "formdata-node": "^5.0.0", + "formidable": "^2.0.1", + "fs-extra": "^10.1.0", + "get-stream": "^3.0.0", + "gulp": "^4.0.2", + "gzip-size": "^7.0.0", + "handlebars": "^4.7.7", + "husky": "^8.0.2", + "istanbul-instrumenter-loader": "^3.0.1", + "jasmine-core": "^2.4.1", + "karma": "^6.3.17", + "karma-chrome-launcher": "^3.1.1", + "karma-firefox-launcher": "^2.1.2", + "karma-jasmine": "^1.1.1", + "karma-jasmine-ajax": "^0.1.13", + "karma-rollup-preprocessor": "^7.0.8", + "karma-safari-launcher": "^1.0.0", + "karma-sauce-launcher": "^4.3.6", + "karma-sinon": "^1.0.5", + "karma-sourcemap-loader": "^0.3.8", + "memoizee": "^0.4.15", + "minimist": "^1.2.7", + "mocha": "^10.0.0", + "multer": "^1.4.4", + "pretty-bytes": "^6.0.0", + "release-it": "^15.5.1", + "rollup": "^2.67.0", + "rollup-plugin-auto-external": "^2.0.0", + "rollup-plugin-bundle-size": "^1.0.3", + "rollup-plugin-terser": "^7.0.2", + "sinon": "^4.5.0", + "stream-throttle": "^0.1.3", + "string-replace-async": "^3.0.2", + "terser-webpack-plugin": "^4.2.3", + "typescript": "^4.8.4" + }, + "browser": { + "./lib/adapters/http.js": "./lib/helpers/null.js", + "./lib/platform/node/index.js": "./lib/platform/browser/index.js", + "./lib/platform/node/classes/FormData.js": "./lib/helpers/null.js" + }, + "jsdelivr": "dist/axios.min.js", + "unpkg": "dist/axios.min.js", + "typings": "./index.d.ts", + "dependencies": { + "follow-redirects": "^1.15.4", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + }, + "bundlesize": [ + { + "path": "./dist/axios.min.js", + "threshold": "5kB" + } + ], + "contributors": [ + "Matt Zabriskie (https://github.com/mzabriskie)", + "Nick Uraltsev (https://github.com/nickuraltsev)", + "Jay (https://github.com/jasonsaayman)", + "Dmitriy Mozgovoy (https://github.com/DigitalBrainJS)", + "Emily Morehouse (https://github.com/emilyemorehouse)", + "Rubén Norte (https://github.com/rubennorte)", + "Justin Beckwith (https://github.com/JustinBeckwith)", + "Martti Laine (https://github.com/codeclown)", + "Xianming Zhong (https://github.com/chinesedfan)", + "Rikki Gibson (https://github.com/RikkiGibson)", + "Remco Haszing (https://github.com/remcohaszing)", + "Yasu Flores (https://github.com/yasuf)", + "Ben Carp (https://github.com/carpben)" + ], + "sideEffects": false, + "release-it": { + "git": { + "commitMessage": "chore(release): v${version}", + "push": true, + "commit": true, + "tag": true, + "requireCommits": false, + "requireCleanWorkingDir": false + }, + "github": { + "release": true, + "draft": true + }, + "npm": { + "publish": false, + "ignoreVersion": false + }, + "plugins": { + "@release-it/conventional-changelog": { + "preset": "angular", + "infile": "CHANGELOG.md", + "header": "# Changelog" + } + }, + "hooks": { + "before:init": "npm test", + "after:bump": "gulp version --bump ${version} && npm run build && npm run test:build:version && git add ./dist && git add ./package-lock.json", + "before:release": "npm run release:changelog:fix", + "after:release": "echo Successfully released ${name} v${version} to ${repo.repository}." + } + }, + "commitlint": { + "rules": { + "header-max-length": [ + 2, + "always", + 130 + ] + }, + "extends": [ + "@commitlint/config-conventional" + ] + } +} \ No newline at end of file diff --git a/task/node_modules/azure-pipelines-task-lib/LICENSE b/task/node_modules/azure-pipelines-task-lib/LICENSE new file mode 100644 index 0000000..bb81c0a --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/task/node_modules/azure-pipelines-task-lib/README.md b/task/node_modules/azure-pipelines-task-lib/README.md new file mode 100644 index 0000000..5cb32dd --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/README.md @@ -0,0 +1,74 @@ + +# Azure Pipelines Task SDK + +Libraries for writing [Azure Pipelines](https://azure.microsoft.com/en-us/services/devops/pipelines) tasks + +Reference examples of our in the box tasks [are here](https://github.com/Microsoft/azure-pipelines-tasks) + +## TypeScript Tasks + +Cross platform tasks are written in TypeScript. It is the preferred way to write tasks once. + +[![NPM version][npm-lib-image]][npm-lib-url] + +Step by Step: [Create Task](https://docs.microsoft.com/en-us/azure/devops/extend/develop/add-build-task?view=vsts) + +Documentation: [TypeScript API](https://github.com/microsoft/azure-pipelines-task-lib/blob/master/node/docs/azure-pipelines-task-lib.md), [task JSON schema](https://aka.ms/vsts-tasks.schema.json) + +Guidance: [Finding Files](https://github.com/microsoft/azure-pipelines-task-lib/blob/master/node/docs/findingfiles.md), [Minimum agent version](https://github.com/microsoft/azure-pipelines-task-lib/blob/master/node/docs/minagent.md), [Proxy](https://github.com/microsoft/azure-pipelines-task-lib/blob/master/node/docs/proxy.md), [Certificate](https://github.com/microsoft/azure-pipelines-task-lib/blob/master/node/docs/cert.md) + +## Node 10 Upgrade Notice + +Azure DevOps is currently working to establish Node 10 as the new preferred runtime for tasks, upgrading from Node 6. +Relevant work is happening in the `master` branch and the major version should be used with Node 10 is 3. +Previous major version is stored in the `releases/2.x` + +### Upgrading to Node 10 + +Upgrading your tasks from Node 6 should be relatively painless, however there are some things to note: +* Typescript has been upgraded to TS 4. Older versions of TS may or may not work with Node 14 or the 3.x branch. We recommend upgrading to TS 4 when upgrading to task-lib 3.x. +* Node has made some changes to `fs` between Node 6 and Node 10. It is worth reviewing and testing your tasks thoroughly before publishing updates to Node 10. + +## Reference Examples + +The [ShellScript Task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/ShellScriptV2) and the [XCode Task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/XcodeV5) are good examples. + +## Contributing + +We are accepting contributions and we try to stay on top of issues. + +[Contribution Guide](https://github.com/microsoft/azure-pipelines-task-lib/blob/master/CONTRIBUTING.md). + +[Logging Issues](https://github.com/Microsoft/azure-pipelines-task-lib/issues) + +## Building the library + +Once: +```bash +$ cd node +$ npm install +``` + +Build and Test: +```bash +$ npm test +``` + +Set environment variable TASK_TEST_TRACE=1 to display test output. + +[npm-lib-image]: https://img.shields.io/npm/v/azure-pipelines-task-lib.svg?style=flat +[npm-lib-url]: https://www.npmjs.com/package/azure-pipelines-task-lib + +## Powershell + +We also maintain a PowerShell library for Windows task development. + +Library: [Powershell Library](https://github.com/microsoft/azure-pipelines-task-lib/tree/master/powershell) + +Usage: [Consuming the SDK](https://github.com/microsoft/azure-pipelines-task-lib/blob/master/powershell/Docs/Consuming.md) + +## Third Party Notices +To generate/update third party notice file run: +```bash +$ node generate-third-party-notice.js +``` diff --git a/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/de-DE/resources.resjson b/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 0000000..7612989 --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,36 @@ +{ + "loc.messages.LIB_UnhandledEx": "Ausnahmefehler: %s", + "loc.messages.LIB_FailOnCode": "Fehler beim Rückgabecode: %d", + "loc.messages.LIB_MkdirFailed": "Das Verzeichnis \"%s\" kann nicht erstellt werden. %s", + "loc.messages.LIB_MkdirFailedFileExists": "Das Verzeichnis \"%s\" kann nicht erstellt werden. Eine in Konflikt stehende Datei ist vorhanden: \"%s\"", + "loc.messages.LIB_MkdirFailedInvalidDriveRoot": "Das Verzeichnis \"%s\" kann nicht erstellt werden. Das Stammverzeichnis ist nicht vorhanden: %s", + "loc.messages.LIB_MkdirFailedInvalidShare": "Das Verzeichnis \"%s\" kann nicht erstellt werden. Es kann nicht überprüft werden, ob das Verzeichnis vorhanden ist: {%s}. Wenn das Verzeichnis eine Dateifreigabe ist, stellen Sie sicher, dass der Freigabename richtig, die Freigabe online und der aktuelle Prozess berechtigt ist, auf die Freigabe zuzugreifen.", + "loc.messages.LIB_MultilineSecret": "Geheimnisse dürfen nicht mehrere Zeilen enthalten", + "loc.messages.LIB_ProcessError": "Fehler beim Ausführen des Prozesses \"%s\". Möglicherweise konnte der Prozess nicht gestartet werden. Fehler: %s", + "loc.messages.LIB_ProcessExitCode": "Fehler beim Prozess \"%s\" mit Exitcode %s.", + "loc.messages.LIB_ProcessStderr": "Fehler beim Prozess \"%s\": Mindestens eine Zeile wurde in den STDERR-Datenstrom geschrieben.", + "loc.messages.LIB_ReturnCode": "Rückgabecode: %d", + "loc.messages.LIB_ResourceFileNotExist": "Die Ressourcendatei ist nicht vorhanden: %s", + "loc.messages.LIB_ResourceFileAlreadySet": "Die Ressourcendatei wurde bereits festgelegt auf: %s", + "loc.messages.LIB_ResourceFileNotSet": "Die Ressourcendatei wurde nicht festgelegt. Die Lokalisierungszeichenfolge für den folgenden Schlüssel wurde nicht gefunden: %s", + "loc.messages.LIB_StdioNotClosed": "Die STDIO-Datenströme wurden nicht innerhalb von %s Sekunden nach dem Beendigungsereignis aus dem Prozess \"%s\" geschlossen. Möglicherweise hat ein untergeordneter Prozess die STDIO-Datenströme geerbt und wurde noch nicht beendet.", + "loc.messages.LIB_WhichNotFound_Linux": "Ausführbare Datei nicht gefunden: '%s'. Prüfen Sie, ob der Dateipfad vorhanden ist oder sich die Datei in einem von der PATH-Umgebungsvariablen angegebenen Verzeichnis befindet. Prüfen Sie zudem den Dateimodus, um sicherzustellen, dass die Datei ausführbar ist.", + "loc.messages.LIB_WhichNotFound_Win": "Ausführbare Datei nicht gefunden: \"%s\". Prüfen Sie, ob der Dateipfad vorhanden ist oder sich die Datei in einem von der PATH-Umgebungsvariablen angegebenen Verzeichnis befindet. Prüfen Sie zudem, ob die Datei eine gültige Erweiterung für eine ausführbare Datei aufweist.", + "loc.messages.LIB_LocStringNotFound": "Die Lokalisierungszeichenfolge für den folgenden Schlüssel wurde nicht gefunden: %s", + "loc.messages.LIB_ParameterIsRequired": "\"%s\" wurde nicht angegeben.", + "loc.messages.LIB_InputRequired": "Eingabe erforderlich: %s", + "loc.messages.LIB_InvalidPattern": "Ungültiges Muster: \"%s\"", + "loc.messages.LIB_EndpointNotExist": "Der Endpunkt ist nicht vorhanden: %s", + "loc.messages.LIB_EndpointDataNotExist": "Der Endpunkt-Datenparameter %s ist nicht vorhanden: %s", + "loc.messages.LIB_EndpointAuthNotExist": "Die Endpunkt-Authentifizierungsdatensind nicht vorhanden: %s", + "loc.messages.LIB_InvalidEndpointAuth": "Ungültige Endpunktauthentifizierung: %s", + "loc.messages.LIB_InvalidSecureFilesInput": "Ungültige sichere Dateiausgabe: %s", + "loc.messages.LIB_PathNotFound": "Nicht gefunden %s: %s", + "loc.messages.LIB_PathHasNullByte": "Der Pfad darf keine NULL-Bytes enthalten.", + "loc.messages.LIB_OperationFailed": "Fehler %s: %s", + "loc.messages.LIB_UseFirstGlobMatch": "Mehrere Arbeitsbereichübereinstimmungen. Die erste Übereinstimmung wird verwendet.", + "loc.messages.LIB_MergeTestResultNotSupported": "Das Mergen von Testergebnissen aus mehreren Dateien in einen Testlauf wird von dieser Version des Build-Agents für OSX/Linux nicht unterstützt. Jede Testergebnisdatei wird als separater Testlauf in VSO/TFS veröffentlicht.", + "loc.messages.LIB_PlatformNotSupported": "Plattform wird nicht unterstützt: %s", + "loc.messages.LIB_CopyFileFailed": "Fehler beim Kopieren der Datei. Verbleibende Versuche: %s", + "loc.messages.LIB_UndefinedNodeVersion": "Die Knotenversion ist nicht definiert." +} \ No newline at end of file diff --git a/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/en-US/resources.resjson b/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 0000000..41844a9 --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,36 @@ +{ + "loc.messages.LIB_UnhandledEx": "Unhandled: %s", + "loc.messages.LIB_FailOnCode": "Failure return code: %d", + "loc.messages.LIB_MkdirFailed": "Unable to create directory '%s'. %s", + "loc.messages.LIB_MkdirFailedFileExists": "Unable to create directory '%s'. Conflicting file exists: '%s'", + "loc.messages.LIB_MkdirFailedInvalidDriveRoot": "Unable to create directory '%s'. Root directory does not exist: '%s'", + "loc.messages.LIB_MkdirFailedInvalidShare": "Unable to create directory '%s'. Unable to verify the directory exists: '%s'. If directory is a file share, please verify the share name is correct, the share is online, and the current process has permission to access the share.", + "loc.messages.LIB_MultilineSecret": "Secrets cannot contain multiple lines", + "loc.messages.LIB_ProcessError": "There was an error when attempting to execute the process '%s'. This may indicate the process failed to start. Error: %s", + "loc.messages.LIB_ProcessExitCode": "The process '%s' failed with exit code %s", + "loc.messages.LIB_ProcessStderr": "The process '%s' failed because one or more lines were written to the STDERR stream", + "loc.messages.LIB_ReturnCode": "Return code: %d", + "loc.messages.LIB_ResourceFileNotExist": "Resource file doesn\\'t exist: %s", + "loc.messages.LIB_ResourceFileAlreadySet": "Resource file has already set to: %s", + "loc.messages.LIB_ResourceFileNotSet": "Resource file haven\\'t set, can\\'t find loc string for key: %s", + "loc.messages.LIB_StdioNotClosed": "The STDIO streams did not close within %s seconds of the exit event from process '%s'. This may indicate a child process inherited the STDIO streams and has not yet exited.", + "loc.messages.LIB_WhichNotFound_Linux": "Unable to locate executable file: '%s'. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.", + "loc.messages.LIB_WhichNotFound_Win": "Unable to locate executable file: '%s'. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.", + "loc.messages.LIB_LocStringNotFound": "Can\\'t find loc string for key: %s", + "loc.messages.LIB_ParameterIsRequired": "%s not supplied", + "loc.messages.LIB_InputRequired": "Input required: %s", + "loc.messages.LIB_InvalidPattern": "Invalid pattern: '%s'", + "loc.messages.LIB_EndpointNotExist": "Endpoint not present: %s", + "loc.messages.LIB_EndpointDataNotExist": "Endpoint data parameter %s not present: %s", + "loc.messages.LIB_EndpointAuthNotExist": "Endpoint auth data not present: %s", + "loc.messages.LIB_InvalidEndpointAuth": "Invalid endpoint auth: %s", + "loc.messages.LIB_InvalidSecureFilesInput": "Invalid secure file input: %s", + "loc.messages.LIB_PathNotFound": "Not found %s: %s", + "loc.messages.LIB_PathHasNullByte": "Path cannot contain null bytes", + "loc.messages.LIB_OperationFailed": "Failed %s: %s", + "loc.messages.LIB_UseFirstGlobMatch": "Multiple workspace matches. using first.", + "loc.messages.LIB_MergeTestResultNotSupported": "Merging test results from multiple files to one test run is not supported on this version of build agent for OSX/Linux, each test result file will be published as a separate test run in VSO/TFS.", + "loc.messages.LIB_PlatformNotSupported": "Platform not supported: %s", + "loc.messages.LIB_CopyFileFailed": "Error while copying the file. Attempts left: %s", + "loc.messages.LIB_UndefinedNodeVersion": "Node version is undefined." +} \ No newline at end of file diff --git a/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/es-ES/resources.resjson b/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 0000000..b3f1a9c --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,36 @@ +{ + "loc.messages.LIB_UnhandledEx": "No controlada: %s", + "loc.messages.LIB_FailOnCode": "Código de retorno de error: %d", + "loc.messages.LIB_MkdirFailed": "No se puede crear el directorio '%s'. %s", + "loc.messages.LIB_MkdirFailedFileExists": "No se puede crear el directorio '%s'. Hay un conflicto entre archivos: '%s'", + "loc.messages.LIB_MkdirFailedInvalidDriveRoot": "No se puede crear el directorio '%s'. El directorio raíz no existe: '%s'", + "loc.messages.LIB_MkdirFailedInvalidShare": "No se puede crear el directorio '%s'. No se puede comprobar si el directorio existe: '%s'. Si el directorio es un recurso compartido de archivos, compruebe que el nombre es correcto, que está en línea y que el proceso actual tiene permiso de acceso a este.", + "loc.messages.LIB_MultilineSecret": "Los secretos no pueden contener varias líneas.", + "loc.messages.LIB_ProcessError": "Error al intentar ejecutar el proceso \"%s\". Esto puede indicar que no se pudo iniciar el proceso. Error: %s", + "loc.messages.LIB_ProcessExitCode": "Error del proceso \"%s\" con el código de salida %s", + "loc.messages.LIB_ProcessStderr": "Error del proceso \"%s\" porque se escribieron una o varias líneas en la secuencia STDERR", + "loc.messages.LIB_ReturnCode": "Código de retorno: %d", + "loc.messages.LIB_ResourceFileNotExist": "El archivo de recursos no existe: %s", + "loc.messages.LIB_ResourceFileAlreadySet": "El archivo de recursos se ha establecido ya en: %s", + "loc.messages.LIB_ResourceFileNotSet": "No se ha establecido el archivo de recursos. No se encuentra la cadena localizada para la clave: %s", + "loc.messages.LIB_StdioNotClosed": "Las secuencias STDIO no se cerraron en un plazo de %s segundos desde el evento de salida del proceso \"%s\". Esto puede indicar que un proceso secundario ha heredado las secuencias STDIO y aún no se ha cerrado.", + "loc.messages.LIB_WhichNotFound_Linux": "No se puede encontrar el archivo ejecutable: \"%s\". Compruebe que la ruta de acceso del archivo existe o que el archivo se puede encontrar en un directorio especificado en la variable de entorno PATH. Revise también el modo de archivo para comprobar que el archivo es ejecutable.", + "loc.messages.LIB_WhichNotFound_Win": "No se puede encontrar el archivo ejecutable: \"%s\". Compruebe que la ruta de acceso del archivo existe o que el archivo se puede encontrar en un directorio especificado en la variable de entorno PATH. Revise también que el archivo tenga una extensión válida para un archivo ejecutable.", + "loc.messages.LIB_LocStringNotFound": "No se encuentra la cadena localizada para la clave: %s", + "loc.messages.LIB_ParameterIsRequired": "No se ha proporcionado %s", + "loc.messages.LIB_InputRequired": "Entrada requerida: %s", + "loc.messages.LIB_InvalidPattern": "Patrón no válido: '%s'", + "loc.messages.LIB_EndpointNotExist": "No hay punto de conexión: %s", + "loc.messages.LIB_EndpointDataNotExist": "El parámetro %s de datos del punto de conexión no existe: %s.", + "loc.messages.LIB_EndpointAuthNotExist": "Los datos de autenticación del punto de conexión no existen: %s.", + "loc.messages.LIB_InvalidEndpointAuth": "Autenticación de punto de conexión no válida: %s", + "loc.messages.LIB_InvalidSecureFilesInput": "Entrada de archivo seguro no válida: %s", + "loc.messages.LIB_PathNotFound": "No se encuentra %s: %s", + "loc.messages.LIB_PathHasNullByte": "La ruta de acceso no puede tener bytes nulos", + "loc.messages.LIB_OperationFailed": "Error de %s: %s", + "loc.messages.LIB_UseFirstGlobMatch": "Hay varias coincidencias en el área de trabajo. Se usará la primera.", + "loc.messages.LIB_MergeTestResultNotSupported": "Esta versión del agente de compilación para OSX/Linux no admite la fusión mediante combinación de resultados de pruebas de varios archivos en una serie de pruebas. Cada archivo de resultados de pruebas se publicará como una serie de pruebas diferente en VSO/TFS.", + "loc.messages.LIB_PlatformNotSupported": "No se admite la plataforma: %s", + "loc.messages.LIB_CopyFileFailed": "Error al copiar el archivo. Intentos restantes: %s", + "loc.messages.LIB_UndefinedNodeVersion": "La versión del nodo no está definida." +} \ No newline at end of file diff --git a/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/fr-FR/resources.resjson b/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 0000000..556360d --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,36 @@ +{ + "loc.messages.LIB_UnhandledEx": "Non géré : %s", + "loc.messages.LIB_FailOnCode": "Code de retour de l'échec : %d", + "loc.messages.LIB_MkdirFailed": "Impossible de créer le répertoire '%s'. %s", + "loc.messages.LIB_MkdirFailedFileExists": "Impossible de créer le répertoire '%s'. Présence d'un fichier en conflit : '%s'", + "loc.messages.LIB_MkdirFailedInvalidDriveRoot": "Impossible de créer le répertoire '%s'. Le répertoire racine n'existe pas : '%s'", + "loc.messages.LIB_MkdirFailedInvalidShare": "Impossible de créer le répertoire '%s'. Impossible de vérifier l'existence du répertoire : '%s'. Si le répertoire est un partage de fichiers, vérifiez que le nom du partage est correct, que le partage est en ligne, et que le processus actuel est autorisé à accéder au partage.", + "loc.messages.LIB_MultilineSecret": "Les secrets ne peuvent pas contenir plusieurs lignes", + "loc.messages.LIB_ProcessError": "Erreur durant la tentative d'exécution du processus '%s'. Cela peut indiquer que le processus n'a pas réussi à démarrer. Erreur : %s", + "loc.messages.LIB_ProcessExitCode": "Échec du processus '%s'. Code de sortie : %s", + "loc.messages.LIB_ProcessStderr": "Échec du processus '%s', car une ou plusieurs lignes ont été écrites dans le flux STDERR", + "loc.messages.LIB_ReturnCode": "Code de retour : %d", + "loc.messages.LIB_ResourceFileNotExist": "Le fichier de ressources n'existe pas : %s", + "loc.messages.LIB_ResourceFileAlreadySet": "Le fichier de ressources est déjà défini : %s", + "loc.messages.LIB_ResourceFileNotSet": "Le fichier de ressources n'est pas défini. La chaîne localisée de la clé est introuvable : %s", + "loc.messages.LIB_StdioNotClosed": "Les flux STDIO ne se sont pas fermés dans les %s secondes qui ont suivi l'événement exit du processus '%s'. Cela peut indiquer qu'un processus enfant a hérité des flux STDIO et qu'il n'est pas encore sorti.", + "loc.messages.LIB_WhichNotFound_Linux": "Impossible de localiser le fichier exécutable : '%s'. Vérifiez si le chemin du fichier existe ou si le fichier peut se trouver dans un répertoire spécifié par la variable d'environnement PATH. Vérifiez également le Mode de Fichier pour déterminer si le fichier est exécutable.", + "loc.messages.LIB_WhichNotFound_Win": "Impossible de localiser le fichier exécutable : '%s'. Vérifiez si le chemin du fichier existe ou si le fichier peut se trouver dans un répertoire spécifié par la variable d'environnement PATH. Vérifiez également si le fichier a une extension de fichier exécutable valide.", + "loc.messages.LIB_LocStringNotFound": "Chaîne localisée introuvable pour la clé : %s", + "loc.messages.LIB_ParameterIsRequired": "%s non fourni", + "loc.messages.LIB_InputRequired": "Entrée nécessaire : %s", + "loc.messages.LIB_InvalidPattern": "Modèle non valide : '%s'", + "loc.messages.LIB_EndpointNotExist": "Point de terminaison absent : %s", + "loc.messages.LIB_EndpointDataNotExist": "Paramètre de données du point de terminaison %s absent : %s", + "loc.messages.LIB_EndpointAuthNotExist": "Données d'authentification du point de terminaison absentes : %s", + "loc.messages.LIB_InvalidEndpointAuth": "Authentification du point de terminaison non valide : %s", + "loc.messages.LIB_InvalidSecureFilesInput": "Entrée de fichier sécurisé non valide : %s", + "loc.messages.LIB_PathNotFound": "%s : %s introuvable", + "loc.messages.LIB_PathHasNullByte": "Le chemin ne peut pas contenir d'octets de valeur Null", + "loc.messages.LIB_OperationFailed": "Échec de %s : %s", + "loc.messages.LIB_UseFirstGlobMatch": "Plusieurs espaces de travail correspondants. Utilisation du premier d'entre eux.", + "loc.messages.LIB_MergeTestResultNotSupported": "La fusion des résultats des tests de plusieurs fichiers en une seule série de tests n'est pas prise en charge dans cette version de l'agent de build pour OSX/Linux. Chaque fichier de résultats des tests est publié en tant que série de tests distincte dans VSO/TFS.", + "loc.messages.LIB_PlatformNotSupported": "Plateforme non prise en charge : %s", + "loc.messages.LIB_CopyFileFailed": "Erreur durant la copie du fichier. Tentatives restantes : %s", + "loc.messages.LIB_UndefinedNodeVersion": "La version du nœud n’est pas définie." +} \ No newline at end of file diff --git a/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/it-IT/resources.resjson b/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 0000000..9f415c0 --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,36 @@ +{ + "loc.messages.LIB_UnhandledEx": "Eccezione non gestita: %s", + "loc.messages.LIB_FailOnCode": "Codice restituito dell'errore: %d", + "loc.messages.LIB_MkdirFailed": "Non è possibile creare la directory '%s'. %s", + "loc.messages.LIB_MkdirFailedFileExists": "Non è possibile creare la directory '%s'. Esiste un file in conflitto: '%s'", + "loc.messages.LIB_MkdirFailedInvalidDriveRoot": "Non è possibile creare la directory '%s'. La directory radice non esiste: '%s'", + "loc.messages.LIB_MkdirFailedInvalidShare": "Non è possibile creare la directory '%s' perché non è possibile verificarne l'esistenza: '%s'. Se la directory è una condivisione file, verificare che il nome della condivisione sia corretto, che la condivisione sia online e che il processo corrente sia autorizzato ad accedervi.", + "loc.messages.LIB_MultilineSecret": "I segreti non possono contenere più righe", + "loc.messages.LIB_ProcessError": "Si è verificato un errore durante il tentativo di eseguire il processo '%s'. Questo errore può indicare che non è stato possibile avviare il processo. Errore: %s", + "loc.messages.LIB_ProcessExitCode": "Il processo '%s' non è riuscito. Codice di uscita: %s", + "loc.messages.LIB_ProcessStderr": "Il processo '%s' non è riuscito perché una o più righe sono state scritte nel flusso STDERR", + "loc.messages.LIB_ReturnCode": "Codice restituito: %d", + "loc.messages.LIB_ResourceFileNotExist": "Il file di risorse non esiste: %s", + "loc.messages.LIB_ResourceFileAlreadySet": "Il file di risorse è già stato impostato su %s", + "loc.messages.LIB_ResourceFileNotSet": "Il file di risorse non è stato impostato. La stringa localizzata per la chiave %s non è stata trovata", + "loc.messages.LIB_StdioNotClosed": "I flussi STDIO non si sono chiusi entro %s secondi dall'evento di uscita dal processo '%s'. Questa condizione può indicare che un processo figlio ha ereditato i flussi STDIO e non è ancora stato terminato.", + "loc.messages.LIB_WhichNotFound_Linux": "Il file eseguibile '%s' non è stato trovato. Verificare se il percorso di file esiste o il file è presente in una directory specificata dalla variabile di ambiente PATH. Controllare anche la modalità file per verificare che il file sia eseguibile.", + "loc.messages.LIB_WhichNotFound_Win": "Il file eseguibile '%s' non è stato trovato. Verificare se il percorso di file esiste o il file è presente in una directory specificata dalla variabile di ambiente PATH. Controllare anche che l'estensione sia valida per un file eseguibile.", + "loc.messages.LIB_LocStringNotFound": "La stringa localizzata per la chiave %s non è stata trovata", + "loc.messages.LIB_ParameterIsRequired": "Parametro %s non fornito", + "loc.messages.LIB_InputRequired": "Input richiesto: %s", + "loc.messages.LIB_InvalidPattern": "Criterio non valido: '%s'", + "loc.messages.LIB_EndpointNotExist": "Endpoint non presente: %s", + "loc.messages.LIB_EndpointDataNotExist": "Il parametro %s dei dati dell'endpoint non è presente: %s", + "loc.messages.LIB_EndpointAuthNotExist": "I dati di autenticazione endpoint non sono presenti: %s", + "loc.messages.LIB_InvalidEndpointAuth": "Autenticazione endpoint non valida: %s", + "loc.messages.LIB_InvalidSecureFilesInput": "L'input del file protetto non è valido: %s", + "loc.messages.LIB_PathNotFound": "Percorso %s non trovato: %s", + "loc.messages.LIB_PathHasNullByte": "Il percorso non può contenere byte Null", + "loc.messages.LIB_OperationFailed": "Operazione %s non riuscita: %s", + "loc.messages.LIB_UseFirstGlobMatch": "Sono presenti più corrispondenze dell'area di lavoro. Verrà usata la prima.", + "loc.messages.LIB_MergeTestResultNotSupported": "L'unione di più file risultanti da un'unica esecuzione dei test non è supportata in questa versione dell'agente di compilazione per OS X/Linux. Ogni file dei risultati del test verrà pubblicato come esecuzione dei test separata in VSO/TFS.", + "loc.messages.LIB_PlatformNotSupported": "Piattaforma non supportata: %s", + "loc.messages.LIB_CopyFileFailed": "Si è verificato un errore durante la copia del file. Tentativi rimasti: %s", + "loc.messages.LIB_UndefinedNodeVersion": "La versione del nodo non è definita." +} \ No newline at end of file diff --git a/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/ja-JP/resources.resjson b/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 0000000..5c20588 --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,36 @@ +{ + "loc.messages.LIB_UnhandledEx": "未処理: %s", + "loc.messages.LIB_FailOnCode": "失敗のリターン コード: %d", + "loc.messages.LIB_MkdirFailed": "ディレクトリ '%s' を作成できません。%s", + "loc.messages.LIB_MkdirFailedFileExists": "ディレクトリ '%s' を作成できません。競合するファイルが存在します: '%s'", + "loc.messages.LIB_MkdirFailedInvalidDriveRoot": "ディレクトリ '%s' を作成できません。ルート ディレクトリが存在しません: '%s'", + "loc.messages.LIB_MkdirFailedInvalidShare": "ディレクトリ '%s' を作成できません。ディレクトリが存在することを確認できません: '%s'。ディレクトリがファイル共有である場合、その共有名が正しいこと、その共有がオンラインであること、そして現在のプロセスにその共有へのアクセス許可があることをご確認ください。", + "loc.messages.LIB_MultilineSecret": "シークレットに複数の行を含めることはできません", + "loc.messages.LIB_ProcessError": "プロセス '%s' を実行しようとしているときにエラーが発生しました。プロセスの開始に失敗したおそれがあります。エラー: %s", + "loc.messages.LIB_ProcessExitCode": "プロセス '%s' が終了コード %s で失敗しました", + "loc.messages.LIB_ProcessStderr": "1 つ以上の行が STDERR ストリームに書き込まれたため、プロセス '%s' が失敗しました", + "loc.messages.LIB_ReturnCode": "リターン コード: %d", + "loc.messages.LIB_ResourceFileNotExist": "リソース ファイルが存在しません: %s", + "loc.messages.LIB_ResourceFileAlreadySet": "リソース ファイルは既に %s に設定されています", + "loc.messages.LIB_ResourceFileNotSet": "リソース ファイルが設定されておらず、キーの loc 文字列が見つかりません: %s", + "loc.messages.LIB_StdioNotClosed": "STDIO ストリームが、プロセス '%s' の終了イベントから %s 秒以内に終了しませんでした。これは、子プロセスが STDIO ストリームを継承し、まだ終了していないことを示している可能性があります。", + "loc.messages.LIB_WhichNotFound_Linux": "実行可能ファイルが見つかりません: '%s'。ファイル パスが存在すること、またはそのファイルが PATH 環境変数で指定されたディレクトリ内にあることをご確認ください。ファイルが実行可能かどうかについてファイル モードもご確認ください。", + "loc.messages.LIB_WhichNotFound_Win": "実行可能ファイルが見つかりません: '%s'。ファイル パスが存在すること、またはそのファイルが PATH 環境変数で指定されたディレクトリ内にあることをご確認ください。そのファイルに実行可能ファイルの有効な拡張子がついていることもご確認ください。", + "loc.messages.LIB_LocStringNotFound": "キーの loc 文字列が見つかりません: %s", + "loc.messages.LIB_ParameterIsRequired": "%s が提供されていません", + "loc.messages.LIB_InputRequired": "入力が必要です: %s", + "loc.messages.LIB_InvalidPattern": "無効なパターン: '%s'", + "loc.messages.LIB_EndpointNotExist": "エンドポイントが存在しません: %s", + "loc.messages.LIB_EndpointDataNotExist": "エンドポイントのデータ パラメーター %s がありません: %s", + "loc.messages.LIB_EndpointAuthNotExist": "エンドポイントの認証データがありません: %s", + "loc.messages.LIB_InvalidEndpointAuth": "エンドポイントの認証が無効です: %s", + "loc.messages.LIB_InvalidSecureFilesInput": "無効なセキュア ファイル入力: %s", + "loc.messages.LIB_PathNotFound": "見つかりませんでした %s: %s", + "loc.messages.LIB_PathHasNullByte": "パスに null バイトを含めることはできません", + "loc.messages.LIB_OperationFailed": "失敗しました %s: %s", + "loc.messages.LIB_UseFirstGlobMatch": "複数のワークスペースが一致します。最初のワークスペースが使用されます。", + "loc.messages.LIB_MergeTestResultNotSupported": "複数のファイルからのテスト結果を 1 つのテスト実行にマージする処理は、OSX/Linux 用のビルド エージェントのこのバージョンではサポートされていません。各テスト結果ファイルが VSO/TFS で別個のテスト実行として発行されます。", + "loc.messages.LIB_PlatformNotSupported": "プラットフォームがサポートされていません: %s", + "loc.messages.LIB_CopyFileFailed": "ファイルのコピー中にエラーが発生しました。残りの試行回数: %s", + "loc.messages.LIB_UndefinedNodeVersion": "ノードのバージョンが定義されていません。" +} \ No newline at end of file diff --git a/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/ko-KR/resources.resjson b/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 0000000..c43354f --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,36 @@ +{ + "loc.messages.LIB_UnhandledEx": "처리되지 않음: %s", + "loc.messages.LIB_FailOnCode": "실패 반환 코드: %d", + "loc.messages.LIB_MkdirFailed": "'%s' 디렉터리를 만들 수 없습니다. %s", + "loc.messages.LIB_MkdirFailedFileExists": "'%s' 디렉터리를 만들 수 없습니다. 충돌하는 파일 '%s'이(가) 있습니다.", + "loc.messages.LIB_MkdirFailedInvalidDriveRoot": "'%s' 디렉터리를 만들 수 없습니다. 루트 디렉터리 '%s'이(가) 없습니다.", + "loc.messages.LIB_MkdirFailedInvalidShare": "'%s' 디렉터리를 만들 수 없습니다. '%s' 디렉터리가 있는지 확인할 수 없습니다. 디렉터리가 파일 공유인 경우 공유 이름이 올바르고, 공유가 온라인 상태이며, 현재 프로세스에 공유에 액세스할 수 있는 권한이 있는지 확인하세요.", + "loc.messages.LIB_MultilineSecret": "비밀에 여러 줄을 사용할 수 없습니다.", + "loc.messages.LIB_ProcessError": "'%s' 프로세스를 실행할 때 오류가 발생했습니다. 이는 프로세스를 시작하지 못했음을 나타낼 수 있습니다. 오류: %s", + "loc.messages.LIB_ProcessExitCode": "'%s' 프로세스가 실패함(종료 코드 %s)", + "loc.messages.LIB_ProcessStderr": "하나 이상의 줄이 STDERR 스트림에 쓰였으므로 '%s' 프로세스가 실패함", + "loc.messages.LIB_ReturnCode": "반환 코드: %d", + "loc.messages.LIB_ResourceFileNotExist": "리소스 파일이 없음: %s", + "loc.messages.LIB_ResourceFileAlreadySet": "리소스 파일이 이미 다음으로 설정됨: %s", + "loc.messages.LIB_ResourceFileNotSet": "리소스 파일이 설정되지 않았고 키에 대한 loc 문자열을 찾을 수 없음: %s", + "loc.messages.LIB_StdioNotClosed": "STDIO 스트림이 %s초 이내('%s' 프로세스의 종료 이벤트 후)에 닫히지 않았습니다. 이는 자식 프로세스가 STDIO 스트림을 상속했으며 아직 종료되지 않았음을 나타낼 수 있습니다.", + "loc.messages.LIB_WhichNotFound_Linux": "실행 파일 '%s'을(를) 찾을 수 없습니다. 파일 경로가 있는지 또는 PATH 환경 변수에서 지정한 디렉터리 내에서 파일을 찾을 수 있는지 확인하세요. 또한 파일 모드를 확인하여 파일을 실행할 수 있는지 확인하세요.", + "loc.messages.LIB_WhichNotFound_Win": "실행 파일 '%s'을(를) 찾을 수 없습니다. 파일 경로가 있는지 또는 PATH 환경 변수에서 지정한 디렉터리 내에서 파일을 찾을 수 있는지 확인하세요. 또한 파일이 실행 파일에 대해 올바른 확장명을 가지고 있는지 확인하세요.", + "loc.messages.LIB_LocStringNotFound": "키에 대한 loc 문자열을 찾을 수 없음: %s", + "loc.messages.LIB_ParameterIsRequired": "%s이(가) 제공되지 않음", + "loc.messages.LIB_InputRequired": "입력 필요: %s", + "loc.messages.LIB_InvalidPattern": "잘못된 패턴: '%s'", + "loc.messages.LIB_EndpointNotExist": "엔드포인트가 없음: %s", + "loc.messages.LIB_EndpointDataNotExist": "엔드포인트 데이터 매개 변수 %s이(가) 없음: %s", + "loc.messages.LIB_EndpointAuthNotExist": "엔드포인트 인증 데이터가 없음: %s", + "loc.messages.LIB_InvalidEndpointAuth": "잘못된 엔드포인트 인증: %s", + "loc.messages.LIB_InvalidSecureFilesInput": "보안 파일 입력이 잘못됨: %s", + "loc.messages.LIB_PathNotFound": "%s을(를) 찾을 수 없음: %s", + "loc.messages.LIB_PathHasNullByte": "경로에 null 바이트를 포함할 수 없음", + "loc.messages.LIB_OperationFailed": "%s 실패: %s", + "loc.messages.LIB_UseFirstGlobMatch": "여러 작업 영역이 일치합니다. 첫 번째 작업 영역을 사용하세요.", + "loc.messages.LIB_MergeTestResultNotSupported": "이 OSX/Linux용 빌드 에이전트 버전에서 여러 파일의 테스트 결과를 하나의 테스트 실행으로 병합하는 것을 지원하지 않습니다. 각 테스트 결과 파일은 VSO/TFS에서 별도의 테스트 실행으로 게시됩니다.", + "loc.messages.LIB_PlatformNotSupported": "지원되지 않는 플랫폼: %s", + "loc.messages.LIB_CopyFileFailed": "파일을 복사하는 동안 오류가 발생했습니다. 남은 시도 횟수: %s", + "loc.messages.LIB_UndefinedNodeVersion": "노드 버전이 정의되지 않았습니다." +} \ No newline at end of file diff --git a/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/ru-RU/resources.resjson b/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 0000000..234dc3d --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,36 @@ +{ + "loc.messages.LIB_UnhandledEx": "Не обработано: %s", + "loc.messages.LIB_FailOnCode": "Код возврата при сбое: %d.", + "loc.messages.LIB_MkdirFailed": "Не удается создать каталог \"%s\". %s", + "loc.messages.LIB_MkdirFailedFileExists": "Не удается создать каталог \"%s\". Существует конфликтующий файл: \"%s\"", + "loc.messages.LIB_MkdirFailedInvalidDriveRoot": "Не удалось создать каталог \"%s\". Корневой каталог не существует: \"%s\"", + "loc.messages.LIB_MkdirFailedInvalidShare": "Не удалось создать каталог \"%s\". Не удалось проверить, существует ли каталог \"%s\". Если каталог является файловым ресурсом, убедитесь, что имя ресурса указано правильно, он работает и текущий процесс имеет разрешение на доступ к нему.", + "loc.messages.LIB_MultilineSecret": "Секрет не может быть многострочным", + "loc.messages.LIB_ProcessError": "Произошла ошибка при попытке выполнить процесс \"%s\". Это может означать, что процесс не удалось запустить. Ошибка: %s", + "loc.messages.LIB_ProcessExitCode": "Произошел сбой процесса \"%s\" с кодом выхода %s.", + "loc.messages.LIB_ProcessStderr": "Произошел сбой процесса \"%s\", так как одна или несколько строк были записаны в поток STDERR.", + "loc.messages.LIB_ReturnCode": "Код возврата: %d", + "loc.messages.LIB_ResourceFileNotExist": "Файл ресурсов не существует: %s.", + "loc.messages.LIB_ResourceFileAlreadySet": "Файл ресурсов уже задан: %s.", + "loc.messages.LIB_ResourceFileNotSet": "Файл ресурсов не задан, не удается найти локализованную строку для ключа: %s.", + "loc.messages.LIB_StdioNotClosed": "Потоки STDIO не были закрыты в течение %s с после получения события выхода от процесса \"%s\". Это может свидетельствовать о том, что дочерний процесс унаследовал потоки STDIO и еще не завершил работу.", + "loc.messages.LIB_WhichNotFound_Linux": "Не удалось найти исполняемый файл: \"%s\". Убедитесь, что путь к файлу существует и файл можно найти в каталоге, указанном переменной окружения PATH. Также проверьте режим файла, чтобы убедиться, что файл является исполняемым.", + "loc.messages.LIB_WhichNotFound_Win": "Не удалось найти исполняемый файл: \"%s\". Убедитесь, что путь к файлу существует и что файл можно найти в каталоге, указанном переменной окружения PATH. Также убедитесь, что у файла есть допустимое расширение для исполняемого файла.", + "loc.messages.LIB_LocStringNotFound": "Не удается найти локализованную строку для ключа: %s.", + "loc.messages.LIB_ParameterIsRequired": "Не указан %s.", + "loc.messages.LIB_InputRequired": "Требуется ввести данные: %s.", + "loc.messages.LIB_InvalidPattern": "Недопустимый шаблон: \"%s\"", + "loc.messages.LIB_EndpointNotExist": "Конечная точка отсутствует: %s.", + "loc.messages.LIB_EndpointDataNotExist": "Отсутствует параметр %s данных конечной точки: %s", + "loc.messages.LIB_EndpointAuthNotExist": "Отсутствуют данные для проверки подлинности конечной точки: %s", + "loc.messages.LIB_InvalidEndpointAuth": "Недопустимая проверка подлинности конечной точки: %s.", + "loc.messages.LIB_InvalidSecureFilesInput": "Недопустимые входные данные защитного файла: %s", + "loc.messages.LIB_PathNotFound": "Не найден %s: %s.", + "loc.messages.LIB_PathHasNullByte": "Путь не может содержать пустые байты.", + "loc.messages.LIB_OperationFailed": "Сбой %s: %s.", + "loc.messages.LIB_UseFirstGlobMatch": "Несколько рабочих областей совпадает, использована первая рабочая область.", + "loc.messages.LIB_MergeTestResultNotSupported": "Объединение результатов тестов из нескольких файлов в один тестовый запуск не поддерживается в этой версии агента сборки для OSX/Linux. Каждый файл результатов теста будет опубликован в качестве отдельного тестового запуска в VSO/TFS.", + "loc.messages.LIB_PlatformNotSupported": "Платформа не поддерживается: %s", + "loc.messages.LIB_CopyFileFailed": "Ошибка при копировании файла. Оставшееся число попыток: %s.", + "loc.messages.LIB_UndefinedNodeVersion": "Версия узла не определена." +} \ No newline at end of file diff --git a/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/zh-CN/resources.resjson b/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 0000000..91ea458 --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,36 @@ +{ + "loc.messages.LIB_UnhandledEx": "未处理: %s", + "loc.messages.LIB_FailOnCode": "故障返回代码: %d", + "loc.messages.LIB_MkdirFailed": "无法创建目录“%s”。%s", + "loc.messages.LIB_MkdirFailedFileExists": "无法创建目录“%s”。存在冲突文件:“%s”", + "loc.messages.LIB_MkdirFailedInvalidDriveRoot": "无法创建目录“%s”。根目录不存在:“%s”", + "loc.messages.LIB_MkdirFailedInvalidShare": "无法创建目录“%s”。无法验证“%s”目录是否存在。如果目录是文件共享,请验证共享名称是否正确、共享是否已联机以及当前进程是否有权访问该共享。", + "loc.messages.LIB_MultilineSecret": "密码不能包含多个行", + "loc.messages.LIB_ProcessError": "尝试执行进程“%s”时出错。这可能表示进程启动失败。错误: %s", + "loc.messages.LIB_ProcessExitCode": "进程“%s”失败,退出代码为 %s", + "loc.messages.LIB_ProcessStderr": "进程“%s”失败,因为已将一行或多行写入 STDERR 流", + "loc.messages.LIB_ReturnCode": "返回代码: %d", + "loc.messages.LIB_ResourceFileNotExist": "资源文件不存在: %s", + "loc.messages.LIB_ResourceFileAlreadySet": "资源文件已被设置为 %s", + "loc.messages.LIB_ResourceFileNotSet": "资源文件尚未设置,无法找到关键字的本地字符串: %s", + "loc.messages.LIB_StdioNotClosed": "STDIO 流在进程“%s”中发生退出事件 %s 秒内未关闭 。这可能表示子进程继承了 STDIO 流且尚未退出。", + "loc.messages.LIB_WhichNotFound_Linux": "无法定位可执行文件: \"%s\"。请验证文件路径是否存在或文件是否可在 PATH 环境变量指定的目录内找到。另请检查文件模式以验证文件是否可执行。", + "loc.messages.LIB_WhichNotFound_Win": "无法定位可执行文件: \"%s\"。请验证文件路径是否存在或文件是否可在 PATH 环境变量指定的目录内找到。另请验证该文件是否具有可执行文件的有效扩展名。", + "loc.messages.LIB_LocStringNotFound": "无法找到关键字的本地字符串: %s", + "loc.messages.LIB_ParameterIsRequired": "未提供 %s", + "loc.messages.LIB_InputRequired": "输入必需项: %s", + "loc.messages.LIB_InvalidPattern": "无效的模式: \"%s\"", + "loc.messages.LIB_EndpointNotExist": "终结点不存在: %s", + "loc.messages.LIB_EndpointDataNotExist": "终结点数据参数 %s 不存在: %s", + "loc.messages.LIB_EndpointAuthNotExist": "终结点授权数据不存在: %s", + "loc.messages.LIB_InvalidEndpointAuth": "终结点验证无效: %s", + "loc.messages.LIB_InvalidSecureFilesInput": "无效的安全文件输入: %s", + "loc.messages.LIB_PathNotFound": "找不到 %s: %s", + "loc.messages.LIB_PathHasNullByte": "路径不能包含 null 字节", + "loc.messages.LIB_OperationFailed": "%s 失败: %s", + "loc.messages.LIB_UseFirstGlobMatch": "出现多个工作区匹配时,使用第一个。", + "loc.messages.LIB_MergeTestResultNotSupported": "此版本的 OSX/Linux 生成代理不支持来自某个测试运行的多文件合并测试结果,在 VSO/TFS 中,每个测试结果文件都将作为单独的测试运行进行发布。", + "loc.messages.LIB_PlatformNotSupported": "平台不受支持: %s", + "loc.messages.LIB_CopyFileFailed": "复制文件时出错。剩余尝试次数: %s", + "loc.messages.LIB_UndefinedNodeVersion": "节点版本未定义。" +} \ No newline at end of file diff --git a/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/zh-TW/resources.resjson b/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 0000000..d7e414e --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,36 @@ +{ + "loc.messages.LIB_UnhandledEx": "未經處理: %s", + "loc.messages.LIB_FailOnCode": "傳回程式碼失敗: %d", + "loc.messages.LIB_MkdirFailed": "無法建立目錄 '%s'。%s", + "loc.messages.LIB_MkdirFailedFileExists": "無法建立目錄 '%s'。存在衝突的檔案: '%s'", + "loc.messages.LIB_MkdirFailedInvalidDriveRoot": "無法建立目錄 '%s'。根目錄不存在: '%s'", + "loc.messages.LIB_MkdirFailedInvalidShare": "無法建立目錄 '%s'。無法驗證目錄是否存在: '%s'。如果目錄是檔案共用,請驗證共用名稱正確、共用在線上,而且目前的流程具有存取共用的權限。", + "loc.messages.LIB_MultilineSecret": "祕密不得包含多個行", + "loc.messages.LIB_ProcessError": "嘗試執行處理序 '%s' 時發生錯誤。這可能表示處理序無法啟動。錯誤: %s", + "loc.messages.LIB_ProcessExitCode": "處理序 '%s' 失敗,結束代碼為 %s", + "loc.messages.LIB_ProcessStderr": "因為 STDERR 資料流中寫入了一或多行程式碼,所以處理序 '%s' 失敗", + "loc.messages.LIB_ReturnCode": "傳回程式碼: %d", + "loc.messages.LIB_ResourceFileNotExist": "資源檔案不存在: %s", + "loc.messages.LIB_ResourceFileAlreadySet": "資源檔案已設定至: %s", + "loc.messages.LIB_ResourceFileNotSet": "尚未設定資源檔案,找不到索引鍵的 loc 字串: %s", + "loc.messages.LIB_StdioNotClosed": "STDIO 資料流未在 %s 秒內關閉 (從處理序 '%s' 結束事件發生後算起)。這可能表示子處理序繼承了 STDIO 資料流且尚未結束。", + "loc.messages.LIB_WhichNotFound_Linux": "找不到可執行檔: '%s'。請確認檔案路徑存在,或檔案可以在 PATH 環境變數指定的目錄中找到。另請檢查檔案模式,確認檔案可以執行。", + "loc.messages.LIB_WhichNotFound_Win": "找不到可執行檔: '%s'。請確認檔案路徑存在,或檔案可以在 PATH 環境變數指定的目錄中找到。另請確認檔案具備有效的可執行檔副檔名。", + "loc.messages.LIB_LocStringNotFound": "找不到索引鍵的 loc 字串: %s", + "loc.messages.LIB_ParameterIsRequired": "未提供 %s", + "loc.messages.LIB_InputRequired": "需要輸入內容: %s", + "loc.messages.LIB_InvalidPattern": "模式無效: '%s'", + "loc.messages.LIB_EndpointNotExist": "端點不存在: %s", + "loc.messages.LIB_EndpointDataNotExist": "端點資料參數 %s 不存在: %s", + "loc.messages.LIB_EndpointAuthNotExist": "端點驗證資料不存在: %s", + "loc.messages.LIB_InvalidEndpointAuth": "端點驗證無效: %s", + "loc.messages.LIB_InvalidSecureFilesInput": "安全檔案輸入無效: %s", + "loc.messages.LIB_PathNotFound": "找不到 %s: %s", + "loc.messages.LIB_PathHasNullByte": "路徑不能包含 null 位元組", + "loc.messages.LIB_OperationFailed": "%s 失敗: %s", + "loc.messages.LIB_UseFirstGlobMatch": "多個工作區相符。請先使用。", + "loc.messages.LIB_MergeTestResultNotSupported": "OSX/Linux 的此版本組建代理程式不支援將多個檔案的測試結果合併至單一測試回合,每個測試結果檔案將作為個別測試回合在 VSO/TFS 中發行。", + "loc.messages.LIB_PlatformNotSupported": "不支援的平台: %s", + "loc.messages.LIB_CopyFileFailed": "複製檔案時發生錯誤。剩餘嘗試次數: %s", + "loc.messages.LIB_UndefinedNodeVersion": "未定義節點版本。" +} \ No newline at end of file diff --git a/task/node_modules/azure-pipelines-task-lib/ThirdPartyNotice.txt b/task/node_modules/azure-pipelines-task-lib/ThirdPartyNotice.txt new file mode 100644 index 0000000..7c6354f --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/ThirdPartyNotice.txt @@ -0,0 +1,1116 @@ + +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +This Azure Pipelines extension (azure-pipelines-task-lib) is based on or incorporates material from the projects listed below (Third Party IP). The original copyright notice and the license under which Microsoft received such Third Party IP, are set forth below. Such licenses and notices are provided for informational purposes only. Microsoft licenses the Third Party IP to you under the licensing terms for the Visual Studio Team Services extension. Microsoft reserves all other rights not expressly granted under this agreement, whether by implication, estoppel or otherwise. + +1. asap (git+https://github.com/kriskowal/asap.git) +2. balanced-match (git://github.com/juliangruber/balanced-match.git) +3. brace-expansion (git://github.com/juliangruber/brace-expansion.git) +4. browser-stdout (git+ssh://git@github.com/kumavis/browser-stdout.git) +5. caseless (git+https://github.com/mikeal/caseless.git) +6. concat-map (git://github.com/substack/node-concat-map.git) +7. concat-stream (git+ssh://git@github.com/maxogden/concat-stream.git) +8. core-util-is (git://github.com/isaacs/core-util-is.git) +9. fs.realpath (git+https://github.com/isaacs/fs.realpath.git) +10. has-flag (git+https://github.com/sindresorhus/has-flag.git) +11. he (git+https://github.com/mathiasbynens/he.git) +12. http-basic (git+https://github.com/ForbesLindesay/http-basic.git) +13. http-response-object (git+https://github.com/ForbesLindesay/http-response-object.git) +14. inflight (git+https://github.com/npm/inflight.git) +15. inherits (git://github.com/isaacs/inherits.git) +16. isarray (git://github.com/juliangruber/isarray.git) +17. minimatch (git://github.com/isaacs/minimatch.git) +18. minimist (git://github.com/substack/minimist.git) +19. mkdirp (git+https://github.com/substack/node-mkdirp.git) +20. mocha (git+https://github.com/mochajs/mocha.git) +21. mockery (git://github.com/mfncooper/mockery.git) +22. once (git://github.com/isaacs/once.git) +23. path-is-absolute (git+https://github.com/sindresorhus/path-is-absolute.git) +24. process-nextick-args (git+https://github.com/calvinmetcalf/process-nextick-args.git) +25. promise (git+https://github.com/then/promise.git) +26. q (git://github.com/kriskowal/q.git) +27. qs (git+https://github.com/ljharb/qs.git) +28. readable-stream (git://github.com/nodejs/readable-stream.git) +29. safe-buffer (git://github.com/feross/safe-buffer.git) +30. semver (git+https://github.com/npm/node-semver.git) +31. shelljs (git://github.com/arturadib/shelljs.git) +32. string_decoder (git://github.com/rvagg/string_decoder.git) +33. nodejs-file-downloader (git://github.com/ibrod83/nodejs-file-downloader.git) +34. then-request (git+https://github.com/then/then-request.git) +35. typedarray (git://github.com/substack/typedarray.git) +36. typescript (git+https://github.com/Microsoft/TypeScript.git) +37. util-deprecate (git://github.com/TooTallNate/util-deprecate.git) +38. uuid (git+https://github.com/kelektiv/node-uuid.git) +39. wrappy (git+https://github.com/npm/wrappy.git) + + +%% asap NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2009–2014 Contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF asap NOTICES, INFORMATION, AND LICENSE + +%% balanced-match NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF balanced-match NOTICES, INFORMATION, AND LICENSE + +%% brace-expansion NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF brace-expansion NOTICES, INFORMATION, AND LICENSE + +%% browser-stdout NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2018 kumavis + +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF browser-stdout NOTICES, INFORMATION, AND LICENSE + +%% caseless NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +1. Definitions. +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: +You must give any other recipients of the Work or Derivative Works a copy of this License; and +You must cause any modified files to carry prominent notices stating that You changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. +END OF TERMS AND CONDITIONS +========================================= +END OF caseless NOTICES, INFORMATION, AND LICENSE + +%% concat-map NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF concat-map NOTICES, INFORMATION, AND LICENSE + +%% concat-stream NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License + +Copyright (c) 2013 Max Ogden + +Permission is hereby granted, free of charge, +to any person obtaining a copy of this software and +associated documentation files (the "Software"), to +deal in the Software without restriction, including +without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom +the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF concat-stream NOTICES, INFORMATION, AND LICENSE + +%% core-util-is NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF core-util-is NOTICES, INFORMATION, AND LICENSE + +%% fs.realpath NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---- + +This library bundles a version of the `fs.realpath` and `fs.realpathSync` +methods from Node.js v0.10 under the terms of the Node.js MIT license. + +Node's license follows, also included at the header of `old.js` which contains +the licensed code: + + Copyright Joyent, Inc. and other Node contributors. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF fs.realpath NOTICES, INFORMATION, AND LICENSE + +%% has-flag NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF has-flag NOTICES, INFORMATION, AND LICENSE + +%% he NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright Mathias Bynens + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF he NOTICES, INFORMATION, AND LICENSE + +%% http-basic NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2014 Forbes Lindesay + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF http-basic NOTICES, INFORMATION, AND LICENSE + +%% http-response-object NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2014 Forbes Lindesay + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF http-response-object NOTICES, INFORMATION, AND LICENSE + +%% inflight NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inflight NOTICES, INFORMATION, AND LICENSE + +%% inherits NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inherits NOTICES, INFORMATION, AND LICENSE + +%% isarray NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +No license text available. +========================================= +END OF isarray NOTICES, INFORMATION, AND LICENSE + +%% minimatch NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF minimatch NOTICES, INFORMATION, AND LICENSE + +%% minimist NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF minimist NOTICES, INFORMATION, AND LICENSE + +%% mkdirp NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2010 James Halliday (mail@substack.net) + +This project is free software released under the MIT/X11 license: + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF mkdirp NOTICES, INFORMATION, AND LICENSE + +%% mocha NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(The MIT License) + +Copyright (c) 2011-2018 JS Foundation and contributors, https://js.foundation + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF mocha NOTICES, INFORMATION, AND LICENSE + +%% mockery NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyrights for code authored by Yahoo! Inc. is licensed under the following + terms: + + MIT License + + Copyright (c) 2011 Yahoo! Inc. All Rights Reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF mockery NOTICES, INFORMATION, AND LICENSE + +%% once NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF once NOTICES, INFORMATION, AND LICENSE + +%% path-is-absolute NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF path-is-absolute NOTICES, INFORMATION, AND LICENSE + +%% process-nextick-args NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +# Copyright (c) 2015 Calvin Metcalf + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.** +========================================= +END OF process-nextick-args NOTICES, INFORMATION, AND LICENSE + +%% promise NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2014 Forbes Lindesay + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF promise NOTICES, INFORMATION, AND LICENSE + +%% q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2009–2017 Kristopher Michael Kowal. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF q NOTICES, INFORMATION, AND LICENSE + +%% qs NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2014 Nathan LaFreniere and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/qs/graphs/contributors +========================================= +END OF qs NOTICES, INFORMATION, AND LICENSE + +%% readable-stream NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Node.js is licensed for use as follows: + +""" +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" +========================================= +END OF readable-stream NOTICES, INFORMATION, AND LICENSE + +%% safe-buffer NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF safe-buffer NOTICES, INFORMATION, AND LICENSE + +%% semver NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF semver NOTICES, INFORMATION, AND LICENSE + +%% shelljs NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012, Artur Adib +All rights reserved. + +You may use this project under the terms of the New BSD license as follows: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Artur Adib nor the + names of the contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF shelljs NOTICES, INFORMATION, AND LICENSE + +%% string_decoder NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Node.js is licensed for use as follows: + +""" +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" +========================================= +END OF string_decoder NOTICES, INFORMATION, AND LICENSE + + +%% nodejs-file-downloader NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2014 Forbes Lindesay + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF nodejs-file-downloader NOTICES, INFORMATION, AND LICENSE + + +%% then-request NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2014 Forbes Lindesay + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF then-request NOTICES, INFORMATION, AND LICENSE + +%% typedarray NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +/* + Copyright (c) 2010, Linden Research, Inc. + Copyright (c) 2012, Joshua Bell + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + $/LicenseInfo$ + */ + +// Original can be found at: +// https://bitbucket.org/lindenlab/llsd +// Modifications by Joshua Bell inexorabletash@gmail.com +// https://github.com/inexorabletash/polyfill + +// ES3/ES5 implementation of the Krhonos Typed Array Specification +// Ref: http://www.khronos.org/registry/typedarray/specs/latest/ +// Date: 2011-02-01 +// +// Variations: +// * Allows typed_array.get/set() as alias for subscripts (typed_array[]) +========================================= +END OF typedarray NOTICES, INFORMATION, AND LICENSE + +%% typescript NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and + +You must cause any modified files to carry prominent notices stating that You changed the files; and + +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS +========================================= +END OF typescript NOTICES, INFORMATION, AND LICENSE + +%% util-deprecate NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(The MIT License) + +Copyright (c) 2014 Nathan Rajlich + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF util-deprecate NOTICES, INFORMATION, AND LICENSE + +%% uuid NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2010-2016 Robert Kieffer and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF uuid NOTICES, INFORMATION, AND LICENSE + +%% wrappy NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF wrappy NOTICES, INFORMATION, AND LICENSE + diff --git a/task/node_modules/azure-pipelines-task-lib/internal.d.ts b/task/node_modules/azure-pipelines-task-lib/internal.d.ts new file mode 100644 index 0000000..9d0ec41 --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/internal.d.ts @@ -0,0 +1,134 @@ +import vm = require('./vault'); +/** + * Hash table of known variable info. The formatted env var name is the lookup key. + * + * The purpose of this hash table is to keep track of known variables. The hash table + * needs to be maintained for multiple reasons: + * 1) to distinguish between env vars and job vars + * 2) to distinguish between secret vars and public + * 3) to know the real variable name and not just the formatted env var name. + */ +export declare var _knownVariableMap: { + [key: string]: _KnownVariableInfo; +}; +export declare var _vault: vm.Vault; +export declare enum IssueSource { + CustomerScript = "CustomerScript", + TaskInternal = "TaskInternal" +} +export declare function _startsWith(str: string, start: string): boolean; +export declare function _endsWith(str: string, end: string): boolean; +export declare function _writeLine(str: string): void; +export declare function _setStdStream(stdStream: any): void; +export declare function _setErrStream(errStream: any): void; +/** + * Sets the location of the resources json. This is typically the task.json file. + * Call once at the beginning of the script before any calls to loc. + * @param path Full path to the json. + * @param ignoreWarnings Won't throw warnings if path already set. + * @returns void + */ +export declare function _setResourcePath(path: string, ignoreWarnings?: boolean): void; +/** + * Gets the localized string from the json resource file. Optionally formats with additional params. + * + * @param key key of the resources string in the resource file + * @param param additional params for formatting the string + * @returns string + */ +export declare function _loc(key: string, ...param: any[]): string; +/** + * Gets a variable value that is defined on the build/release definition or set at runtime. + * + * @param name name of the variable to get + * @returns string + */ +export declare function _getVariable(name: string): string | undefined; +export declare function _getVariableKey(name: string): string; +/** + * Used to store the following information about job variables: + * 1) the real variable name (not the formatted environment variable name) + * 2) whether the variable is a secret variable + */ +export interface _KnownVariableInfo { + name: string; + secret: boolean; +} +export declare function _command(command: string, properties: any, message: string): void; +export declare function _warning(message: string, source?: IssueSource): void; +export declare function _error(message: string, source?: IssueSource): void; +export declare function _debug(message: string): void; +/** + * Returns whether a path exists. + * + * @param path path to check + * @returns boolean + */ +export declare function _exist(path: string): boolean; +/** + * Checks whether a path exists. + * If the path does not exist, it will throw. + * + * @param p path to check + * @param name name only used in error message to identify the path + * @returns void + */ +export declare function _checkPath(p: string, name: string): void; +/** + * Returns path of a tool had the tool actually been invoked. Resolves via paths. + * If you check and the tool does not exist, it will throw. + * + * @param tool name of the tool + * @param check whether to check if tool exists + * @returns string + */ +export declare function _which(tool: string, check?: boolean): string; +export declare function _legacyFindFiles_convertPatternToRegExp(pattern: string): RegExp; +export interface _MatchOptions { + debug?: boolean; + nobrace?: boolean; + noglobstar?: boolean; + dot?: boolean; + noext?: boolean; + nocase?: boolean; + nonull?: boolean; + matchBase?: boolean; + nocomment?: boolean; + nonegate?: boolean; + flipNegate?: boolean; +} +export declare function _cloneMatchOptions(matchOptions: _MatchOptions): _MatchOptions; +export interface _PatternFindInfo { + /** Adjusted pattern to use. Unrooted patterns are typically rooted using the default info, although this is not true for match-base scenarios. */ + adjustedPattern: string; + /** Path interpreted from the pattern to call find() on. */ + findPath: string; + /** Indicates whether to call stat() or find(). When all path segemnts in the pattern are literal, there is no need to call find(). */ + statOnly: boolean; +} +export declare function _getFindInfoFromPattern(defaultRoot: string, pattern: string, matchOptions: _MatchOptions): _PatternFindInfo; +export declare function _ensurePatternRooted(root: string, p: string): string; +export declare function _loadData(): void; +/** + * Defines if path is unc-path. + * + * @param path a path to a file. + * @returns true if path starts with double backslash, otherwise returns false. + */ +export declare function _isUncPath(path: string): boolean; +export declare function _ensureRooted(root: string, p: string): string; +/** + * Determines the parent path and trims trailing slashes (when safe). Path separators are normalized + * in the result. This function works similar to the .NET System.IO.Path.GetDirectoryName() method. + * For example, C:\hello\world\ returns C:\hello\world (trailing slash removed). Returns empty when + * no higher directory can be determined. + */ +export declare function _getDirectoryName(p: string): string; +/** + * On OSX/Linux, true if path starts with '/'. On Windows, true for paths like: + * \, \hello, \\hello\share, C:, and C:\hello (and corresponding alternate separator cases). + */ +export declare function _isRooted(p: string): boolean; +export declare function _normalizeSeparators(p: string): string; +export declare function _exposeProxySettings(): void; +export declare function _exposeCertSettings(): void; diff --git a/task/node_modules/azure-pipelines-task-lib/internal.js b/task/node_modules/azure-pipelines-task-lib/internal.js new file mode 100644 index 0000000..926734e --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/internal.js @@ -0,0 +1,893 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports._exposeCertSettings = exports._exposeProxySettings = exports._normalizeSeparators = exports._isRooted = exports._getDirectoryName = exports._ensureRooted = exports._isUncPath = exports._loadData = exports._ensurePatternRooted = exports._getFindInfoFromPattern = exports._cloneMatchOptions = exports._legacyFindFiles_convertPatternToRegExp = exports._which = exports._checkPath = exports._exist = exports._debug = exports._error = exports._warning = exports._command = exports._getVariableKey = exports._getVariable = exports._loc = exports._setResourcePath = exports._setErrStream = exports._setStdStream = exports._writeLine = exports._endsWith = exports._startsWith = exports.IssueSource = exports._vault = exports._knownVariableMap = void 0; +var fs = require("fs"); +var path = require("path"); +var os = require("os"); +var minimatch = require("minimatch"); +var util = require("util"); +var tcm = require("./taskcommand"); +var vm = require("./vault"); +var semver = require("semver"); +var crypto = require("crypto"); +/** + * Hash table of known variable info. The formatted env var name is the lookup key. + * + * The purpose of this hash table is to keep track of known variables. The hash table + * needs to be maintained for multiple reasons: + * 1) to distinguish between env vars and job vars + * 2) to distinguish between secret vars and public + * 3) to know the real variable name and not just the formatted env var name. + */ +exports._knownVariableMap = {}; +//----------------------------------------------------- +// Enums +//----------------------------------------------------- +var IssueSource; +(function (IssueSource) { + IssueSource["CustomerScript"] = "CustomerScript"; + IssueSource["TaskInternal"] = "TaskInternal"; +})(IssueSource = exports.IssueSource || (exports.IssueSource = {})); +//----------------------------------------------------- +// Validation Checks +//----------------------------------------------------- +// async await needs generators in node 4.x+ +if (semver.lt(process.versions.node, '4.2.0')) { + _warning('Tasks require a new agent. Upgrade your agent or node to 4.2.0 or later', IssueSource.TaskInternal); +} +//----------------------------------------------------- +// String convenience +//----------------------------------------------------- +function _startsWith(str, start) { + return str.slice(0, start.length) == start; +} +exports._startsWith = _startsWith; +function _endsWith(str, end) { + return str.slice(-end.length) == end; +} +exports._endsWith = _endsWith; +//----------------------------------------------------- +// General Helpers +//----------------------------------------------------- +var _outStream = process.stdout; +var _errStream = process.stderr; +function _writeLine(str) { + _outStream.write(str + os.EOL); +} +exports._writeLine = _writeLine; +function _setStdStream(stdStream) { + _outStream = stdStream; +} +exports._setStdStream = _setStdStream; +function _setErrStream(errStream) { + _errStream = errStream; +} +exports._setErrStream = _setErrStream; +//----------------------------------------------------- +// Loc Helpers +//----------------------------------------------------- +var _locStringCache = {}; +var _resourceFiles = {}; +var _libResourceFileLoaded = false; +var _resourceCulture = 'en-US'; +function _loadResJson(resjsonFile) { + var resJson; + if (_exist(resjsonFile)) { + var resjsonContent = fs.readFileSync(resjsonFile, 'utf8').toString(); + // remove BOM + if (resjsonContent.indexOf('\uFEFF') == 0) { + resjsonContent = resjsonContent.slice(1); + } + try { + resJson = JSON.parse(resjsonContent); + } + catch (err) { + _debug('unable to parse resjson with err: ' + err.message); + } + } + else { + _debug('.resjson file not found: ' + resjsonFile); + } + return resJson; +} +function _loadLocStrings(resourceFile, culture) { + var locStrings = {}; + if (_exist(resourceFile)) { + var resourceJson = require(resourceFile); + if (resourceJson && resourceJson.hasOwnProperty('messages')) { + var locResourceJson; + // load up resource resjson for different culture + var localizedResourceFile = path.join(path.dirname(resourceFile), 'Strings', 'resources.resjson'); + var upperCulture = culture.toUpperCase(); + var cultures = []; + try { + cultures = fs.readdirSync(localizedResourceFile); + } + catch (ex) { } + for (var i = 0; i < cultures.length; i++) { + if (cultures[i].toUpperCase() == upperCulture) { + localizedResourceFile = path.join(localizedResourceFile, cultures[i], 'resources.resjson'); + if (_exist(localizedResourceFile)) { + locResourceJson = _loadResJson(localizedResourceFile); + } + break; + } + } + for (var key in resourceJson.messages) { + if (locResourceJson && locResourceJson.hasOwnProperty('loc.messages.' + key)) { + locStrings[key] = locResourceJson['loc.messages.' + key]; + } + else { + locStrings[key] = resourceJson.messages[key]; + } + } + } + } + else { + _warning('LIB_ResourceFile does not exist', IssueSource.TaskInternal); + } + return locStrings; +} +/** + * Sets the location of the resources json. This is typically the task.json file. + * Call once at the beginning of the script before any calls to loc. + * @param path Full path to the json. + * @param ignoreWarnings Won't throw warnings if path already set. + * @returns void + */ +function _setResourcePath(path, ignoreWarnings) { + if (ignoreWarnings === void 0) { ignoreWarnings = false; } + if (process.env['TASKLIB_INPROC_UNITS']) { + _resourceFiles = {}; + _libResourceFileLoaded = false; + _locStringCache = {}; + _resourceCulture = 'en-US'; + } + if (!_resourceFiles[path]) { + _checkPath(path, 'resource file path'); + _resourceFiles[path] = path; + _debug('adding resource file: ' + path); + _resourceCulture = _getVariable('system.culture') || _resourceCulture; + var locStrs = _loadLocStrings(path, _resourceCulture); + for (var key in locStrs) { + //cache loc string + _locStringCache[key] = locStrs[key]; + } + } + else { + if (ignoreWarnings) { + _debug(_loc('LIB_ResourceFileAlreadySet', path)); + } + else { + _warning(_loc('LIB_ResourceFileAlreadySet', path), IssueSource.TaskInternal); + } + } +} +exports._setResourcePath = _setResourcePath; +/** + * Gets the localized string from the json resource file. Optionally formats with additional params. + * + * @param key key of the resources string in the resource file + * @param param additional params for formatting the string + * @returns string + */ +function _loc(key) { + var param = []; + for (var _i = 1; _i < arguments.length; _i++) { + param[_i - 1] = arguments[_i]; + } + if (!_libResourceFileLoaded) { + // merge loc strings from azure-pipelines-task-lib. + var libResourceFile = path.join(__dirname, 'lib.json'); + var libLocStrs = _loadLocStrings(libResourceFile, _resourceCulture); + for (var libKey in libLocStrs) { + //cache azure-pipelines-task-lib loc string + _locStringCache[libKey] = libLocStrs[libKey]; + } + _libResourceFileLoaded = true; + } + var locString; + ; + if (_locStringCache.hasOwnProperty(key)) { + locString = _locStringCache[key]; + } + else { + if (Object.keys(_resourceFiles).length <= 0) { + _warning("Resource file haven't been set, can't find loc string for key: " + key, IssueSource.TaskInternal); + } + else { + _warning("Can't find loc string for key: " + key); + } + locString = key; + } + if (param.length > 0) { + return util.format.apply(this, [locString].concat(param)); + } + else { + return locString; + } +} +exports._loc = _loc; +//----------------------------------------------------- +// Input Helpers +//----------------------------------------------------- +/** + * Gets a variable value that is defined on the build/release definition or set at runtime. + * + * @param name name of the variable to get + * @returns string + */ +function _getVariable(name) { + var varval; + // get the metadata + var info; + var key = _getVariableKey(name); + if (exports._knownVariableMap.hasOwnProperty(key)) { + info = exports._knownVariableMap[key]; + } + if (info && info.secret) { + // get the secret value + varval = exports._vault.retrieveSecret('SECRET_' + key); + } + else { + // get the public value + varval = process.env[key]; + // fallback for pre 2.104.1 agent + if (!varval && name.toUpperCase() == 'AGENT.JOBSTATUS') { + varval = process.env['agent.jobstatus']; + } + } + _debug(name + '=' + varval); + return varval; +} +exports._getVariable = _getVariable; +function _getVariableKey(name) { + if (!name) { + throw new Error(_loc('LIB_ParameterIsRequired', 'name')); + } + return name.replace(/\./g, '_').replace(/ /g, '_').toUpperCase(); +} +exports._getVariableKey = _getVariableKey; +//----------------------------------------------------- +// Cmd Helpers +//----------------------------------------------------- +function _command(command, properties, message) { + var taskCmd = new tcm.TaskCommand(command, properties, message); + _writeLine(taskCmd.toString()); +} +exports._command = _command; +function _warning(message, source) { + _command('task.issue', { 'type': 'warning', 'source': source }, message); +} +exports._warning = _warning; +function _error(message, source) { + _command('task.issue', { 'type': 'error', 'source': source }, message); +} +exports._error = _error; +function _debug(message) { + _command('task.debug', null, message); +} +exports._debug = _debug; +// //----------------------------------------------------- +// // Disk Functions +// //----------------------------------------------------- +/** + * Returns whether a path exists. + * + * @param path path to check + * @returns boolean + */ +function _exist(path) { + var exist = false; + try { + exist = !!(path && fs.statSync(path) != null); + } + catch (err) { + if (err && err.code === 'ENOENT') { + exist = false; + } + else { + throw err; + } + } + return exist; +} +exports._exist = _exist; +/** + * Checks whether a path exists. + * If the path does not exist, it will throw. + * + * @param p path to check + * @param name name only used in error message to identify the path + * @returns void + */ +function _checkPath(p, name) { + _debug('check path : ' + p); + if (!_exist(p)) { + throw new Error(_loc('LIB_PathNotFound', name, p)); + } +} +exports._checkPath = _checkPath; +/** + * Returns path of a tool had the tool actually been invoked. Resolves via paths. + * If you check and the tool does not exist, it will throw. + * + * @param tool name of the tool + * @param check whether to check if tool exists + * @returns string + */ +function _which(tool, check) { + if (!tool) { + throw new Error('parameter \'tool\' is required'); + } + // recursive when check=true + if (check) { + var result = _which(tool, false); + if (result) { + return result; + } + else { + if (process.platform == 'win32') { + throw new Error(_loc('LIB_WhichNotFound_Win', tool)); + } + else { + throw new Error(_loc('LIB_WhichNotFound_Linux', tool)); + } + } + } + _debug("which '" + tool + "'"); + try { + // build the list of extensions to try + var extensions = []; + if (process.platform == 'win32' && process.env['PATHEXT']) { + for (var _i = 0, _a = process.env['PATHEXT'].split(path.delimiter); _i < _a.length; _i++) { + var extension = _a[_i]; + if (extension) { + extensions.push(extension); + } + } + } + // if it's rooted, return it if exists. otherwise return empty. + if (_isRooted(tool)) { + var filePath = _tryGetExecutablePath(tool, extensions); + if (filePath) { + _debug("found: '" + filePath + "'"); + return filePath; + } + _debug('not found'); + return ''; + } + // if any path separators, return empty + if (tool.indexOf('/') >= 0 || (process.platform == 'win32' && tool.indexOf('\\') >= 0)) { + _debug('not found'); + return ''; + } + // build the list of directories + // + // Note, technically "where" checks the current directory on Windows. From a task lib perspective, + // it feels like we should not do this. Checking the current directory seems like more of a use + // case of a shell, and the which() function exposed by the task lib should strive for consistency + // across platforms. + var directories = []; + if (process.env['PATH']) { + for (var _b = 0, _c = process.env['PATH'].split(path.delimiter); _b < _c.length; _b++) { + var p = _c[_b]; + if (p) { + directories.push(p); + } + } + } + // return the first match + for (var _d = 0, directories_1 = directories; _d < directories_1.length; _d++) { + var directory = directories_1[_d]; + var filePath = _tryGetExecutablePath(directory + path.sep + tool, extensions); + if (filePath) { + _debug("found: '" + filePath + "'"); + return filePath; + } + } + _debug('not found'); + return ''; + } + catch (err) { + throw new Error(_loc('LIB_OperationFailed', 'which', err.message)); + } +} +exports._which = _which; +/** + * Best effort attempt to determine whether a file exists and is executable. + * @param filePath file path to check + * @param extensions additional file extensions to try + * @return if file exists and is executable, returns the file path. otherwise empty string. + */ +function _tryGetExecutablePath(filePath, extensions) { + try { + // test file exists + var stats = fs.statSync(filePath); + if (stats.isFile()) { + if (process.platform == 'win32') { + // on Windows, test for valid extension + var isExecutable = false; + var fileName = path.basename(filePath); + var dotIndex = fileName.lastIndexOf('.'); + if (dotIndex >= 0) { + var upperExt_1 = fileName.substr(dotIndex).toUpperCase(); + if (extensions.some(function (validExt) { return validExt.toUpperCase() == upperExt_1; })) { + return filePath; + } + } + } + else { + if (isUnixExecutable(stats)) { + return filePath; + } + } + } + } + catch (err) { + if (err.code != 'ENOENT') { + _debug("Unexpected error attempting to determine if executable file exists '" + filePath + "': " + err); + } + } + // try each extension + var originalFilePath = filePath; + for (var _i = 0, extensions_1 = extensions; _i < extensions_1.length; _i++) { + var extension = extensions_1[_i]; + var found = false; + var filePath_1 = originalFilePath + extension; + try { + var stats = fs.statSync(filePath_1); + if (stats.isFile()) { + if (process.platform == 'win32') { + // preserve the case of the actual file (since an extension was appended) + try { + var directory = path.dirname(filePath_1); + var upperName = path.basename(filePath_1).toUpperCase(); + for (var _a = 0, _b = fs.readdirSync(directory); _a < _b.length; _a++) { + var actualName = _b[_a]; + if (upperName == actualName.toUpperCase()) { + filePath_1 = path.join(directory, actualName); + break; + } + } + } + catch (err) { + _debug("Unexpected error attempting to determine the actual case of the file '" + filePath_1 + "': " + err); + } + return filePath_1; + } + else { + if (isUnixExecutable(stats)) { + return filePath_1; + } + } + } + } + catch (err) { + if (err.code != 'ENOENT') { + _debug("Unexpected error attempting to determine if executable file exists '" + filePath_1 + "': " + err); + } + } + } + return ''; +} +// on Mac/Linux, test the execute bit +// R W X R W X R W X +// 256 128 64 32 16 8 4 2 1 +function isUnixExecutable(stats) { + return (stats.mode & 1) > 0 || ((stats.mode & 8) > 0 && stats.gid === process.getgid()) || ((stats.mode & 64) > 0 && stats.uid === process.getuid()); +} +function _legacyFindFiles_convertPatternToRegExp(pattern) { + pattern = (process.platform == 'win32' ? pattern.replace(/\\/g, '/') : pattern) // normalize separator on Windows + .replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') // regex escape - from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript + .replace(/\\\/\\\*\\\*\\\//g, '((\/.+/)|(\/))') // replace directory globstar, e.g. /hello/**/world + .replace(/\\\*\\\*/g, '.*') // replace remaining globstars with a wildcard that can span directory separators, e.g. /hello/**dll + .replace(/\\\*/g, '[^\/]*') // replace asterisks with a wildcard that cannot span directory separators, e.g. /hello/*.dll + .replace(/\\\?/g, '[^\/]'); // replace single character wildcards, e.g. /hello/log?.dll + pattern = "^" + pattern + "$"; + var flags = process.platform == 'win32' ? 'i' : ''; + return new RegExp(pattern, flags); +} +exports._legacyFindFiles_convertPatternToRegExp = _legacyFindFiles_convertPatternToRegExp; +function _cloneMatchOptions(matchOptions) { + return { + debug: matchOptions.debug, + nobrace: matchOptions.nobrace, + noglobstar: matchOptions.noglobstar, + dot: matchOptions.dot, + noext: matchOptions.noext, + nocase: matchOptions.nocase, + nonull: matchOptions.nonull, + matchBase: matchOptions.matchBase, + nocomment: matchOptions.nocomment, + nonegate: matchOptions.nonegate, + flipNegate: matchOptions.flipNegate + }; +} +exports._cloneMatchOptions = _cloneMatchOptions; +function _getFindInfoFromPattern(defaultRoot, pattern, matchOptions) { + // parameter validation + if (!defaultRoot) { + throw new Error('getFindRootFromPattern() parameter defaultRoot cannot be empty'); + } + if (!pattern) { + throw new Error('getFindRootFromPattern() parameter pattern cannot be empty'); + } + if (!matchOptions.nobrace) { + throw new Error('getFindRootFromPattern() expected matchOptions.nobrace to be true'); + } + // for the sake of determining the findPath, pretend nocase=false + matchOptions = _cloneMatchOptions(matchOptions); + matchOptions.nocase = false; + // check if basename only and matchBase=true + if (matchOptions.matchBase && + !_isRooted(pattern) && + (process.platform == 'win32' ? pattern.replace(/\\/g, '/') : pattern).indexOf('/') < 0) { + return { + adjustedPattern: pattern, + findPath: defaultRoot, + statOnly: false, + }; + } + // the technique applied by this function is to use the information on the Minimatch object determine + // the findPath. Minimatch breaks the pattern into path segments, and exposes information about which + // segments are literal vs patterns. + // + // note, the technique currently imposes a limitation for drive-relative paths with a glob in the + // first segment, e.g. C:hello*/world. it's feasible to overcome this limitation, but is left unsolved + // for now. + var minimatchObj = new minimatch.Minimatch(pattern, matchOptions); + // the "set" property is an array of arrays of parsed path segment info. the outer array should only + // contain one item, otherwise something went wrong. brace expansion can result in multiple arrays, + // but that should be turned off by the time this function is reached. + if (minimatchObj.set.length != 1) { + throw new Error('getFindRootFromPattern() expected Minimatch(...).set.length to be 1. Actual: ' + minimatchObj.set.length); + } + var literalSegments = []; + for (var _i = 0, _a = minimatchObj.set[0]; _i < _a.length; _i++) { + var parsedSegment = _a[_i]; + if (typeof parsedSegment == 'string') { + // the item is a string when the original input for the path segment does not contain any + // unescaped glob characters. + // + // note, the string here is already unescaped (i.e. glob escaping removed), so it is ready + // to pass to find() as-is. for example, an input string 'hello\\*world' => 'hello*world'. + literalSegments.push(parsedSegment); + continue; + } + break; + } + // join the literal segments back together. Minimatch converts '\' to '/' on Windows, then squashes + // consequetive slashes, and finally splits on slash. this means that UNC format is lost, but can + // be detected from the original pattern. + var joinedSegments = literalSegments.join('/'); + if (joinedSegments && process.platform == 'win32' && _startsWith(pattern.replace(/\\/g, '/'), '//')) { + joinedSegments = '/' + joinedSegments; // restore UNC format + } + // determine the find path + var findPath; + if (_isRooted(pattern)) { // the pattern was rooted + findPath = joinedSegments; + } + else if (joinedSegments) { // the pattern was not rooted, and literal segments were found + findPath = _ensureRooted(defaultRoot, joinedSegments); + } + else { // the pattern was not rooted, and no literal segments were found + findPath = defaultRoot; + } + // clean up the path + if (findPath) { + findPath = _getDirectoryName(_ensureRooted(findPath, '_')); // hack to remove unnecessary trailing slash + findPath = _normalizeSeparators(findPath); // normalize slashes + } + return { + adjustedPattern: _ensurePatternRooted(defaultRoot, pattern), + findPath: findPath, + statOnly: literalSegments.length == minimatchObj.set[0].length, + }; +} +exports._getFindInfoFromPattern = _getFindInfoFromPattern; +function _ensurePatternRooted(root, p) { + if (!root) { + throw new Error('ensurePatternRooted() parameter "root" cannot be empty'); + } + if (!p) { + throw new Error('ensurePatternRooted() parameter "p" cannot be empty'); + } + if (_isRooted(p)) { + return p; + } + // normalize root + root = _normalizeSeparators(root); + // escape special glob characters + root = (process.platform == 'win32' ? root : root.replace(/\\/g, '\\\\')) // escape '\' on OSX/Linux + .replace(/(\[)(?=[^\/]+\])/g, '[[]') // escape '[' when ']' follows within the path segment + .replace(/\?/g, '[?]') // escape '?' + .replace(/\*/g, '[*]') // escape '*' + .replace(/\+\(/g, '[+](') // escape '+(' + .replace(/@\(/g, '[@](') // escape '@(' + .replace(/!\(/g, '[!]('); // escape '!(' + return _ensureRooted(root, p); +} +exports._ensurePatternRooted = _ensurePatternRooted; +//------------------------------------------------------------------- +// Populate the vault with sensitive data. Inputs and Endpoints +//------------------------------------------------------------------- +function _loadData() { + // in agent, prefer TempDirectory then workFolder. + // In interactive dev mode, it won't be + var keyPath = _getVariable("agent.TempDirectory") || _getVariable("agent.workFolder") || process.cwd(); + exports._vault = new vm.Vault(keyPath); + exports._knownVariableMap = {}; + _debug('loading inputs and endpoints'); + var loaded = 0; + for (var envvar in process.env) { + if (_startsWith(envvar, 'INPUT_') || + _startsWith(envvar, 'ENDPOINT_AUTH_') || + _startsWith(envvar, 'SECUREFILE_TICKET_') || + _startsWith(envvar, 'SECRET_') || + _startsWith(envvar, 'VSTS_TASKVARIABLE_')) { + // Record the secret variable metadata. This is required by getVariable to know whether + // to retrieve the value from the vault. In a 2.104.1 agent or higher, this metadata will + // be overwritten when the VSTS_SECRET_VARIABLES env var is processed below. + if (_startsWith(envvar, 'SECRET_')) { + var variableName = envvar.substring('SECRET_'.length); + if (variableName) { + // This is technically not the variable name (has underscores instead of dots), + // but it's good enough to make getVariable work in a pre-2.104.1 agent where + // the VSTS_SECRET_VARIABLES env var is not defined. + exports._knownVariableMap[_getVariableKey(variableName)] = { name: variableName, secret: true }; + } + } + // store the secret + var value = process.env[envvar]; + if (value) { + ++loaded; + _debug('loading ' + envvar); + exports._vault.storeSecret(envvar, value); + delete process.env[envvar]; + } + } + } + _debug('loaded ' + loaded); + // store public variable metadata + var names; + try { + names = JSON.parse(process.env['VSTS_PUBLIC_VARIABLES'] || '[]'); + } + catch (err) { + throw new Error('Failed to parse VSTS_PUBLIC_VARIABLES as JSON. ' + err); // may occur during interactive testing + } + names.forEach(function (name) { + exports._knownVariableMap[_getVariableKey(name)] = { name: name, secret: false }; + }); + delete process.env['VSTS_PUBLIC_VARIABLES']; + // store secret variable metadata + try { + names = JSON.parse(process.env['VSTS_SECRET_VARIABLES'] || '[]'); + } + catch (err) { + throw new Error('Failed to parse VSTS_SECRET_VARIABLES as JSON. ' + err); // may occur during interactive testing + } + names.forEach(function (name) { + exports._knownVariableMap[_getVariableKey(name)] = { name: name, secret: true }; + }); + delete process.env['VSTS_SECRET_VARIABLES']; + // avoid loading twice (overwrites .taskkey) + global['_vsts_task_lib_loaded'] = true; +} +exports._loadData = _loadData; +//-------------------------------------------------------------------------------- +// Internal path helpers. +//-------------------------------------------------------------------------------- +/** + * Defines if path is unc-path. + * + * @param path a path to a file. + * @returns true if path starts with double backslash, otherwise returns false. + */ +function _isUncPath(path) { + return /^\\\\[^\\]/.test(path); +} +exports._isUncPath = _isUncPath; +function _ensureRooted(root, p) { + if (!root) { + throw new Error('ensureRooted() parameter "root" cannot be empty'); + } + if (!p) { + throw new Error('ensureRooted() parameter "p" cannot be empty'); + } + if (_isRooted(p)) { + return p; + } + if (process.platform == 'win32' && root.match(/^[A-Z]:$/i)) { // e.g. C: + return root + p; + } + // ensure root ends with a separator + if (_endsWith(root, '/') || (process.platform == 'win32' && _endsWith(root, '\\'))) { + // root already ends with a separator + } + else { + root += path.sep; // append separator + } + return root + p; +} +exports._ensureRooted = _ensureRooted; +/** + * Determines the parent path and trims trailing slashes (when safe). Path separators are normalized + * in the result. This function works similar to the .NET System.IO.Path.GetDirectoryName() method. + * For example, C:\hello\world\ returns C:\hello\world (trailing slash removed). Returns empty when + * no higher directory can be determined. + */ +function _getDirectoryName(p) { + // short-circuit if empty + if (!p) { + return ''; + } + // normalize separators + p = _normalizeSeparators(p); + // on Windows, the goal of this function is to match the behavior of + // [System.IO.Path]::GetDirectoryName(), e.g. + // C:/ => + // C:/hello => C:\ + // C:/hello/ => C:\hello + // C:/hello/world => C:\hello + // C:/hello/world/ => C:\hello\world + // C: => + // C:hello => C: + // C:hello/ => C:hello + // / => + // /hello => \ + // /hello/ => \hello + // //hello => + // //hello/ => + // //hello/world => + // //hello/world/ => \\hello\world + // + // unfortunately, path.dirname() can't simply be used. for example, on Windows + // it yields different results from Path.GetDirectoryName: + // C:/ => C:/ + // C:/hello => C:/ + // C:/hello/ => C:/ + // C:/hello/world => C:/hello + // C:/hello/world/ => C:/hello + // C: => C: + // C:hello => C: + // C:hello/ => C: + // / => / + // /hello => / + // /hello/ => / + // //hello => / + // //hello/ => / + // //hello/world => //hello/world + // //hello/world/ => //hello/world/ + // //hello/world/again => //hello/world/ + // //hello/world/again/ => //hello/world/ + // //hello/world/again/again => //hello/world/again + // //hello/world/again/again/ => //hello/world/again + if (process.platform == 'win32') { + if (/^[A-Z]:\\?[^\\]+$/i.test(p)) { // e.g. C:\hello or C:hello + return p.charAt(2) == '\\' ? p.substring(0, 3) : p.substring(0, 2); + } + else if (/^[A-Z]:\\?$/i.test(p)) { // e.g. C:\ or C: + return ''; + } + var lastSlashIndex = p.lastIndexOf('\\'); + if (lastSlashIndex < 0) { // file name only + return ''; + } + else if (p == '\\') { // relative root + return ''; + } + else if (lastSlashIndex == 0) { // e.g. \\hello + return '\\'; + } + else if (/^\\\\[^\\]+(\\[^\\]*)?$/.test(p)) { // UNC root, e.g. \\hello or \\hello\ or \\hello\world + return ''; + } + return p.substring(0, lastSlashIndex); // e.g. hello\world => hello or hello\world\ => hello\world + // note, this means trailing slashes for non-root directories + // (i.e. not C:\, \, or \\unc\) will simply be removed. + } + // OSX/Linux + if (p.indexOf('/') < 0) { // file name only + return ''; + } + else if (p == '/') { + return ''; + } + else if (_endsWith(p, '/')) { + return p.substring(0, p.length - 1); + } + return path.dirname(p); +} +exports._getDirectoryName = _getDirectoryName; +/** + * On OSX/Linux, true if path starts with '/'. On Windows, true for paths like: + * \, \hello, \\hello\share, C:, and C:\hello (and corresponding alternate separator cases). + */ +function _isRooted(p) { + p = _normalizeSeparators(p); + if (!p) { + throw new Error('isRooted() parameter "p" cannot be empty'); + } + if (process.platform == 'win32') { + return _startsWith(p, '\\') || // e.g. \ or \hello or \\hello + /^[A-Z]:/i.test(p); // e.g. C: or C:\hello + } + return _startsWith(p, '/'); // e.g. /hello +} +exports._isRooted = _isRooted; +function _normalizeSeparators(p) { + p = p || ''; + if (process.platform == 'win32') { + // convert slashes on Windows + p = p.replace(/\//g, '\\'); + // remove redundant slashes + var isUnc = /^\\\\+[^\\]/.test(p); // e.g. \\hello + return (isUnc ? '\\' : '') + p.replace(/\\\\+/g, '\\'); // preserve leading // for UNC + } + // remove redundant slashes + return p.replace(/\/\/+/g, '/'); +} +exports._normalizeSeparators = _normalizeSeparators; +//----------------------------------------------------- +// Expose proxy information to vsts-node-api +//----------------------------------------------------- +function _exposeProxySettings() { + var proxyUrl = _getVariable('Agent.ProxyUrl'); + if (proxyUrl && proxyUrl.length > 0) { + var proxyUsername = _getVariable('Agent.ProxyUsername'); + var proxyPassword = _getVariable('Agent.ProxyPassword'); + var proxyBypassHostsJson = _getVariable('Agent.ProxyBypassList'); + global['_vsts_task_lib_proxy_url'] = proxyUrl; + global['_vsts_task_lib_proxy_username'] = proxyUsername; + global['_vsts_task_lib_proxy_bypass'] = proxyBypassHostsJson; + global['_vsts_task_lib_proxy_password'] = _exposeTaskLibSecret('proxy', proxyPassword || ''); + _debug('expose agent proxy configuration.'); + global['_vsts_task_lib_proxy'] = true; + } +} +exports._exposeProxySettings = _exposeProxySettings; +//----------------------------------------------------- +// Expose certificate information to vsts-node-api +//----------------------------------------------------- +function _exposeCertSettings() { + var ca = _getVariable('Agent.CAInfo'); + if (ca) { + global['_vsts_task_lib_cert_ca'] = ca; + } + var clientCert = _getVariable('Agent.ClientCert'); + if (clientCert) { + var clientCertKey = _getVariable('Agent.ClientCertKey'); + var clientCertArchive = _getVariable('Agent.ClientCertArchive'); + var clientCertPassword = _getVariable('Agent.ClientCertPassword'); + global['_vsts_task_lib_cert_clientcert'] = clientCert; + global['_vsts_task_lib_cert_key'] = clientCertKey; + global['_vsts_task_lib_cert_archive'] = clientCertArchive; + global['_vsts_task_lib_cert_passphrase'] = _exposeTaskLibSecret('cert', clientCertPassword || ''); + } + if (ca || clientCert) { + _debug('expose agent certificate configuration.'); + global['_vsts_task_lib_cert'] = true; + } + var skipCertValidation = _getVariable('Agent.SkipCertValidation') || 'false'; + if (skipCertValidation) { + global['_vsts_task_lib_skip_cert_validation'] = skipCertValidation.toUpperCase() === 'TRUE'; + } +} +exports._exposeCertSettings = _exposeCertSettings; +// We store the encryption key on disk and hold the encrypted content and key file in memory +// return base64encoded:base64encoded +// downstream vsts-node-api will retrieve the secret later +function _exposeTaskLibSecret(keyFile, secret) { + if (secret) { + var encryptKey = crypto.randomBytes(256); + var cipher = crypto.createCipher("aes-256-ctr", encryptKey); + var encryptedContent = cipher.update(secret, "utf8", "hex"); + encryptedContent += cipher.final("hex"); + var storageFile = path.join(_getVariable('Agent.TempDirectory') || _getVariable("agent.workFolder") || process.cwd(), keyFile); + fs.writeFileSync(storageFile, encryptKey.toString('base64'), { encoding: 'utf8' }); + return new Buffer(storageFile).toString('base64') + ':' + new Buffer(encryptedContent).toString('base64'); + } +} diff --git a/task/node_modules/azure-pipelines-task-lib/lib-mocker.d.ts b/task/node_modules/azure-pipelines-task-lib/lib-mocker.d.ts new file mode 100644 index 0000000..5552694 --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/lib-mocker.d.ts @@ -0,0 +1,17 @@ +export interface MockOptions { + useCleanCache?: boolean; + warnOnReplace?: boolean; + warnOnUnregistered?: boolean; +} +export declare function enable(opts: MockOptions): void; +export declare function disable(): void; +export declare function resetCache(): void; +export declare function warnOnReplace(enable: boolean): void; +export declare function warnOnUnregistered(enable: boolean): void; +export declare function registerMock(mod: string, mock: any): void; +export declare function deregisterMock(mod: string): void; +export declare function deregisterAll(): void; +export declare function registerAllowable(mod: string): void; +export declare function registerAllowables(mods: string[]): void; +export declare function deregisterAllowable(mod: string): void; +export declare function deregisterAllowables(mods: any): void; diff --git a/task/node_modules/azure-pipelines-task-lib/lib-mocker.js b/task/node_modules/azure-pipelines-task-lib/lib-mocker.js new file mode 100644 index 0000000..3a61188 --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/lib-mocker.js @@ -0,0 +1,199 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.deregisterAllowables = exports.deregisterAllowable = exports.registerAllowables = exports.registerAllowable = exports.deregisterAll = exports.deregisterMock = exports.registerMock = exports.warnOnUnregistered = exports.warnOnReplace = exports.resetCache = exports.disable = exports.enable = void 0; +var m = require('module'); +; +var registeredMocks = {}; +var registeredAllowables = new Set(); +var originalLoader = null; +var originalCache = {}; +var options = {}; +var defaultOptions = { + useCleanCache: false, + warnOnReplace: true, + warnOnUnregistered: true +}; +function _getEffectiveOptions(opts) { + var options = {}; + Object.keys(defaultOptions).forEach(function (key) { + if (opts && opts.hasOwnProperty(key)) { + options[key] = opts[key]; + } + else { + options[key] = defaultOptions[key]; + } + }); + return options; +} +/* + * Loader function that used when hooking is enabled. + * if the requested module is registered as a mock, return the mock. + * otherwise, invoke the original loader + put warning in the output. + */ +function _hookedLoader(request, parent, isMain) { + if (!originalLoader) { + throw new Error("Loader has not been hooked"); + } + if (registeredMocks.hasOwnProperty(request)) { + return registeredMocks[request]; + } + if (!registeredAllowables.has(request) && options.warnOnUnregistered) { + console.warn("WARNING: loading non-allowed module: " + request); + } + return originalLoader(request, parent, isMain); +} +/** + * Remove references to modules in the cache from + * their parents' children. + */ +function _removeParentReferences() { + Object.keys(m._cache).forEach(function (k) { + var _a; + if (k.indexOf('\.node') === -1) { + // don't touch native modules, because they're special + var mod = m._cache[k]; + var idx = (_a = mod === null || mod === void 0 ? void 0 : mod.parent) === null || _a === void 0 ? void 0 : _a.children.indexOf(mod); + if (idx > -1) { + mod.parent.children.splice(idx, 1); + } + } + }); +} +/* + * Starting in node 0.12 node won't reload native modules + * The reason is that native modules can register themselves to be loaded automatically + * This will re-populate the cache with the native modules that have not been mocked + */ +function _repopulateNative() { + Object.keys(originalCache).forEach(function (k) { + if (k.indexOf('\.node') > -1 && !m._cache[k]) { + m._cache[k] = originalCache[k]; + } + }); +} +/* + * Enable function, hooking the Node loader with options. + */ +function enable(opts) { + if (originalLoader) { + // Already hooked + return; + } + options = _getEffectiveOptions(opts); + if (options.useCleanCache) { + originalCache = m._cache; + m._cache = {}; + _repopulateNative(); + } + originalLoader = m._load; + m._load = _hookedLoader; +} +exports.enable = enable; +/* + * Disables mock loading, reverting to normal 'require' behaviour. + */ +function disable() { + if (!originalLoader) + return; + if (options.useCleanCache) { + Object.keys(m._cache).forEach(function (k) { + if (k.indexOf('\.node') > -1 && !originalCache[k]) { + originalCache[k] = m._cache[k]; + } + }); + _removeParentReferences(); + m._cache = originalCache; + originalCache = {}; + } + m._load = originalLoader; + originalLoader = null; +} +exports.disable = disable; +/* +* If the clean cache option is in effect, reset the module cache to an empty +* state. Calling this function when the clean cache option is not in effect +* will have no ill effects, but will do nothing. +*/ +function resetCache() { + if (options.useCleanCache && originalCache) { + _removeParentReferences(); + m._cache = {}; + _repopulateNative(); + } +} +exports.resetCache = resetCache; +/* + * Enable or disable warnings to the console when previously registered mocks are replaced. + */ +function warnOnReplace(enable) { + options.warnOnReplace = enable; +} +exports.warnOnReplace = warnOnReplace; +/* + * Enable or disable warnings to the console when modules are loaded that have + * not been registered as a mock. + */ +function warnOnUnregistered(enable) { + options.warnOnUnregistered = enable; +} +exports.warnOnUnregistered = warnOnUnregistered; +/* + * Register a mock object for the specified module. + */ +function registerMock(mod, mock) { + if (options.warnOnReplace && registeredMocks.hasOwnProperty(mod)) { + console.warn("WARNING: Replacing existing mock for module: " + mod); + } + registeredMocks[mod] = mock; +} +exports.registerMock = registerMock; +/* + * Deregister a mock object for the specified module. + */ +function deregisterMock(mod) { + if (registeredMocks.hasOwnProperty(mod)) { + delete registeredMocks[mod]; + } +} +exports.deregisterMock = deregisterMock; +/* + * Deregister all mocks. + */ +function deregisterAll() { + registeredMocks = {}; + registeredAllowables = new Set(); +} +exports.deregisterAll = deregisterAll; +/* + Register a module as 'allowed'. + This will allow the module to be loaded without mock otherwise a warning would be thrown. + */ +function registerAllowable(mod) { + registeredAllowables.add(mod); +} +exports.registerAllowable = registerAllowable; +/* + * Register an array of 'allowed' modules. + */ +function registerAllowables(mods) { + mods.forEach(function (mod) { return registerAllowable(mod); }); +} +exports.registerAllowables = registerAllowables; +/* + * Deregister a module as 'allowed'. + */ +function deregisterAllowable(mod) { + if (registeredAllowables.hasOwnProperty(mod)) { + registeredAllowables.delete(mod); + } +} +exports.deregisterAllowable = deregisterAllowable; +/* + * Deregister an array of modules as 'allowed'. + */ +function deregisterAllowables(mods) { + mods.forEach(function (mod) { + deregisterAllowable(mod); + }); +} +exports.deregisterAllowables = deregisterAllowables; diff --git a/task/node_modules/azure-pipelines-task-lib/lib.json b/task/node_modules/azure-pipelines-task-lib/lib.json new file mode 100644 index 0000000..45ffe07 --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/lib.json @@ -0,0 +1,38 @@ +{ + "messages": { + "LIB_UnhandledEx": "Unhandled: %s", + "LIB_FailOnCode": "Failure return code: %d", + "LIB_MkdirFailed": "Unable to create directory '%s'. %s", + "LIB_MkdirFailedFileExists": "Unable to create directory '%s'. Conflicting file exists: '%s'", + "LIB_MkdirFailedInvalidDriveRoot": "Unable to create directory '%s'. Root directory does not exist: '%s'", + "LIB_MkdirFailedInvalidShare": "Unable to create directory '%s'. Unable to verify the directory exists: '%s'. If directory is a file share, please verify the share name is correct, the share is online, and the current process has permission to access the share.", + "LIB_MultilineSecret": "Secrets cannot contain multiple lines", + "LIB_ProcessError": "There was an error when attempting to execute the process '%s'. This may indicate the process failed to start. Error: %s", + "LIB_ProcessExitCode": "The process '%s' failed with exit code %s", + "LIB_ProcessStderr": "The process '%s' failed because one or more lines were written to the STDERR stream", + "LIB_ReturnCode": "Return code: %d", + "LIB_ResourceFileNotExist": "Resource file doesn\\'t exist: %s", + "LIB_ResourceFileAlreadySet": "Resource file has already set to: %s", + "LIB_ResourceFileNotSet": "Resource file haven\\'t set, can\\'t find loc string for key: %s", + "LIB_StdioNotClosed": "The STDIO streams did not close within %s seconds of the exit event from process '%s'. This may indicate a child process inherited the STDIO streams and has not yet exited.", + "LIB_WhichNotFound_Linux": "Unable to locate executable file: '%s'. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.", + "LIB_WhichNotFound_Win": "Unable to locate executable file: '%s'. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.", + "LIB_LocStringNotFound": "Can\\'t find loc string for key: %s", + "LIB_ParameterIsRequired": "%s not supplied", + "LIB_InputRequired": "Input required: %s", + "LIB_InvalidPattern": "Invalid pattern: '%s'", + "LIB_EndpointNotExist": "Endpoint not present: %s", + "LIB_EndpointDataNotExist": "Endpoint data parameter %s not present: %s", + "LIB_EndpointAuthNotExist": "Endpoint auth data not present: %s", + "LIB_InvalidEndpointAuth": "Invalid endpoint auth: %s", + "LIB_InvalidSecureFilesInput": "Invalid secure file input: %s", + "LIB_PathNotFound": "Not found %s: %s", + "LIB_PathHasNullByte": "Path cannot contain null bytes", + "LIB_OperationFailed": "Failed %s: %s", + "LIB_UseFirstGlobMatch": "Multiple workspace matches. using first.", + "LIB_MergeTestResultNotSupported": "Merging test results from multiple files to one test run is not supported on this version of build agent for OSX/Linux, each test result file will be published as a separate test run in VSO/TFS.", + "LIB_PlatformNotSupported": "Platform not supported: %s", + "LIB_CopyFileFailed": "Error while copying the file. Attempts left: %s", + "LIB_UndefinedNodeVersion": "Node version is undefined." + } +} diff --git a/task/node_modules/azure-pipelines-task-lib/mock-answer.d.ts b/task/node_modules/azure-pipelines-task-lib/mock-answer.d.ts new file mode 100644 index 0000000..1e19ff7 --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/mock-answer.d.ts @@ -0,0 +1,61 @@ +import * as task from './task'; +export interface TaskLibAnswerExecResult { + code: number; + stdout?: string; + stderr?: string; +} +export interface TaskLibAnswers { + checkPath?: { + [key: string]: boolean; + }; + cwd?: { + [key: string]: string; + }; + exec?: { + [key: string]: TaskLibAnswerExecResult; + }; + exist?: { + [key: string]: boolean; + }; + find?: { + [key: string]: string[]; + }; + findMatch?: { + [key: string]: string[]; + }; + getPlatform?: { + [key: string]: task.Platform; + }; + getNodeMajorVersion?: { + [key: string]: Number; + }; + getAgentMode?: { + [key: string]: task.AgentHostedMode; + }; + legacyFindFiles?: { + [key: string]: string[]; + }; + ls?: { + [key: string]: string; + }; + osType?: { + [key: string]: string; + }; + rmRF?: { + [key: string]: { + success: boolean; + }; + }; + stats?: { + [key: string]: any; + }; + which?: { + [key: string]: string; + }; +} +export declare type MockedCommand = keyof TaskLibAnswers; +export declare class MockAnswers { + private _answers; + initialize(answers: TaskLibAnswers): void; + getResponse(cmd: MockedCommand, key: string, debug: (message: string) => void): any; +} diff --git a/task/node_modules/azure-pipelines-task-lib/mock-answer.js b/task/node_modules/azure-pipelines-task-lib/mock-answer.js new file mode 100644 index 0000000..f817096 --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/mock-answer.js @@ -0,0 +1,41 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MockAnswers = void 0; +var MockAnswers = /** @class */ (function () { + function MockAnswers() { + } + MockAnswers.prototype.initialize = function (answers) { + if (!answers) { + throw new Error('Answers not supplied'); + } + this._answers = answers; + }; + MockAnswers.prototype.getResponse = function (cmd, key, debug) { + debug("looking up mock answers for " + JSON.stringify(cmd) + ", key '" + JSON.stringify(key) + "'"); + if (!this._answers) { + throw new Error('Must initialize'); + } + if (!this._answers[cmd]) { + debug("no mock responses registered for " + JSON.stringify(cmd)); + return null; + } + var cmd_answer = this._answers[cmd]; + //use this construction to avoid falsy zero + if (cmd_answer[key] != null) { + debug('found mock response'); + return cmd_answer[key]; + } + if (key && process.env['MOCK_NORMALIZE_SLASHES'] === 'true') { + // try normalizing the slashes + var key2 = key.replace(/\\/g, "/"); + if (cmd_answer[key2]) { + debug('found mock response for normalized key'); + return cmd_answer[key2]; + } + } + debug('mock response not found'); + return null; + }; + return MockAnswers; +}()); +exports.MockAnswers = MockAnswers; diff --git a/task/node_modules/azure-pipelines-task-lib/mock-run.d.ts b/task/node_modules/azure-pipelines-task-lib/mock-run.d.ts new file mode 100644 index 0000000..c3d3972 --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/mock-run.d.ts @@ -0,0 +1,44 @@ +import ma = require('./mock-answer'); +export declare class TaskMockRunner { + constructor(taskPath: string); + _taskPath: string; + _answers: ma.TaskLibAnswers | undefined; + _exports: { + [key: string]: any; + }; + _moduleCount: number; + setInput(name: string, val: string): void; + setVariableName(name: string, val: string, isSecret?: boolean): void; + /** + * Register answers for the mock "azure-pipelines-task-lib/task" instance. + * + * @param answers Answers to be returned when the task lib functions are called. + */ + setAnswers(answers: ma.TaskLibAnswers): void; + /** + * Register a mock module. When require() is called for the module name, + * the mock implementation will be returned instead. + * + * @param modName Module name to override. + * @param val Mock implementation of the module. + * @returns void + */ + registerMock(modName: string, mod: any): void; + /** + * Registers an override for a specific function on the mock "azure-pipelines-task-lib/task" instance. + * This can be used in conjunction with setAnswers(), for cases where additional runtime + * control is needed for a specific function. + * + * @param key Function or field to override. + * @param val Function or field value. + * @returns void + */ + registerMockExport(key: string, val: any): void; + /** + * Runs a task script. + * + * @param noMockTask Indicates whether to mock "azure-pipelines-task-lib/task". Default is to mock. + * @returns void + */ + run(noMockTask?: boolean): void; +} diff --git a/task/node_modules/azure-pipelines-task-lib/mock-run.js b/task/node_modules/azure-pipelines-task-lib/mock-run.js new file mode 100644 index 0000000..1f0b64f --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/mock-run.js @@ -0,0 +1,92 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TaskMockRunner = void 0; +var im = require("./internal"); +var mocker = require("./lib-mocker"); +var TaskMockRunner = /** @class */ (function () { + function TaskMockRunner(taskPath) { + this._exports = {}; + this._moduleCount = 0; + this._taskPath = taskPath; + } + TaskMockRunner.prototype.setInput = function (name, val) { + var key = im._getVariableKey(name); + process.env['INPUT_' + key] = val; + }; + TaskMockRunner.prototype.setVariableName = function (name, val, isSecret) { + var key = im._getVariableKey(name); + if (isSecret) { + process.env['SECRET_' + key] = val; + } + else { + process.env['VSTS_TASKVARIABLE_' + key] = val; + } + }; + /** + * Register answers for the mock "azure-pipelines-task-lib/task" instance. + * + * @param answers Answers to be returned when the task lib functions are called. + */ + TaskMockRunner.prototype.setAnswers = function (answers) { + this._answers = answers; + }; + /** + * Register a mock module. When require() is called for the module name, + * the mock implementation will be returned instead. + * + * @param modName Module name to override. + * @param val Mock implementation of the module. + * @returns void + */ + TaskMockRunner.prototype.registerMock = function (modName, mod) { + this._moduleCount++; + mocker.registerMock(modName, mod); + }; + /** + * Registers an override for a specific function on the mock "azure-pipelines-task-lib/task" instance. + * This can be used in conjunction with setAnswers(), for cases where additional runtime + * control is needed for a specific function. + * + * @param key Function or field to override. + * @param val Function or field value. + * @returns void + */ + TaskMockRunner.prototype.registerMockExport = function (key, val) { + this._exports[key] = val; + }; + /** + * Runs a task script. + * + * @param noMockTask Indicates whether to mock "azure-pipelines-task-lib/task". Default is to mock. + * @returns void + */ + TaskMockRunner.prototype.run = function (noMockTask) { + var _this = this; + // determine whether to enable mocker + if (!noMockTask || this._moduleCount) { + mocker.enable({ warnOnUnregistered: false }); + } + // answers and exports not compatible with "noMockTask" mode + if (noMockTask) { + if (this._answers || Object.keys(this._exports).length) { + throw new Error('setAnswers() and registerMockExport() is not compatible with "noMockTask" mode'); + } + } + // register mock task lib + else { + var tlm = require('azure-pipelines-task-lib/mock-task'); + if (this._answers) { + tlm.setAnswers(this._answers); + } + Object.keys(this._exports) + .forEach(function (key) { + tlm[key] = _this._exports[key]; + }); + mocker.registerMock('azure-pipelines-task-lib/task', tlm); + } + // run it + require(this._taskPath); + }; + return TaskMockRunner; +}()); +exports.TaskMockRunner = TaskMockRunner; diff --git a/task/node_modules/azure-pipelines-task-lib/mock-task.d.ts b/task/node_modules/azure-pipelines-task-lib/mock-task.d.ts new file mode 100644 index 0000000..f110b01 --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/mock-task.d.ts @@ -0,0 +1,114 @@ +/// +import Q = require('q'); +import fs = require('fs'); +import task = require('./task'); +import trm = require('./mock-toolrunner'); +import ma = require('./mock-answer'); +export declare function setAnswers(answers: ma.TaskLibAnswers): void; +export declare function setResourcePath(path: string): void; +export declare function loc(key: string, ...args: any[]): string; +export interface EndpointAuthorization { + parameters: { + [key: string]: string; + }; + scheme: string; +} +export declare class FsStats implements fs.Stats { + private m_isFile; + private m_isDirectory; + private m_isBlockDevice; + private m_isCharacterDevice; + private m_isSymbolicLink; + private m_isFIFO; + private m_isSocket; + dev: number; + ino: number; + mode: number; + nlink: number; + uid: number; + gid: number; + rdev: number; + size: number; + blksize: number; + blocks: number; + atime: Date; + mtime: Date; + ctime: Date; + birthtime: Date; + atimeMs: number; + mtimeMs: number; + ctimeMs: number; + birthtimeMs: number; + setAnswers(mockResponses: any): void; + isFile(): boolean; + isDirectory(): boolean; + isBlockDevice(): boolean; + isCharacterDevice(): boolean; + isSymbolicLink(): boolean; + isFIFO(): boolean; + isSocket(): boolean; +} +export declare function stats(path: string): FsStats; +export declare function exist(path: string): boolean; +export interface FsOptions { + encoding?: string; + mode?: number; + flag?: string; +} +export declare function writeFile(file: string, data: string | Buffer, options?: string | FsOptions): void; +export declare function osType(): string; +export declare function getPlatform(): task.Platform; +export declare function getNodeMajorVersion(): Number; +export declare function getAgentMode(): task.AgentHostedMode; +export declare function cwd(): string; +export declare function cd(path: string): void; +export declare function pushd(path: string): void; +export declare function popd(): void; +export declare function checkPath(p: string, name: string): void; +export declare function mkdirP(p: any): void; +export declare function resolve(): string; +export declare function which(tool: string, check?: boolean): string; +export declare function ls(options: string, paths: string[]): string[]; +export declare function cp(source: string, dest: string): void; +export declare function retry(func: Function, args: any[], retryOptions: task.RetryOptions): any; +export declare function find(findPath: string): string[]; +export declare function rmRF(path: string): void; +export declare function mv(source: string, dest: string, force: boolean, continueOnError?: boolean): boolean; +export declare function exec(tool: string, args: any, options?: trm.IExecOptions): Q.Promise; +export declare function execAsync(tool: string, args: any, options?: trm.IExecOptions): Promise; +export declare function execSync(tool: string, args: any, options?: trm.IExecSyncOptions): trm.IExecSyncResult; +export declare function tool(tool: string): trm.ToolRunner; +export interface MatchOptions { + debug?: boolean; + nobrace?: boolean; + noglobstar?: boolean; + dot?: boolean; + noext?: boolean; + nocase?: boolean; + nonull?: boolean; + matchBase?: boolean; + nocomment?: boolean; + nonegate?: boolean; + flipNegate?: boolean; +} +export declare function findMatch(defaultRoot: string, patterns: string[] | string): string[]; +export declare function legacyFindFiles(rootDirectory: string, pattern: string, includeFiles?: boolean, includeDirectories?: boolean): string[]; +export declare class TestPublisher { + testRunner: string; + constructor(testRunner: string); + publish(resultFiles?: string, mergeResults?: string, platform?: string, config?: string, runTitle?: string, publishRunAttachments?: string): void; +} +export declare class CodeCoveragePublisher { + constructor(); + publish(codeCoverageTool?: string, summaryFileLocation?: string, reportDirectory?: string, additionalCodeCoverageFiles?: string): void; +} +export declare class CodeCoverageEnabler { + private buildTool; + private ccTool; + constructor(buildTool: string, ccTool: string); + enableCodeCoverage(buildProps: { + [key: string]: string; + }): void; +} +export declare function getHttpProxyConfiguration(requestUrl?: string): task.ProxyConfiguration | null; +export declare function getHttpCertConfiguration(): task.CertConfiguration | null; diff --git a/task/node_modules/azure-pipelines-task-lib/mock-task.js b/task/node_modules/azure-pipelines-task-lib/mock-task.js new file mode 100644 index 0000000..b06f209 --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/mock-task.js @@ -0,0 +1,469 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getHttpCertConfiguration = exports.getHttpProxyConfiguration = exports.CodeCoverageEnabler = exports.CodeCoveragePublisher = exports.TestPublisher = exports.legacyFindFiles = exports.findMatch = exports.tool = exports.execSync = exports.execAsync = exports.exec = exports.mv = exports.rmRF = exports.find = exports.retry = exports.cp = exports.ls = exports.which = exports.resolve = exports.mkdirP = exports.checkPath = exports.popd = exports.pushd = exports.cd = exports.cwd = exports.getAgentMode = exports.getNodeMajorVersion = exports.getPlatform = exports.osType = exports.writeFile = exports.exist = exports.stats = exports.FsStats = exports.loc = exports.setResourcePath = exports.setAnswers = void 0; +var path = require("path"); +var task = require("./task"); +var tcm = require("./taskcommand"); +var trm = require("./mock-toolrunner"); +var ma = require("./mock-answer"); +var mock = new ma.MockAnswers(); +function setAnswers(answers) { + mock.initialize(answers); + trm.setAnswers(answers); +} +exports.setAnswers = setAnswers; +//----------------------------------------------------- +// Enums +//----------------------------------------------------- +module.exports.TaskResult = task.TaskResult; +module.exports.TaskState = task.TaskState; +module.exports.IssueType = task.IssueType; +module.exports.ArtifactType = task.ArtifactType; +module.exports.FieldType = task.FieldType; +module.exports.Platform = task.Platform; +//----------------------------------------------------- +// Results and Exiting +//----------------------------------------------------- +module.exports.setStdStream = task.setStdStream; +module.exports.setErrStream = task.setErrStream; +module.exports.setResult = task.setResult; +//----------------------------------------------------- +// Loc Helpers +//----------------------------------------------------- +function setResourcePath(path) { + // nothing in mock +} +exports.setResourcePath = setResourcePath; +function loc(key) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + var str = 'loc_mock_' + key; + if (args.length) { + str += ' ' + args.join(' '); + } + return str; +} +exports.loc = loc; +//----------------------------------------------------- +// Input Helpers +//----------------------------------------------------- +module.exports.assertAgent = task.assertAgent; +module.exports.getVariable = task.getVariable; +module.exports.getVariables = task.getVariables; +module.exports.setVariable = task.setVariable; +module.exports.setSecret = task.setSecret; +module.exports.getTaskVariable = task.getTaskVariable; +module.exports.setTaskVariable = task.setTaskVariable; +module.exports.getInput = task.getInput; +module.exports.getInputRequired = task.getInputRequired; +module.exports.getBoolInput = task.getBoolInput; +module.exports.getBoolFeatureFlag = task.getBoolFeatureFlag; +module.exports.getPipelineFeature = task.getPipelineFeature; +module.exports.getDelimitedInput = task.getDelimitedInput; +module.exports.filePathSupplied = task.filePathSupplied; +function getPathInput(name, required, check) { + var inval = module.exports.getInput(name, required); + if (inval) { + if (check) { + checkPath(inval, name); + } + } + return inval; +} +module.exports.getPathInput = getPathInput; +function getPathInputRequired(name, check) { + return getPathInput(name, true, check); +} +module.exports.getPathInputRequired = getPathInputRequired; +//----------------------------------------------------- +// Endpoint Helpers +//----------------------------------------------------- +module.exports.getEndpointUrl = task.getEndpointUrl; +module.exports.getEndpointUrlRequired = task.getEndpointUrlRequired; +module.exports.getEndpointDataParameter = task.getEndpointDataParameter; +module.exports.getEndpointDataParameterRequired = task.getEndpointDataParameterRequired; +module.exports.getEndpointAuthorizationScheme = task.getEndpointAuthorizationScheme; +module.exports.getEndpointAuthorizationSchemeRequired = task.getEndpointAuthorizationSchemeRequired; +module.exports.getEndpointAuthorizationParameter = task.getEndpointAuthorizationParameter; +module.exports.getEndpointAuthorizationParameterRequired = task.getEndpointAuthorizationParameterRequired; +module.exports.getEndpointAuthorization = task.getEndpointAuthorization; +//----------------------------------------------------- +// SecureFile Helpers +//----------------------------------------------------- +module.exports.getSecureFileName = task.getSecureFileName; +module.exports.getSecureFileTicket = task.getSecureFileTicket; +//----------------------------------------------------- +// Fs Helpers +//----------------------------------------------------- +var FsStats = /** @class */ (function () { + function FsStats() { + this.m_isFile = false; + this.m_isDirectory = false; + this.m_isBlockDevice = false; + this.m_isCharacterDevice = false; + this.m_isSymbolicLink = false; + this.m_isFIFO = false; + this.m_isSocket = false; + this.dev = 0; + this.ino = 0; + this.mode = 0; + this.nlink = 0; + this.uid = 0; + this.gid = 0; + this.rdev = 0; + this.size = 0; + this.blksize = 0; + this.blocks = 0; + this.atime = new Date(); + this.mtime = new Date(); + this.ctime = new Date(); + this.birthtime = new Date(); + } + FsStats.prototype.setAnswers = function (mockResponses) { + this.m_isFile = mockResponses['isFile'] || this.m_isFile; + this.m_isDirectory = mockResponses['isDirectory'] || this.m_isDirectory; + this.m_isBlockDevice = mockResponses['isBlockDevice'] || this.m_isBlockDevice; + this.m_isCharacterDevice = mockResponses['isCharacterDevice'] || this.m_isCharacterDevice; + this.m_isSymbolicLink = mockResponses['isSymbolicLink'] || this.m_isSymbolicLink; + this.m_isFIFO = mockResponses['isFIFO'] || this.m_isFIFO; + this.m_isSocket = mockResponses['isSocket'] || this.m_isSocket; + this.dev = mockResponses['dev'] || this.dev; + this.ino = mockResponses['ino'] || this.ino; + this.mode = mockResponses['mode'] || this.mode; + this.nlink = mockResponses['nlink'] || this.nlink; + this.uid = mockResponses['uid'] || this.uid; + this.gid = mockResponses['gid'] || this.gid; + this.rdev = mockResponses['rdev'] || this.rdev; + this.size = mockResponses['size'] || this.size; + this.blksize = mockResponses['blksize'] || this.blksize; + this.blocks = mockResponses['blocks'] || this.blocks; + this.atime = mockResponses['atime'] || this.atime; + this.mtime = mockResponses['mtime'] || this.mtime; + this.ctime = mockResponses['ctime'] || this.ctime; + this.m_isSocket = mockResponses['isSocket'] || this.m_isSocket; + }; + FsStats.prototype.isFile = function () { + return this.m_isFile; + }; + FsStats.prototype.isDirectory = function () { + return this.m_isDirectory; + }; + FsStats.prototype.isBlockDevice = function () { + return this.m_isBlockDevice; + }; + FsStats.prototype.isCharacterDevice = function () { + return this.m_isCharacterDevice; + }; + FsStats.prototype.isSymbolicLink = function () { + return this.m_isSymbolicLink; + }; + FsStats.prototype.isFIFO = function () { + return this.m_isFIFO; + }; + FsStats.prototype.isSocket = function () { + return this.m_isSocket; + }; + return FsStats; +}()); +exports.FsStats = FsStats; +function stats(path) { + var fsStats = new FsStats(); + fsStats.setAnswers(mock.getResponse('stats', path, module.exports.debug) || {}); + return fsStats; +} +exports.stats = stats; +function exist(path) { + return mock.getResponse('exist', path, module.exports.debug) || false; +} +exports.exist = exist; +function writeFile(file, data, options) { + //do nothing +} +exports.writeFile = writeFile; +function osType() { + return mock.getResponse('osType', 'osType', module.exports.debug); +} +exports.osType = osType; +function getPlatform() { + return mock.getResponse('getPlatform', 'getPlatform', module.exports.debug); +} +exports.getPlatform = getPlatform; +function getNodeMajorVersion() { + return mock.getResponse('getNodeMajorVersion', 'getNodeMajorVersion', module.exports.debug); +} +exports.getNodeMajorVersion = getNodeMajorVersion; +function getAgentMode() { + return mock.getResponse('getAgentMode', 'getAgentMode', module.exports.debug); +} +exports.getAgentMode = getAgentMode; +function cwd() { + return mock.getResponse('cwd', 'cwd', module.exports.debug); +} +exports.cwd = cwd; +//----------------------------------------------------- +// Cmd Helpers +//----------------------------------------------------- +module.exports.command = task.command; +module.exports.warning = task.warning; +module.exports.error = task.error; +module.exports.debug = task.debug; +function cd(path) { + // do nothing. TODO: keep stack with asserts +} +exports.cd = cd; +function pushd(path) { + // do nothing. TODO: keep stack with asserts +} +exports.pushd = pushd; +function popd() { + // do nothing. TODO: keep stack with asserts +} +exports.popd = popd; +//------------------------------------------------ +// Validation Helpers +//------------------------------------------------ +function checkPath(p, name) { + module.exports.debug('check path : ' + p); + if (!p || !mock.getResponse('checkPath', p, module.exports.debug)) { + throw new Error('Not found ' + p); + } +} +exports.checkPath = checkPath; +//----------------------------------------------------- +// Shell/File I/O Helpers +// Abstract these away so we can +// - default to good error handling +// - inject system.debug info +// - have option to switch internal impl (shelljs now) +//----------------------------------------------------- +function mkdirP(p) { + module.exports.debug('creating path: ' + p); +} +exports.mkdirP = mkdirP; +function resolve() { + // we can't do ...param if we target ES6 and node 5. This is what <=ES5 compiles down to. + //return the posix implementation in the mock, so paths will be consistent when L0 tests are run on Windows or Mac/Linux + var absolutePath = path.posix.resolve.apply(this, arguments); + module.exports.debug('Absolute path for pathSegments: ' + arguments + ' = ' + absolutePath); + return absolutePath; +} +exports.resolve = resolve; +function which(tool, check) { + var response = mock.getResponse('which', tool, module.exports.debug); + if (check) { + checkPath(response, tool); + } + return response; +} +exports.which = which; +function ls(options, paths) { + var response = mock.getResponse('ls', paths[0], module.exports.debug); + if (!response) { + return []; + } + return response; +} +exports.ls = ls; +function cp(source, dest) { + module.exports.debug('###copying###'); + module.exports.debug('copying ' + source + ' to ' + dest); +} +exports.cp = cp; +function retry(func, args, retryOptions) { + module.exports.debug("trying to execute " + (func === null || func === void 0 ? void 0 : func.name) + "(" + args.toString() + ") with " + retryOptions.retryCount + " retries"); +} +exports.retry = retry; +function find(findPath) { + return mock.getResponse('find', findPath, module.exports.debug); +} +exports.find = find; +function rmRF(path) { + module.exports.debug('rmRF ' + path); + var response = mock.getResponse('rmRF', path, module.exports.debug); + if (!response['success']) { + module.exports.setResult(1, response['message']); + } +} +exports.rmRF = rmRF; +function mv(source, dest, force, continueOnError) { + module.exports.debug('moving ' + source + ' to ' + dest); + return true; +} +exports.mv = mv; +//----------------------------------------------------- +// Exec convenience wrapper +//----------------------------------------------------- +function exec(tool, args, options) { + var toolPath = which(tool, true); + var tr = this.tool(toolPath); + if (args) { + tr.arg(args); + } + return tr.exec(options); +} +exports.exec = exec; +//----------------------------------------------------- +// Exec convenience wrapper +//----------------------------------------------------- +function execAsync(tool, args, options) { + var toolPath = which(tool, true); + var tr = this.tool(toolPath); + if (args) { + tr.arg(args); + } + return tr.execAsync(options); +} +exports.execAsync = execAsync; +function execSync(tool, args, options) { + var toolPath = which(tool, true); + var tr = this.tool(toolPath); + if (args) { + tr.arg(args); + } + return tr.execSync(options); +} +exports.execSync = execSync; +function tool(tool) { + var tr = new trm.ToolRunner(tool); + tr.on('debug', function (message) { + module.exports.debug(message); + }); + return tr; +} +exports.tool = tool; +//----------------------------------------------------- +// Matching helpers +//----------------------------------------------------- +module.exports.filter = task.filter; +module.exports.match = task.match; +function findMatch(defaultRoot, patterns) { + var responseKey = typeof patterns == 'object' ? patterns.join('\n') : patterns; + return mock.getResponse('findMatch', responseKey, module.exports.debug); +} +exports.findMatch = findMatch; +function legacyFindFiles(rootDirectory, pattern, includeFiles, includeDirectories) { + return mock.getResponse('legacyFindFiles', pattern, module.exports.debug); +} +exports.legacyFindFiles = legacyFindFiles; +//----------------------------------------------------- +// Test Publisher +//----------------------------------------------------- +var TestPublisher = /** @class */ (function () { + function TestPublisher(testRunner) { + this.testRunner = testRunner; + } + TestPublisher.prototype.publish = function (resultFiles, mergeResults, platform, config, runTitle, publishRunAttachments) { + var properties = {}; + properties['type'] = this.testRunner; + if (mergeResults) { + properties['mergeResults'] = mergeResults; + } + if (platform) { + properties['platform'] = platform; + } + if (config) { + properties['config'] = config; + } + if (runTitle) { + properties['runTitle'] = runTitle; + } + if (publishRunAttachments) { + properties['publishRunAttachments'] = publishRunAttachments; + } + if (resultFiles) { + properties['resultFiles'] = resultFiles; + } + module.exports.command('results.publish', properties, ''); + }; + return TestPublisher; +}()); +exports.TestPublisher = TestPublisher; +//----------------------------------------------------- +// Code Coverage Publisher +//----------------------------------------------------- +var CodeCoveragePublisher = /** @class */ (function () { + function CodeCoveragePublisher() { + } + CodeCoveragePublisher.prototype.publish = function (codeCoverageTool, summaryFileLocation, reportDirectory, additionalCodeCoverageFiles) { + var properties = {}; + if (codeCoverageTool) { + properties['codecoveragetool'] = codeCoverageTool; + } + if (summaryFileLocation) { + properties['summaryfile'] = summaryFileLocation; + } + if (reportDirectory) { + properties['reportdirectory'] = reportDirectory; + } + if (additionalCodeCoverageFiles) { + properties['additionalcodecoveragefiles'] = additionalCodeCoverageFiles; + } + module.exports.command('codecoverage.publish', properties, ""); + }; + return CodeCoveragePublisher; +}()); +exports.CodeCoveragePublisher = CodeCoveragePublisher; +//----------------------------------------------------- +// Code coverage Publisher +//----------------------------------------------------- +var CodeCoverageEnabler = /** @class */ (function () { + function CodeCoverageEnabler(buildTool, ccTool) { + this.buildTool = buildTool; + this.ccTool = ccTool; + } + CodeCoverageEnabler.prototype.enableCodeCoverage = function (buildProps) { + buildProps['buildtool'] = this.buildTool; + buildProps['codecoveragetool'] = this.ccTool; + module.exports.command('codecoverage.enable', buildProps, ""); + }; + return CodeCoverageEnabler; +}()); +exports.CodeCoverageEnabler = CodeCoverageEnabler; +//----------------------------------------------------- +// Task Logging Commands +//----------------------------------------------------- +exports.uploadFile = task.uploadFile; +exports.prependPath = task.prependPath; +exports.uploadSummary = task.uploadSummary; +exports.addAttachment = task.addAttachment; +exports.setEndpoint = task.setEndpoint; +exports.setProgress = task.setProgress; +exports.logDetail = task.logDetail; +exports.logIssue = task.logIssue; +//----------------------------------------------------- +// Artifact Logging Commands +//----------------------------------------------------- +exports.uploadArtifact = task.uploadArtifact; +exports.associateArtifact = task.associateArtifact; +//----------------------------------------------------- +// Build Logging Commands +//----------------------------------------------------- +exports.uploadBuildLog = task.uploadBuildLog; +exports.updateBuildNumber = task.updateBuildNumber; +exports.addBuildTag = task.addBuildTag; +//----------------------------------------------------- +// Release Logging Commands +//----------------------------------------------------- +exports.updateReleaseName = task.updateReleaseName; +//----------------------------------------------------- +// Tools +//----------------------------------------------------- +exports.TaskCommand = tcm.TaskCommand; +exports.commandFromString = tcm.commandFromString; +exports.ToolRunner = trm.ToolRunner; +//----------------------------------------------------- +// Http Proxy Helper +//----------------------------------------------------- +function getHttpProxyConfiguration(requestUrl) { + return null; +} +exports.getHttpProxyConfiguration = getHttpProxyConfiguration; +//----------------------------------------------------- +// Http Certificate Helper +//----------------------------------------------------- +function getHttpCertConfiguration() { + return null; +} +exports.getHttpCertConfiguration = getHttpCertConfiguration; diff --git a/task/node_modules/azure-pipelines-task-lib/mock-test.d.ts b/task/node_modules/azure-pipelines-task-lib/mock-test.d.ts new file mode 100644 index 0000000..2fea5ea --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/mock-test.d.ts @@ -0,0 +1,34 @@ +export declare class MockTestRunner { + constructor(testPath?: string, taskJsonPath?: string); + private _testPath; + private _taskJsonPath; + nodePath: string; + stdout: string; + stderr: string; + cmdlines: {}; + invokedToolCount: number; + succeeded: boolean; + errorIssues: string[]; + warningIssues: string[]; + LoadAsync(testPath: string, taskJsonPath?: string): Promise; + get failed(): boolean; + ran(cmdline: string): boolean; + createdErrorIssue(message: string): boolean; + createdWarningIssue(message: string): boolean; + stdOutContained(message: string): boolean; + stdErrContained(message: string): boolean; + runAsync(nodeVersion?: number): Promise; + /** + * @deprecated This method uses library which is not prefered to use on production + */ + run(nodeVersion?: number): void; + private getNodePath; + private getNodePathSync; + private getNodeVersion; + private getTaskJsonPath; + private downloadNode; + private downloadFile; + private downloadTarGz; + private getPathToNodeExe; + private getPlatform; +} diff --git a/task/node_modules/azure-pipelines-task-lib/mock-test.js b/task/node_modules/azure-pipelines-task-lib/mock-test.js new file mode 100644 index 0000000..e595f9f --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/mock-test.js @@ -0,0 +1,436 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MockTestRunner = void 0; +var cp = require("child_process"); +var fs = require("fs"); +var ncp = require("child_process"); +var os = require("os"); +var path = require("path"); +var cmdm = require("./taskcommand"); +var shelljs = require("shelljs"); +var deasync = require("deasync"); +var Downloader = require("nodejs-file-downloader"); +var COMMAND_TAG = '[command]'; +var COMMAND_LENGTH = COMMAND_TAG.length; +var downloadDirectory = path.join(process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE, 'azure-pipelines-task-lib', '_download'); +var MockTestRunner = /** @class */ (function () { + function MockTestRunner(testPath, taskJsonPath) { + this._testPath = ''; + this._taskJsonPath = ''; + this.nodePath = ''; + this.stdout = ''; + this.stderr = ''; + this.cmdlines = {}; + this.invokedToolCount = 0; + this.succeeded = false; + this.errorIssues = []; + this.warningIssues = []; + if (testPath === undefined) + return; + this._taskJsonPath = taskJsonPath || ''; + this._testPath = testPath; + this.nodePath = this.getNodePathSync(); + } + MockTestRunner.prototype.LoadAsync = function (testPath, taskJsonPath) { + return __awaiter(this, void 0, void 0, function () { + var _this = this; + return __generator(this, function (_a) { + return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () { + var _a; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + if (this.nodePath != '') { + resolve(this); + return [2 /*return*/]; + } + this._taskJsonPath = taskJsonPath || ''; + this._testPath = testPath; + _a = this; + return [4 /*yield*/, this.getNodePath()]; + case 1: + _a.nodePath = _b.sent(); + resolve(this); + return [2 /*return*/]; + } + }); + }); })]; + }); + }); + }; + Object.defineProperty(MockTestRunner.prototype, "failed", { + get: function () { + return !this.succeeded; + }, + enumerable: false, + configurable: true + }); + MockTestRunner.prototype.ran = function (cmdline) { + return this.cmdlines.hasOwnProperty(cmdline.trim()); + }; + MockTestRunner.prototype.createdErrorIssue = function (message) { + return this.errorIssues.indexOf(message.trim()) >= 0; + }; + MockTestRunner.prototype.createdWarningIssue = function (message) { + return this.warningIssues.indexOf(message.trim()) >= 0; + }; + MockTestRunner.prototype.stdOutContained = function (message) { + return this.stdout.indexOf(message) > 0; + }; + MockTestRunner.prototype.stdErrContained = function (message) { + return this.stderr.indexOf(message) > 0; + }; + MockTestRunner.prototype.runAsync = function (nodeVersion) { + return __awaiter(this, void 0, void 0, function () { + var nodePath, spawn, lines, traceFile; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + this.cmdlines = {}; + this.invokedToolCount = 0; + this.succeeded = true; + this.errorIssues = []; + this.warningIssues = []; + nodePath = this.nodePath; + if (!nodeVersion) return [3 /*break*/, 2]; + return [4 /*yield*/, this.getNodePath(nodeVersion)]; + case 1: + nodePath = _a.sent(); + _a.label = 2; + case 2: + spawn = cp.spawnSync(nodePath, [this._testPath]); + // Clean environment + Object.keys(process.env) + .filter(function (key) { return (key.substr(0, 'INPUT_'.length) === 'INPUT_' || + key.substr(0, 'SECRET_'.length) === 'SECRET_' || + key.substr(0, 'VSTS_TASKVARIABLE_'.length) === 'VSTS_TASKVARIABLE_'); }) + .forEach(function (key) { return delete process.env[key]; }); + if (spawn.error) { + console.error('Running test failed'); + console.error(spawn.error.message); + return [2 /*return*/]; + } + this.stdout = spawn.stdout.toString(); + this.stderr = spawn.stderr.toString(); + if (process.env['TASK_TEST_TRACE']) { + console.log(''); + } + lines = this.stdout.replace(/\r\n/g, '\n').split('\n'); + traceFile = this._testPath + '.log'; + lines.forEach(function (line) { + var ci = line.indexOf('##vso['); + var cmd; + var cmi = line.indexOf(COMMAND_TAG); + if (ci >= 0) { + cmd = cmdm.commandFromString(line.substring(ci)); + if (cmd.command === 'task.complete' && cmd.properties['result'] === 'Failed') { + _this.succeeded = false; + } + if (cmd.command === 'task.issue' && cmd.properties['type'] === 'error') { + _this.errorIssues.push(cmd.message.trim()); + } + if (cmd.command === 'task.issue' && cmd.properties['type'] === 'warning') { + _this.warningIssues.push(cmd.message.trim()); + } + } + else if (cmi == 0 && line.length > COMMAND_LENGTH) { + var cmdline = line.substr(COMMAND_LENGTH).trim(); + _this.cmdlines[cmdline] = true; + _this.invokedToolCount++; + } + if (process.env['TASK_TEST_TRACE']) { + fs.appendFileSync(traceFile, line + os.EOL); + if (line && !cmd) { + console.log(line); + } + // don't print task.debug commands to console - too noisy. + // otherwise omit command details - can interfere during CI. + else if (cmd && cmd.command != 'task.debug') { + console.log(cmd.command + " details omitted"); + } + } + }); + if (this.stderr && process.env['TASK_TEST_TRACE']) { + console.log('STDERR: ' + this.stderr); + fs.appendFileSync(traceFile, 'STDERR: ' + this.stderr + os.EOL); + } + if (process.env['TASK_TEST_TRACE']) { + console.log('TRACE FILE: ' + traceFile); + } + return [2 /*return*/]; + } + }); + }); + }; + /** + * @deprecated This method uses library which is not prefered to use on production + */ + MockTestRunner.prototype.run = function (nodeVersion) { + var completeExecution = false; + this.runAsync(nodeVersion).then(function (t) { return completeExecution = true; }); + deasync.loopWhile(function () { return !completeExecution; }); + }; + // Returns a path to node.exe with the correct version for this task (based on if its node10 or node) + MockTestRunner.prototype.getNodePath = function (nodeVersion) { + return __awaiter(this, void 0, void 0, function () { + var version, downloadVersion, downloadDestination, pathToExe, result; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + version = nodeVersion || this.getNodeVersion(); + switch (version) { + case 6: + downloadVersion = 'v6.17.1'; + break; + case 10: + downloadVersion = 'v10.21.0'; + break; + case 16: + downloadVersion = 'v16.13.0'; + break; + default: + throw new Error('Invalid node version, must be 6, 10, or 16 (received ' + version + ')'); + } + downloadDestination = path.join(downloadDirectory, 'node' + version); + pathToExe = this.getPathToNodeExe(downloadVersion, downloadDestination); + if (!pathToExe) return [3 /*break*/, 1]; + return [2 /*return*/, pathToExe]; + case 1: return [4 /*yield*/, this.downloadNode(downloadVersion, downloadDestination)]; + case 2: + result = _a.sent(); + return [2 /*return*/, result]; + } + }); + }); + }; + MockTestRunner.prototype.getNodePathSync = function (nodeVersion) { + var nodePath = ''; + this.getNodePath(nodeVersion).then(function (t) { return nodePath = t; }); + deasync.loopWhile(function () { return nodePath == ''; }); + return nodePath; + }; + // Determines the correct version of node to use based on the contents of the task's task.json. Defaults to Node 16. + MockTestRunner.prototype.getNodeVersion = function () { + var taskJsonPath = this.getTaskJsonPath(); + if (!taskJsonPath) { + console.warn('Unable to find task.json, defaulting to use Node 16'); + return 16; + } + var taskJsonContents = fs.readFileSync(taskJsonPath, { encoding: 'utf-8' }); + var taskJson = JSON.parse(taskJsonContents); + var nodeVersionFound = false; + var execution = (taskJson['execution'] + || taskJson['prejobexecution'] + || taskJson['postjobexecution']); + var keys = Object.keys(execution); + for (var i = 0; i < keys.length; i++) { + if (keys[i].toLowerCase() == 'node16') { + // Prefer node 16 and return immediately. + return 16; + } + else if (keys[i].toLowerCase() == 'node10') { + // Prefer node 10 and return immediately. + return 10; + } + else if (keys[i].toLowerCase() == 'node') { + nodeVersionFound = true; + } + } + if (!nodeVersionFound) { + console.warn('Unable to determine execution type from task.json, defaulting to use Node 16'); + return 16; + } + return 6; + }; + // Returns the path to the task.json for the task being tested. Returns null if unable to find it. + // Searches by moving up the directory structure from the initial starting point and checking at each level. + MockTestRunner.prototype.getTaskJsonPath = function () { + if (this._taskJsonPath) { + return this._taskJsonPath; + } + var curPath = this._testPath; + var newPath = path.join(this._testPath, '..'); + while (curPath != newPath) { + curPath = newPath; + var taskJsonPath = path.join(curPath, 'task.json'); + if (fs.existsSync(taskJsonPath)) { + return taskJsonPath; + } + newPath = path.join(curPath, '..'); + } + return ''; + }; + // Downloads the specified node version to the download destination. Returns a path to node.exe + MockTestRunner.prototype.downloadNode = function (nodeVersion, downloadDestination) { + return __awaiter(this, void 0, void 0, function () { + var nodeUrl, downloadPath, _a, marker; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + shelljs.rm('-rf', downloadDestination); + nodeUrl = process.env['TASK_NODE_URL'] || 'https://nodejs.org/dist'; + nodeUrl = nodeUrl.replace(/\/$/, ''); // ensure there is no trailing slash on the base URL + downloadPath = ''; + _a = this.getPlatform(); + switch (_a) { + case 'darwin': return [3 /*break*/, 1]; + case 'linux': return [3 /*break*/, 3]; + case 'win32': return [3 /*break*/, 5]; + } + return [3 /*break*/, 8]; + case 1: return [4 /*yield*/, this.downloadTarGz(nodeUrl + '/' + nodeVersion + '/node-' + nodeVersion + '-darwin-x64.tar.gz', downloadDestination)]; + case 2: + _b.sent(); + downloadPath = path.join(downloadDestination, 'node-' + nodeVersion + '-darwin-x64', 'bin', 'node'); + return [3 /*break*/, 8]; + case 3: return [4 /*yield*/, this.downloadTarGz(nodeUrl + '/' + nodeVersion + '/node-' + nodeVersion + '-linux-x64.tar.gz', downloadDestination)]; + case 4: + _b.sent(); + downloadPath = path.join(downloadDestination, 'node-' + nodeVersion + '-linux-x64', 'bin', 'node'); + return [3 /*break*/, 8]; + case 5: return [4 /*yield*/, this.downloadFile(nodeUrl + '/' + nodeVersion + '/win-x64/node.exe', downloadDestination, 'node.exe')]; + case 6: + _b.sent(); + return [4 /*yield*/, this.downloadFile(nodeUrl + '/' + nodeVersion + '/win-x64/node.lib', downloadDestination, 'node.lib')]; + case 7: + _b.sent(); + downloadPath = path.join(downloadDestination, 'node.exe'); + _b.label = 8; + case 8: + marker = downloadDestination + '.completed'; + fs.writeFileSync(marker, ''); + return [2 /*return*/, downloadPath]; + } + }); + }); + }; + // Downloads file to the downloadDestination, making any necessary folders along the way. + MockTestRunner.prototype.downloadFile = function (url, downloadDestination, fileName) { + return __awaiter(this, void 0, void 0, function () { + var downloader; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!url) { + throw new Error('Parameter "url" must be set.'); + } + if (!downloadDestination) { + throw new Error('Parameter "downloadDestination" must be set.'); + } + console.log('Downloading file:', url); + shelljs.mkdir('-p', downloadDestination); + downloader = new Downloader({ + url: url, + directory: downloadDestination, + fileName: fileName + }); + return [4 /*yield*/, downloader.download()]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }); + }; + // Downloads tarGz to the download destination, making any necessary folders along the way. + MockTestRunner.prototype.downloadTarGz = function (url, downloadDestination) { + return __awaiter(this, void 0, void 0, function () { + var tarGzName, originalCwd; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!url) { + throw new Error('Parameter "url" must be set.'); + } + if (!downloadDestination) { + throw new Error('Parameter "downloadDestination" must be set.'); + } + tarGzName = 'node.tar.gz'; + return [4 /*yield*/, this.downloadFile(url, downloadDestination, tarGzName)]; + case 1: + _a.sent(); + originalCwd = process.cwd(); + process.chdir(downloadDestination); + try { + ncp.execSync("tar -xzf \"" + path.join(downloadDestination, tarGzName) + "\""); + } + catch (_b) { + throw new Error('Failed to unzip node tar.gz from ' + url); + } + finally { + process.chdir(originalCwd); + } + return [2 /*return*/]; + } + }); + }); + }; + // Checks if node is installed at downloadDestination. If it is, returns a path to node.exe, otherwise returns null. + MockTestRunner.prototype.getPathToNodeExe = function (nodeVersion, downloadDestination) { + var exePath = ''; + switch (this.getPlatform()) { + case 'darwin': + exePath = path.join(downloadDestination, 'node-' + nodeVersion + '-darwin-x64', 'bin', 'node'); + break; + case 'linux': + exePath = path.join(downloadDestination, 'node-' + nodeVersion + '-linux-x64', 'bin', 'node'); + break; + case 'win32': + exePath = path.join(downloadDestination, 'node.exe'); + } + // Only use path if marker is found indicating download completed successfully (and not partially) + var marker = downloadDestination + '.completed'; + if (fs.existsSync(exePath) && fs.existsSync(marker)) { + return exePath; + } + else { + return ''; + } + }; + MockTestRunner.prototype.getPlatform = function () { + var platform = os.platform(); + if (platform != 'darwin' && platform != 'linux' && platform != 'win32') { + throw new Error('Unexpected platform: ' + platform); + } + return platform; + }; + return MockTestRunner; +}()); +exports.MockTestRunner = MockTestRunner; diff --git a/task/node_modules/azure-pipelines-task-lib/mock-toolrunner.d.ts b/task/node_modules/azure-pipelines-task-lib/mock-toolrunner.d.ts new file mode 100644 index 0000000..34fa030 --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/mock-toolrunner.d.ts @@ -0,0 +1,47 @@ +/// +import Q = require('q'); +import events = require('events'); +import ma = require('./mock-answer'); +export declare function setAnswers(answers: ma.TaskLibAnswers): void; +export interface IExecOptions extends IExecSyncOptions { + failOnStdErr?: boolean; + ignoreReturnCode?: boolean; +} +export interface IExecSyncOptions { + cwd?: string; + env?: { + [key: string]: string | undefined; + }; + silent?: boolean; + outStream: NodeJS.WritableStream; + errStream: NodeJS.WritableStream; + windowsVerbatimArguments?: boolean; +} +export interface IExecSyncResult { + stdout: string; + stderr: string; + code: number; + error: Error; +} +export declare function debug(message: any): void; +export declare class ToolRunner extends events.EventEmitter { + constructor(toolPath: string); + private toolPath; + private args; + private pipeOutputToTool; + private _debug; + private _argStringToArray; + arg(val: any): ToolRunner; + argIf(condition: any, val: any): ToolRunner; + line(val: string): ToolRunner; + pipeExecOutputToTool(tool: ToolRunner): ToolRunner; + private ignoreTempPath; + execAsync(options?: IExecOptions): Promise; + /** + * Exec - use for long running tools where you need to stream live output as it runs + * @deprecated use `execAsync` instead + * @returns a promise with return code. + */ + exec(options?: IExecOptions): Q.Promise; + execSync(options?: IExecSyncOptions): IExecSyncResult; +} diff --git a/task/node_modules/azure-pipelines-task-lib/mock-toolrunner.js b/task/node_modules/azure-pipelines-task-lib/mock-toolrunner.js new file mode 100644 index 0000000..74ad961 --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/mock-toolrunner.js @@ -0,0 +1,360 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ToolRunner = exports.debug = exports.setAnswers = void 0; +var Q = require("q"); +var os = require("os"); +var events = require("events"); +var ma = require("./mock-answer"); +var mock = new ma.MockAnswers(); +function setAnswers(answers) { + mock.initialize(answers); +} +exports.setAnswers = setAnswers; +; +; +function debug(message) { + // do nothing, overridden +} +exports.debug = debug; +var ToolRunner = /** @class */ (function (_super) { + __extends(ToolRunner, _super); + function ToolRunner(toolPath) { + var _this = this; + debug('toolRunner toolPath: ' + toolPath); + _this = _super.call(this) || this; + _this.toolPath = toolPath; + _this.args = []; + return _this; + } + ToolRunner.prototype._debug = function (message) { + debug(message); + this.emit('debug', message); + }; + ToolRunner.prototype._argStringToArray = function (argString) { + var args = []; + var inQuotes = false; + var escaped = false; + var arg = ''; + var append = function (c) { + // we only escape double quotes. + if (escaped && c !== '"') { + arg += '\\'; + } + arg += c; + escaped = false; + }; + for (var i = 0; i < argString.length; i++) { + var c = argString.charAt(i); + if (c === '"') { + if (!escaped) { + inQuotes = !inQuotes; + } + else { + append(c); + } + continue; + } + if (c === "\\" && inQuotes) { + escaped = true; + continue; + } + if (c === ' ' && !inQuotes) { + if (arg.length > 0) { + args.push(arg); + arg = ''; + } + continue; + } + append(c); + } + if (arg.length > 0) { + args.push(arg.trim()); + } + return args; + }; + ToolRunner.prototype.arg = function (val) { + if (!val) { + return this; + } + if (val instanceof Array) { + this._debug(this.toolPath + ' arg: ' + JSON.stringify(val)); + this.args = this.args.concat(val); + } + else if (typeof (val) === 'string') { + this._debug(this.toolPath + ' arg: ' + val); + this.args = this.args.concat(val.trim()); + } + return this; + }; + ToolRunner.prototype.argIf = function (condition, val) { + if (condition) { + this.arg(val); + } + return this; + }; + ToolRunner.prototype.line = function (val) { + if (!val) { + return this; + } + this._debug(this.toolPath + ' arg: ' + val); + this.args = this.args.concat(this._argStringToArray(val)); + return this; + }; + ToolRunner.prototype.pipeExecOutputToTool = function (tool) { + this.pipeOutputToTool = tool; + return this; + }; + ToolRunner.prototype.ignoreTempPath = function (cmdString) { + this._debug('ignoreTempPath=' + process.env['MOCK_IGNORE_TEMP_PATH']); + this._debug('tempPath=' + process.env['MOCK_TEMP_PATH']); + if (process.env['MOCK_IGNORE_TEMP_PATH'] === 'true') { + // Using split/join to replace the temp path + cmdString = cmdString.split(process.env['MOCK_TEMP_PATH'] || "").join(''); + } + return cmdString; + }; + // + // Exec - use for long running tools where you need to stream live output as it runs + // returns a promise with return code. + // + ToolRunner.prototype.execAsync = function (options) { + var _this = this; + this._debug('exec tool: ' + this.toolPath); + this._debug('Arguments:'); + this.args.forEach(function (arg) { + _this._debug(' ' + arg); + }); + var success = true; + options = options || {}; + var ops = { + cwd: options.cwd || process.cwd(), + env: options.env || process.env, + silent: options.silent || false, + outStream: options.outStream || process.stdout, + errStream: options.errStream || process.stderr, + failOnStdErr: options.failOnStdErr || false, + ignoreReturnCode: options.ignoreReturnCode || false, + windowsVerbatimArguments: options.windowsVerbatimArguments + }; + var argString = this.args.join(' ') || ''; + var cmdString = this.toolPath; + if (argString) { + cmdString += (' ' + argString); + } + // Using split/join to replace the temp path + cmdString = this.ignoreTempPath(cmdString); + if (!ops.silent) { + if (this.pipeOutputToTool) { + var pipeToolArgString = this.pipeOutputToTool.args.join(' ') || ''; + var pipeToolCmdString = this.ignoreTempPath(this.pipeOutputToTool.toolPath); + if (pipeToolArgString) { + pipeToolCmdString += (' ' + pipeToolArgString); + } + cmdString += ' | ' + pipeToolCmdString; + } + ops.outStream.write('[command]' + cmdString + os.EOL); + } + // TODO: filter process.env + var res = mock.getResponse('exec', cmdString, debug); + if (res.stdout) { + this.emit('stdout', res.stdout); + if (!ops.silent) { + ops.outStream.write(res.stdout + os.EOL); + } + var stdLineArray = res.stdout.split(os.EOL); + for (var _i = 0, _a = stdLineArray.slice(0, -1); _i < _a.length; _i++) { + var line = _a[_i]; + this.emit('stdline', line); + } + if (stdLineArray.length > 0 && stdLineArray[stdLineArray.length - 1].length > 0) { + this.emit('stdline', stdLineArray[stdLineArray.length - 1]); + } + } + if (res.stderr) { + this.emit('stderr', res.stderr); + success = !ops.failOnStdErr; + if (!ops.silent) { + var s = ops.failOnStdErr ? ops.errStream : ops.outStream; + s.write(res.stderr + os.EOL); + } + var stdErrArray = res.stderr.split(os.EOL); + for (var _b = 0, _c = stdErrArray.slice(0, -1); _b < _c.length; _b++) { + var line = _c[_b]; + this.emit('errline', line); + } + if (stdErrArray.length > 0 && stdErrArray[stdErrArray.length - 1].length > 0) { + this.emit('errline', stdErrArray[stdErrArray.length - 1]); + } + } + var code = res.code; + if (!ops.silent) { + ops.outStream.write('rc:' + res.code + os.EOL); + } + if (code != 0 && !ops.ignoreReturnCode) { + success = false; + } + if (!ops.silent) { + ops.outStream.write('success:' + success + os.EOL); + } + return new Promise(function (resolve, reject) { + if (success) { + resolve(code); + } + else { + reject(new Error(_this.toolPath + ' failed with return code: ' + code)); + } + }); + }; + /** + * Exec - use for long running tools where you need to stream live output as it runs + * @deprecated use `execAsync` instead + * @returns a promise with return code. + */ + ToolRunner.prototype.exec = function (options) { + var _this = this; + var defer = Q.defer(); + this._debug('exec tool: ' + this.toolPath); + this._debug('Arguments:'); + this.args.forEach(function (arg) { + _this._debug(' ' + arg); + }); + var success = true; + options = options || {}; + var ops = { + cwd: options.cwd || process.cwd(), + env: options.env || process.env, + silent: options.silent || false, + outStream: options.outStream || process.stdout, + errStream: options.errStream || process.stderr, + failOnStdErr: options.failOnStdErr || false, + ignoreReturnCode: options.ignoreReturnCode || false, + windowsVerbatimArguments: options.windowsVerbatimArguments + }; + var argString = this.args.join(' ') || ''; + var cmdString = this.toolPath; + if (argString) { + cmdString += (' ' + argString); + } + // Using split/join to replace the temp path + cmdString = this.ignoreTempPath(cmdString); + if (!ops.silent) { + if (this.pipeOutputToTool) { + var pipeToolArgString = this.pipeOutputToTool.args.join(' ') || ''; + var pipeToolCmdString = this.ignoreTempPath(this.pipeOutputToTool.toolPath); + if (pipeToolArgString) { + pipeToolCmdString += (' ' + pipeToolArgString); + } + cmdString += ' | ' + pipeToolCmdString; + } + ops.outStream.write('[command]' + cmdString + os.EOL); + } + // TODO: filter process.env + var res = mock.getResponse('exec', cmdString, debug); + if (res.stdout) { + this.emit('stdout', res.stdout); + if (!ops.silent) { + ops.outStream.write(res.stdout + os.EOL); + } + var stdLineArray = res.stdout.split(os.EOL); + for (var _i = 0, _a = stdLineArray.slice(0, -1); _i < _a.length; _i++) { + var line = _a[_i]; + this.emit('stdline', line); + } + if (stdLineArray.length > 0 && stdLineArray[stdLineArray.length - 1].length > 0) { + this.emit('stdline', stdLineArray[stdLineArray.length - 1]); + } + } + if (res.stderr) { + this.emit('stderr', res.stderr); + success = !ops.failOnStdErr; + if (!ops.silent) { + var s = ops.failOnStdErr ? ops.errStream : ops.outStream; + s.write(res.stderr + os.EOL); + } + var stdErrArray = res.stderr.split(os.EOL); + for (var _b = 0, _c = stdErrArray.slice(0, -1); _b < _c.length; _b++) { + var line = _c[_b]; + this.emit('errline', line); + } + if (stdErrArray.length > 0 && stdErrArray[stdErrArray.length - 1].length > 0) { + this.emit('errline', stdErrArray[stdErrArray.length - 1]); + } + } + var code = res.code; + if (!ops.silent) { + ops.outStream.write('rc:' + res.code + os.EOL); + } + if (code != 0 && !ops.ignoreReturnCode) { + success = false; + } + if (!ops.silent) { + ops.outStream.write('success:' + success + os.EOL); + } + if (success) { + defer.resolve(code); + } + else { + defer.reject(new Error(this.toolPath + ' failed with return code: ' + code)); + } + return defer.promise; + }; + // + // ExecSync - use for short running simple commands. Simple and convenient (synchronous) + // but also has limits. For example, no live output and limited to max buffer + // + ToolRunner.prototype.execSync = function (options) { + var _this = this; + this._debug('exec tool: ' + this.toolPath); + this._debug('Arguments:'); + this.args.forEach(function (arg) { + _this._debug(' ' + arg); + }); + var success = true; + options = options || {}; + var ops = { + cwd: options.cwd || process.cwd(), + env: options.env || process.env, + silent: options.silent || false, + outStream: options.outStream || process.stdout, + errStream: options.errStream || process.stderr, + windowsVerbatimArguments: options.windowsVerbatimArguments, + }; + var argString = this.args.join(' ') || ''; + var cmdString = this.toolPath; + // Using split/join to replace the temp path + cmdString = this.ignoreTempPath(cmdString); + if (argString) { + cmdString += (' ' + argString); + } + if (!ops.silent) { + ops.outStream.write('[command]' + cmdString + os.EOL); + } + var r = mock.getResponse('exec', cmdString, debug); + if (!ops.silent && r.stdout && r.stdout.length > 0) { + ops.outStream.write(r.stdout); + } + if (!ops.silent && r.stderr && r.stderr.length > 0) { + ops.errStream.write(r.stderr); + } + return { + code: r.code, + stdout: (r.stdout) ? r.stdout.toString() : null, + stderr: (r.stderr) ? r.stderr.toString() : null + }; + }; + return ToolRunner; +}(events.EventEmitter)); +exports.ToolRunner = ToolRunner; diff --git a/task/node_modules/azure-pipelines-task-lib/package.json b/task/node_modules/azure-pipelines-task-lib/package.json new file mode 100644 index 0000000..8a89b7e --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/package.json @@ -0,0 +1,49 @@ +{ + "name": "azure-pipelines-task-lib", + "version": "4.9.0", + "description": "Azure Pipelines Task SDK", + "main": "./task.js", + "typings": "./task.d.ts", + "scripts": { + "build": "node make.js build", + "test": "node make.js test" + }, + "repository": { + "type": "git", + "url": "https://github.com/Microsoft/azure-pipelines-task-lib" + }, + "keywords": [ + "azure-pipelines", + "agent", + "build", + "release", + "ci-cd", + "task" + ], + "author": "Microsoft", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-task-lib/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-task-lib", + "dependencies": { + "adm-zip": "^0.5.10", + "deasync": "^0.1.28", + "minimatch": "3.0.5", + "nodejs-file-downloader": "^4.11.1", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "uuid": "^3.0.1" + }, + "devDependencies": { + "@types/minimatch": "3.0.3", + "@types/mocha": "^9.1.1", + "@types/node": "^16.11.39", + "@types/q": "^1.5.4", + "@types/semver": "^7.3.4", + "@types/shelljs": "^0.8.8", + "mocha": "^9.2.2", + "typescript": "^4.0.0" + } +} diff --git a/task/node_modules/azure-pipelines-task-lib/task.d.ts b/task/node_modules/azure-pipelines-task-lib/task.d.ts new file mode 100644 index 0000000..8f7d119 --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/task.d.ts @@ -0,0 +1,763 @@ +/// +import Q = require('q'); +import fs = require('fs'); +import im = require('./internal'); +import trm = require('./toolrunner'); +export declare enum TaskResult { + Succeeded = 0, + SucceededWithIssues = 1, + Failed = 2, + Cancelled = 3, + Skipped = 4 +} +export declare enum TaskState { + Unknown = 0, + Initialized = 1, + InProgress = 2, + Completed = 3 +} +export declare enum IssueType { + Error = 0, + Warning = 1 +} +export declare enum ArtifactType { + Container = 0, + FilePath = 1, + VersionControl = 2, + GitRef = 3, + TfvcLabel = 4 +} +export declare enum FieldType { + AuthParameter = 0, + DataParameter = 1, + Url = 2 +} +export declare const IssueSource: typeof im.IssueSource; +/** Platforms supported by our build agent */ +export declare enum Platform { + Windows = 0, + MacOS = 1, + Linux = 2 +} +export declare enum AgentHostedMode { + Unknown = 0, + SelfHosted = 1, + MsHosted = 2 +} +export declare const setStdStream: typeof im._setStdStream; +export declare const setErrStream: typeof im._setErrStream; +/** + * Sets the result of the task. + * Execution will continue. + * If not set, task will be Succeeded. + * If multiple calls are made to setResult the most pessimistic call wins (Failed) regardless of the order of calls. + * + * @param result TaskResult enum of Succeeded, SucceededWithIssues, Failed, Cancelled or Skipped. + * @param message A message which will be logged as an error issue if the result is Failed. + * @param done Optional. Instructs the agent the task is done. This is helpful when child processes + * may still be running and prevent node from fully exiting. This argument is supported + * from agent version 2.142.0 or higher (otherwise will no-op). + * @returns void + */ +export declare function setResult(result: TaskResult.Succeeded, message?: string, done?: boolean): void; +export declare function setResult(result: Exclude, message: string, done?: boolean): void; +export declare const setResourcePath: typeof im._setResourcePath; +export declare const loc: typeof im._loc; +export declare const getVariable: typeof im._getVariable; +/** + * Asserts the agent version is at least the specified minimum. + * + * @param minimum minimum version version - must be 2.104.1 or higher + */ +export declare function assertAgent(minimum: string): void; +/** + * Gets a snapshot of the current state of all job variables available to the task. + * Requires a 2.104.1 agent or higher for full functionality. + * + * Limitations on an agent prior to 2.104.1: + * 1) The return value does not include all public variables. Only public variables + * that have been added using setVariable are returned. + * 2) The name returned for each secret variable is the formatted environment variable + * name, not the actual variable name (unless it was set explicitly at runtime using + * setVariable). + * + * @returns VariableInfo[] + */ +export declare function getVariables(): VariableInfo[]; +/** + * Sets a variable which will be available to subsequent tasks as well. + * + * @param name name of the variable to set + * @param val value to set + * @param secret whether variable is secret. Multi-line secrets are not allowed. Optional, defaults to false + * @param isOutput whether variable is an output variable. Optional, defaults to false + * @returns void + */ +export declare function setVariable(name: string, val: string, secret?: boolean, isOutput?: boolean): void; +/** + * Registers a value with the logger, so the value will be masked from the logs. Multi-line secrets are not allowed. + * + * @param val value to register + */ +export declare function setSecret(val: string): void; +/** Snapshot of a variable at the time when getVariables was called. */ +export interface VariableInfo { + name: string; + value: string; + secret: boolean; +} +/** + * Gets the value of an input. + * If required is true and the value is not set, it will throw. + * + * @param name name of the input to get + * @param required whether input is required. optional, defaults to false + * @returns string + */ +export declare function getInput(name: string, required?: boolean): string | undefined; +/** + * Gets the value of an input. + * If the value is not set, it will throw. + * + * @param name name of the input to get + * @returns string + */ +export declare function getInputRequired(name: string): string; +/** + * Gets the value of an input and converts to a bool. Convenience. + * If required is true and the value is not set, it will throw. + * If required is false and the value is not set, returns false. + * + * @param name name of the bool input to get + * @param required whether input is required. optional, defaults to false + * @returns boolean + */ +export declare function getBoolInput(name: string, required?: boolean): boolean; +/** + * Gets the value of an feature flag and converts to a bool. + * @IMPORTANT This method is only for internal Microsoft development. Do not use it for external tasks. + * @param name name of the feature flag to get. + * @param defaultValue default value of the feature flag in case it's not found in env. (optional. Default value = false) + * @returns boolean + * @deprecated Don't use this for new development. Use getPipelineFeature instead. + */ +export declare function getBoolFeatureFlag(ffName: string, defaultValue?: boolean): boolean; +/** + * Gets the value of an task feature and converts to a bool. + * @IMPORTANT This method is only for internal Microsoft development. Do not use it for external tasks. + * @param name name of the feature to get. + * @returns boolean + */ +export declare function getPipelineFeature(featureName: string): boolean; +/** + * Gets the value of an input and splits the value using a delimiter (space, comma, etc). + * Empty values are removed. This function is useful for splitting an input containing a simple + * list of items - such as build targets. + * IMPORTANT: Do not use this function for splitting additional args! Instead use argString(), which + * follows normal argument splitting rules and handles values encapsulated by quotes. + * If required is true and the value is not set, it will throw. + * + * @param name name of the input to get + * @param delim delimiter to split on + * @param required whether input is required. optional, defaults to false + * @returns string[] + */ +export declare function getDelimitedInput(name: string, delim: string | RegExp, required?: boolean): string[]; +/** + * Checks whether a path inputs value was supplied by the user + * File paths are relative with a picker, so an empty path is the root of the repo. + * Useful if you need to condition work (like append an arg) if a value was supplied + * + * @param name name of the path input to check + * @returns boolean + */ +export declare function filePathSupplied(name: string): boolean; +/** + * Gets the value of a path input + * It will be quoted for you if it isn't already and contains spaces + * If required is true and the value is not set, it will throw. + * If check is true and the path does not exist, it will throw. + * + * @param name name of the input to get + * @param required whether input is required. optional, defaults to false + * @param check whether path is checked. optional, defaults to false + * @returns string + */ +export declare function getPathInput(name: string, required?: boolean, check?: boolean): string | undefined; +/** + * Gets the value of a path input + * It will be quoted for you if it isn't already and contains spaces + * If the value is not set, it will throw. + * If check is true and the path does not exist, it will throw. + * + * @param name name of the input to get + * @param check whether path is checked. optional, defaults to false + * @returns string + */ +export declare function getPathInputRequired(name: string, check?: boolean): string; +/** + * Gets the url for a service endpoint + * If the url was not set and is not optional, it will throw. + * + * @param id name of the service endpoint + * @param optional whether the url is optional + * @returns string + */ +export declare function getEndpointUrl(id: string, optional: boolean): string | undefined; +/** + * Gets the url for a service endpoint + * If the url was not set, it will throw. + * + * @param id name of the service endpoint + * @returns string + */ +export declare function getEndpointUrlRequired(id: string): string; +export declare function getEndpointDataParameter(id: string, key: string, optional: boolean): string | undefined; +export declare function getEndpointDataParameterRequired(id: string, key: string): string; +/** + * Gets the endpoint authorization scheme for a service endpoint + * If the endpoint authorization scheme is not set and is not optional, it will throw. + * + * @param id name of the service endpoint + * @param optional whether the endpoint authorization scheme is optional + * @returns {string} value of the endpoint authorization scheme + */ +export declare function getEndpointAuthorizationScheme(id: string, optional: boolean): string | undefined; +/** + * Gets the endpoint authorization scheme for a service endpoint + * If the endpoint authorization scheme is not set, it will throw. + * + * @param id name of the service endpoint + * @returns {string} value of the endpoint authorization scheme + */ +export declare function getEndpointAuthorizationSchemeRequired(id: string): string; +/** + * Gets the endpoint authorization parameter value for a service endpoint with specified key + * If the endpoint authorization parameter is not set and is not optional, it will throw. + * + * @param id name of the service endpoint + * @param key key to find the endpoint authorization parameter + * @param optional optional whether the endpoint authorization scheme is optional + * @returns {string} value of the endpoint authorization parameter value + */ +export declare function getEndpointAuthorizationParameter(id: string, key: string, optional: boolean): string | undefined; +/** + * Gets the endpoint authorization parameter value for a service endpoint with specified key + * If the endpoint authorization parameter is not set, it will throw. + * + * @param id name of the service endpoint + * @param key key to find the endpoint authorization parameter + * @returns {string} value of the endpoint authorization parameter value + */ +export declare function getEndpointAuthorizationParameterRequired(id: string, key: string): string; +/** + * Interface for EndpointAuthorization + * Contains a schema and a string/string dictionary of auth data + */ +export interface EndpointAuthorization { + /** dictionary of auth data */ + parameters: { + [key: string]: string; + }; + /** auth scheme such as OAuth or username/password etc... */ + scheme: string; +} +/** + * Gets the authorization details for a service endpoint + * If the authorization was not set and is not optional, it will set the task result to Failed. + * + * @param id name of the service endpoint + * @param optional whether the url is optional + * @returns string + */ +export declare function getEndpointAuthorization(id: string, optional: boolean): EndpointAuthorization | undefined; +/** + * Gets the name for a secure file + * + * @param id secure file id + * @returns string + */ +export declare function getSecureFileName(id: string): string | undefined; +/** + * Gets the secure file ticket that can be used to download the secure file contents + * + * @param id name of the secure file + * @returns {string} secure file ticket + */ +export declare function getSecureFileTicket(id: string): string | undefined; +/** + * Gets a variable value that is set by previous step from the same wrapper task. + * Requires a 2.115.0 agent or higher. + * + * @param name name of the variable to get + * @returns string + */ +export declare function getTaskVariable(name: string): string | undefined; +/** + * Sets a task variable which will only be available to subsequent steps belong to the same wrapper task. + * Requires a 2.115.0 agent or higher. + * + * @param name name of the variable to set + * @param val value to set + * @param secret whether variable is secret. optional, defaults to false + * @returns void + */ +export declare function setTaskVariable(name: string, val: string, secret?: boolean): void; +export declare const command: typeof im._command; +export declare const warning: typeof im._warning; +export declare const error: typeof im._error; +export declare const debug: typeof im._debug; +export interface FsStats extends fs.Stats { +} +/** + * Get's stat on a path. + * Useful for checking whether a file or directory. Also getting created, modified and accessed time. + * see [fs.stat](https://nodejs.org/api/fs.html#fs_class_fs_stats) + * + * @param path path to check + * @returns fsStat + */ +export declare function stats(path: string): FsStats; +export declare const exist: typeof im._exist; +export declare function writeFile(file: string, data: string | Buffer, options?: BufferEncoding | fs.WriteFileOptions): void; +/** + * @deprecated Use `getPlatform` + * Useful for determining the host operating system. + * see [os.type](https://nodejs.org/api/os.html#os_os_type) + * + * @return the name of the operating system + */ +export declare function osType(): string; +/** + * Determine the operating system the build agent is running on. + * @returns {Platform} + * @throws {Error} Platform is not supported by our agent + */ +export declare function getPlatform(): Platform; +/** + * Resolves major version of Node.js engine used by the agent. + * @returns {Number} Node's major version. + */ +export declare function getNodeMajorVersion(): Number; +/** + * Return hosted type of Agent + * @returns {AgentHostedMode} + */ +export declare function getAgentMode(): AgentHostedMode; +/** + * Returns the process's current working directory. + * see [process.cwd](https://nodejs.org/api/process.html#process_process_cwd) + * + * @return the path to the current working directory of the process + */ +export declare function cwd(): string; +export declare const checkPath: typeof im._checkPath; +/** + * Change working directory. + * + * @param path new working directory path + * @returns void + */ +export declare function cd(path: string): void; +/** + * Change working directory and push it on the stack + * + * @param path new working directory path + * @returns void + */ +export declare function pushd(path: string): void; +/** + * Change working directory back to previously pushed directory + * + * @returns void + */ +export declare function popd(): void; +/** + * Make a directory. Creates the full path with folders in between + * Will throw if it fails + * + * @param p path to create + * @returns void + */ +export declare function mkdirP(p: string): void; +/** + * Resolves a sequence of paths or path segments into an absolute path. + * Calls node.js path.resolve() + * Allows L0 testing with consistent path formats on Mac/Linux and Windows in the mock implementation + * @param pathSegments + * @returns {string} + */ +export declare function resolve(...pathSegments: any[]): string; +export declare const which: typeof im._which; +/** + * Returns array of files in the given path, or in current directory if no path provided. See shelljs.ls + * @param {string} options Available options: -R (recursive), -A (all files, include files beginning with ., except for . and ..) + * @param {string[]} paths Paths to search. + * @return {string[]} An array of files in the given path(s). + */ +export declare function ls(options: string, paths: string[]): string[]; +/** + * Copies a file or folder. + * + * @param source source path + * @param dest destination path + * @param options string -r, -f or -rf for recursive and force + * @param continueOnError optional. whether to continue on error + * @param retryCount optional. Retry count to copy the file. It might help to resolve intermittent issues e.g. with UNC target paths on a remote host. + */ +export declare function cp(source: string, dest: string, options?: string, continueOnError?: boolean, retryCount?: number): void; +/** + * Moves a path. + * + * @param source source path + * @param dest destination path + * @param options string -f or -n for force and no clobber + * @param continueOnError optional. whether to continue on error + */ +export declare function mv(source: string, dest: string, options?: string, continueOnError?: boolean): void; +/** + * Interface for FindOptions + * Contains properties to control whether to follow symlinks + */ +export interface FindOptions { + /** + * When true, broken symbolic link will not cause an error. + */ + allowBrokenSymbolicLinks: boolean; + /** + * Equivalent to the -H command line option. Indicates whether to traverse descendants if + * the specified path is a symbolic link directory. Does not cause nested symbolic link + * directories to be traversed. + */ + followSpecifiedSymbolicLink: boolean; + /** + * Equivalent to the -L command line option. Indicates whether to traverse descendants of + * symbolic link directories. + */ + followSymbolicLinks: boolean; + /** + * When true, missing files will not cause an error and will be skipped. + */ + skipMissingFiles?: boolean; +} +/** + * Interface for RetryOptions + * + * Contains "continueOnError" and "retryCount" options. + */ +export interface RetryOptions { + /** + * If true, code still continues to execute when all retries failed. + */ + continueOnError: boolean; + /** + * Number of retries. + */ + retryCount: number; +} +/** + * Tries to execute a function a specified number of times. + * + * @param func a function to be executed. + * @param args executed function arguments array. + * @param retryOptions optional. Defaults to { continueOnError: false, retryCount: 0 }. + * @returns the same as the usual function. + */ +export declare function retry(func: Function, args: any[], retryOptions?: RetryOptions): any; +/** + * Recursively finds all paths a given path. Returns an array of paths. + * + * @param findPath path to search + * @param options optional. defaults to { followSymbolicLinks: true }. following soft links is generally appropriate unless deleting files. + * @returns string[] + */ +export declare function find(findPath: string, options?: FindOptions): string[]; +/** + * Prefer tl.find() and tl.match() instead. This function is for backward compatibility + * when porting tasks to Node from the PowerShell or PowerShell3 execution handler. + * + * @param rootDirectory path to root unrooted patterns with + * @param pattern include and exclude patterns + * @param includeFiles whether to include files in the result. defaults to true when includeFiles and includeDirectories are both false + * @param includeDirectories whether to include directories in the result + * @returns string[] + */ +export declare function legacyFindFiles(rootDirectory: string, pattern: string, includeFiles?: boolean, includeDirectories?: boolean): string[]; +/** + * Remove a path recursively with force + * + * @param inputPath path to remove + * @throws when the file or directory exists but could not be deleted. + */ +export declare function rmRF(inputPath: string): void; +/** + * Exec a tool. Convenience wrapper over ToolRunner to exec with args in one call. + * Output will be streamed to the live console. + * Returns promise with return code + * + * @param tool path to tool to exec + * @param args an arg string or array of args + * @param options optional exec options. See IExecOptions + * @returns number + */ +export declare function execAsync(tool: string, args: any, options?: trm.IExecOptions): Promise; +/** + * Exec a tool. Convenience wrapper over ToolRunner to exec with args in one call. + * Output will be streamed to the live console. + * Returns promise with return code + * + * @deprecated Use the {@link execAsync} method that returns a native Javascript Promise instead + * @param tool path to tool to exec + * @param args an arg string or array of args + * @param options optional exec options. See IExecOptions + * @returns number + */ +export declare function exec(tool: string, args: any, options?: trm.IExecOptions): Q.Promise; +/** + * Exec a tool synchronously. Convenience wrapper over ToolRunner to execSync with args in one call. + * Output will be *not* be streamed to the live console. It will be returned after execution is complete. + * Appropriate for short running tools + * Returns IExecResult with output and return code + * + * @param tool path to tool to exec + * @param args an arg string or array of args + * @param options optional exec options. See IExecSyncOptions + * @returns IExecSyncResult + */ +export declare function execSync(tool: string, args: string | string[], options?: trm.IExecSyncOptions): trm.IExecSyncResult; +/** + * Convenience factory to create a ToolRunner. + * + * @param tool path to tool to exec + * @returns ToolRunner + */ +export declare function tool(tool: string): trm.ToolRunner; +export interface MatchOptions { + debug?: boolean; + nobrace?: boolean; + noglobstar?: boolean; + dot?: boolean; + noext?: boolean; + nocase?: boolean; + nonull?: boolean; + matchBase?: boolean; + nocomment?: boolean; + nonegate?: boolean; + flipNegate?: boolean; +} +/** + * Applies glob patterns to a list of paths. Supports interleaved exclude patterns. + * + * @param list array of paths + * @param patterns patterns to apply. supports interleaved exclude patterns. + * @param patternRoot optional. default root to apply to unrooted patterns. not applied to basename-only patterns when matchBase:true. + * @param options optional. defaults to { dot: true, nobrace: true, nocase: process.platform == 'win32' }. + */ +export declare function match(list: string[], patterns: string[] | string, patternRoot?: string, options?: MatchOptions): string[]; +/** + * Filter to apply glob patterns + * + * @param pattern pattern to apply + * @param options optional. defaults to { dot: true, nobrace: true, nocase: process.platform == 'win32' }. + */ +export declare function filter(pattern: string, options?: MatchOptions): (element: string, indexed: number, array: string[]) => boolean; +/** + * Determines the find root from a list of patterns. Performs the find and then applies the glob patterns. + * Supports interleaved exclude patterns. Unrooted patterns are rooted using defaultRoot, unless + * matchOptions.matchBase is specified and the pattern is a basename only. For matchBase cases, the + * defaultRoot is used as the find root. + * + * @param defaultRoot default path to root unrooted patterns. falls back to System.DefaultWorkingDirectory or process.cwd(). + * @param patterns pattern or array of patterns to apply + * @param findOptions defaults to { followSymbolicLinks: true }. following soft links is generally appropriate unless deleting files. + * @param matchOptions defaults to { dot: true, nobrace: true, nocase: process.platform == 'win32' } + */ +export declare function findMatch(defaultRoot: string, patterns: string[] | string, findOptions?: FindOptions, matchOptions?: MatchOptions): string[]; +export interface ProxyConfiguration { + proxyUrl: string; + /** + * Proxy URI formated as: protocol://username:password@hostname:port + * + * For tools that require setting proxy configuration in the single environment variable + */ + proxyFormattedUrl: string; + proxyUsername?: string; + proxyPassword?: string; + proxyBypassHosts?: string[]; +} +/** + * Gets http proxy configuration used by Build/Release agent + * + * @return ProxyConfiguration + */ +export declare function getHttpProxyConfiguration(requestUrl?: string): ProxyConfiguration | null; +export interface CertConfiguration { + caFile?: string; + certFile?: string; + keyFile?: string; + certArchiveFile?: string; + passphrase?: string; +} +/** + * Gets http certificate configuration used by Build/Release agent + * + * @return CertConfiguration + */ +export declare function getHttpCertConfiguration(): CertConfiguration | null; +export declare class TestPublisher { + testRunner: string; + constructor(testRunner: string); + publish(resultFiles?: string | string[], mergeResults?: string, platform?: string, config?: string, runTitle?: string, publishRunAttachments?: string, testRunSystem?: string): void; +} +export declare class CodeCoveragePublisher { + constructor(); + publish(codeCoverageTool?: string, summaryFileLocation?: string, reportDirectory?: string, additionalCodeCoverageFiles?: string | string[]): void; +} +export declare class CodeCoverageEnabler { + private buildTool; + private ccTool; + constructor(buildTool: string, ccTool: string); + enableCodeCoverage(buildProps: { + [key: string]: string; + }): void; +} +/** + * Upload user interested file as additional log information + * to the current timeline record. + * + * The file shall be available for download along with task logs. + * + * @param path Path to the file that should be uploaded. + * @returns void + */ +export declare function uploadFile(path: string): void; +/** + * Instruction for the agent to update the PATH environment variable. + * The specified directory is prepended to the PATH. + * The updated environment variable will be reflected in subsequent tasks. + * + * @param path Local directory path. + * @returns void + */ +export declare function prependPath(path: string): void; +/** + * Upload and attach summary markdown to current timeline record. + * This summary shall be added to the build/release summary and + * not available for download with logs. + * + * @param path Local directory path. + * @returns void + */ +export declare function uploadSummary(path: string): void; +/** + * Upload and attach attachment to current timeline record. + * These files are not available for download with logs. + * These can only be referred to by extensions using the type or name values. + * + * @param type Attachment type. + * @param name Attachment name. + * @param path Attachment path. + * @returns void + */ +export declare function addAttachment(type: string, name: string, path: string): void; +/** + * Set an endpoint field with given value. + * Value updated will be retained in the endpoint for + * the subsequent tasks that execute within the same job. + * + * @param id Endpoint id. + * @param field FieldType enum of AuthParameter, DataParameter or Url. + * @param key Key. + * @param value Value for key or url. + * @returns void + */ +export declare function setEndpoint(id: string, field: FieldType, key: string, value: string): void; +/** + * Set progress and current operation for current task. + * + * @param percent Percentage of completion. + * @param currentOperation Current pperation. + * @returns void + */ +export declare function setProgress(percent: number, currentOperation: string): void; +/** + * Indicates whether to write the logging command directly to the host or to the output pipeline. + * + * @param id Timeline record Guid. + * @param parentId Parent timeline record Guid. + * @param recordType Record type. + * @param recordName Record name. + * @param order Order of timeline record. + * @param startTime Start time. + * @param finishTime End time. + * @param progress Percentage of completion. + * @param state TaskState enum of Unknown, Initialized, InProgress or Completed. + * @param result TaskResult enum of Succeeded, SucceededWithIssues, Failed, Cancelled or Skipped. + * @param message current operation + * @returns void + */ +export declare function logDetail(id: string, message: string, parentId?: string, recordType?: string, recordName?: string, order?: number, startTime?: string, finishTime?: string, progress?: number, state?: TaskState, result?: TaskResult): void; +/** + * Log error or warning issue to timeline record of current task. + * + * @param type IssueType enum of Error or Warning. + * @param sourcePath Source file location. + * @param lineNumber Line number. + * @param columnNumber Column number. + * @param code Error or warning code. + * @param message Error or warning message. + * @returns void + */ +export declare function logIssue(type: IssueType, message: string, sourcePath?: string, lineNumber?: number, columnNumber?: number, errorCode?: string): void; +/** + * Upload user interested file as additional log information + * to the current timeline record. + * + * The file shall be available for download along with task logs. + * + * @param containerFolder Folder that the file will upload to, folder will be created if needed. + * @param path Path to the file that should be uploaded. + * @param name Artifact name. + * @returns void + */ +export declare function uploadArtifact(containerFolder: string, path: string, name?: string): void; +/** + * Create an artifact link, artifact location is required to be + * a file container path, VC path or UNC share path. + * + * The file shall be available for download along with task logs. + * + * @param name Artifact name. + * @param path Path to the file that should be associated. + * @param artifactType ArtifactType enum of Container, FilePath, VersionControl, GitRef or TfvcLabel. + * @returns void + */ +export declare function associateArtifact(name: string, path: string, artifactType: ArtifactType): void; +/** + * Upload user interested log to build’s container “logs\tool” folder. + * + * @param path Path to the file that should be uploaded. + * @returns void + */ +export declare function uploadBuildLog(path: string): void; +/** + * Update build number for current build. + * + * @param value Value to be assigned as the build number. + * @returns void + */ +export declare function updateBuildNumber(value: string): void; +/** + * Add a tag for current build. + * + * @param value Tag value. + * @returns void + */ +export declare function addBuildTag(value: string): void; +/** + * Update release name for current release. + * + * @param value Value to be assigned as the release name. + * @returns void + */ +export declare function updateReleaseName(name: string): void; diff --git a/task/node_modules/azure-pipelines-task-lib/task.js b/task/node_modules/azure-pipelines-task-lib/task.js new file mode 100644 index 0000000..90f6f78 --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/task.js @@ -0,0 +1,2103 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.updateReleaseName = exports.addBuildTag = exports.updateBuildNumber = exports.uploadBuildLog = exports.associateArtifact = exports.uploadArtifact = exports.logIssue = exports.logDetail = exports.setProgress = exports.setEndpoint = exports.addAttachment = exports.uploadSummary = exports.prependPath = exports.uploadFile = exports.CodeCoverageEnabler = exports.CodeCoveragePublisher = exports.TestPublisher = exports.getHttpCertConfiguration = exports.getHttpProxyConfiguration = exports.findMatch = exports.filter = exports.match = exports.tool = exports.execSync = exports.exec = exports.execAsync = exports.rmRF = exports.legacyFindFiles = exports.find = exports.retry = exports.mv = exports.cp = exports.ls = exports.which = exports.resolve = exports.mkdirP = exports.popd = exports.pushd = exports.cd = exports.checkPath = exports.cwd = exports.getAgentMode = exports.getNodeMajorVersion = exports.getPlatform = exports.osType = exports.writeFile = exports.exist = exports.stats = exports.debug = exports.error = exports.warning = exports.command = exports.setTaskVariable = exports.getTaskVariable = exports.getSecureFileTicket = exports.getSecureFileName = exports.getEndpointAuthorization = exports.getEndpointAuthorizationParameterRequired = exports.getEndpointAuthorizationParameter = exports.getEndpointAuthorizationSchemeRequired = exports.getEndpointAuthorizationScheme = exports.getEndpointDataParameterRequired = exports.getEndpointDataParameter = exports.getEndpointUrlRequired = exports.getEndpointUrl = exports.getPathInputRequired = exports.getPathInput = exports.filePathSupplied = exports.getDelimitedInput = exports.getPipelineFeature = exports.getBoolFeatureFlag = exports.getBoolInput = exports.getInputRequired = exports.getInput = exports.setSecret = exports.setVariable = exports.getVariables = exports.assertAgent = exports.getVariable = exports.loc = exports.setResourcePath = exports.setResult = exports.setErrStream = exports.setStdStream = exports.AgentHostedMode = exports.Platform = exports.IssueSource = exports.FieldType = exports.ArtifactType = exports.IssueType = exports.TaskState = exports.TaskResult = void 0; +var shell = require("shelljs"); +var childProcess = require("child_process"); +var fs = require("fs"); +var path = require("path"); +var os = require("os"); +var minimatch = require("minimatch"); +var im = require("./internal"); +var tcm = require("./taskcommand"); +var trm = require("./toolrunner"); +var semver = require("semver"); +var TaskResult; +(function (TaskResult) { + TaskResult[TaskResult["Succeeded"] = 0] = "Succeeded"; + TaskResult[TaskResult["SucceededWithIssues"] = 1] = "SucceededWithIssues"; + TaskResult[TaskResult["Failed"] = 2] = "Failed"; + TaskResult[TaskResult["Cancelled"] = 3] = "Cancelled"; + TaskResult[TaskResult["Skipped"] = 4] = "Skipped"; +})(TaskResult = exports.TaskResult || (exports.TaskResult = {})); +var TaskState; +(function (TaskState) { + TaskState[TaskState["Unknown"] = 0] = "Unknown"; + TaskState[TaskState["Initialized"] = 1] = "Initialized"; + TaskState[TaskState["InProgress"] = 2] = "InProgress"; + TaskState[TaskState["Completed"] = 3] = "Completed"; +})(TaskState = exports.TaskState || (exports.TaskState = {})); +var IssueType; +(function (IssueType) { + IssueType[IssueType["Error"] = 0] = "Error"; + IssueType[IssueType["Warning"] = 1] = "Warning"; +})(IssueType = exports.IssueType || (exports.IssueType = {})); +var ArtifactType; +(function (ArtifactType) { + ArtifactType[ArtifactType["Container"] = 0] = "Container"; + ArtifactType[ArtifactType["FilePath"] = 1] = "FilePath"; + ArtifactType[ArtifactType["VersionControl"] = 2] = "VersionControl"; + ArtifactType[ArtifactType["GitRef"] = 3] = "GitRef"; + ArtifactType[ArtifactType["TfvcLabel"] = 4] = "TfvcLabel"; +})(ArtifactType = exports.ArtifactType || (exports.ArtifactType = {})); +var FieldType; +(function (FieldType) { + FieldType[FieldType["AuthParameter"] = 0] = "AuthParameter"; + FieldType[FieldType["DataParameter"] = 1] = "DataParameter"; + FieldType[FieldType["Url"] = 2] = "Url"; +})(FieldType = exports.FieldType || (exports.FieldType = {})); +exports.IssueSource = im.IssueSource; +/** Platforms supported by our build agent */ +var Platform; +(function (Platform) { + Platform[Platform["Windows"] = 0] = "Windows"; + Platform[Platform["MacOS"] = 1] = "MacOS"; + Platform[Platform["Linux"] = 2] = "Linux"; +})(Platform = exports.Platform || (exports.Platform = {})); +var AgentHostedMode; +(function (AgentHostedMode) { + AgentHostedMode[AgentHostedMode["Unknown"] = 0] = "Unknown"; + AgentHostedMode[AgentHostedMode["SelfHosted"] = 1] = "SelfHosted"; + AgentHostedMode[AgentHostedMode["MsHosted"] = 2] = "MsHosted"; +})(AgentHostedMode = exports.AgentHostedMode || (exports.AgentHostedMode = {})); +//----------------------------------------------------- +// General Helpers +//----------------------------------------------------- +exports.setStdStream = im._setStdStream; +exports.setErrStream = im._setErrStream; +function setResult(result, message, done) { + exports.debug('task result: ' + TaskResult[result]); + // add an error issue + if (result == TaskResult.Failed && message) { + exports.error(message, exports.IssueSource.TaskInternal); + } + else if (result == TaskResult.SucceededWithIssues && message) { + exports.warning(message, exports.IssueSource.TaskInternal); + } + // task.complete + var properties = { 'result': TaskResult[result] }; + if (done) { + properties['done'] = 'true'; + } + exports.command('task.complete', properties, message); +} +exports.setResult = setResult; +// +// Catching all exceptions +// +process.on('uncaughtException', function (err) { + setResult(TaskResult.Failed, exports.loc('LIB_UnhandledEx', err.message)); + exports.error(String(err.stack), im.IssueSource.TaskInternal); +}); +// +// Catching unhandled rejections from promises and rethrowing them as exceptions +// For example, a promise that is rejected but not handled by a .catch() handler in node 10 +// doesn't cause an uncaughtException but causes in Node 16. +// For types definitions(Error | Any) see https://nodejs.org/docs/latest-v16.x/api/process.html#event-unhandledrejection +// +process.on('unhandledRejection', function (reason) { + if (reason instanceof Error) { + throw reason; + } + else { + throw new Error(reason); + } +}); +//----------------------------------------------------- +// Loc Helpers +//----------------------------------------------------- +exports.setResourcePath = im._setResourcePath; +exports.loc = im._loc; +//----------------------------------------------------- +// Input Helpers +//----------------------------------------------------- +exports.getVariable = im._getVariable; +/** + * Asserts the agent version is at least the specified minimum. + * + * @param minimum minimum version version - must be 2.104.1 or higher + */ +function assertAgent(minimum) { + if (semver.lt(minimum, '2.104.1')) { + throw new Error('assertAgent() requires the parameter to be 2.104.1 or higher'); + } + var agent = exports.getVariable('Agent.Version'); + if (agent && semver.lt(agent, minimum)) { + throw new Error("Agent version " + minimum + " or higher is required"); + } +} +exports.assertAgent = assertAgent; +/** + * Gets a snapshot of the current state of all job variables available to the task. + * Requires a 2.104.1 agent or higher for full functionality. + * + * Limitations on an agent prior to 2.104.1: + * 1) The return value does not include all public variables. Only public variables + * that have been added using setVariable are returned. + * 2) The name returned for each secret variable is the formatted environment variable + * name, not the actual variable name (unless it was set explicitly at runtime using + * setVariable). + * + * @returns VariableInfo[] + */ +function getVariables() { + return Object.keys(im._knownVariableMap) + .map(function (key) { + var info = im._knownVariableMap[key]; + return { name: info.name, value: exports.getVariable(info.name), secret: info.secret }; + }); +} +exports.getVariables = getVariables; +/** + * Sets a variable which will be available to subsequent tasks as well. + * + * @param name name of the variable to set + * @param val value to set + * @param secret whether variable is secret. Multi-line secrets are not allowed. Optional, defaults to false + * @param isOutput whether variable is an output variable. Optional, defaults to false + * @returns void + */ +function setVariable(name, val, secret, isOutput) { + if (secret === void 0) { secret = false; } + if (isOutput === void 0) { isOutput = false; } + // once a secret always a secret + var key = im._getVariableKey(name); + if (im._knownVariableMap.hasOwnProperty(key)) { + secret = secret || im._knownVariableMap[key].secret; + } + // store the value + var varValue = val || ''; + exports.debug('set ' + name + '=' + (secret && varValue ? '********' : varValue)); + if (secret) { + if (varValue && varValue.match(/\r|\n/) && ("" + process.env['SYSTEM_UNSAFEALLOWMULTILINESECRET']).toUpperCase() != 'TRUE') { + throw new Error(exports.loc('LIB_MultilineSecret')); + } + im._vault.storeSecret('SECRET_' + key, varValue); + delete process.env[key]; + } + else { + process.env[key] = varValue; + } + // store the metadata + im._knownVariableMap[key] = { name: name, secret: secret }; + // write the setvariable command + exports.command('task.setvariable', { 'variable': name || '', isOutput: (isOutput || false).toString(), 'issecret': (secret || false).toString() }, varValue); +} +exports.setVariable = setVariable; +/** + * Registers a value with the logger, so the value will be masked from the logs. Multi-line secrets are not allowed. + * + * @param val value to register + */ +function setSecret(val) { + if (val) { + if (val.match(/\r|\n/) && ("" + process.env['SYSTEM_UNSAFEALLOWMULTILINESECRET']).toUpperCase() !== 'TRUE') { + throw new Error(exports.loc('LIB_MultilineSecret')); + } + exports.command('task.setsecret', {}, val); + } +} +exports.setSecret = setSecret; +/** + * Gets the value of an input. + * If required is true and the value is not set, it will throw. + * + * @param name name of the input to get + * @param required whether input is required. optional, defaults to false + * @returns string + */ +function getInput(name, required) { + var inval = im._vault.retrieveSecret('INPUT_' + im._getVariableKey(name)); + if (required && !inval) { + throw new Error(exports.loc('LIB_InputRequired', name)); + } + exports.debug(name + '=' + inval); + return inval; +} +exports.getInput = getInput; +/** + * Gets the value of an input. + * If the value is not set, it will throw. + * + * @param name name of the input to get + * @returns string + */ +function getInputRequired(name) { + return getInput(name, true); +} +exports.getInputRequired = getInputRequired; +/** + * Gets the value of an input and converts to a bool. Convenience. + * If required is true and the value is not set, it will throw. + * If required is false and the value is not set, returns false. + * + * @param name name of the bool input to get + * @param required whether input is required. optional, defaults to false + * @returns boolean + */ +function getBoolInput(name, required) { + return (getInput(name, required) || '').toUpperCase() == "TRUE"; +} +exports.getBoolInput = getBoolInput; +/** + * Gets the value of an feature flag and converts to a bool. + * @IMPORTANT This method is only for internal Microsoft development. Do not use it for external tasks. + * @param name name of the feature flag to get. + * @param defaultValue default value of the feature flag in case it's not found in env. (optional. Default value = false) + * @returns boolean + * @deprecated Don't use this for new development. Use getPipelineFeature instead. + */ +function getBoolFeatureFlag(ffName, defaultValue) { + if (defaultValue === void 0) { defaultValue = false; } + var ffValue = process.env[ffName]; + if (!ffValue) { + exports.debug("Feature flag " + ffName + " not found. Returning " + defaultValue + " as default."); + return defaultValue; + } + exports.debug("Feature flag " + ffName + " = " + ffValue); + return ffValue.toLowerCase() === "true"; +} +exports.getBoolFeatureFlag = getBoolFeatureFlag; +/** + * Gets the value of an task feature and converts to a bool. + * @IMPORTANT This method is only for internal Microsoft development. Do not use it for external tasks. + * @param name name of the feature to get. + * @returns boolean + */ +function getPipelineFeature(featureName) { + var variableName = im._getVariableKey("DistributedTask.Tasks." + featureName); + var featureValue = process.env[variableName]; + if (!featureValue) { + exports.debug("Feature '" + featureName + "' not found. Returning false as default."); + return false; + } + var boolValue = featureValue.toLowerCase() === "true"; + exports.debug("Feature '" + featureName + "' = '" + featureValue + "'. Processed as '" + boolValue + "'."); + return boolValue; +} +exports.getPipelineFeature = getPipelineFeature; +/** + * Gets the value of an input and splits the value using a delimiter (space, comma, etc). + * Empty values are removed. This function is useful for splitting an input containing a simple + * list of items - such as build targets. + * IMPORTANT: Do not use this function for splitting additional args! Instead use argString(), which + * follows normal argument splitting rules and handles values encapsulated by quotes. + * If required is true and the value is not set, it will throw. + * + * @param name name of the input to get + * @param delim delimiter to split on + * @param required whether input is required. optional, defaults to false + * @returns string[] + */ +function getDelimitedInput(name, delim, required) { + var inputVal = getInput(name, required); + if (!inputVal) { + return []; + } + var result = []; + inputVal.split(delim).forEach(function (x) { + if (x) { + result.push(x); + } + }); + return result; +} +exports.getDelimitedInput = getDelimitedInput; +/** + * Checks whether a path inputs value was supplied by the user + * File paths are relative with a picker, so an empty path is the root of the repo. + * Useful if you need to condition work (like append an arg) if a value was supplied + * + * @param name name of the path input to check + * @returns boolean + */ +function filePathSupplied(name) { + // normalize paths + var pathValue = this.resolve(this.getPathInput(name) || ''); + var repoRoot = this.resolve(exports.getVariable('build.sourcesDirectory') || exports.getVariable('system.defaultWorkingDirectory') || ''); + var supplied = pathValue !== repoRoot; + exports.debug(name + 'path supplied :' + supplied); + return supplied; +} +exports.filePathSupplied = filePathSupplied; +/** + * Gets the value of a path input + * It will be quoted for you if it isn't already and contains spaces + * If required is true and the value is not set, it will throw. + * If check is true and the path does not exist, it will throw. + * + * @param name name of the input to get + * @param required whether input is required. optional, defaults to false + * @param check whether path is checked. optional, defaults to false + * @returns string + */ +function getPathInput(name, required, check) { + var inval = getInput(name, required); + if (inval) { + if (check) { + exports.checkPath(inval, name); + } + } + return inval; +} +exports.getPathInput = getPathInput; +/** + * Gets the value of a path input + * It will be quoted for you if it isn't already and contains spaces + * If the value is not set, it will throw. + * If check is true and the path does not exist, it will throw. + * + * @param name name of the input to get + * @param check whether path is checked. optional, defaults to false + * @returns string + */ +function getPathInputRequired(name, check) { + return getPathInput(name, true, check); +} +exports.getPathInputRequired = getPathInputRequired; +//----------------------------------------------------- +// Endpoint Helpers +//----------------------------------------------------- +/** + * Gets the url for a service endpoint + * If the url was not set and is not optional, it will throw. + * + * @param id name of the service endpoint + * @param optional whether the url is optional + * @returns string + */ +function getEndpointUrl(id, optional) { + var urlval = process.env['ENDPOINT_URL_' + id]; + if (!optional && !urlval) { + throw new Error(exports.loc('LIB_EndpointNotExist', id)); + } + exports.debug(id + '=' + urlval); + return urlval; +} +exports.getEndpointUrl = getEndpointUrl; +/** + * Gets the url for a service endpoint + * If the url was not set, it will throw. + * + * @param id name of the service endpoint + * @returns string + */ +function getEndpointUrlRequired(id) { + return getEndpointUrl(id, false); +} +exports.getEndpointUrlRequired = getEndpointUrlRequired; +/* + * Gets the endpoint data parameter value with specified key for a service endpoint + * If the endpoint data parameter was not set and is not optional, it will throw. + * + * @param id name of the service endpoint + * @param key of the parameter + * @param optional whether the endpoint data is optional + * @returns {string} value of the endpoint data parameter + */ +function getEndpointDataParameter(id, key, optional) { + var dataParamVal = process.env['ENDPOINT_DATA_' + id + '_' + key.toUpperCase()]; + if (!optional && !dataParamVal) { + throw new Error(exports.loc('LIB_EndpointDataNotExist', id, key)); + } + exports.debug(id + ' data ' + key + ' = ' + dataParamVal); + return dataParamVal; +} +exports.getEndpointDataParameter = getEndpointDataParameter; +/* + * Gets the endpoint data parameter value with specified key for a service endpoint + * If the endpoint data parameter was not set, it will throw. + * + * @param id name of the service endpoint + * @param key of the parameter + * @returns {string} value of the endpoint data parameter + */ +function getEndpointDataParameterRequired(id, key) { + return getEndpointDataParameter(id, key, false); +} +exports.getEndpointDataParameterRequired = getEndpointDataParameterRequired; +/** + * Gets the endpoint authorization scheme for a service endpoint + * If the endpoint authorization scheme is not set and is not optional, it will throw. + * + * @param id name of the service endpoint + * @param optional whether the endpoint authorization scheme is optional + * @returns {string} value of the endpoint authorization scheme + */ +function getEndpointAuthorizationScheme(id, optional) { + var authScheme = im._vault.retrieveSecret('ENDPOINT_AUTH_SCHEME_' + id); + if (!optional && !authScheme) { + throw new Error(exports.loc('LIB_EndpointAuthNotExist', id)); + } + exports.debug(id + ' auth scheme = ' + authScheme); + return authScheme; +} +exports.getEndpointAuthorizationScheme = getEndpointAuthorizationScheme; +/** + * Gets the endpoint authorization scheme for a service endpoint + * If the endpoint authorization scheme is not set, it will throw. + * + * @param id name of the service endpoint + * @returns {string} value of the endpoint authorization scheme + */ +function getEndpointAuthorizationSchemeRequired(id) { + return getEndpointAuthorizationScheme(id, false); +} +exports.getEndpointAuthorizationSchemeRequired = getEndpointAuthorizationSchemeRequired; +/** + * Gets the endpoint authorization parameter value for a service endpoint with specified key + * If the endpoint authorization parameter is not set and is not optional, it will throw. + * + * @param id name of the service endpoint + * @param key key to find the endpoint authorization parameter + * @param optional optional whether the endpoint authorization scheme is optional + * @returns {string} value of the endpoint authorization parameter value + */ +function getEndpointAuthorizationParameter(id, key, optional) { + var authParam = im._vault.retrieveSecret('ENDPOINT_AUTH_PARAMETER_' + id + '_' + key.toUpperCase()); + if (!optional && !authParam) { + throw new Error(exports.loc('LIB_EndpointAuthNotExist', id)); + } + exports.debug(id + ' auth param ' + key + ' = ' + authParam); + return authParam; +} +exports.getEndpointAuthorizationParameter = getEndpointAuthorizationParameter; +/** + * Gets the endpoint authorization parameter value for a service endpoint with specified key + * If the endpoint authorization parameter is not set, it will throw. + * + * @param id name of the service endpoint + * @param key key to find the endpoint authorization parameter + * @returns {string} value of the endpoint authorization parameter value + */ +function getEndpointAuthorizationParameterRequired(id, key) { + return getEndpointAuthorizationParameter(id, key, false); +} +exports.getEndpointAuthorizationParameterRequired = getEndpointAuthorizationParameterRequired; +/** + * Gets the authorization details for a service endpoint + * If the authorization was not set and is not optional, it will set the task result to Failed. + * + * @param id name of the service endpoint + * @param optional whether the url is optional + * @returns string + */ +function getEndpointAuthorization(id, optional) { + var aval = im._vault.retrieveSecret('ENDPOINT_AUTH_' + id); + if (!optional && !aval) { + setResult(TaskResult.Failed, exports.loc('LIB_EndpointAuthNotExist', id)); + } + exports.debug(id + ' exists ' + (!!aval)); + var auth; + try { + if (aval) { + auth = JSON.parse(aval); + } + } + catch (err) { + throw new Error(exports.loc('LIB_InvalidEndpointAuth', aval)); + } + return auth; +} +exports.getEndpointAuthorization = getEndpointAuthorization; +//----------------------------------------------------- +// SecureFile Helpers +//----------------------------------------------------- +/** + * Gets the name for a secure file + * + * @param id secure file id + * @returns string + */ +function getSecureFileName(id) { + var name = process.env['SECUREFILE_NAME_' + id]; + exports.debug('secure file name for id ' + id + ' = ' + name); + return name; +} +exports.getSecureFileName = getSecureFileName; +/** + * Gets the secure file ticket that can be used to download the secure file contents + * + * @param id name of the secure file + * @returns {string} secure file ticket + */ +function getSecureFileTicket(id) { + var ticket = im._vault.retrieveSecret('SECUREFILE_TICKET_' + id); + exports.debug('secure file ticket for id ' + id + ' = ' + ticket); + return ticket; +} +exports.getSecureFileTicket = getSecureFileTicket; +//----------------------------------------------------- +// Task Variable Helpers +//----------------------------------------------------- +/** + * Gets a variable value that is set by previous step from the same wrapper task. + * Requires a 2.115.0 agent or higher. + * + * @param name name of the variable to get + * @returns string + */ +function getTaskVariable(name) { + assertAgent('2.115.0'); + var inval = im._vault.retrieveSecret('VSTS_TASKVARIABLE_' + im._getVariableKey(name)); + if (inval) { + inval = inval.trim(); + } + exports.debug('task variable: ' + name + '=' + inval); + return inval; +} +exports.getTaskVariable = getTaskVariable; +/** + * Sets a task variable which will only be available to subsequent steps belong to the same wrapper task. + * Requires a 2.115.0 agent or higher. + * + * @param name name of the variable to set + * @param val value to set + * @param secret whether variable is secret. optional, defaults to false + * @returns void + */ +function setTaskVariable(name, val, secret) { + if (secret === void 0) { secret = false; } + assertAgent('2.115.0'); + var key = im._getVariableKey(name); + // store the value + var varValue = val || ''; + exports.debug('set task variable: ' + name + '=' + (secret && varValue ? '********' : varValue)); + im._vault.storeSecret('VSTS_TASKVARIABLE_' + key, varValue); + delete process.env[key]; + // write the command + exports.command('task.settaskvariable', { 'variable': name || '', 'issecret': (secret || false).toString() }, varValue); +} +exports.setTaskVariable = setTaskVariable; +//----------------------------------------------------- +// Cmd Helpers +//----------------------------------------------------- +exports.command = im._command; +exports.warning = im._warning; +exports.error = im._error; +exports.debug = im._debug; +//----------------------------------------------------- +// Disk Functions +//----------------------------------------------------- +function _checkShell(cmd, continueOnError) { + var se = shell.error(); + if (se) { + exports.debug(cmd + ' failed'); + var errMsg = exports.loc('LIB_OperationFailed', cmd, se); + exports.debug(errMsg); + if (!continueOnError) { + throw new Error(errMsg); + } + } +} +/** + * Get's stat on a path. + * Useful for checking whether a file or directory. Also getting created, modified and accessed time. + * see [fs.stat](https://nodejs.org/api/fs.html#fs_class_fs_stats) + * + * @param path path to check + * @returns fsStat + */ +function stats(path) { + return fs.statSync(path); +} +exports.stats = stats; +exports.exist = im._exist; +function writeFile(file, data, options) { + if (typeof (options) === 'string') { + fs.writeFileSync(file, data, { encoding: options }); + } + else { + fs.writeFileSync(file, data, options); + } +} +exports.writeFile = writeFile; +/** + * @deprecated Use `getPlatform` + * Useful for determining the host operating system. + * see [os.type](https://nodejs.org/api/os.html#os_os_type) + * + * @return the name of the operating system + */ +function osType() { + return os.type(); +} +exports.osType = osType; +/** + * Determine the operating system the build agent is running on. + * @returns {Platform} + * @throws {Error} Platform is not supported by our agent + */ +function getPlatform() { + switch (process.platform) { + case 'win32': return Platform.Windows; + case 'darwin': return Platform.MacOS; + case 'linux': return Platform.Linux; + default: throw Error(exports.loc('LIB_PlatformNotSupported', process.platform)); + } +} +exports.getPlatform = getPlatform; +/** + * Resolves major version of Node.js engine used by the agent. + * @returns {Number} Node's major version. + */ +function getNodeMajorVersion() { + var _a; + var version = (_a = process === null || process === void 0 ? void 0 : process.versions) === null || _a === void 0 ? void 0 : _a.node; + if (!version) { + throw new Error(exports.loc('LIB_UndefinedNodeVersion')); + } + var parts = version.split('.').map(Number); + if (parts.length < 1) { + return NaN; + } + return parts[0]; +} +exports.getNodeMajorVersion = getNodeMajorVersion; +/** + * Return hosted type of Agent + * @returns {AgentHostedMode} + */ +function getAgentMode() { + var agentCloudId = exports.getVariable('Agent.CloudId'); + if (agentCloudId === undefined) + return AgentHostedMode.Unknown; + if (agentCloudId) + return AgentHostedMode.MsHosted; + return AgentHostedMode.SelfHosted; +} +exports.getAgentMode = getAgentMode; +/** + * Returns the process's current working directory. + * see [process.cwd](https://nodejs.org/api/process.html#process_process_cwd) + * + * @return the path to the current working directory of the process + */ +function cwd() { + return process.cwd(); +} +exports.cwd = cwd; +exports.checkPath = im._checkPath; +/** + * Change working directory. + * + * @param path new working directory path + * @returns void + */ +function cd(path) { + if (path) { + shell.cd(path); + _checkShell('cd'); + } +} +exports.cd = cd; +/** + * Change working directory and push it on the stack + * + * @param path new working directory path + * @returns void + */ +function pushd(path) { + shell.pushd(path); + _checkShell('pushd'); +} +exports.pushd = pushd; +/** + * Change working directory back to previously pushed directory + * + * @returns void + */ +function popd() { + shell.popd(); + _checkShell('popd'); +} +exports.popd = popd; +/** + * Make a directory. Creates the full path with folders in between + * Will throw if it fails + * + * @param p path to create + * @returns void + */ +function mkdirP(p) { + if (!p) { + throw new Error(exports.loc('LIB_ParameterIsRequired', 'p')); + } + // build a stack of directories to create + var stack = []; + var testDir = p; + while (true) { + // validate the loop is not out of control + if (stack.length >= Number(process.env['TASKLIB_TEST_MKDIRP_FAILSAFE'] || 1000)) { + // let the framework throw + exports.debug('loop is out of control'); + fs.mkdirSync(p); + return; + } + exports.debug("testing directory '" + testDir + "'"); + var stats_1 = void 0; + try { + stats_1 = fs.statSync(testDir); + } + catch (err) { + if (err.code == 'ENOENT') { + // validate the directory is not the drive root + var parentDir = path.dirname(testDir); + if (testDir == parentDir) { + throw new Error(exports.loc('LIB_MkdirFailedInvalidDriveRoot', p, testDir)); // Unable to create directory '{p}'. Root directory does not exist: '{testDir}' + } + // push the dir and test the parent + stack.push(testDir); + testDir = parentDir; + continue; + } + else if (err.code == 'UNKNOWN') { + throw new Error(exports.loc('LIB_MkdirFailedInvalidShare', p, testDir)); // Unable to create directory '{p}'. Unable to verify the directory exists: '{testDir}'. If directory is a file share, please verify the share name is correct, the share is online, and the current process has permission to access the share. + } + else { + throw err; + } + } + if (!stats_1.isDirectory()) { + throw new Error(exports.loc('LIB_MkdirFailedFileExists', p, testDir)); // Unable to create directory '{p}'. Conflicting file exists: '{testDir}' + } + // testDir exists + break; + } + // create each directory + while (stack.length) { + var dir = stack.pop(); // non-null because `stack.length` was truthy + exports.debug("mkdir '" + dir + "'"); + try { + fs.mkdirSync(dir); + } + catch (err) { + throw new Error(exports.loc('LIB_MkdirFailed', p, err.message)); // Unable to create directory '{p}'. {err.message} + } + } +} +exports.mkdirP = mkdirP; +/** + * Resolves a sequence of paths or path segments into an absolute path. + * Calls node.js path.resolve() + * Allows L0 testing with consistent path formats on Mac/Linux and Windows in the mock implementation + * @param pathSegments + * @returns {string} + */ +function resolve() { + var pathSegments = []; + for (var _i = 0; _i < arguments.length; _i++) { + pathSegments[_i] = arguments[_i]; + } + var absolutePath = path.resolve.apply(this, pathSegments); + exports.debug('Absolute path for pathSegments: ' + pathSegments + ' = ' + absolutePath); + return absolutePath; +} +exports.resolve = resolve; +exports.which = im._which; +/** + * Returns array of files in the given path, or in current directory if no path provided. See shelljs.ls + * @param {string} options Available options: -R (recursive), -A (all files, include files beginning with ., except for . and ..) + * @param {string[]} paths Paths to search. + * @return {string[]} An array of files in the given path(s). + */ +function ls(options, paths) { + if (options) { + return shell.ls(options, paths); + } + else { + return shell.ls(paths); + } +} +exports.ls = ls; +/** + * Copies a file or folder. + * + * @param source source path + * @param dest destination path + * @param options string -r, -f or -rf for recursive and force + * @param continueOnError optional. whether to continue on error + * @param retryCount optional. Retry count to copy the file. It might help to resolve intermittent issues e.g. with UNC target paths on a remote host. + */ +function cp(source, dest, options, continueOnError, retryCount) { + if (retryCount === void 0) { retryCount = 0; } + while (retryCount >= 0) { + try { + if (options) { + shell.cp(options, source, dest); + } + else { + shell.cp(source, dest); + } + _checkShell('cp', false); + break; + } + catch (e) { + if (retryCount <= 0) { + if (continueOnError) { + exports.warning(e, exports.IssueSource.TaskInternal); + break; + } + else { + throw e; + } + } + else { + console.log(exports.loc('LIB_CopyFileFailed', retryCount)); + retryCount--; + } + } + } +} +exports.cp = cp; +/** + * Moves a path. + * + * @param source source path + * @param dest destination path + * @param options string -f or -n for force and no clobber + * @param continueOnError optional. whether to continue on error + */ +function mv(source, dest, options, continueOnError) { + if (options) { + shell.mv(options, source, dest); + } + else { + shell.mv(source, dest); + } + _checkShell('mv', continueOnError); +} +exports.mv = mv; +/** + * Tries to execute a function a specified number of times. + * + * @param func a function to be executed. + * @param args executed function arguments array. + * @param retryOptions optional. Defaults to { continueOnError: false, retryCount: 0 }. + * @returns the same as the usual function. + */ +function retry(func, args, retryOptions) { + if (retryOptions === void 0) { retryOptions = { continueOnError: false, retryCount: 0 }; } + while (retryOptions.retryCount >= 0) { + try { + return func.apply(void 0, args); + } + catch (e) { + if (retryOptions.retryCount <= 0) { + if (retryOptions.continueOnError) { + exports.warning(e, exports.IssueSource.TaskInternal); + break; + } + else { + throw e; + } + } + else { + exports.debug("Attempt to execute function \"" + (func === null || func === void 0 ? void 0 : func.name) + "\" failed, retries left: " + retryOptions.retryCount); + retryOptions.retryCount--; + } + } + } +} +exports.retry = retry; +/** + * Gets info about item stats. + * + * @param path a path to the item to be processed. + * @param followSymbolicLink indicates whether to traverse descendants of symbolic link directories. + * @param allowBrokenSymbolicLinks when true, broken symbolic link will not cause an error. + * @returns fs.Stats + */ +function _getStats(path, followSymbolicLink, allowBrokenSymbolicLinks) { + // stat returns info about the target of a symlink (or symlink chain), + // lstat returns info about a symlink itself + var stats; + if (followSymbolicLink) { + try { + // use stat (following symlinks) + stats = fs.statSync(path); + } + catch (err) { + if (err.code == 'ENOENT' && allowBrokenSymbolicLinks) { + // fallback to lstat (broken symlinks allowed) + stats = fs.lstatSync(path); + exports.debug(" " + path + " (broken symlink)"); + } + else { + throw err; + } + } + } + else { + // use lstat (not following symlinks) + stats = fs.lstatSync(path); + } + return stats; +} +/** + * Recursively finds all paths a given path. Returns an array of paths. + * + * @param findPath path to search + * @param options optional. defaults to { followSymbolicLinks: true }. following soft links is generally appropriate unless deleting files. + * @returns string[] + */ +function find(findPath, options) { + if (!findPath) { + exports.debug('no path specified'); + return []; + } + // normalize the path, otherwise the first result is inconsistently formatted from the rest of the results + // because path.join() performs normalization. + findPath = path.normalize(findPath); + // debug trace the parameters + exports.debug("findPath: '" + findPath + "'"); + options = options || _getDefaultFindOptions(); + _debugFindOptions(options); + // return empty if not exists + try { + fs.lstatSync(findPath); + } + catch (err) { + if (err.code == 'ENOENT') { + exports.debug('0 results'); + return []; + } + throw err; + } + try { + var result = []; + // push the first item + var stack = [new _FindItem(findPath, 1)]; + var traversalChain = []; // used to detect cycles + var _loop_1 = function () { + // pop the next item and push to the result array + var item = stack.pop(); // non-null because `stack.length` was truthy + var stats_2 = void 0; + try { + // `item.path` equals `findPath` for the first item to be processed, when the `result` array is empty + var isPathToSearch = !result.length; + // following specified symlinks only if current path equals specified path + var followSpecifiedSymbolicLink = options.followSpecifiedSymbolicLink && isPathToSearch; + // following all symlinks or following symlink for the specified path + var followSymbolicLink = options.followSymbolicLinks || followSpecifiedSymbolicLink; + // stat the item. The stat info is used further below to determine whether to traverse deeper + stats_2 = _getStats(item.path, followSymbolicLink, options.allowBrokenSymbolicLinks); + } + catch (err) { + if (err.code == 'ENOENT' && options.skipMissingFiles) { + exports.warning("No such file or directory: \"" + item.path + "\" - skipping.", exports.IssueSource.TaskInternal); + return "continue"; + } + throw err; + } + result.push(item.path); + // note, isDirectory() returns false for the lstat of a symlink + if (stats_2.isDirectory()) { + exports.debug(" " + item.path + " (directory)"); + if (options.followSymbolicLinks) { + // get the realpath + var realPath_1; + if (im._isUncPath(item.path)) { + // Sometimes there are spontaneous issues when working with unc-paths, so retries have been added for them. + realPath_1 = retry(fs.realpathSync, [item.path], { continueOnError: false, retryCount: 5 }); + } + else { + realPath_1 = fs.realpathSync(item.path); + } + // fixup the traversal chain to match the item level + while (traversalChain.length >= item.level) { + traversalChain.pop(); + } + // test for a cycle + if (traversalChain.some(function (x) { return x == realPath_1; })) { + exports.debug(' cycle detected'); + return "continue"; + } + // update the traversal chain + traversalChain.push(realPath_1); + } + // push the child items in reverse onto the stack + var childLevel_1 = item.level + 1; + var childItems = fs.readdirSync(item.path) + .map(function (childName) { return new _FindItem(path.join(item.path, childName), childLevel_1); }); + for (var i = childItems.length - 1; i >= 0; i--) { + stack.push(childItems[i]); + } + } + else { + exports.debug(" " + item.path + " (file)"); + } + }; + while (stack.length) { + _loop_1(); + } + exports.debug(result.length + " results"); + return result; + } + catch (err) { + throw new Error(exports.loc('LIB_OperationFailed', 'find', err.message)); + } +} +exports.find = find; +var _FindItem = /** @class */ (function () { + function _FindItem(path, level) { + this.path = path; + this.level = level; + } + return _FindItem; +}()); +function _debugFindOptions(options) { + exports.debug("findOptions.allowBrokenSymbolicLinks: '" + options.allowBrokenSymbolicLinks + "'"); + exports.debug("findOptions.followSpecifiedSymbolicLink: '" + options.followSpecifiedSymbolicLink + "'"); + exports.debug("findOptions.followSymbolicLinks: '" + options.followSymbolicLinks + "'"); + exports.debug("findOptions.skipMissingFiles: '" + options.skipMissingFiles + "'"); +} +function _getDefaultFindOptions() { + return { + allowBrokenSymbolicLinks: false, + followSpecifiedSymbolicLink: true, + followSymbolicLinks: true, + skipMissingFiles: false + }; +} +/** + * Prefer tl.find() and tl.match() instead. This function is for backward compatibility + * when porting tasks to Node from the PowerShell or PowerShell3 execution handler. + * + * @param rootDirectory path to root unrooted patterns with + * @param pattern include and exclude patterns + * @param includeFiles whether to include files in the result. defaults to true when includeFiles and includeDirectories are both false + * @param includeDirectories whether to include directories in the result + * @returns string[] + */ +function legacyFindFiles(rootDirectory, pattern, includeFiles, includeDirectories) { + if (!pattern) { + throw new Error('pattern parameter cannot be empty'); + } + exports.debug("legacyFindFiles rootDirectory: '" + rootDirectory + "'"); + exports.debug("pattern: '" + pattern + "'"); + exports.debug("includeFiles: '" + includeFiles + "'"); + exports.debug("includeDirectories: '" + includeDirectories + "'"); + if (!includeFiles && !includeDirectories) { + includeFiles = true; + } + // organize the patterns into include patterns and exclude patterns + var includePatterns = []; + var excludePatterns = []; + pattern = pattern.replace(/;;/g, '\0'); + for (var _i = 0, _a = pattern.split(';'); _i < _a.length; _i++) { + var pat = _a[_i]; + if (!pat) { + continue; + } + pat = pat.replace(/\0/g, ';'); + // determine whether include pattern and remove any include/exclude prefix. + // include patterns start with +: or anything other than -: + // exclude patterns start with -: + var isIncludePattern = void 0; + if (im._startsWith(pat, '+:')) { + pat = pat.substring(2); + isIncludePattern = true; + } + else if (im._startsWith(pat, '-:')) { + pat = pat.substring(2); + isIncludePattern = false; + } + else { + isIncludePattern = true; + } + // validate pattern does not end with a slash + if (im._endsWith(pat, '/') || (process.platform == 'win32' && im._endsWith(pat, '\\'))) { + throw new Error(exports.loc('LIB_InvalidPattern', pat)); + } + // root the pattern + if (rootDirectory && !path.isAbsolute(pat)) { + pat = path.join(rootDirectory, pat); + // remove trailing slash sometimes added by path.join() on Windows, e.g. + // path.join('\\\\hello', 'world') => '\\\\hello\\world\\' + // path.join('//hello', 'world') => '\\\\hello\\world\\' + if (im._endsWith(pat, '\\')) { + pat = pat.substring(0, pat.length - 1); + } + } + if (isIncludePattern) { + includePatterns.push(pat); + } + else { + excludePatterns.push(im._legacyFindFiles_convertPatternToRegExp(pat)); + } + } + // find and apply patterns + var count = 0; + var result = _legacyFindFiles_getMatchingItems(includePatterns, excludePatterns, !!includeFiles, !!includeDirectories); + exports.debug('all matches:'); + for (var _b = 0, result_1 = result; _b < result_1.length; _b++) { + var resultItem = result_1[_b]; + exports.debug(' ' + resultItem); + } + exports.debug('total matched: ' + result.length); + return result; +} +exports.legacyFindFiles = legacyFindFiles; +function _legacyFindFiles_getMatchingItems(includePatterns, excludePatterns, includeFiles, includeDirectories) { + exports.debug('getMatchingItems()'); + for (var _i = 0, includePatterns_1 = includePatterns; _i < includePatterns_1.length; _i++) { + var pattern = includePatterns_1[_i]; + exports.debug("includePattern: '" + pattern + "'"); + } + for (var _a = 0, excludePatterns_1 = excludePatterns; _a < excludePatterns_1.length; _a++) { + var pattern = excludePatterns_1[_a]; + exports.debug("excludePattern: " + pattern); + } + exports.debug('includeFiles: ' + includeFiles); + exports.debug('includeDirectories: ' + includeDirectories); + var allFiles = {}; + var _loop_2 = function (pattern) { + // determine the directory to search + // + // note, getDirectoryName removes redundant path separators + var findPath = void 0; + var starIndex = pattern.indexOf('*'); + var questionIndex = pattern.indexOf('?'); + if (starIndex < 0 && questionIndex < 0) { + // if no wildcards are found, use the directory name portion of the path. + // if there is no directory name (file name only in pattern or drive root), + // this will return empty string. + findPath = im._getDirectoryName(pattern); + } + else { + // extract the directory prior to the first wildcard + var index = Math.min(starIndex >= 0 ? starIndex : questionIndex, questionIndex >= 0 ? questionIndex : starIndex); + findPath = im._getDirectoryName(pattern.substring(0, index)); + } + // note, due to this short-circuit and the above usage of getDirectoryName, this + // function has the same limitations regarding drive roots as the powershell + // implementation. + // + // also note, since getDirectoryName eliminates slash redundancies, some additional + // work may be required if removal of this limitation is attempted. + if (!findPath) { + return "continue"; + } + var patternRegex = im._legacyFindFiles_convertPatternToRegExp(pattern); + // find files/directories + var items = find(findPath, { followSymbolicLinks: true }) + .filter(function (item) { + if (includeFiles && includeDirectories) { + return true; + } + var isDir = fs.statSync(item).isDirectory(); + return (includeFiles && !isDir) || (includeDirectories && isDir); + }) + .forEach(function (item) { + var normalizedPath = process.platform == 'win32' ? item.replace(/\\/g, '/') : item; // normalize separators + // **/times/** will not match C:/fun/times because there isn't a trailing slash + // so try both if including directories + var alternatePath = normalizedPath + "/"; // potential bug: it looks like this will result in a false + // positive if the item is a regular file and not a directory + var isMatch = false; + if (patternRegex.test(normalizedPath) || (includeDirectories && patternRegex.test(alternatePath))) { + isMatch = true; + // test whether the path should be excluded + for (var _i = 0, excludePatterns_2 = excludePatterns; _i < excludePatterns_2.length; _i++) { + var regex = excludePatterns_2[_i]; + if (regex.test(normalizedPath) || (includeDirectories && regex.test(alternatePath))) { + isMatch = false; + break; + } + } + } + if (isMatch) { + allFiles[item] = item; + } + }); + }; + for (var _b = 0, includePatterns_2 = includePatterns; _b < includePatterns_2.length; _b++) { + var pattern = includePatterns_2[_b]; + _loop_2(pattern); + } + return Object.keys(allFiles).sort(); +} +/** + * Remove a path recursively with force + * + * @param inputPath path to remove + * @throws when the file or directory exists but could not be deleted. + */ +function rmRF(inputPath) { + exports.debug('rm -rf ' + inputPath); + if (getPlatform() == Platform.Windows) { + // Node doesn't provide a delete operation, only an unlink function. This means that if the file is being used by another + // program (e.g. antivirus), it won't be deleted. To address this, we shell out the work to rd/del. + try { + if (fs.statSync(inputPath).isDirectory()) { + exports.debug('removing directory ' + inputPath); + childProcess.execSync("rd /s /q \"" + inputPath + "\""); + } + else { + exports.debug('removing file ' + inputPath); + childProcess.execSync("del /f /a \"" + inputPath + "\""); + } + } + catch (err) { + // if you try to delete a file that doesn't exist, desired result is achieved + // other errors are valid + if (err.code != 'ENOENT') { + throw new Error(exports.loc('LIB_OperationFailed', 'rmRF', err.message)); + } + } + // Shelling out fails to remove a symlink folder with missing source, this unlink catches that + try { + fs.unlinkSync(inputPath); + } + catch (err) { + // if you try to delete a file that doesn't exist, desired result is achieved + // other errors are valid + if (err.code != 'ENOENT') { + throw new Error(exports.loc('LIB_OperationFailed', 'rmRF', err.message)); + } + } + } + else { + // get the lstats in order to workaround a bug in shelljs@0.3.0 where symlinks + // with missing targets are not handled correctly by "rm('-rf', path)" + var lstats = void 0; + try { + lstats = fs.lstatSync(inputPath); + } + catch (err) { + // if you try to delete a file that doesn't exist, desired result is achieved + // other errors are valid + if (err.code == 'ENOENT') { + return; + } + throw new Error(exports.loc('LIB_OperationFailed', 'rmRF', err.message)); + } + if (lstats.isDirectory()) { + exports.debug('removing directory'); + shell.rm('-rf', inputPath); + var errMsg = shell.error(); + if (errMsg) { + throw new Error(exports.loc('LIB_OperationFailed', 'rmRF', errMsg)); + } + return; + } + exports.debug('removing file'); + try { + fs.unlinkSync(inputPath); + } + catch (err) { + throw new Error(exports.loc('LIB_OperationFailed', 'rmRF', err.message)); + } + } +} +exports.rmRF = rmRF; +/** + * Exec a tool. Convenience wrapper over ToolRunner to exec with args in one call. + * Output will be streamed to the live console. + * Returns promise with return code + * + * @param tool path to tool to exec + * @param args an arg string or array of args + * @param options optional exec options. See IExecOptions + * @returns number + */ +function execAsync(tool, args, options) { + var tr = this.tool(tool); + tr.on('debug', function (data) { + exports.debug(data); + }); + if (args) { + if (args instanceof Array) { + tr.arg(args); + } + else if (typeof (args) === 'string') { + tr.line(args); + } + } + return tr.execAsync(options); +} +exports.execAsync = execAsync; +/** + * Exec a tool. Convenience wrapper over ToolRunner to exec with args in one call. + * Output will be streamed to the live console. + * Returns promise with return code + * + * @deprecated Use the {@link execAsync} method that returns a native Javascript Promise instead + * @param tool path to tool to exec + * @param args an arg string or array of args + * @param options optional exec options. See IExecOptions + * @returns number + */ +function exec(tool, args, options) { + var tr = this.tool(tool); + tr.on('debug', function (data) { + exports.debug(data); + }); + if (args) { + if (args instanceof Array) { + tr.arg(args); + } + else if (typeof (args) === 'string') { + tr.line(args); + } + } + return tr.exec(options); +} +exports.exec = exec; +/** + * Exec a tool synchronously. Convenience wrapper over ToolRunner to execSync with args in one call. + * Output will be *not* be streamed to the live console. It will be returned after execution is complete. + * Appropriate for short running tools + * Returns IExecResult with output and return code + * + * @param tool path to tool to exec + * @param args an arg string or array of args + * @param options optional exec options. See IExecSyncOptions + * @returns IExecSyncResult + */ +function execSync(tool, args, options) { + var tr = this.tool(tool); + tr.on('debug', function (data) { + exports.debug(data); + }); + if (args) { + if (args instanceof Array) { + tr.arg(args); + } + else if (typeof (args) === 'string') { + tr.line(args); + } + } + return tr.execSync(options); +} +exports.execSync = execSync; +/** + * Convenience factory to create a ToolRunner. + * + * @param tool path to tool to exec + * @returns ToolRunner + */ +function tool(tool) { + var tr = new trm.ToolRunner(tool); + tr.on('debug', function (message) { + exports.debug(message); + }); + return tr; +} +exports.tool = tool; +/** + * Applies glob patterns to a list of paths. Supports interleaved exclude patterns. + * + * @param list array of paths + * @param patterns patterns to apply. supports interleaved exclude patterns. + * @param patternRoot optional. default root to apply to unrooted patterns. not applied to basename-only patterns when matchBase:true. + * @param options optional. defaults to { dot: true, nobrace: true, nocase: process.platform == 'win32' }. + */ +function match(list, patterns, patternRoot, options) { + // trace parameters + exports.debug("patternRoot: '" + patternRoot + "'"); + options = options || _getDefaultMatchOptions(); // default match options + _debugMatchOptions(options); + // convert pattern to an array + if (typeof patterns == 'string') { + patterns = [patterns]; + } + // hashtable to keep track of matches + var map = {}; + var originalOptions = options; + for (var _i = 0, patterns_1 = patterns; _i < patterns_1.length; _i++) { + var pattern = patterns_1[_i]; + exports.debug("pattern: '" + pattern + "'"); + // trim and skip empty + pattern = (pattern || '').trim(); + if (!pattern) { + exports.debug('skipping empty pattern'); + continue; + } + // clone match options + var options_1 = im._cloneMatchOptions(originalOptions); + // skip comments + if (!options_1.nocomment && im._startsWith(pattern, '#')) { + exports.debug('skipping comment'); + continue; + } + // set nocomment - brace expansion could result in a leading '#' + options_1.nocomment = true; + // determine whether pattern is include or exclude + var negateCount = 0; + if (!options_1.nonegate) { + while (pattern.charAt(negateCount) == '!') { + negateCount++; + } + pattern = pattern.substring(negateCount); // trim leading '!' + if (negateCount) { + exports.debug("trimmed leading '!'. pattern: '" + pattern + "'"); + } + } + var isIncludePattern = negateCount == 0 || + (negateCount % 2 == 0 && !options_1.flipNegate) || + (negateCount % 2 == 1 && options_1.flipNegate); + // set nonegate - brace expansion could result in a leading '!' + options_1.nonegate = true; + options_1.flipNegate = false; + // expand braces - required to accurately root patterns + var expanded = void 0; + var preExpanded = pattern; + if (options_1.nobrace) { + expanded = [pattern]; + } + else { + // convert slashes on Windows before calling braceExpand(). unfortunately this means braces cannot + // be escaped on Windows, this limitation is consistent with current limitations of minimatch (3.0.3). + exports.debug('expanding braces'); + var convertedPattern = process.platform == 'win32' ? pattern.replace(/\\/g, '/') : pattern; + expanded = minimatch.braceExpand(convertedPattern); + } + // set nobrace + options_1.nobrace = true; + for (var _a = 0, expanded_1 = expanded; _a < expanded_1.length; _a++) { + var pattern_1 = expanded_1[_a]; + if (expanded.length != 1 || pattern_1 != preExpanded) { + exports.debug("pattern: '" + pattern_1 + "'"); + } + // trim and skip empty + pattern_1 = (pattern_1 || '').trim(); + if (!pattern_1) { + exports.debug('skipping empty pattern'); + continue; + } + // root the pattern when all of the following conditions are true: + if (patternRoot && // patternRoot supplied + !im._isRooted(pattern_1) && // AND pattern not rooted + // AND matchBase:false or not basename only + (!options_1.matchBase || (process.platform == 'win32' ? pattern_1.replace(/\\/g, '/') : pattern_1).indexOf('/') >= 0)) { + pattern_1 = im._ensureRooted(patternRoot, pattern_1); + exports.debug("rooted pattern: '" + pattern_1 + "'"); + } + if (isIncludePattern) { + // apply the pattern + exports.debug('applying include pattern against original list'); + var matchResults = minimatch.match(list, pattern_1, options_1); + exports.debug(matchResults.length + ' matches'); + // union the results + for (var _b = 0, matchResults_1 = matchResults; _b < matchResults_1.length; _b++) { + var matchResult = matchResults_1[_b]; + map[matchResult] = true; + } + } + else { + // apply the pattern + exports.debug('applying exclude pattern against original list'); + var matchResults = minimatch.match(list, pattern_1, options_1); + exports.debug(matchResults.length + ' matches'); + // substract the results + for (var _c = 0, matchResults_2 = matchResults; _c < matchResults_2.length; _c++) { + var matchResult = matchResults_2[_c]; + delete map[matchResult]; + } + } + } + } + // return a filtered version of the original list (preserves order and prevents duplication) + var result = list.filter(function (item) { return map.hasOwnProperty(item); }); + exports.debug(result.length + ' final results'); + return result; +} +exports.match = match; +/** + * Filter to apply glob patterns + * + * @param pattern pattern to apply + * @param options optional. defaults to { dot: true, nobrace: true, nocase: process.platform == 'win32' }. + */ +function filter(pattern, options) { + options = options || _getDefaultMatchOptions(); + return minimatch.filter(pattern, options); +} +exports.filter = filter; +function _debugMatchOptions(options) { + exports.debug("matchOptions.debug: '" + options.debug + "'"); + exports.debug("matchOptions.nobrace: '" + options.nobrace + "'"); + exports.debug("matchOptions.noglobstar: '" + options.noglobstar + "'"); + exports.debug("matchOptions.dot: '" + options.dot + "'"); + exports.debug("matchOptions.noext: '" + options.noext + "'"); + exports.debug("matchOptions.nocase: '" + options.nocase + "'"); + exports.debug("matchOptions.nonull: '" + options.nonull + "'"); + exports.debug("matchOptions.matchBase: '" + options.matchBase + "'"); + exports.debug("matchOptions.nocomment: '" + options.nocomment + "'"); + exports.debug("matchOptions.nonegate: '" + options.nonegate + "'"); + exports.debug("matchOptions.flipNegate: '" + options.flipNegate + "'"); +} +function _getDefaultMatchOptions() { + return { + debug: false, + nobrace: true, + noglobstar: false, + dot: true, + noext: false, + nocase: process.platform == 'win32', + nonull: false, + matchBase: false, + nocomment: false, + nonegate: false, + flipNegate: false + }; +} +/** + * Determines the find root from a list of patterns. Performs the find and then applies the glob patterns. + * Supports interleaved exclude patterns. Unrooted patterns are rooted using defaultRoot, unless + * matchOptions.matchBase is specified and the pattern is a basename only. For matchBase cases, the + * defaultRoot is used as the find root. + * + * @param defaultRoot default path to root unrooted patterns. falls back to System.DefaultWorkingDirectory or process.cwd(). + * @param patterns pattern or array of patterns to apply + * @param findOptions defaults to { followSymbolicLinks: true }. following soft links is generally appropriate unless deleting files. + * @param matchOptions defaults to { dot: true, nobrace: true, nocase: process.platform == 'win32' } + */ +function findMatch(defaultRoot, patterns, findOptions, matchOptions) { + // apply defaults for parameters and trace + defaultRoot = defaultRoot || this.getVariable('system.defaultWorkingDirectory') || process.cwd(); + exports.debug("defaultRoot: '" + defaultRoot + "'"); + patterns = patterns || []; + patterns = typeof patterns == 'string' ? [patterns] : patterns; + findOptions = findOptions || _getDefaultFindOptions(); + _debugFindOptions(findOptions); + matchOptions = matchOptions || _getDefaultMatchOptions(); + _debugMatchOptions(matchOptions); + // normalize slashes for root dir + defaultRoot = im._normalizeSeparators(defaultRoot); + var results = {}; + var originalMatchOptions = matchOptions; + for (var _i = 0, _a = (patterns || []); _i < _a.length; _i++) { + var pattern = _a[_i]; + exports.debug("pattern: '" + pattern + "'"); + // trim and skip empty + pattern = (pattern || '').trim(); + if (!pattern) { + exports.debug('skipping empty pattern'); + continue; + } + // clone match options + var matchOptions_1 = im._cloneMatchOptions(originalMatchOptions); + // skip comments + if (!matchOptions_1.nocomment && im._startsWith(pattern, '#')) { + exports.debug('skipping comment'); + continue; + } + // set nocomment - brace expansion could result in a leading '#' + matchOptions_1.nocomment = true; + // determine whether pattern is include or exclude + var negateCount = 0; + if (!matchOptions_1.nonegate) { + while (pattern.charAt(negateCount) == '!') { + negateCount++; + } + pattern = pattern.substring(negateCount); // trim leading '!' + if (negateCount) { + exports.debug("trimmed leading '!'. pattern: '" + pattern + "'"); + } + } + var isIncludePattern = negateCount == 0 || + (negateCount % 2 == 0 && !matchOptions_1.flipNegate) || + (negateCount % 2 == 1 && matchOptions_1.flipNegate); + // set nonegate - brace expansion could result in a leading '!' + matchOptions_1.nonegate = true; + matchOptions_1.flipNegate = false; + // expand braces - required to accurately interpret findPath + var expanded = void 0; + var preExpanded = pattern; + if (matchOptions_1.nobrace) { + expanded = [pattern]; + } + else { + // convert slashes on Windows before calling braceExpand(). unfortunately this means braces cannot + // be escaped on Windows, this limitation is consistent with current limitations of minimatch (3.0.3). + exports.debug('expanding braces'); + var convertedPattern = process.platform == 'win32' ? pattern.replace(/\\/g, '/') : pattern; + expanded = minimatch.braceExpand(convertedPattern); + } + // set nobrace + matchOptions_1.nobrace = true; + for (var _b = 0, expanded_2 = expanded; _b < expanded_2.length; _b++) { + var pattern_2 = expanded_2[_b]; + if (expanded.length != 1 || pattern_2 != preExpanded) { + exports.debug("pattern: '" + pattern_2 + "'"); + } + // trim and skip empty + pattern_2 = (pattern_2 || '').trim(); + if (!pattern_2) { + exports.debug('skipping empty pattern'); + continue; + } + if (isIncludePattern) { + // determine the findPath + var findInfo = im._getFindInfoFromPattern(defaultRoot, pattern_2, matchOptions_1); + var findPath = findInfo.findPath; + exports.debug("findPath: '" + findPath + "'"); + if (!findPath) { + exports.debug('skipping empty path'); + continue; + } + // perform the find + exports.debug("statOnly: '" + findInfo.statOnly + "'"); + var findResults = []; + if (findInfo.statOnly) { + // simply stat the path - all path segments were used to build the path + try { + fs.statSync(findPath); + findResults.push(findPath); + } + catch (err) { + if (err.code != 'ENOENT') { + throw err; + } + exports.debug('ENOENT'); + } + } + else { + findResults = find(findPath, findOptions); + } + exports.debug("found " + findResults.length + " paths"); + // apply the pattern + exports.debug('applying include pattern'); + if (findInfo.adjustedPattern != pattern_2) { + exports.debug("adjustedPattern: '" + findInfo.adjustedPattern + "'"); + pattern_2 = findInfo.adjustedPattern; + } + var matchResults = minimatch.match(findResults, pattern_2, matchOptions_1); + exports.debug(matchResults.length + ' matches'); + // union the results + for (var _c = 0, matchResults_3 = matchResults; _c < matchResults_3.length; _c++) { + var matchResult = matchResults_3[_c]; + var key = process.platform == 'win32' ? matchResult.toUpperCase() : matchResult; + results[key] = matchResult; + } + } + else { + // check if basename only and matchBase=true + if (matchOptions_1.matchBase && + !im._isRooted(pattern_2) && + (process.platform == 'win32' ? pattern_2.replace(/\\/g, '/') : pattern_2).indexOf('/') < 0) { + // do not root the pattern + exports.debug('matchBase and basename only'); + } + else { + // root the exclude pattern + pattern_2 = im._ensurePatternRooted(defaultRoot, pattern_2); + exports.debug("after ensurePatternRooted, pattern: '" + pattern_2 + "'"); + } + // apply the pattern + exports.debug('applying exclude pattern'); + var matchResults = minimatch.match(Object.keys(results).map(function (key) { return results[key]; }), pattern_2, matchOptions_1); + exports.debug(matchResults.length + ' matches'); + // substract the results + for (var _d = 0, matchResults_4 = matchResults; _d < matchResults_4.length; _d++) { + var matchResult = matchResults_4[_d]; + var key = process.platform == 'win32' ? matchResult.toUpperCase() : matchResult; + delete results[key]; + } + } + } + } + var finalResult = Object.keys(results) + .map(function (key) { return results[key]; }) + .sort(); + exports.debug(finalResult.length + ' final results'); + return finalResult; +} +exports.findMatch = findMatch; +/** + * Build Proxy URL in the following format: protocol://username:password@hostname:port + * @param proxyUrl Url address of the proxy server (eg: http://example.com) + * @param proxyUsername Proxy username (optional) + * @param proxyPassword Proxy password (optional) + * @returns string + */ +function getProxyFormattedUrl(proxyUrl, proxyUsername, proxyPassword) { + var parsedUrl = new URL(proxyUrl); + var proxyAddress = parsedUrl.protocol + "//" + parsedUrl.host; + if (proxyUsername) { + proxyAddress = parsedUrl.protocol + "//" + proxyUsername + ":" + proxyPassword + "@" + parsedUrl.host; + } + return proxyAddress; +} +/** + * Gets http proxy configuration used by Build/Release agent + * + * @return ProxyConfiguration + */ +function getHttpProxyConfiguration(requestUrl) { + var proxyUrl = exports.getVariable('Agent.ProxyUrl'); + if (proxyUrl && proxyUrl.length > 0) { + var proxyUsername = exports.getVariable('Agent.ProxyUsername'); + var proxyPassword = exports.getVariable('Agent.ProxyPassword'); + var proxyBypassHosts = JSON.parse(exports.getVariable('Agent.ProxyBypassList') || '[]'); + var bypass_1 = false; + if (requestUrl) { + proxyBypassHosts.forEach(function (bypassHost) { + if (new RegExp(bypassHost, 'i').test(requestUrl)) { + bypass_1 = true; + } + }); + } + if (bypass_1) { + return null; + } + else { + var proxyAddress = getProxyFormattedUrl(proxyUrl, proxyUsername, proxyPassword); + return { + proxyUrl: proxyUrl, + proxyUsername: proxyUsername, + proxyPassword: proxyPassword, + proxyBypassHosts: proxyBypassHosts, + proxyFormattedUrl: proxyAddress + }; + } + } + else { + return null; + } +} +exports.getHttpProxyConfiguration = getHttpProxyConfiguration; +/** + * Gets http certificate configuration used by Build/Release agent + * + * @return CertConfiguration + */ +function getHttpCertConfiguration() { + var ca = exports.getVariable('Agent.CAInfo'); + var clientCert = exports.getVariable('Agent.ClientCert'); + if (ca || clientCert) { + var certConfig = {}; + certConfig.caFile = ca; + certConfig.certFile = clientCert; + if (clientCert) { + var clientCertKey = exports.getVariable('Agent.ClientCertKey'); + var clientCertArchive = exports.getVariable('Agent.ClientCertArchive'); + var clientCertPassword = exports.getVariable('Agent.ClientCertPassword'); + certConfig.keyFile = clientCertKey; + certConfig.certArchiveFile = clientCertArchive; + certConfig.passphrase = clientCertPassword; + } + return certConfig; + } + else { + return null; + } +} +exports.getHttpCertConfiguration = getHttpCertConfiguration; +//----------------------------------------------------- +// Test Publisher +//----------------------------------------------------- +var TestPublisher = /** @class */ (function () { + function TestPublisher(testRunner) { + this.testRunner = testRunner; + } + TestPublisher.prototype.publish = function (resultFiles, mergeResults, platform, config, runTitle, publishRunAttachments, testRunSystem) { + // Could have used an initializer, but wanted to avoid reordering parameters when converting to strict null checks + // (A parameter cannot both be optional and have an initializer) + testRunSystem = testRunSystem || "VSTSTask"; + var properties = {}; + properties['type'] = this.testRunner; + if (mergeResults) { + properties['mergeResults'] = mergeResults; + } + if (platform) { + properties['platform'] = platform; + } + if (config) { + properties['config'] = config; + } + if (runTitle) { + properties['runTitle'] = runTitle; + } + if (publishRunAttachments) { + properties['publishRunAttachments'] = publishRunAttachments; + } + if (resultFiles) { + properties['resultFiles'] = Array.isArray(resultFiles) ? resultFiles.join() : resultFiles; + } + properties['testRunSystem'] = testRunSystem; + exports.command('results.publish', properties, ''); + }; + return TestPublisher; +}()); +exports.TestPublisher = TestPublisher; +//----------------------------------------------------- +// Code coverage Publisher +//----------------------------------------------------- +var CodeCoveragePublisher = /** @class */ (function () { + function CodeCoveragePublisher() { + } + CodeCoveragePublisher.prototype.publish = function (codeCoverageTool, summaryFileLocation, reportDirectory, additionalCodeCoverageFiles) { + var properties = {}; + if (codeCoverageTool) { + properties['codecoveragetool'] = codeCoverageTool; + } + if (summaryFileLocation) { + properties['summaryfile'] = summaryFileLocation; + } + if (reportDirectory) { + properties['reportdirectory'] = reportDirectory; + } + if (additionalCodeCoverageFiles) { + properties['additionalcodecoveragefiles'] = Array.isArray(additionalCodeCoverageFiles) ? additionalCodeCoverageFiles.join() : additionalCodeCoverageFiles; + } + exports.command('codecoverage.publish', properties, ""); + }; + return CodeCoveragePublisher; +}()); +exports.CodeCoveragePublisher = CodeCoveragePublisher; +//----------------------------------------------------- +// Code coverage Publisher +//----------------------------------------------------- +var CodeCoverageEnabler = /** @class */ (function () { + function CodeCoverageEnabler(buildTool, ccTool) { + this.buildTool = buildTool; + this.ccTool = ccTool; + } + CodeCoverageEnabler.prototype.enableCodeCoverage = function (buildProps) { + buildProps['buildtool'] = this.buildTool; + buildProps['codecoveragetool'] = this.ccTool; + exports.command('codecoverage.enable', buildProps, ""); + }; + return CodeCoverageEnabler; +}()); +exports.CodeCoverageEnabler = CodeCoverageEnabler; +//----------------------------------------------------- +// Task Logging Commands +//----------------------------------------------------- +/** + * Upload user interested file as additional log information + * to the current timeline record. + * + * The file shall be available for download along with task logs. + * + * @param path Path to the file that should be uploaded. + * @returns void + */ +function uploadFile(path) { + exports.command("task.uploadfile", null, path); +} +exports.uploadFile = uploadFile; +/** + * Instruction for the agent to update the PATH environment variable. + * The specified directory is prepended to the PATH. + * The updated environment variable will be reflected in subsequent tasks. + * + * @param path Local directory path. + * @returns void + */ +function prependPath(path) { + assertAgent("2.115.0"); + exports.command("task.prependpath", null, path); +} +exports.prependPath = prependPath; +/** + * Upload and attach summary markdown to current timeline record. + * This summary shall be added to the build/release summary and + * not available for download with logs. + * + * @param path Local directory path. + * @returns void + */ +function uploadSummary(path) { + exports.command("task.uploadsummary", null, path); +} +exports.uploadSummary = uploadSummary; +/** + * Upload and attach attachment to current timeline record. + * These files are not available for download with logs. + * These can only be referred to by extensions using the type or name values. + * + * @param type Attachment type. + * @param name Attachment name. + * @param path Attachment path. + * @returns void + */ +function addAttachment(type, name, path) { + exports.command("task.addattachment", { "type": type, "name": name }, path); +} +exports.addAttachment = addAttachment; +/** + * Set an endpoint field with given value. + * Value updated will be retained in the endpoint for + * the subsequent tasks that execute within the same job. + * + * @param id Endpoint id. + * @param field FieldType enum of AuthParameter, DataParameter or Url. + * @param key Key. + * @param value Value for key or url. + * @returns void + */ +function setEndpoint(id, field, key, value) { + exports.command("task.setendpoint", { "id": id, "field": FieldType[field].toLowerCase(), "key": key }, value); +} +exports.setEndpoint = setEndpoint; +/** + * Set progress and current operation for current task. + * + * @param percent Percentage of completion. + * @param currentOperation Current pperation. + * @returns void + */ +function setProgress(percent, currentOperation) { + exports.command("task.setprogress", { "value": "" + percent }, currentOperation); +} +exports.setProgress = setProgress; +/** + * Indicates whether to write the logging command directly to the host or to the output pipeline. + * + * @param id Timeline record Guid. + * @param parentId Parent timeline record Guid. + * @param recordType Record type. + * @param recordName Record name. + * @param order Order of timeline record. + * @param startTime Start time. + * @param finishTime End time. + * @param progress Percentage of completion. + * @param state TaskState enum of Unknown, Initialized, InProgress or Completed. + * @param result TaskResult enum of Succeeded, SucceededWithIssues, Failed, Cancelled or Skipped. + * @param message current operation + * @returns void + */ +function logDetail(id, message, parentId, recordType, recordName, order, startTime, finishTime, progress, state, result) { + var properties = { + "id": id, + "parentid": parentId, + "type": recordType, + "name": recordName, + "order": order ? order.toString() : undefined, + "starttime": startTime, + "finishtime": finishTime, + "progress": progress ? progress.toString() : undefined, + "state": state ? TaskState[state] : undefined, + "result": result ? TaskResult[result] : undefined + }; + exports.command("task.logdetail", properties, message); +} +exports.logDetail = logDetail; +/** + * Log error or warning issue to timeline record of current task. + * + * @param type IssueType enum of Error or Warning. + * @param sourcePath Source file location. + * @param lineNumber Line number. + * @param columnNumber Column number. + * @param code Error or warning code. + * @param message Error or warning message. + * @returns void + */ +function logIssue(type, message, sourcePath, lineNumber, columnNumber, errorCode) { + var properties = { + "type": IssueType[type].toLowerCase(), + "code": errorCode, + "sourcepath": sourcePath, + "linenumber": lineNumber ? lineNumber.toString() : undefined, + "columnnumber": columnNumber ? columnNumber.toString() : undefined, + }; + exports.command("task.logissue", properties, message); +} +exports.logIssue = logIssue; +//----------------------------------------------------- +// Artifact Logging Commands +//----------------------------------------------------- +/** + * Upload user interested file as additional log information + * to the current timeline record. + * + * The file shall be available for download along with task logs. + * + * @param containerFolder Folder that the file will upload to, folder will be created if needed. + * @param path Path to the file that should be uploaded. + * @param name Artifact name. + * @returns void + */ +function uploadArtifact(containerFolder, path, name) { + exports.command("artifact.upload", { "containerfolder": containerFolder, "artifactname": name }, path); +} +exports.uploadArtifact = uploadArtifact; +/** + * Create an artifact link, artifact location is required to be + * a file container path, VC path or UNC share path. + * + * The file shall be available for download along with task logs. + * + * @param name Artifact name. + * @param path Path to the file that should be associated. + * @param artifactType ArtifactType enum of Container, FilePath, VersionControl, GitRef or TfvcLabel. + * @returns void + */ +function associateArtifact(name, path, artifactType) { + exports.command("artifact.associate", { "type": ArtifactType[artifactType].toLowerCase(), "artifactname": name }, path); +} +exports.associateArtifact = associateArtifact; +//----------------------------------------------------- +// Build Logging Commands +//----------------------------------------------------- +/** + * Upload user interested log to build’s container “logs\tool” folder. + * + * @param path Path to the file that should be uploaded. + * @returns void + */ +function uploadBuildLog(path) { + exports.command("build.uploadlog", null, path); +} +exports.uploadBuildLog = uploadBuildLog; +/** + * Update build number for current build. + * + * @param value Value to be assigned as the build number. + * @returns void + */ +function updateBuildNumber(value) { + exports.command("build.updatebuildnumber", null, value); +} +exports.updateBuildNumber = updateBuildNumber; +/** + * Add a tag for current build. + * + * @param value Tag value. + * @returns void + */ +function addBuildTag(value) { + exports.command("build.addbuildtag", null, value); +} +exports.addBuildTag = addBuildTag; +//----------------------------------------------------- +// Release Logging Commands +//----------------------------------------------------- +/** + * Update release name for current release. + * + * @param value Value to be assigned as the release name. + * @returns void + */ +function updateReleaseName(name) { + assertAgent("2.132.0"); + exports.command("release.updatereleasename", null, name); +} +exports.updateReleaseName = updateReleaseName; +//----------------------------------------------------- +// Tools +//----------------------------------------------------- +exports.TaskCommand = tcm.TaskCommand; +exports.commandFromString = tcm.commandFromString; +exports.ToolRunner = trm.ToolRunner; +//----------------------------------------------------- +// Validation Checks +//----------------------------------------------------- +// async await needs generators in node 4.x+ +if (semver.lt(process.versions.node, '4.2.0')) { + exports.warning('Tasks require a new agent. Upgrade your agent or node to 4.2.0 or later', exports.IssueSource.TaskInternal); +} +//------------------------------------------------------------------- +// Populate the vault with sensitive data. Inputs and Endpoints +//------------------------------------------------------------------- +// avoid loading twice (overwrites .taskkey) +if (!global['_vsts_task_lib_loaded']) { + im._loadData(); + im._exposeProxySettings(); + im._exposeCertSettings(); +} diff --git a/task/node_modules/azure-pipelines-task-lib/taskcommand.d.ts b/task/node_modules/azure-pipelines-task-lib/taskcommand.d.ts new file mode 100644 index 0000000..ffa150c --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/taskcommand.d.ts @@ -0,0 +1,10 @@ +export declare class TaskCommand { + constructor(command: any, properties: any, message: any); + command: string; + message: string; + properties: { + [key: string]: string; + }; + toString(): string; +} +export declare function commandFromString(commandLine: any): TaskCommand; diff --git a/task/node_modules/azure-pipelines-task-lib/taskcommand.js b/task/node_modules/azure-pipelines-task-lib/taskcommand.js new file mode 100644 index 0000000..ee477e8 --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/taskcommand.js @@ -0,0 +1,103 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.commandFromString = exports.TaskCommand = void 0; +// +// Command Format: +// ##vso[artifact.command key=value;key=value]user message +// +// Examples: +// ##vso[task.progress value=58] +// ##vso[task.issue type=warning;]This is the user warning message +// +var CMD_PREFIX = '##vso['; +var TaskCommand = /** @class */ (function () { + function TaskCommand(command, properties, message) { + if (!command) { + command = 'missing.command'; + } + this.command = command; + this.properties = properties; + this.message = message; + } + TaskCommand.prototype.toString = function () { + var cmdStr = CMD_PREFIX + this.command; + if (this.properties && Object.keys(this.properties).length > 0) { + cmdStr += ' '; + for (var key in this.properties) { + if (this.properties.hasOwnProperty(key)) { + var val = this.properties[key]; + if (val) { + // safely append the val - avoid blowing up when attempting to + // call .replace() if message is not a string for some reason + cmdStr += key + '=' + escape('' + (val || '')) + ';'; + } + } + } + } + cmdStr += ']'; + // safely append the message - avoid blowing up when attempting to + // call .replace() if message is not a string for some reason + var message = '' + (this.message || ''); + cmdStr += escapedata(message); + return cmdStr; + }; + return TaskCommand; +}()); +exports.TaskCommand = TaskCommand; +function commandFromString(commandLine) { + var preLen = CMD_PREFIX.length; + var lbPos = commandLine.indexOf('['); + var rbPos = commandLine.indexOf(']'); + if (lbPos == -1 || rbPos == -1 || rbPos - lbPos < 3) { + throw new Error('Invalid command brackets'); + } + var cmdInfo = commandLine.substring(lbPos + 1, rbPos); + var spaceIdx = cmdInfo.indexOf(' '); + var command = cmdInfo; + var properties = {}; + if (spaceIdx > 0) { + command = cmdInfo.trim().substring(0, spaceIdx); + var propSection = cmdInfo.trim().substring(spaceIdx + 1); + var propLines = propSection.split(';'); + propLines.forEach(function (propLine) { + propLine = propLine.trim(); + if (propLine.length > 0) { + var eqIndex = propLine.indexOf('='); + if (eqIndex == -1) { + throw new Error('Invalid property: ' + propLine); + } + var key = propLine.substring(0, eqIndex); + var val = propLine.substring(eqIndex + 1); + properties[key] = unescape(val); + } + }); + } + var msg = unescapedata(commandLine.substring(rbPos + 1)); + var cmd = new TaskCommand(command, properties, msg); + return cmd; +} +exports.commandFromString = commandFromString; +function escapedata(s) { + return s.replace(/%/g, '%AZP25') + .replace(/\r/g, '%0D') + .replace(/\n/g, '%0A'); +} +function unescapedata(s) { + return s.replace(/%0D/g, '\r') + .replace(/%0A/g, '\n') + .replace(/%AZP25/g, '%'); +} +function escape(s) { + return s.replace(/%/g, '%AZP25') + .replace(/\r/g, '%0D') + .replace(/\n/g, '%0A') + .replace(/]/g, '%5D') + .replace(/;/g, '%3B'); +} +function unescape(s) { + return s.replace(/%0D/g, '\r') + .replace(/%0A/g, '\n') + .replace(/%5D/g, ']') + .replace(/%3B/g, ';') + .replace(/%AZP25/g, '%'); +} diff --git a/task/node_modules/azure-pipelines-task-lib/toolrunner.d.ts b/task/node_modules/azure-pipelines-task-lib/toolrunner.d.ts new file mode 100644 index 0000000..7ce6259 --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/toolrunner.d.ts @@ -0,0 +1,171 @@ +/// +import Q = require('q'); +import events = require('events'); +/** + * Interface for exec options + */ +export interface IExecOptions extends IExecSyncOptions { + /** optional. whether to fail if output to stderr. defaults to false */ + failOnStdErr?: boolean; + /** optional. defaults to failing on non zero. ignore will not fail leaving it up to the caller */ + ignoreReturnCode?: boolean; +} +/** + * Interface for execSync options + */ +export interface IExecSyncOptions { + /** optional working directory. defaults to current */ + cwd?: string; + /** optional envvar dictionary. defaults to current process's env */ + env?: { + [key: string]: string | undefined; + }; + /** optional. defaults to false */ + silent?: boolean; + /** Optional. Default is process.stdout. */ + outStream?: NodeJS.WritableStream; + /** Optional. Default is process.stderr. */ + errStream?: NodeJS.WritableStream; + /** optional. Whether to skip quoting/escaping arguments if needed. defaults to false. */ + windowsVerbatimArguments?: boolean; + /** optional. Run command inside of the shell. Defaults to false. */ + shell?: boolean; +} +/** + * Interface for exec results returned from synchronous exec functions + */ +export interface IExecSyncResult { + /** standard output */ + stdout: string; + /** error output */ + stderr: string; + /** return code */ + code: number; + /** Error on failure */ + error: Error; +} +export declare class ToolRunner extends events.EventEmitter { + constructor(toolPath: string); + private readonly cmdSpecialChars; + private toolPath; + private args; + private pipeOutputToTool; + private pipeOutputToFile; + private childProcess; + private _debug; + private _argStringToArray; + private _getCommandString; + private _processLineBuffer; + /** + * Wraps an arg string with specified char if it's not already wrapped + * @returns {string} Arg wrapped with specified char + * @param {string} arg Input argument string + * @param {string} wrapChar A char input string should be wrapped with + */ + private _wrapArg; + /** + * Unwraps an arg string wrapped with specified char + * @param arg Arg wrapped with specified char + * @param wrapChar A char to be removed + */ + private _unwrapArg; + /** + * Determine if arg string is wrapped with specified char + * @param arg Input arg string + */ + private _isWrapped; + private _getSpawnFileName; + private _getSpawnArgs; + /** + * Escape specified character. + * @param arg String to escape char in + * @param charToEscape Char should be escaped + */ + private _escapeChar; + private _isCmdFile; + /** + * Determine whether the cmd arg needs to be quoted. Returns true if arg contains any of special chars array. + * @param arg The cmd command arg. + * @param additionalChars Additional chars which should be also checked. + */ + private _needQuotesForCmd; + private _windowsQuoteCmdArg; + private _uv_quote_cmd_arg; + private _cloneExecOptions; + private _getSpawnOptions; + private _getSpawnSyncOptions; + private execWithPipingAsync; + private execWithPiping; + /** + * Add argument + * Append an argument or an array of arguments + * returns ToolRunner for chaining + * + * @param val string cmdline or array of strings + * @returns ToolRunner + */ + arg(val: string | string[]): ToolRunner; + /** + * Parses an argument line into one or more arguments + * e.g. .line('"arg one" two -z') is equivalent to .arg(['arg one', 'two', '-z']) + * returns ToolRunner for chaining + * + * @param val string argument line + * @returns ToolRunner + */ + line(val: string): ToolRunner; + /** + * Add argument(s) if a condition is met + * Wraps arg(). See arg for details + * returns ToolRunner for chaining + * + * @param condition boolean condition + * @param val string cmdline or array of strings + * @returns ToolRunner + */ + argIf(condition: unknown, val: string | string[]): ToolRunner; + /** + * Pipe output of exec() to another tool + * @param tool + * @param file optional filename to additionally stream the output to. + * @returns {ToolRunner} + */ + pipeExecOutputToTool(tool: ToolRunner, file?: string): ToolRunner; + /** + * Exec a tool. + * Output will be streamed to the live console. + * Returns promise with return code + * + * @param tool path to tool to exec + * @param options optional exec options. See IExecOptions + * @returns number + */ + execAsync(options?: IExecOptions): Promise; + /** + * Exec a tool. + * Output will be streamed to the live console. + * Returns promise with return code + * + * @deprecated Use the `execAsync` method that returns a native Javascript promise instead + * @param tool path to tool to exec + * @param options optional exec options. See IExecOptions + * @returns number + */ + exec(options?: IExecOptions): Q.Promise; + /** + * Exec a tool synchronously. + * Output will be *not* be streamed to the live console. It will be returned after execution is complete. + * Appropriate for short running tools + * Returns IExecSyncResult with output and return code + * + * @param tool path to tool to exec + * @param options optional exec options. See IExecSyncOptions + * @returns IExecSyncResult + */ + execSync(options?: IExecSyncOptions): IExecSyncResult; + /** + * Used to close child process by sending SIGNINT signal. + * It allows executed script to have some additional logic on SIGINT, before exiting. + */ + killChildProcess(): void; +} diff --git a/task/node_modules/azure-pipelines-task-lib/toolrunner.js b/task/node_modules/azure-pipelines-task-lib/toolrunner.js new file mode 100644 index 0000000..2b43750 --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/toolrunner.js @@ -0,0 +1,1244 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ToolRunner = void 0; +var Q = require("q"); +var os = require("os"); +var events = require("events"); +var child = require("child_process"); +var im = require("./internal"); +var fs = require("fs"); +var ToolRunner = /** @class */ (function (_super) { + __extends(ToolRunner, _super); + function ToolRunner(toolPath) { + var _this = _super.call(this) || this; + _this.cmdSpecialChars = [' ', '\t', '&', '(', ')', '[', ']', '{', '}', '^', '=', ';', '!', '\'', '+', ',', '`', '~', '|', '<', '>', '"']; + if (!toolPath) { + throw new Error('Parameter \'toolPath\' cannot be null or empty.'); + } + _this.toolPath = im._which(toolPath, true); + _this.args = []; + _this._debug('toolRunner toolPath: ' + toolPath); + return _this; + } + ToolRunner.prototype._debug = function (message) { + this.emit('debug', message); + }; + ToolRunner.prototype._argStringToArray = function (argString) { + var args = []; + var inQuotes = false; + var escaped = false; + var lastCharWasSpace = true; + var arg = ''; + var append = function (c) { + // we only escape double quotes. + if (escaped) { + if (c !== '"') { + arg += '\\'; + } + else { + arg.slice(0, -1); + } + } + arg += c; + escaped = false; + }; + for (var i = 0; i < argString.length; i++) { + var c = argString.charAt(i); + if (c === ' ' && !inQuotes) { + if (!lastCharWasSpace) { + args.push(arg); + arg = ''; + } + lastCharWasSpace = true; + continue; + } + else { + lastCharWasSpace = false; + } + if (c === '"') { + if (!escaped) { + inQuotes = !inQuotes; + } + else { + append(c); + } + continue; + } + if (c === "\\" && escaped) { + append(c); + continue; + } + if (c === "\\" && inQuotes) { + escaped = true; + continue; + } + append(c); + lastCharWasSpace = false; + } + if (!lastCharWasSpace) { + args.push(arg.trim()); + } + return args; + }; + ToolRunner.prototype._getCommandString = function (options, noPrefix) { + var _this = this; + var toolPath = this._getSpawnFileName(); + var args = this._getSpawnArgs(options); + var cmd = noPrefix ? '' : '[command]'; // omit prefix when piped to a second tool + var commandParts = []; + if (process.platform == 'win32') { + // Windows + cmd file + if (this._isCmdFile()) { + commandParts.push(toolPath); + commandParts = commandParts.concat(args); + } + // Windows + verbatim + else if (options.windowsVerbatimArguments) { + commandParts.push("\"" + toolPath + "\""); + commandParts = commandParts.concat(args); + } + else if (options.shell) { + commandParts.push(this._windowsQuoteCmdArg(toolPath)); + commandParts = commandParts.concat(args); + } + // Windows (regular) + else { + commandParts.push(this._windowsQuoteCmdArg(toolPath)); + commandParts = commandParts.concat(args.map(function (arg) { return _this._windowsQuoteCmdArg(arg); })); + } + } + else { + // OSX/Linux - this can likely be improved with some form of quoting. + // creating processes on Unix is fundamentally different than Windows. + // on Unix, execvp() takes an arg array. + commandParts.push(toolPath); + commandParts = commandParts.concat(args); + } + cmd += commandParts.join(' '); + // append second tool + if (this.pipeOutputToTool) { + cmd += ' | ' + this.pipeOutputToTool._getCommandString(options, /*noPrefix:*/ true); + } + return cmd; + }; + ToolRunner.prototype._processLineBuffer = function (data, strBuffer, onLine) { + try { + var s = strBuffer + data.toString(); + var n = s.indexOf(os.EOL); + while (n > -1) { + var line = s.substring(0, n); + onLine(line); + // the rest of the string ... + s = s.substring(n + os.EOL.length); + n = s.indexOf(os.EOL); + } + strBuffer = s; + } + catch (err) { + // streaming lines to console is best effort. Don't fail a build. + this._debug('error processing line'); + } + }; + /** + * Wraps an arg string with specified char if it's not already wrapped + * @returns {string} Arg wrapped with specified char + * @param {string} arg Input argument string + * @param {string} wrapChar A char input string should be wrapped with + */ + ToolRunner.prototype._wrapArg = function (arg, wrapChar) { + if (!this._isWrapped(arg, wrapChar)) { + return "" + wrapChar + arg + wrapChar; + } + return arg; + }; + /** + * Unwraps an arg string wrapped with specified char + * @param arg Arg wrapped with specified char + * @param wrapChar A char to be removed + */ + ToolRunner.prototype._unwrapArg = function (arg, wrapChar) { + if (this._isWrapped(arg, wrapChar)) { + var pattern = new RegExp("(^\\\\?" + wrapChar + ")|(\\\\?" + wrapChar + "$)", 'g'); + return arg.trim().replace(pattern, ''); + } + return arg; + }; + /** + * Determine if arg string is wrapped with specified char + * @param arg Input arg string + */ + ToolRunner.prototype._isWrapped = function (arg, wrapChar) { + var pattern = new RegExp("^\\\\?" + wrapChar + ".+\\\\?" + wrapChar + "$"); + return pattern.test(arg.trim()); + }; + ToolRunner.prototype._getSpawnFileName = function (options) { + if (process.platform == 'win32') { + if (this._isCmdFile()) { + return process.env['COMSPEC'] || 'cmd.exe'; + } + } + if (options && options.shell) { + return this._wrapArg(this.toolPath, '"'); + } + return this.toolPath; + }; + ToolRunner.prototype._getSpawnArgs = function (options) { + var _this = this; + if (process.platform == 'win32') { + if (this._isCmdFile()) { + var argline = "/D /S /C \"" + this._windowsQuoteCmdArg(this.toolPath); + for (var i = 0; i < this.args.length; i++) { + argline += ' '; + argline += options.windowsVerbatimArguments ? this.args[i] : this._windowsQuoteCmdArg(this.args[i]); + } + argline += '"'; + return [argline]; + } + if (options.windowsVerbatimArguments) { + // note, in Node 6.x options.argv0 can be used instead of overriding args.slice and args.unshift. + // for more details, refer to https://github.com/nodejs/node/blob/v6.x/lib/child_process.js + var args_1 = this.args.slice(0); // copy the array + // override slice to prevent Node from creating a copy of the arg array. + // we need Node to use the "unshift" override below. + args_1.slice = function () { + if (arguments.length != 1 || arguments[0] != 0) { + throw new Error('Unexpected arguments passed to args.slice when windowsVerbatimArguments flag is set.'); + } + return args_1; + }; + // override unshift + // + // when using the windowsVerbatimArguments option, Node does not quote the tool path when building + // the cmdline parameter for the win32 function CreateProcess(). an unquoted space in the tool path + // causes problems for tools when attempting to parse their own command line args. tools typically + // assume their arguments begin after arg 0. + // + // by hijacking unshift, we can quote the tool path when it pushed onto the args array. Node builds + // the cmdline parameter from the args array. + // + // note, we can't simply pass a quoted tool path to Node for multiple reasons: + // 1) Node verifies the file exists (calls win32 function GetFileAttributesW) and the check returns + // false if the path is quoted. + // 2) Node passes the tool path as the application parameter to CreateProcess, which expects the + // path to be unquoted. + // + // also note, in addition to the tool path being embedded within the cmdline parameter, Node also + // passes the tool path to CreateProcess via the application parameter (optional parameter). when + // present, Windows uses the application parameter to determine which file to run, instead of + // interpreting the file from the cmdline parameter. + args_1.unshift = function () { + if (arguments.length != 1) { + throw new Error('Unexpected arguments passed to args.unshift when windowsVerbatimArguments flag is set.'); + } + return Array.prototype.unshift.call(args_1, "\"" + arguments[0] + "\""); // quote the file name + }; + return args_1; + } + else if (options.shell) { + var args = []; + for (var _i = 0, _a = this.args; _i < _a.length; _i++) { + var arg = _a[_i]; + if (this._needQuotesForCmd(arg, '%')) { + args.push(this._wrapArg(arg, '"')); + } + else { + args.push(arg); + } + } + return args; + } + } + else if (options.shell) { + return this.args.map(function (arg) { + if (_this._isWrapped(arg, "'")) { + return arg; + } + // remove wrapping double quotes to avoid escaping + arg = _this._unwrapArg(arg, '"'); + arg = _this._escapeChar(arg, '"'); + return _this._wrapArg(arg, '"'); + }); + } + return this.args; + }; + /** + * Escape specified character. + * @param arg String to escape char in + * @param charToEscape Char should be escaped + */ + ToolRunner.prototype._escapeChar = function (arg, charToEscape) { + var escChar = "\\"; + var output = ''; + var charIsEscaped = false; + for (var _i = 0, arg_1 = arg; _i < arg_1.length; _i++) { + var char = arg_1[_i]; + if (char === charToEscape && !charIsEscaped) { + output += escChar + char; + } + else { + output += char; + } + charIsEscaped = char === escChar && !charIsEscaped; + } + return output; + }; + ToolRunner.prototype._isCmdFile = function () { + var upperToolPath = this.toolPath.toUpperCase(); + return im._endsWith(upperToolPath, '.CMD') || im._endsWith(upperToolPath, '.BAT'); + }; + /** + * Determine whether the cmd arg needs to be quoted. Returns true if arg contains any of special chars array. + * @param arg The cmd command arg. + * @param additionalChars Additional chars which should be also checked. + */ + ToolRunner.prototype._needQuotesForCmd = function (arg, additionalChars) { + var specialChars = this.cmdSpecialChars; + if (additionalChars) { + specialChars = this.cmdSpecialChars.concat(additionalChars); + } + var _loop_1 = function (char) { + if (specialChars.some(function (x) { return x === char; })) { + return { value: true }; + } + }; + for (var _i = 0, arg_2 = arg; _i < arg_2.length; _i++) { + var char = arg_2[_i]; + var state_1 = _loop_1(char); + if (typeof state_1 === "object") + return state_1.value; + } + return false; + }; + ToolRunner.prototype._windowsQuoteCmdArg = function (arg) { + // for .exe, apply the normal quoting rules that libuv applies + if (!this._isCmdFile()) { + return this._uv_quote_cmd_arg(arg); + } + // otherwise apply quoting rules specific to the cmd.exe command line parser. + // the libuv rules are generic and are not designed specifically for cmd.exe + // command line parser. + // + // for a detailed description of the cmd.exe command line parser, refer to + // http://stackoverflow.com/questions/4094699/how-does-the-windows-command-interpreter-cmd-exe-parse-scripts/7970912#7970912 + // need quotes for empty arg + if (!arg) { + return '""'; + } + // determine whether the arg needs to be quoted + var needsQuotes = this._needQuotesForCmd(arg); + // short-circuit if quotes not needed + if (!needsQuotes) { + return arg; + } + // the following quoting rules are very similar to the rules that by libuv applies. + // + // 1) wrap the string in quotes + // + // 2) double-up quotes - i.e. " => "" + // + // this is different from the libuv quoting rules. libuv replaces " with \", which unfortunately + // doesn't work well with a cmd.exe command line. + // + // note, replacing " with "" also works well if the arg is passed to a downstream .NET console app. + // for example, the command line: + // foo.exe "myarg:""my val""" + // is parsed by a .NET console app into an arg array: + // [ "myarg:\"my val\"" ] + // which is the same end result when applying libuv quoting rules. although the actual + // command line from libuv quoting rules would look like: + // foo.exe "myarg:\"my val\"" + // + // 3) double-up slashes that preceed a quote, + // e.g. hello \world => "hello \world" + // hello\"world => "hello\\""world" + // hello\\"world => "hello\\\\""world" + // hello world\ => "hello world\\" + // + // technically this is not required for a cmd.exe command line, or the batch argument parser. + // the reasons for including this as a .cmd quoting rule are: + // + // a) this is optimized for the scenario where the argument is passed from the .cmd file to an + // external program. many programs (e.g. .NET console apps) rely on the slash-doubling rule. + // + // b) it's what we've been doing previously (by deferring to node default behavior) and we + // haven't heard any complaints about that aspect. + // + // note, a weakness of the quoting rules chosen here, is that % is not escaped. in fact, % cannot be + // escaped when used on the command line directly - even though within a .cmd file % can be escaped + // by using %%. + // + // the saving grace is, on the command line, %var% is left as-is if var is not defined. this contrasts + // the line parsing rules within a .cmd file, where if var is not defined it is replaced with nothing. + // + // one option that was explored was replacing % with ^% - i.e. %var% => ^%var^%. this hack would + // often work, since it is unlikely that var^ would exist, and the ^ character is removed when the + // variable is used. the problem, however, is that ^ is not removed when %* is used to pass the args + // to an external program. + // + // an unexplored potential solution for the % escaping problem, is to create a wrapper .cmd file. + // % can be escaped within a .cmd file. + var reverse = '"'; + var quote_hit = true; + for (var i = arg.length; i > 0; i--) { // walk the string in reverse + reverse += arg[i - 1]; + if (quote_hit && arg[i - 1] == '\\') { + reverse += '\\'; // double the slash + } + else if (arg[i - 1] == '"') { + quote_hit = true; + reverse += '"'; // double the quote + } + else { + quote_hit = false; + } + } + reverse += '"'; + return reverse.split('').reverse().join(''); + }; + ToolRunner.prototype._uv_quote_cmd_arg = function (arg) { + // Tool runner wraps child_process.spawn() and needs to apply the same quoting as + // Node in certain cases where the undocumented spawn option windowsVerbatimArguments + // is used. + // + // Since this function is a port of quote_cmd_arg from Node 4.x (technically, lib UV, + // see https://github.com/nodejs/node/blob/v4.x/deps/uv/src/win/process.c for details), + // pasting copyright notice from Node within this function: + // + // Copyright Joyent, Inc. and other Node contributors. All rights reserved. + // + // Permission is hereby granted, free of charge, to any person obtaining a copy + // of this software and associated documentation files (the "Software"), to + // deal in the Software without restriction, including without limitation the + // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + // sell copies of the Software, and to permit persons to whom the Software is + // furnished to do so, subject to the following conditions: + // + // The above copyright notice and this permission notice shall be included in + // all copies or substantial portions of the Software. + // + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + // IN THE SOFTWARE. + if (!arg) { + // Need double quotation for empty argument + return '""'; + } + if (arg.indexOf(' ') < 0 && arg.indexOf('\t') < 0 && arg.indexOf('"') < 0) { + // No quotation needed + return arg; + } + if (arg.indexOf('"') < 0 && arg.indexOf('\\') < 0) { + // No embedded double quotes or backslashes, so I can just wrap + // quote marks around the whole thing. + return "\"" + arg + "\""; + } + // Expected input/output: + // input : hello"world + // output: "hello\"world" + // input : hello""world + // output: "hello\"\"world" + // input : hello\world + // output: hello\world + // input : hello\\world + // output: hello\\world + // input : hello\"world + // output: "hello\\\"world" + // input : hello\\"world + // output: "hello\\\\\"world" + // input : hello world\ + // output: "hello world\\" - note the comment in libuv actually reads "hello world\" + // but it appears the comment is wrong, it should be "hello world\\" + var reverse = '"'; + var quote_hit = true; + for (var i = arg.length; i > 0; i--) { // walk the string in reverse + reverse += arg[i - 1]; + if (quote_hit && arg[i - 1] == '\\') { + reverse += '\\'; + } + else if (arg[i - 1] == '"') { + quote_hit = true; + reverse += '\\'; + } + else { + quote_hit = false; + } + } + reverse += '"'; + return reverse.split('').reverse().join(''); + }; + ToolRunner.prototype._cloneExecOptions = function (options) { + options = options || {}; + var result = { + cwd: options.cwd || process.cwd(), + env: options.env || process.env, + silent: options.silent || false, + failOnStdErr: options.failOnStdErr || false, + ignoreReturnCode: options.ignoreReturnCode || false, + windowsVerbatimArguments: options.windowsVerbatimArguments || false, + shell: options.shell || false + }; + result.outStream = options.outStream || process.stdout; + result.errStream = options.errStream || process.stderr; + return result; + }; + ToolRunner.prototype._getSpawnOptions = function (options) { + options = options || {}; + var result = {}; + result.cwd = options.cwd; + result.env = options.env; + result.shell = options.shell; + result['windowsVerbatimArguments'] = options.windowsVerbatimArguments || this._isCmdFile(); + return result; + }; + ToolRunner.prototype._getSpawnSyncOptions = function (options) { + var result = {}; + result.maxBuffer = 1024 * 1024 * 1024; + result.cwd = options.cwd; + result.env = options.env; + result.shell = options.shell; + result['windowsVerbatimArguments'] = options.windowsVerbatimArguments || this._isCmdFile(); + return result; + }; + ToolRunner.prototype.execWithPipingAsync = function (pipeOutputToTool, options) { + var _this = this; + this._debug('exec tool: ' + this.toolPath); + this._debug('arguments:'); + this.args.forEach(function (arg) { + _this._debug(' ' + arg); + }); + var success = true; + var optionsNonNull = this._cloneExecOptions(options); + if (!optionsNonNull.silent) { + optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os.EOL); + } + var cp; + var toolPath = pipeOutputToTool.toolPath; + var toolPathFirst; + var successFirst = true; + var returnCodeFirst; + var fileStream; + var waitingEvents = 0; // number of process or stream events we are waiting on to complete + var returnCode = 0; + var error; + toolPathFirst = this.toolPath; + // Following node documentation example from this link on how to pipe output of one process to another + // https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options + //start the child process for both tools + waitingEvents++; + var cpFirst = child.spawn(this._getSpawnFileName(optionsNonNull), this._getSpawnArgs(optionsNonNull), this._getSpawnOptions(optionsNonNull)); + waitingEvents++; + cp = child.spawn(pipeOutputToTool._getSpawnFileName(optionsNonNull), pipeOutputToTool._getSpawnArgs(optionsNonNull), pipeOutputToTool._getSpawnOptions(optionsNonNull)); + fileStream = this.pipeOutputToFile ? fs.createWriteStream(this.pipeOutputToFile) : null; + return new Promise(function (resolve, reject) { + var _a, _b, _c, _d; + if (fileStream) { + waitingEvents++; + fileStream.on('finish', function () { + waitingEvents--; //file write is complete + fileStream = null; + if (waitingEvents == 0) { + if (error) { + reject(error); + } + else { + resolve(returnCode); + } + } + }); + fileStream.on('error', function (err) { + waitingEvents--; //there were errors writing to the file, write is done + _this._debug("Failed to pipe output of " + toolPathFirst + " to file " + _this.pipeOutputToFile + ". Error = " + err); + fileStream = null; + if (waitingEvents == 0) { + if (error) { + reject(error); + } + else { + resolve(returnCode); + } + } + }); + } + //pipe stdout of first tool to stdin of second tool + (_a = cpFirst.stdout) === null || _a === void 0 ? void 0 : _a.on('data', function (data) { + var _a; + try { + if (fileStream) { + fileStream.write(data); + } + (_a = cp.stdin) === null || _a === void 0 ? void 0 : _a.write(data); + } + catch (err) { + _this._debug('Failed to pipe output of ' + toolPathFirst + ' to ' + toolPath); + _this._debug(toolPath + ' might have exited due to errors prematurely. Verify the arguments passed are valid.'); + } + }); + (_b = cpFirst.stderr) === null || _b === void 0 ? void 0 : _b.on('data', function (data) { + if (fileStream) { + fileStream.write(data); + } + successFirst = !optionsNonNull.failOnStdErr; + if (!optionsNonNull.silent) { + var s = optionsNonNull.failOnStdErr ? optionsNonNull.errStream : optionsNonNull.outStream; + s.write(data); + } + }); + cpFirst.on('error', function (err) { + var _a; + waitingEvents--; //first process is complete with errors + if (fileStream) { + fileStream.end(); + } + (_a = cp.stdin) === null || _a === void 0 ? void 0 : _a.end(); + error = new Error(toolPathFirst + ' failed. ' + err.message); + if (waitingEvents == 0) { + reject(error); + } + }); + cpFirst.on('close', function (code, signal) { + var _a; + waitingEvents--; //first process is complete + if (code != 0 && !optionsNonNull.ignoreReturnCode) { + successFirst = false; + returnCodeFirst = code; + returnCode = returnCodeFirst; + } + _this._debug('success of first tool:' + successFirst); + if (fileStream) { + fileStream.end(); + } + (_a = cp.stdin) === null || _a === void 0 ? void 0 : _a.end(); + if (waitingEvents == 0) { + if (error) { + reject(error); + } + else { + resolve(returnCode); + } + } + }); + var stdbuffer = ''; + (_c = cp.stdout) === null || _c === void 0 ? void 0 : _c.on('data', function (data) { + _this.emit('stdout', data); + if (!optionsNonNull.silent) { + optionsNonNull.outStream.write(data); + } + _this._processLineBuffer(data, stdbuffer, function (line) { + _this.emit('stdline', line); + }); + }); + var errbuffer = ''; + (_d = cp.stderr) === null || _d === void 0 ? void 0 : _d.on('data', function (data) { + _this.emit('stderr', data); + success = !optionsNonNull.failOnStdErr; + if (!optionsNonNull.silent) { + var s = optionsNonNull.failOnStdErr ? optionsNonNull.errStream : optionsNonNull.outStream; + s.write(data); + } + _this._processLineBuffer(data, errbuffer, function (line) { + _this.emit('errline', line); + }); + }); + cp.on('error', function (err) { + waitingEvents--; //process is done with errors + error = new Error(toolPath + ' failed. ' + err.message); + if (waitingEvents == 0) { + reject(error); + } + }); + cp.on('close', function (code, signal) { + waitingEvents--; //process is complete + _this._debug('rc:' + code); + returnCode = code; + if (stdbuffer.length > 0) { + _this.emit('stdline', stdbuffer); + } + if (errbuffer.length > 0) { + _this.emit('errline', errbuffer); + } + if (code != 0 && !optionsNonNull.ignoreReturnCode) { + success = false; + } + _this._debug('success:' + success); + if (!successFirst) { //in the case output is piped to another tool, check exit code of both tools + error = new Error(toolPathFirst + ' failed with return code: ' + returnCodeFirst); + } + else if (!success) { + error = new Error(toolPath + ' failed with return code: ' + code); + } + if (waitingEvents == 0) { + if (error) { + reject(error); + } + else { + resolve(returnCode); + } + } + }); + }); + }; + ToolRunner.prototype.execWithPiping = function (pipeOutputToTool, options) { + var _this = this; + var _a, _b, _c, _d; + var defer = Q.defer(); + this._debug('exec tool: ' + this.toolPath); + this._debug('arguments:'); + this.args.forEach(function (arg) { + _this._debug(' ' + arg); + }); + var success = true; + var optionsNonNull = this._cloneExecOptions(options); + if (!optionsNonNull.silent) { + optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os.EOL); + } + var cp; + var toolPath = pipeOutputToTool.toolPath; + var toolPathFirst; + var successFirst = true; + var returnCodeFirst; + var fileStream; + var waitingEvents = 0; // number of process or stream events we are waiting on to complete + var returnCode = 0; + var error; + toolPathFirst = this.toolPath; + // Following node documentation example from this link on how to pipe output of one process to another + // https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options + //start the child process for both tools + waitingEvents++; + var cpFirst = child.spawn(this._getSpawnFileName(optionsNonNull), this._getSpawnArgs(optionsNonNull), this._getSpawnOptions(optionsNonNull)); + waitingEvents++; + cp = child.spawn(pipeOutputToTool._getSpawnFileName(optionsNonNull), pipeOutputToTool._getSpawnArgs(optionsNonNull), pipeOutputToTool._getSpawnOptions(optionsNonNull)); + fileStream = this.pipeOutputToFile ? fs.createWriteStream(this.pipeOutputToFile) : null; + if (fileStream) { + waitingEvents++; + fileStream.on('finish', function () { + waitingEvents--; //file write is complete + fileStream = null; + if (waitingEvents == 0) { + if (error) { + defer.reject(error); + } + else { + defer.resolve(returnCode); + } + } + }); + fileStream.on('error', function (err) { + waitingEvents--; //there were errors writing to the file, write is done + _this._debug("Failed to pipe output of " + toolPathFirst + " to file " + _this.pipeOutputToFile + ". Error = " + err); + fileStream = null; + if (waitingEvents == 0) { + if (error) { + defer.reject(error); + } + else { + defer.resolve(returnCode); + } + } + }); + } + //pipe stdout of first tool to stdin of second tool + (_a = cpFirst.stdout) === null || _a === void 0 ? void 0 : _a.on('data', function (data) { + var _a; + try { + if (fileStream) { + fileStream.write(data); + } + (_a = cp.stdin) === null || _a === void 0 ? void 0 : _a.write(data); + } + catch (err) { + _this._debug('Failed to pipe output of ' + toolPathFirst + ' to ' + toolPath); + _this._debug(toolPath + ' might have exited due to errors prematurely. Verify the arguments passed are valid.'); + } + }); + (_b = cpFirst.stderr) === null || _b === void 0 ? void 0 : _b.on('data', function (data) { + if (fileStream) { + fileStream.write(data); + } + successFirst = !optionsNonNull.failOnStdErr; + if (!optionsNonNull.silent) { + var s = optionsNonNull.failOnStdErr ? optionsNonNull.errStream : optionsNonNull.outStream; + s.write(data); + } + }); + cpFirst.on('error', function (err) { + var _a; + waitingEvents--; //first process is complete with errors + if (fileStream) { + fileStream.end(); + } + (_a = cp.stdin) === null || _a === void 0 ? void 0 : _a.end(); + error = new Error(toolPathFirst + ' failed. ' + err.message); + if (waitingEvents == 0) { + defer.reject(error); + } + }); + cpFirst.on('close', function (code, signal) { + var _a; + waitingEvents--; //first process is complete + if (code != 0 && !optionsNonNull.ignoreReturnCode) { + successFirst = false; + returnCodeFirst = code; + returnCode = returnCodeFirst; + } + _this._debug('success of first tool:' + successFirst); + if (fileStream) { + fileStream.end(); + } + (_a = cp.stdin) === null || _a === void 0 ? void 0 : _a.end(); + if (waitingEvents == 0) { + if (error) { + defer.reject(error); + } + else { + defer.resolve(returnCode); + } + } + }); + var stdbuffer = ''; + (_c = cp.stdout) === null || _c === void 0 ? void 0 : _c.on('data', function (data) { + _this.emit('stdout', data); + if (!optionsNonNull.silent) { + optionsNonNull.outStream.write(data); + } + _this._processLineBuffer(data, stdbuffer, function (line) { + _this.emit('stdline', line); + }); + }); + var errbuffer = ''; + (_d = cp.stderr) === null || _d === void 0 ? void 0 : _d.on('data', function (data) { + _this.emit('stderr', data); + success = !optionsNonNull.failOnStdErr; + if (!optionsNonNull.silent) { + var s = optionsNonNull.failOnStdErr ? optionsNonNull.errStream : optionsNonNull.outStream; + s.write(data); + } + _this._processLineBuffer(data, errbuffer, function (line) { + _this.emit('errline', line); + }); + }); + cp.on('error', function (err) { + waitingEvents--; //process is done with errors + error = new Error(toolPath + ' failed. ' + err.message); + if (waitingEvents == 0) { + defer.reject(error); + } + }); + cp.on('close', function (code, signal) { + waitingEvents--; //process is complete + _this._debug('rc:' + code); + returnCode = code; + if (stdbuffer.length > 0) { + _this.emit('stdline', stdbuffer); + } + if (errbuffer.length > 0) { + _this.emit('errline', errbuffer); + } + if (code != 0 && !optionsNonNull.ignoreReturnCode) { + success = false; + } + _this._debug('success:' + success); + if (!successFirst) { //in the case output is piped to another tool, check exit code of both tools + error = new Error(toolPathFirst + ' failed with return code: ' + returnCodeFirst); + } + else if (!success) { + error = new Error(toolPath + ' failed with return code: ' + code); + } + if (waitingEvents == 0) { + if (error) { + defer.reject(error); + } + else { + defer.resolve(returnCode); + } + } + }); + return defer.promise; + }; + /** + * Add argument + * Append an argument or an array of arguments + * returns ToolRunner for chaining + * + * @param val string cmdline or array of strings + * @returns ToolRunner + */ + ToolRunner.prototype.arg = function (val) { + if (!val) { + return this; + } + if (val instanceof Array) { + this._debug(this.toolPath + ' arg: ' + JSON.stringify(val)); + this.args = this.args.concat(val); + } + else if (typeof (val) === 'string') { + this._debug(this.toolPath + ' arg: ' + val); + this.args = this.args.concat(val.trim()); + } + return this; + }; + /** + * Parses an argument line into one or more arguments + * e.g. .line('"arg one" two -z') is equivalent to .arg(['arg one', 'two', '-z']) + * returns ToolRunner for chaining + * + * @param val string argument line + * @returns ToolRunner + */ + ToolRunner.prototype.line = function (val) { + if (!val) { + return this; + } + this._debug(this.toolPath + ' arg: ' + val); + this.args = this.args.concat(this._argStringToArray(val)); + return this; + }; + /** + * Add argument(s) if a condition is met + * Wraps arg(). See arg for details + * returns ToolRunner for chaining + * + * @param condition boolean condition + * @param val string cmdline or array of strings + * @returns ToolRunner + */ + ToolRunner.prototype.argIf = function (condition, val) { + if (condition) { + this.arg(val); + } + return this; + }; + /** + * Pipe output of exec() to another tool + * @param tool + * @param file optional filename to additionally stream the output to. + * @returns {ToolRunner} + */ + ToolRunner.prototype.pipeExecOutputToTool = function (tool, file) { + this.pipeOutputToTool = tool; + this.pipeOutputToFile = file; + return this; + }; + /** + * Exec a tool. + * Output will be streamed to the live console. + * Returns promise with return code + * + * @param tool path to tool to exec + * @param options optional exec options. See IExecOptions + * @returns number + */ + ToolRunner.prototype.execAsync = function (options) { + var _this = this; + var _a, _b, _c; + if (this.pipeOutputToTool) { + return this.execWithPipingAsync(this.pipeOutputToTool, options); + } + this._debug('exec tool: ' + this.toolPath); + this._debug('arguments:'); + this.args.forEach(function (arg) { + _this._debug(' ' + arg); + }); + var optionsNonNull = this._cloneExecOptions(options); + if (!optionsNonNull.silent) { + optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os.EOL); + } + var state = new ExecState(optionsNonNull, this.toolPath); + state.on('debug', function (message) { + _this._debug(message); + }); + var cp = child.spawn(this._getSpawnFileName(options), this._getSpawnArgs(optionsNonNull), this._getSpawnOptions(options)); + this.childProcess = cp; + // it is possible for the child process to end its last line without a new line. + // because stdout is buffered, this causes the last line to not get sent to the parent + // stream. Adding this event forces a flush before the child streams are closed. + (_a = cp.stdout) === null || _a === void 0 ? void 0 : _a.on('finish', function () { + if (!optionsNonNull.silent) { + optionsNonNull.outStream.write(os.EOL); + } + }); + var stdbuffer = ''; + (_b = cp.stdout) === null || _b === void 0 ? void 0 : _b.on('data', function (data) { + _this.emit('stdout', data); + if (!optionsNonNull.silent) { + optionsNonNull.outStream.write(data); + } + _this._processLineBuffer(data, stdbuffer, function (line) { + _this.emit('stdline', line); + }); + }); + var errbuffer = ''; + (_c = cp.stderr) === null || _c === void 0 ? void 0 : _c.on('data', function (data) { + state.processStderr = true; + _this.emit('stderr', data); + if (!optionsNonNull.silent) { + var s = optionsNonNull.failOnStdErr ? optionsNonNull.errStream : optionsNonNull.outStream; + s.write(data); + } + _this._processLineBuffer(data, errbuffer, function (line) { + _this.emit('errline', line); + }); + }); + cp.on('error', function (err) { + state.processError = err.message; + state.processExited = true; + state.processClosed = true; + state.CheckComplete(); + }); + cp.on('exit', function (code, signal) { + state.processExitCode = code; + state.processExited = true; + _this._debug("Exit code " + code + " received from tool '" + _this.toolPath + "'"); + state.CheckComplete(); + }); + cp.on('close', function (code, signal) { + state.processExitCode = code; + state.processExited = true; + state.processClosed = true; + _this._debug("STDIO streams have closed for tool '" + _this.toolPath + "'"); + state.CheckComplete(); + }); + return new Promise(function (resolve, reject) { + state.on('done', function (error, exitCode) { + if (stdbuffer.length > 0) { + _this.emit('stdline', stdbuffer); + } + if (errbuffer.length > 0) { + _this.emit('errline', errbuffer); + } + cp.removeAllListeners(); + if (error) { + reject(error); + } + else { + resolve(exitCode); + } + }); + }); + }; + /** + * Exec a tool. + * Output will be streamed to the live console. + * Returns promise with return code + * + * @deprecated Use the `execAsync` method that returns a native Javascript promise instead + * @param tool path to tool to exec + * @param options optional exec options. See IExecOptions + * @returns number + */ + ToolRunner.prototype.exec = function (options) { + var _this = this; + var _a, _b, _c; + if (this.pipeOutputToTool) { + return this.execWithPiping(this.pipeOutputToTool, options); + } + var defer = Q.defer(); + this._debug('exec tool: ' + this.toolPath); + this._debug('arguments:'); + this.args.forEach(function (arg) { + _this._debug(' ' + arg); + }); + var optionsNonNull = this._cloneExecOptions(options); + if (!optionsNonNull.silent) { + optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os.EOL); + } + var state = new ExecState(optionsNonNull, this.toolPath); + state.on('debug', function (message) { + _this._debug(message); + }); + var cp = child.spawn(this._getSpawnFileName(options), this._getSpawnArgs(optionsNonNull), this._getSpawnOptions(options)); + this.childProcess = cp; + // it is possible for the child process to end its last line without a new line. + // because stdout is buffered, this causes the last line to not get sent to the parent + // stream. Adding this event forces a flush before the child streams are closed. + (_a = cp.stdout) === null || _a === void 0 ? void 0 : _a.on('finish', function () { + if (!optionsNonNull.silent) { + optionsNonNull.outStream.write(os.EOL); + } + }); + var stdbuffer = ''; + (_b = cp.stdout) === null || _b === void 0 ? void 0 : _b.on('data', function (data) { + _this.emit('stdout', data); + if (!optionsNonNull.silent) { + optionsNonNull.outStream.write(data); + } + _this._processLineBuffer(data, stdbuffer, function (line) { + _this.emit('stdline', line); + }); + }); + var errbuffer = ''; + (_c = cp.stderr) === null || _c === void 0 ? void 0 : _c.on('data', function (data) { + state.processStderr = true; + _this.emit('stderr', data); + if (!optionsNonNull.silent) { + var s = optionsNonNull.failOnStdErr ? optionsNonNull.errStream : optionsNonNull.outStream; + s.write(data); + } + _this._processLineBuffer(data, errbuffer, function (line) { + _this.emit('errline', line); + }); + }); + cp.on('error', function (err) { + state.processError = err.message; + state.processExited = true; + state.processClosed = true; + state.CheckComplete(); + }); + cp.on('exit', function (code, signal) { + state.processExitCode = code; + state.processExited = true; + _this._debug("Exit code " + code + " received from tool '" + _this.toolPath + "'"); + state.CheckComplete(); + }); + cp.on('close', function (code, signal) { + state.processExitCode = code; + state.processExited = true; + state.processClosed = true; + _this._debug("STDIO streams have closed for tool '" + _this.toolPath + "'"); + state.CheckComplete(); + }); + state.on('done', function (error, exitCode) { + if (stdbuffer.length > 0) { + _this.emit('stdline', stdbuffer); + } + if (errbuffer.length > 0) { + _this.emit('errline', errbuffer); + } + cp.removeAllListeners(); + if (error) { + defer.reject(error); + } + else { + defer.resolve(exitCode); + } + }); + return defer.promise; + }; + /** + * Exec a tool synchronously. + * Output will be *not* be streamed to the live console. It will be returned after execution is complete. + * Appropriate for short running tools + * Returns IExecSyncResult with output and return code + * + * @param tool path to tool to exec + * @param options optional exec options. See IExecSyncOptions + * @returns IExecSyncResult + */ + ToolRunner.prototype.execSync = function (options) { + var _this = this; + this._debug('exec tool: ' + this.toolPath); + this._debug('arguments:'); + this.args.forEach(function (arg) { + _this._debug(' ' + arg); + }); + var success = true; + options = this._cloneExecOptions(options); + if (!options.silent) { + options.outStream.write(this._getCommandString(options) + os.EOL); + } + var r = child.spawnSync(this._getSpawnFileName(options), this._getSpawnArgs(options), this._getSpawnSyncOptions(options)); + if (!options.silent && r.stdout && r.stdout.length > 0) { + options.outStream.write(r.stdout); + } + if (!options.silent && r.stderr && r.stderr.length > 0) { + options.errStream.write(r.stderr); + } + var res = { code: r.status, error: r.error }; + res.stdout = (r.stdout) ? r.stdout.toString() : ''; + res.stderr = (r.stderr) ? r.stderr.toString() : ''; + return res; + }; + /** + * Used to close child process by sending SIGNINT signal. + * It allows executed script to have some additional logic on SIGINT, before exiting. + */ + ToolRunner.prototype.killChildProcess = function () { + if (this.childProcess) { + this.childProcess.kill(); + } + }; + return ToolRunner; +}(events.EventEmitter)); +exports.ToolRunner = ToolRunner; +var ExecState = /** @class */ (function (_super) { + __extends(ExecState, _super); + function ExecState(options, toolPath) { + var _this = _super.call(this) || this; + _this.delay = 10000; // 10 seconds + _this.timeout = null; + if (!toolPath) { + throw new Error('toolPath must not be empty'); + } + _this.options = options; + _this.toolPath = toolPath; + var delay = process.env['TASKLIB_TEST_TOOLRUNNER_EXITDELAY']; + if (delay) { + _this.delay = parseInt(delay); + } + return _this; + } + ExecState.prototype.CheckComplete = function () { + if (this.done) { + return; + } + if (this.processClosed) { + this._setResult(); + } + else if (this.processExited) { + this.timeout = setTimeout(ExecState.HandleTimeout, this.delay, this); + } + }; + ExecState.prototype._debug = function (message) { + this.emit('debug', message); + }; + ExecState.prototype._setResult = function () { + // determine whether there is an error + var error; + if (this.processExited) { + if (this.processError) { + error = new Error(im._loc('LIB_ProcessError', this.toolPath, this.processError)); + } + else if (this.processExitCode != 0 && !this.options.ignoreReturnCode) { + error = new Error(im._loc('LIB_ProcessExitCode', this.toolPath, this.processExitCode)); + } + else if (this.processStderr && this.options.failOnStdErr) { + error = new Error(im._loc('LIB_ProcessStderr', this.toolPath)); + } + } + // clear the timeout + if (this.timeout) { + clearTimeout(this.timeout); + this.timeout = null; + } + this.done = true; + this.emit('done', error, this.processExitCode); + }; + ExecState.HandleTimeout = function (state) { + if (state.done) { + return; + } + if (!state.processClosed && state.processExited) { + console.log(im._loc('LIB_StdioNotClosed', state.delay / 1000, state.toolPath)); + state._debug(im._loc('LIB_StdioNotClosed', state.delay / 1000, state.toolPath)); + } + state._setResult(); + }; + return ExecState; +}(events.EventEmitter)); diff --git a/task/node_modules/azure-pipelines-task-lib/vault.d.ts b/task/node_modules/azure-pipelines-task-lib/vault.d.ts new file mode 100644 index 0000000..4cfaefa --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/vault.d.ts @@ -0,0 +1,10 @@ +export declare class Vault { + constructor(keyPath: string); + private _keyFile; + private _store; + initialize(): void; + storeSecret(name: string, data: string): boolean; + retrieveSecret(name: string): string | undefined; + private getKey; + private genKey; +} diff --git a/task/node_modules/azure-pipelines-task-lib/vault.js b/task/node_modules/azure-pipelines-task-lib/vault.js new file mode 100644 index 0000000..e656f66 --- /dev/null +++ b/task/node_modules/azure-pipelines-task-lib/vault.js @@ -0,0 +1,71 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Vault = void 0; +var fs = require("fs"); +var path = require("path"); +var crypto = require("crypto"); +var uuidV4 = require('uuid/v4'); +var algorithm = "aes-256-ctr"; +var encryptEncoding = 'hex'; +var unencryptedEncoding = 'utf8'; +// +// Store sensitive data in proc. +// Main goal: Protects tasks which would dump envvars from leaking secrets inadvertently +// the task lib clears after storing. +// Also protects against a dump of a process getting the secrets +// The secret is generated and stored externally for the lifetime of the task. +// +var Vault = /** @class */ (function () { + function Vault(keyPath) { + this._keyFile = path.join(keyPath, '.taskkey'); + this._store = {}; + this.genKey(); + } + Vault.prototype.initialize = function () { + }; + Vault.prototype.storeSecret = function (name, data) { + if (!name || name.length == 0) { + return false; + } + name = name.toLowerCase(); + if (!data || data.length == 0) { + if (this._store.hasOwnProperty(name)) { + delete this._store[name]; + } + return false; + } + var key = this.getKey(); + var iv = crypto.randomBytes(16); + var cipher = crypto.createCipheriv(algorithm, key, iv); + var crypted = cipher.update(data, unencryptedEncoding, encryptEncoding); + var cryptedFinal = cipher.final(encryptEncoding); + this._store[name] = iv.toString(encryptEncoding) + crypted + cryptedFinal; + return true; + }; + Vault.prototype.retrieveSecret = function (name) { + var secret; + name = (name || '').toLowerCase(); + if (this._store.hasOwnProperty(name)) { + var key = this.getKey(); + var data = this._store[name]; + var ivDataBuffer = Buffer.from(data, encryptEncoding); + var iv = ivDataBuffer.slice(0, 16); + var encryptedText = ivDataBuffer.slice(16); + var decipher = crypto.createDecipheriv(algorithm, key, iv); + var dec = decipher.update(encryptedText); + var decFinal = decipher.final(unencryptedEncoding); + secret = dec + decFinal; + } + return secret; + }; + Vault.prototype.getKey = function () { + var key = fs.readFileSync(this._keyFile).toString('utf8'); + // Key needs to be hashed to correct length to match algorithm (aes-256-ctr) + return crypto.createHash('sha256').update(key).digest(); + }; + Vault.prototype.genKey = function () { + fs.writeFileSync(this._keyFile, uuidV4(), { encoding: 'utf8' }); + }; + return Vault; +}()); +exports.Vault = Vault; diff --git a/task/node_modules/balanced-match/.github/FUNDING.yml b/task/node_modules/balanced-match/.github/FUNDING.yml new file mode 100644 index 0000000..cea8b16 --- /dev/null +++ b/task/node_modules/balanced-match/.github/FUNDING.yml @@ -0,0 +1,2 @@ +tidelift: "npm/balanced-match" +patreon: juliangruber diff --git a/task/node_modules/balanced-match/LICENSE.md b/task/node_modules/balanced-match/LICENSE.md new file mode 100644 index 0000000..2cdc8e4 --- /dev/null +++ b/task/node_modules/balanced-match/LICENSE.md @@ -0,0 +1,21 @@ +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/task/node_modules/balanced-match/README.md b/task/node_modules/balanced-match/README.md new file mode 100644 index 0000000..d2a48b6 --- /dev/null +++ b/task/node_modules/balanced-match/README.md @@ -0,0 +1,97 @@ +# balanced-match + +Match balanced string pairs, like `{` and `}` or `` and ``. Supports regular expressions as well! + +[![build status](https://secure.travis-ci.org/juliangruber/balanced-match.svg)](http://travis-ci.org/juliangruber/balanced-match) +[![downloads](https://img.shields.io/npm/dm/balanced-match.svg)](https://www.npmjs.org/package/balanced-match) + +[![testling badge](https://ci.testling.com/juliangruber/balanced-match.png)](https://ci.testling.com/juliangruber/balanced-match) + +## Example + +Get the first matching pair of braces: + +```js +var balanced = require('balanced-match'); + +console.log(balanced('{', '}', 'pre{in{nested}}post')); +console.log(balanced('{', '}', 'pre{first}between{second}post')); +console.log(balanced(/\s+\{\s+/, /\s+\}\s+/, 'pre { in{nest} } post')); +``` + +The matches are: + +```bash +$ node example.js +{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' } +{ start: 3, + end: 9, + pre: 'pre', + body: 'first', + post: 'between{second}post' } +{ start: 3, end: 17, pre: 'pre', body: 'in{nest}', post: 'post' } +``` + +## API + +### var m = balanced(a, b, str) + +For the first non-nested matching pair of `a` and `b` in `str`, return an +object with those keys: + +* **start** the index of the first match of `a` +* **end** the index of the matching `b` +* **pre** the preamble, `a` and `b` not included +* **body** the match, `a` and `b` not included +* **post** the postscript, `a` and `b` not included + +If there's no match, `undefined` will be returned. + +If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']` and `{a}}` will match `['', 'a', '}']`. + +### var r = balanced.range(a, b, str) + +For the first non-nested matching pair of `a` and `b` in `str`, return an +array with indexes: `[ , ]`. + +If there's no match, `undefined` will be returned. + +If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `[ 1, 3 ]` and `{a}}` will match `[0, 2]`. + +## Installation + +With [npm](https://npmjs.org) do: + +```bash +npm install balanced-match +``` + +## Security contact information + +To report a security vulnerability, please use the +[Tidelift security contact](https://tidelift.com/security). +Tidelift will coordinate the fix and disclosure. + +## License + +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/task/node_modules/balanced-match/index.js b/task/node_modules/balanced-match/index.js new file mode 100644 index 0000000..c67a646 --- /dev/null +++ b/task/node_modules/balanced-match/index.js @@ -0,0 +1,62 @@ +'use strict'; +module.exports = balanced; +function balanced(a, b, str) { + if (a instanceof RegExp) a = maybeMatch(a, str); + if (b instanceof RegExp) b = maybeMatch(b, str); + + var r = range(a, b, str); + + return r && { + start: r[0], + end: r[1], + pre: str.slice(0, r[0]), + body: str.slice(r[0] + a.length, r[1]), + post: str.slice(r[1] + b.length) + }; +} + +function maybeMatch(reg, str) { + var m = str.match(reg); + return m ? m[0] : null; +} + +balanced.range = range; +function range(a, b, str) { + var begs, beg, left, right, result; + var ai = str.indexOf(a); + var bi = str.indexOf(b, ai + 1); + var i = ai; + + if (ai >= 0 && bi > 0) { + if(a===b) { + return [ai, bi]; + } + begs = []; + left = str.length; + + while (i >= 0 && !result) { + if (i == ai) { + begs.push(i); + ai = str.indexOf(a, i + 1); + } else if (begs.length == 1) { + result = [ begs.pop(), bi ]; + } else { + beg = begs.pop(); + if (beg < left) { + left = beg; + right = bi; + } + + bi = str.indexOf(b, i + 1); + } + + i = ai < bi && ai >= 0 ? ai : bi; + } + + if (begs.length) { + result = [ left, right ]; + } + } + + return result; +} diff --git a/task/node_modules/balanced-match/package.json b/task/node_modules/balanced-match/package.json new file mode 100644 index 0000000..ce6073e --- /dev/null +++ b/task/node_modules/balanced-match/package.json @@ -0,0 +1,48 @@ +{ + "name": "balanced-match", + "description": "Match balanced character pairs, like \"{\" and \"}\"", + "version": "1.0.2", + "repository": { + "type": "git", + "url": "git://github.com/juliangruber/balanced-match.git" + }, + "homepage": "https://github.com/juliangruber/balanced-match", + "main": "index.js", + "scripts": { + "test": "tape test/test.js", + "bench": "matcha test/bench.js" + }, + "devDependencies": { + "matcha": "^0.7.0", + "tape": "^4.6.0" + }, + "keywords": [ + "match", + "regexp", + "test", + "balanced", + "parse" + ], + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "license": "MIT", + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/8..latest", + "firefox/20..latest", + "firefox/nightly", + "chrome/25..latest", + "chrome/canary", + "opera/12..latest", + "opera/next", + "safari/5.1..latest", + "ipad/6.0..latest", + "iphone/6.0..latest", + "android-browser/4.2..latest" + ] + } +} diff --git a/task/node_modules/bindings/LICENSE.md b/task/node_modules/bindings/LICENSE.md new file mode 100644 index 0000000..5a92289 --- /dev/null +++ b/task/node_modules/bindings/LICENSE.md @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net> + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/task/node_modules/bindings/README.md b/task/node_modules/bindings/README.md new file mode 100644 index 0000000..5b3e7a8 --- /dev/null +++ b/task/node_modules/bindings/README.md @@ -0,0 +1,98 @@ +node-bindings +============= +### Helper module for loading your native module's `.node` file + +This is a helper module for authors of Node.js native addon modules. +It is basically the "swiss army knife" of `require()`ing your native module's +`.node` file. + +Throughout the course of Node's native addon history, addons have ended up being +compiled in a variety of different places, depending on which build tool and which +version of node was used. To make matters worse, now the `gyp` build tool can +produce either a __Release__ or __Debug__ build, each being built into different +locations. + +This module checks _all_ the possible locations that a native addon would be built +at, and returns the first one that loads successfully. + + +Installation +------------ + +Install with `npm`: + +``` bash +$ npm install --save bindings +``` + +Or add it to the `"dependencies"` section of your `package.json` file. + + +Example +------- + +`require()`ing the proper bindings file for the current node version, platform +and architecture is as simple as: + +``` js +var bindings = require('bindings')('binding.node') + +// Use your bindings defined in your C files +bindings.your_c_function() +``` + + +Nice Error Output +----------------- + +When the `.node` file could not be loaded, `node-bindings` throws an Error with +a nice error message telling you exactly what was tried. You can also check the +`err.tries` Array property. + +``` +Error: Could not load the bindings file. Tried: + → /Users/nrajlich/ref/build/binding.node + → /Users/nrajlich/ref/build/Debug/binding.node + → /Users/nrajlich/ref/build/Release/binding.node + → /Users/nrajlich/ref/out/Debug/binding.node + → /Users/nrajlich/ref/Debug/binding.node + → /Users/nrajlich/ref/out/Release/binding.node + → /Users/nrajlich/ref/Release/binding.node + → /Users/nrajlich/ref/build/default/binding.node + → /Users/nrajlich/ref/compiled/0.8.2/darwin/x64/binding.node + at bindings (/Users/nrajlich/ref/node_modules/bindings/bindings.js:84:13) + at Object. (/Users/nrajlich/ref/lib/ref.js:5:47) + at Module._compile (module.js:449:26) + at Object.Module._extensions..js (module.js:467:10) + at Module.load (module.js:356:32) + at Function.Module._load (module.js:312:12) + ... +``` + +The searching for the `.node` file will originate from the first directory in which has a `package.json` file is found. + +License +------- + +(The MIT License) + +Copyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net> + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/task/node_modules/bindings/bindings.js b/task/node_modules/bindings/bindings.js new file mode 100644 index 0000000..727413a --- /dev/null +++ b/task/node_modules/bindings/bindings.js @@ -0,0 +1,221 @@ +/** + * Module dependencies. + */ + +var fs = require('fs'), + path = require('path'), + fileURLToPath = require('file-uri-to-path'), + join = path.join, + dirname = path.dirname, + exists = + (fs.accessSync && + function(path) { + try { + fs.accessSync(path); + } catch (e) { + return false; + } + return true; + }) || + fs.existsSync || + path.existsSync, + defaults = { + arrow: process.env.NODE_BINDINGS_ARROW || ' → ', + compiled: process.env.NODE_BINDINGS_COMPILED_DIR || 'compiled', + platform: process.platform, + arch: process.arch, + nodePreGyp: + 'node-v' + + process.versions.modules + + '-' + + process.platform + + '-' + + process.arch, + version: process.versions.node, + bindings: 'bindings.node', + try: [ + // node-gyp's linked version in the "build" dir + ['module_root', 'build', 'bindings'], + // node-waf and gyp_addon (a.k.a node-gyp) + ['module_root', 'build', 'Debug', 'bindings'], + ['module_root', 'build', 'Release', 'bindings'], + // Debug files, for development (legacy behavior, remove for node v0.9) + ['module_root', 'out', 'Debug', 'bindings'], + ['module_root', 'Debug', 'bindings'], + // Release files, but manually compiled (legacy behavior, remove for node v0.9) + ['module_root', 'out', 'Release', 'bindings'], + ['module_root', 'Release', 'bindings'], + // Legacy from node-waf, node <= 0.4.x + ['module_root', 'build', 'default', 'bindings'], + // Production "Release" buildtype binary (meh...) + ['module_root', 'compiled', 'version', 'platform', 'arch', 'bindings'], + // node-qbs builds + ['module_root', 'addon-build', 'release', 'install-root', 'bindings'], + ['module_root', 'addon-build', 'debug', 'install-root', 'bindings'], + ['module_root', 'addon-build', 'default', 'install-root', 'bindings'], + // node-pre-gyp path ./lib/binding/{node_abi}-{platform}-{arch} + ['module_root', 'lib', 'binding', 'nodePreGyp', 'bindings'] + ] + }; + +/** + * The main `bindings()` function loads the compiled bindings for a given module. + * It uses V8's Error API to determine the parent filename that this function is + * being invoked from, which is then used to find the root directory. + */ + +function bindings(opts) { + // Argument surgery + if (typeof opts == 'string') { + opts = { bindings: opts }; + } else if (!opts) { + opts = {}; + } + + // maps `defaults` onto `opts` object + Object.keys(defaults).map(function(i) { + if (!(i in opts)) opts[i] = defaults[i]; + }); + + // Get the module root + if (!opts.module_root) { + opts.module_root = exports.getRoot(exports.getFileName()); + } + + // Ensure the given bindings name ends with .node + if (path.extname(opts.bindings) != '.node') { + opts.bindings += '.node'; + } + + // https://github.com/webpack/webpack/issues/4175#issuecomment-342931035 + var requireFunc = + typeof __webpack_require__ === 'function' + ? __non_webpack_require__ + : require; + + var tries = [], + i = 0, + l = opts.try.length, + n, + b, + err; + + for (; i < l; i++) { + n = join.apply( + null, + opts.try[i].map(function(p) { + return opts[p] || p; + }) + ); + tries.push(n); + try { + b = opts.path ? requireFunc.resolve(n) : requireFunc(n); + if (!opts.path) { + b.path = n; + } + return b; + } catch (e) { + if (e.code !== 'MODULE_NOT_FOUND' && + e.code !== 'QUALIFIED_PATH_RESOLUTION_FAILED' && + !/not find/i.test(e.message)) { + throw e; + } + } + } + + err = new Error( + 'Could not locate the bindings file. Tried:\n' + + tries + .map(function(a) { + return opts.arrow + a; + }) + .join('\n') + ); + err.tries = tries; + throw err; +} +module.exports = exports = bindings; + +/** + * Gets the filename of the JavaScript file that invokes this function. + * Used to help find the root directory of a module. + * Optionally accepts an filename argument to skip when searching for the invoking filename + */ + +exports.getFileName = function getFileName(calling_file) { + var origPST = Error.prepareStackTrace, + origSTL = Error.stackTraceLimit, + dummy = {}, + fileName; + + Error.stackTraceLimit = 10; + + Error.prepareStackTrace = function(e, st) { + for (var i = 0, l = st.length; i < l; i++) { + fileName = st[i].getFileName(); + if (fileName !== __filename) { + if (calling_file) { + if (fileName !== calling_file) { + return; + } + } else { + return; + } + } + } + }; + + // run the 'prepareStackTrace' function above + Error.captureStackTrace(dummy); + dummy.stack; + + // cleanup + Error.prepareStackTrace = origPST; + Error.stackTraceLimit = origSTL; + + // handle filename that starts with "file://" + var fileSchema = 'file://'; + if (fileName.indexOf(fileSchema) === 0) { + fileName = fileURLToPath(fileName); + } + + return fileName; +}; + +/** + * Gets the root directory of a module, given an arbitrary filename + * somewhere in the module tree. The "root directory" is the directory + * containing the `package.json` file. + * + * In: /home/nate/node-native-module/lib/index.js + * Out: /home/nate/node-native-module + */ + +exports.getRoot = function getRoot(file) { + var dir = dirname(file), + prev; + while (true) { + if (dir === '.') { + // Avoids an infinite loop in rare cases, like the REPL + dir = process.cwd(); + } + if ( + exists(join(dir, 'package.json')) || + exists(join(dir, 'node_modules')) + ) { + // Found the 'package.json' file or 'node_modules' dir; we're done + return dir; + } + if (prev === dir) { + // Got to the top + throw new Error( + 'Could not find module root given file: "' + + file + + '". Do you have a `package.json` file? ' + ); + } + // Try the parent dir next + prev = dir; + dir = join(dir, '..'); + } +}; diff --git a/task/node_modules/bindings/package.json b/task/node_modules/bindings/package.json new file mode 100644 index 0000000..d027ee7 --- /dev/null +++ b/task/node_modules/bindings/package.json @@ -0,0 +1,28 @@ +{ + "name": "bindings", + "description": "Helper module for loading your native module's .node file", + "keywords": [ + "native", + "addon", + "bindings", + "gyp", + "waf", + "c", + "c++" + ], + "version": "1.5.0", + "author": "Nathan Rajlich (http://tootallnate.net)", + "repository": { + "type": "git", + "url": "git://github.com/TooTallNate/node-bindings.git" + }, + "main": "./bindings.js", + "bugs": { + "url": "https://github.com/TooTallNate/node-bindings/issues" + }, + "homepage": "https://github.com/TooTallNate/node-bindings", + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } +} diff --git a/task/node_modules/brace-expansion/LICENSE b/task/node_modules/brace-expansion/LICENSE new file mode 100644 index 0000000..de32266 --- /dev/null +++ b/task/node_modules/brace-expansion/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/task/node_modules/brace-expansion/README.md b/task/node_modules/brace-expansion/README.md new file mode 100644 index 0000000..6b4e0e1 --- /dev/null +++ b/task/node_modules/brace-expansion/README.md @@ -0,0 +1,129 @@ +# brace-expansion + +[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html), +as known from sh/bash, in JavaScript. + +[![build status](https://secure.travis-ci.org/juliangruber/brace-expansion.svg)](http://travis-ci.org/juliangruber/brace-expansion) +[![downloads](https://img.shields.io/npm/dm/brace-expansion.svg)](https://www.npmjs.org/package/brace-expansion) +[![Greenkeeper badge](https://badges.greenkeeper.io/juliangruber/brace-expansion.svg)](https://greenkeeper.io/) + +[![testling badge](https://ci.testling.com/juliangruber/brace-expansion.png)](https://ci.testling.com/juliangruber/brace-expansion) + +## Example + +```js +var expand = require('brace-expansion'); + +expand('file-{a,b,c}.jpg') +// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] + +expand('-v{,,}') +// => ['-v', '-v', '-v'] + +expand('file{0..2}.jpg') +// => ['file0.jpg', 'file1.jpg', 'file2.jpg'] + +expand('file-{a..c}.jpg') +// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] + +expand('file{2..0}.jpg') +// => ['file2.jpg', 'file1.jpg', 'file0.jpg'] + +expand('file{0..4..2}.jpg') +// => ['file0.jpg', 'file2.jpg', 'file4.jpg'] + +expand('file-{a..e..2}.jpg') +// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg'] + +expand('file{00..10..5}.jpg') +// => ['file00.jpg', 'file05.jpg', 'file10.jpg'] + +expand('{{A..C},{a..c}}') +// => ['A', 'B', 'C', 'a', 'b', 'c'] + +expand('ppp{,config,oe{,conf}}') +// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf'] +``` + +## API + +```js +var expand = require('brace-expansion'); +``` + +### var expanded = expand(str) + +Return an array of all possible and valid expansions of `str`. If none are +found, `[str]` is returned. + +Valid expansions are: + +```js +/^(.*,)+(.+)?$/ +// {a,b,...} +``` + +A comma separated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`. + +```js +/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ +// {x..y[..incr]} +``` + +A numeric sequence from `x` to `y` inclusive, with optional increment. +If `x` or `y` start with a leading `0`, all the numbers will be padded +to have equal length. Negative numbers and backwards iteration work too. + +```js +/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ +// {x..y[..incr]} +``` + +An alphabetic sequence from `x` to `y` inclusive, with optional increment. +`x` and `y` must be exactly one character, and if given, `incr` must be a +number. + +For compatibility reasons, the string `${` is not eligible for brace expansion. + +## Installation + +With [npm](https://npmjs.org) do: + +```bash +npm install brace-expansion +``` + +## Contributors + +- [Julian Gruber](https://github.com/juliangruber) +- [Isaac Z. Schlueter](https://github.com/isaacs) + +## Sponsors + +This module is proudly supported by my [Sponsors](https://github.com/juliangruber/sponsors)! + +Do you want to support modules like this to improve their quality, stability and weigh in on new features? Then please consider donating to my [Patreon](https://www.patreon.com/juliangruber). Not sure how much of my modules you're using? Try [feross/thanks](https://github.com/feross/thanks)! + +## License + +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/task/node_modules/brace-expansion/index.js b/task/node_modules/brace-expansion/index.js new file mode 100644 index 0000000..0478be8 --- /dev/null +++ b/task/node_modules/brace-expansion/index.js @@ -0,0 +1,201 @@ +var concatMap = require('concat-map'); +var balanced = require('balanced-match'); + +module.exports = expandTop; + +var escSlash = '\0SLASH'+Math.random()+'\0'; +var escOpen = '\0OPEN'+Math.random()+'\0'; +var escClose = '\0CLOSE'+Math.random()+'\0'; +var escComma = '\0COMMA'+Math.random()+'\0'; +var escPeriod = '\0PERIOD'+Math.random()+'\0'; + +function numeric(str) { + return parseInt(str, 10) == str + ? parseInt(str, 10) + : str.charCodeAt(0); +} + +function escapeBraces(str) { + return str.split('\\\\').join(escSlash) + .split('\\{').join(escOpen) + .split('\\}').join(escClose) + .split('\\,').join(escComma) + .split('\\.').join(escPeriod); +} + +function unescapeBraces(str) { + return str.split(escSlash).join('\\') + .split(escOpen).join('{') + .split(escClose).join('}') + .split(escComma).join(',') + .split(escPeriod).join('.'); +} + + +// Basically just str.split(","), but handling cases +// where we have nested braced sections, which should be +// treated as individual members, like {a,{b,c},d} +function parseCommaParts(str) { + if (!str) + return ['']; + + var parts = []; + var m = balanced('{', '}', str); + + if (!m) + return str.split(','); + + var pre = m.pre; + var body = m.body; + var post = m.post; + var p = pre.split(','); + + p[p.length-1] += '{' + body + '}'; + var postParts = parseCommaParts(post); + if (post.length) { + p[p.length-1] += postParts.shift(); + p.push.apply(p, postParts); + } + + parts.push.apply(parts, p); + + return parts; +} + +function expandTop(str) { + if (!str) + return []; + + // I don't know why Bash 4.3 does this, but it does. + // Anything starting with {} will have the first two bytes preserved + // but *only* at the top level, so {},a}b will not expand to anything, + // but a{},b}c will be expanded to [a}c,abc]. + // One could argue that this is a bug in Bash, but since the goal of + // this module is to match Bash's rules, we escape a leading {} + if (str.substr(0, 2) === '{}') { + str = '\\{\\}' + str.substr(2); + } + + return expand(escapeBraces(str), true).map(unescapeBraces); +} + +function identity(e) { + return e; +} + +function embrace(str) { + return '{' + str + '}'; +} +function isPadded(el) { + return /^-?0\d/.test(el); +} + +function lte(i, y) { + return i <= y; +} +function gte(i, y) { + return i >= y; +} + +function expand(str, isTop) { + var expansions = []; + + var m = balanced('{', '}', str); + if (!m || /\$$/.test(m.pre)) return [str]; + + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = m.body.indexOf(',') >= 0; + if (!isSequence && !isOptions) { + // {a},b} + if (m.post.match(/,.*\}/)) { + str = m.pre + '{' + m.body + escClose + m.post; + return expand(str); + } + return [str]; + } + + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); + if (n.length === 1) { + // x{{a,b}}y ==> x{a}y x{b}y + n = expand(n[0], false).map(embrace); + if (n.length === 1) { + var post = m.post.length + ? expand(m.post, false) + : ['']; + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } + } + } + + // at this point, n is the parts, and we know it's not a comma set + // with a single entry. + + // no need to expand pre, since it is guaranteed to be free of brace-sets + var pre = m.pre; + var post = m.post.length + ? expand(m.post, false) + : ['']; + + var N; + + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length) + var incr = n.length == 3 + ? Math.abs(numeric(n[2])) + : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad = n.some(isPadded); + + N = []; + + for (var i = x; test(i, y); i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === '\\') + c = ''; + } else { + c = String(i); + if (pad) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join('0'); + if (i < 0) + c = '-' + z + c.slice(1); + else + c = z + c; + } + } + } + N.push(c); + } + } else { + N = concatMap(n, function(el) { return expand(el, false) }); + } + + for (var j = 0; j < N.length; j++) { + for (var k = 0; k < post.length; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } + } + + return expansions; +} + diff --git a/task/node_modules/brace-expansion/package.json b/task/node_modules/brace-expansion/package.json new file mode 100644 index 0000000..a18faa8 --- /dev/null +++ b/task/node_modules/brace-expansion/package.json @@ -0,0 +1,47 @@ +{ + "name": "brace-expansion", + "description": "Brace expansion as known from sh/bash", + "version": "1.1.11", + "repository": { + "type": "git", + "url": "git://github.com/juliangruber/brace-expansion.git" + }, + "homepage": "https://github.com/juliangruber/brace-expansion", + "main": "index.js", + "scripts": { + "test": "tape test/*.js", + "gentest": "bash test/generate.sh", + "bench": "matcha test/perf/bench.js" + }, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + }, + "devDependencies": { + "matcha": "^0.7.0", + "tape": "^4.6.0" + }, + "keywords": [], + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "license": "MIT", + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/8..latest", + "firefox/20..latest", + "firefox/nightly", + "chrome/25..latest", + "chrome/canary", + "opera/12..latest", + "opera/next", + "safari/5.1..latest", + "ipad/6.0..latest", + "iphone/6.0..latest", + "android-browser/4.2..latest" + ] + } +} diff --git a/task/node_modules/buffer-from/LICENSE b/task/node_modules/buffer-from/LICENSE new file mode 100644 index 0000000..e4bf1d6 --- /dev/null +++ b/task/node_modules/buffer-from/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016, 2018 Linus Unnebäck + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/task/node_modules/buffer-from/index.js b/task/node_modules/buffer-from/index.js new file mode 100644 index 0000000..e1a58b5 --- /dev/null +++ b/task/node_modules/buffer-from/index.js @@ -0,0 +1,72 @@ +/* eslint-disable node/no-deprecated-api */ + +var toString = Object.prototype.toString + +var isModern = ( + typeof Buffer !== 'undefined' && + typeof Buffer.alloc === 'function' && + typeof Buffer.allocUnsafe === 'function' && + typeof Buffer.from === 'function' +) + +function isArrayBuffer (input) { + return toString.call(input).slice(8, -1) === 'ArrayBuffer' +} + +function fromArrayBuffer (obj, byteOffset, length) { + byteOffset >>>= 0 + + var maxLength = obj.byteLength - byteOffset + + if (maxLength < 0) { + throw new RangeError("'offset' is out of bounds") + } + + if (length === undefined) { + length = maxLength + } else { + length >>>= 0 + + if (length > maxLength) { + throw new RangeError("'length' is out of bounds") + } + } + + return isModern + ? Buffer.from(obj.slice(byteOffset, byteOffset + length)) + : new Buffer(new Uint8Array(obj.slice(byteOffset, byteOffset + length))) +} + +function fromString (string, encoding) { + if (typeof encoding !== 'string' || encoding === '') { + encoding = 'utf8' + } + + if (!Buffer.isEncoding(encoding)) { + throw new TypeError('"encoding" must be a valid string encoding') + } + + return isModern + ? Buffer.from(string, encoding) + : new Buffer(string, encoding) +} + +function bufferFrom (value, encodingOrOffset, length) { + if (typeof value === 'number') { + throw new TypeError('"value" argument must not be a number') + } + + if (isArrayBuffer(value)) { + return fromArrayBuffer(value, encodingOrOffset, length) + } + + if (typeof value === 'string') { + return fromString(value, encodingOrOffset) + } + + return isModern + ? Buffer.from(value) + : new Buffer(value) +} + +module.exports = bufferFrom diff --git a/task/node_modules/buffer-from/package.json b/task/node_modules/buffer-from/package.json new file mode 100644 index 0000000..6ac5327 --- /dev/null +++ b/task/node_modules/buffer-from/package.json @@ -0,0 +1,19 @@ +{ + "name": "buffer-from", + "version": "1.1.2", + "license": "MIT", + "repository": "LinusU/buffer-from", + "files": [ + "index.js" + ], + "scripts": { + "test": "standard && node test" + }, + "devDependencies": { + "standard": "^12.0.1" + }, + "keywords": [ + "buffer", + "buffer from" + ] +} diff --git a/task/node_modules/buffer-from/readme.md b/task/node_modules/buffer-from/readme.md new file mode 100644 index 0000000..9880a55 --- /dev/null +++ b/task/node_modules/buffer-from/readme.md @@ -0,0 +1,69 @@ +# Buffer From + +A [ponyfill](https://ponyfill.com) for `Buffer.from`, uses native implementation if available. + +## Installation + +```sh +npm install --save buffer-from +``` + +## Usage + +```js +const bufferFrom = require('buffer-from') + +console.log(bufferFrom([1, 2, 3, 4])) +//=> + +const arr = new Uint8Array([1, 2, 3, 4]) +console.log(bufferFrom(arr.buffer, 1, 2)) +//=> + +console.log(bufferFrom('test', 'utf8')) +//=> + +const buf = bufferFrom('test') +console.log(bufferFrom(buf)) +//=> +``` + +## API + +### bufferFrom(array) + +- `array` <Array> + +Allocates a new `Buffer` using an `array` of octets. + +### bufferFrom(arrayBuffer[, byteOffset[, length]]) + +- `arrayBuffer` <ArrayBuffer> The `.buffer` property of a TypedArray or ArrayBuffer +- `byteOffset` <Integer> Where to start copying from `arrayBuffer`. **Default:** `0` +- `length` <Integer> How many bytes to copy from `arrayBuffer`. **Default:** `arrayBuffer.length - byteOffset` + +When passed a reference to the `.buffer` property of a TypedArray instance, the +newly created `Buffer` will share the same allocated memory as the TypedArray. + +The optional `byteOffset` and `length` arguments specify a memory range within +the `arrayBuffer` that will be shared by the `Buffer`. + +### bufferFrom(buffer) + +- `buffer` <Buffer> An existing `Buffer` to copy data from + +Copies the passed `buffer` data onto a new `Buffer` instance. + +### bufferFrom(string[, encoding]) + +- `string` <String> A string to encode. +- `encoding` <String> The encoding of `string`. **Default:** `'utf8'` + +Creates a new `Buffer` containing the given JavaScript string `string`. If +provided, the `encoding` parameter identifies the character encoding of +`string`. + +## See also + +- [buffer-alloc](https://github.com/LinusU/buffer-alloc) A ponyfill for `Buffer.alloc` +- [buffer-alloc-unsafe](https://github.com/LinusU/buffer-alloc-unsafe) A ponyfill for `Buffer.allocUnsafe` diff --git a/task/node_modules/bunyan/CHANGES.md b/task/node_modules/bunyan/CHANGES.md new file mode 100644 index 0000000..2386d68 --- /dev/null +++ b/task/node_modules/bunyan/CHANGES.md @@ -0,0 +1,1377 @@ +# bunyan Changelog + +See [the bunyan@2.x changelog](https://github.com/trentm/node-bunyan/blob/master/CHANGES.md) +for details on recent 2.x releases. + +Known issues: + +- [issue #58] Can't install to a dir with spaces. This is [this node-gyp + bug](https://github.com/TooTallNate/node-gyp/issues/65). + +## not yet released + +(nothing yet) + +## 1.8.15 + +- [pull #575, #278] Change the default "req" serializer to accept expressjs's + `req.originalUrl` for the "url" field per + . (By @twelve17 and + @kingcody.) +- Development change: Switch to node-tap for testing (from nodeunit, which is + now obsolete). Currently just tap v9 because that is the last major version + of node-tap that supports back to node v0.10. + +## 1.8.14 + +- [pull #558] Update minimum "moment" version to 2.19.3 for CVE-2017-18214. +- [issue #589] Use `os.EOL` for newlines in bunyan output, which helps with + some Unix-EOL-naive apps like notepad. (By @bwknight877.) +- Development change: Switched to GitHub Actions for CI. + +## 1.8.13 + +- Fix a vulnerability from a crafted argument to 'bunyan -p ARG' + + This was reported privately as: + https://hackerone.com/reports/902739 + bunyan - RCE via insecure command formatting + + Previous to this version the 'bunyan' CLI was not escaping a given argument + to the '-p' option before executing `ps -A -o pid,command | grep '$ARG'` + which could lead to unintended execution. + +## 1.8.12 + +- [issue #444] Fix the `bunyan` CLI to not duplicate the "HTTP/1.1 ..." status + line when serializing a "res" field. + + +## 1.8.11 + +- [issue #504] The `bunyan` 1.x CLI adds a `Host: $client_req.address[:$client_req.port]` + header when rendering a `client_req` field in a log record. Fix that here to: + (a) not add it if `client_req.headers` already includes a host header; and + (b) not include the given `port` if it is 80 or 443 (*assuming* that is the + default port. + Note: `bunyan` 2.x CLI will stop adding this Host header because it is a guess + that can be wrong and misleading. + + +## 1.8.10 + +- Ensure that `bunyan` errors out if attempting to use `-p PID` and + file args at the same time. + + +## 1.8.9 + +- [pull #409, issue #246] Revert a change added to the `bunyan` CLI version + 1.0.1 where `SIGINT` was ignored, such that Ctrl+C could not be used to + terminate bunyan. (By @zbjornson and @davepacheco.) +- [pull #469] Fix a strict mode (`"use strict;"`) error in some versions of + Safari. + + +## 1.8.8 + +- Fix breakage due to a silly last minute "fix 'make check'". + + +## 1.8.7 + +Note: *Bad release.* Use 1.8.8 or later. + +- [issue #484] Fix breakage due to #474 in previous release. + + +## 1.8.6 + +Note: *Bad release.* Use 1.8.7 or later. + +- [issue #474] Bunyan's `safeCycles` is too slow when logging large objects. + + +## 1.8.5 + +- [issue #401] Improved performance when using disabled log levels. + + +## 1.8.4 + +- [issue #454] Fix `src` usage with node v7. + + +## 1.8.3 + +- [issue #450] Fix `log.info(null)` crash that resulted from #426 in v1.8.2. + + +## 1.8.2 + +- [issue #449] Bump dtrace-provider dep to 0.7.0 to help avoid deprecation + warnings with node v6 in some cases. +- [issue #426] Ensure `log.info({err: err})` results in a "msg" value, just + like `log.info(err)`. + + +## 1.8.1 + +- [pull #386] Fix bad bug in rotation that could cause a crash with + error message "cannot start a rotation when already rotating" + (by Frankie O'Rourke). The bug was introduced in 1.8.0. + + +## 1.8.0 + +Note: *Bad release.* An addition in this release broke 'rotating-file' usage. +Use 1.8.1 or later. + +- [issue #370] Fix `bunyan -p ...` (i.e. DTrace integration) on node + 4.x and 5.x. +- [issue #329, pull #330] Update the 'rotating-file' stream to do a file + rotation on initialization if the mtime on the file path indicates the + last rotation time was missed -- i.e. if the app wasn't running at the + time. (by Paul Milham.) + + +## 1.7.1 + +- [issue #332, pull #355] Ensure stream for type='stream' stream is a writable + stream. (By Michael Nisi.) + +- [issue #344] Fix "rotating-file" Bunyan streams to not miss rotations when configured + for a period greater than approximately 25 days. Before this there was an issue + where periods greater than node.js's maximum `setTimeout` length would fail to rotate. + (By Martijn Schrage.) + +- [issue #234, pull #345] Improve `bunyan` CLI rendering of "res" field + HTTP responses to not show two blank lines for an empty body. + (By Michael Nisi.) + + +## 1.7.0 + +- [pull #311, #302, #310] Improve the runtime environment detection to fix + running under [NW.js](http://nwjs.io/). Contributions by Adam Lynch, Jeremy + Ruppel, and Aleksey Timchenko. + +- [pull #318] Add `reemitErrorEvents` optional boolean for streams added to a + Bunyan logger to control whether an "error" event on the stream will be + re-emitted on the `Logger` instance. + + var log = bunyan.createLogger({ + name: 'foo', + streams: [ + { + type: 'raw', + stream: new MyCustomStream(), + reemitErrorEvents: true + } + ] + }); + + Before this change, "error" events were re-emitted on [`file` + streams](https://github.com/trentm/node-bunyan#stream-type-file) only. The new + behaviour is as follows: + + - `reemitErrorEvents` not specified: `file` streams will re-emit error events + on the Logger instance. + - `reemitErrorEvents: true`: error events will be re-emitted on the Logger + for any stream with a `.on()` function -- which includes file streams, + process.stdout/stderr, and any object that inherits from EventEmitter. + - `reemitErrorEvents: false`: error events will not be re-emitted for any + streams. + + Dev Note: Bunyan `Logger` objects don't currently have a `.close()` method + in which registered error event handlers can be *un*registered. That means + that a (presumably rare) situation where code adds dozens of Bunyan Logger + streams to, e.g. process.stdout, and with `reemitErrorEvents: true`, could + result in leaking Logger objects. + + Original work for allowing "error" re-emitting on non-file streams is + by Marc Udoff in pull #318. + + +## 1.6.0 + +- [pull #304, issue #245] Use [Moment.js][momentjs.com] library to handle + `bunyan` CLI time formatting in some cases, especially to fix display of + local time. It is now required for local time formatting (i.e. `bunyan -L` + or `bunyan --time local`). (By David M. Lee.) + +- [pull #252] Fix errant `client_res={}` in `bunyan` CLI rendering, and avoid + extra newlines in `client_req` rendering in some cases. (By Thomas Heymann.) + +- [pull #291, issue #303] Fix `LOG.child(...)` to *not* override the "hostname" + field of the parent. A use case is when one manually sets "hostname" to + something other than `os.hostname()`. (By github.com/Cactusbone.) + +- [issue #325] Allow one to set `level: 0` in `createLogger` to turn on + logging for all levels. (Adapted from #336 by github.com/sometimesalready.) + +- Add guards (to `resolveLevel`) so that all "level" values are validated. + Before this, a bogus level like "foo" or -12 or `['some', 'array']` would + silently be accepted -- with undefined results. + +- Doc updates for #340 and #305. + +- Update `make test` to test against node 5, 4, 0.12 and 0.10. + + +## 1.5.1 + +- [issue #296] Fix `src: true`, which was broken in v1.5.0. + + +## 1.5.0 + +Note: *Bad release.* The addition of `'use strict';` broke Bunyan's `src: true` +feature. Use 1.5.1 instead. + +- [pull #236, issue #231, issue #223] Fix strict mode in the browser. +- [pull #282, issue #213] Fixes bunyan to work with webpack. By Denis Izmaylov. +- [pull #294] Update to dtrace-provider 0.6 to fix with node 4.0 and io.js 3.0. +- Dropped support for 0.8 (can't install deps easily anymore for running + test suite). Bump to a recent iojs version for testing. + + +## 1.4.0 + +(Bumping minor ver b/c I'm wary of dtrace-provider changes. :) + +- [issue #258, pull #259] Update to dtrace-provider 0.5 to fix + install and tests on recent io.js versions. +- safe-json-stringify@1.0.3 changed output, breaking some tests. Fix those. + + +## 1.3.6 + +- [issue #244] Make `bunyan` defensive on `res.header=null`. + + +## 1.3.5 + +- [issue #233] Make `bunyan` defensive on res.header as a boolean. +- [issue #242] Make `bunyan` defensive on err.stack not being a string. + + +## 1.3.4 + +- Allow `log.child(...)` to work even if the logger is a *sub-class* + of Bunyan's Logger class. +- [issue #219] Hide 'source-map-support' require from browserify. +- [issue #218] Reset `haveNonRawStreams` on `.addStream`. + + +## 1.3.3 + +- [pull #127] Update to dtrace-provider 0.4.0, which gives io.js 1.x support + for dtrace-y parts of Bunyan. + + +## 1.3.2 + +- [pull #182] Fallback to using the optional 'safe-json-stringify' module + if `JSON.stringify` throws -- possibly with an enumerable property + getter than throws. By Martin Gausby. + + +## 1.3.1 + +- Export `bunyan.RotatingFileStream` which is needed if one wants to + customize it. E.g. see issue #194. + +- [pull #122] Source Map support for caller line position for [the "src" + field](https://github.com/trentm/node-bunyan#src). This could be interesting + for [CoffeeScript](http://coffeescript.org/documentation/docs/sourcemap.html) + users of Bunyan. By Manuel Schneider. + +- [issue #164] Ensure a top-level `level` given in `bunyan.createLogger` + is *used* for given `streams`. For example, ensure that the following + results in the stream having a DEBUG level: + + var log = bunyan.createLogger({ + name: 'foo', + level: 'debug', + streams: [ + { + path: '/var/tmp/foo.log' + } + ] + }); + + This was broken in the 1.0.1 release. Between that release and 1.3.0 + the "/var/tmp/foo.log" stream would be at the INFO level (Bunyan's + default level). + + +## 1.3.0 + +- [issue #103] `bunyan -L` (or `bunyan --time local`) to show local time. + Bunyan log records store `time` in UTC time. Sometimes it is convenient + to display in local time. + +- [issue #205] Fix the "The Bunyan CLI crashed!" checking to properly warn of + the common failure case when `-c CONDITION` is being used. + + +## 1.2.4 + +- [issue #210] Export `bunyan.nameFromLevel` and `bunyan.levelFromName`. It can + be a pain for custom streams to have to reproduce that. + +- [issue #100] Gracefully handle the case of an unbound + `Logger.{info,debug,...}` being used for logging, e.g.: + + myEmittingThing.on('data', log.info) + + Before this change, bunyan would throw. Now it emits a warning to stderr + *once*, and then silently ignores those log attempts, e.g.: + + bunyan usage error: /Users/trentm/tm/node-bunyan/foo.js:12: attempt to log with an unbound log method: `this` is: { _events: { data: [Function] } } + + +## 1.2.3 + +- [issue #184] Fix log rotation for rotation periods > ~25 days. Before this + change, a rotation period longer than this could hit [the maximum setTimeout + delay in node.js](https://github.com/joyent/node/issues/8656). By Daniel Juhl. + + +## 1.2.2 + +- Drop the guard that a bunyan Logger level must be between TRACE (10) + and FATAL (60), inclusive. This allows a trick of setting the level + to `FATAL + 1` to turn logging off. While the standard named log levels are + the golden path, then intention was not to get in the way of using + other level numbers. + + +## 1.2.1 + +- [issue #178, #181] Get at least dtrace-provider 0.3.1 for + optionalDependencies to get a fix for install with decoupled npm (e.g. with + homebrew's node and npm). + + +## 1.2.0 + +- [issue #157] Restore dtrace-provider as a dependency (in + "optionalDependencies"). + + Dtrace-provider version 0.3.0 add build sugar that should eliminate the + problems from older versions: + The build is not attempted on Linux and Windows. The build spew is + *not* emitted by default (use `V=1 npm install` to see it); instead a + short warning is emitted if the build fails. + + Also, importantly, the new dtrace-provider fixes working with node + v0.11/0.12. + + +## 1.1.3 + +- [issue #165] Include extra `err` fields in `bunyan` CLI output. Before + this change only the fields part of the typical node.js error stack + (err.stack, err.message, err.name) would be emitted, even though + the Bunyan *library* would typically include err.code and err.signal + in the raw JSON log record. + + +## 1.1.2 + +- Fix a breakage in `log.info(err)` on a logger with no serializers. + + +## 1.1.1 + +Note: *Bad release.* It breaks `log.info(err)` on a logger with no serializers. +Use version 1.1.2. + +- [pull #168] Fix handling of `log.info(err)` to use the `log` Logger's `err` + serializer if it has one, instead of always using the core Bunyan err + serializer. (By Mihai Tomescu.) + + +## 1.1.0 + +- [issue #162] Preliminary support for [browserify](http://browserify.org/). + See [the section in the README](../README.md#browserify). + + +## 1.0.1 + +- [issues #105, #138, #151] Export `.addStream(...)` and + `.addSerializers(...)` to be able to add them after Logger creation. + Thanks @andreineculau! + +- [issue #159] Fix bad handling in construtor guard intending to allow + creation without "new": `var log = Logger(...)`. Thanks @rmg! + +- [issue #156] Smaller install size via .npmignore file. + +- [issue #126, #161] Ignore SIGINT (Ctrl+C) when processing stdin. `...| bunyan` + should expect the preceding process in the pipeline to handle SIGINT. While + it is doing so, `bunyan` should continue to process any remaining output. + Thanks @timborodin and @jnordberg! + +- [issue #160] Stop using ANSI 'grey' in `bunyan` CLI output, because of the + problems that causes with Solarized Dark themes (see + ). + + +## 1.0.0 + +- [issue #87] **Backward incompatible change to `-c CODE`** improving + performance by over 10x (good!), with a backward incompatible change to + semantics (unfortunate), and adding some sugar (good!). + + The `-c CODE` implementation was changed to use a JS function for processing + rather than `vm.runInNewContext`. The latter was specatularly slow, so + won't be missed. Unfortunately this does mean a few semantic differences in + the `CODE`, the most noticeable of which is that **`this` is required to + access the object fields:** + + # Bad. Works with bunyan 0.x but not 1.x. + $ bunyan -c 'pid === 123' foo.log + ... + + # Good. Works with all versions of bunyan + $ bunyan -c 'this.pid === 123' foo.log + ... + + The old behaviour of `-c` can be restored with the `BUNYAN_EXEC=vm` + environment variable: + + $ BUNYAN_EXEC=vm bunyan -c 'pid === 123' foo.log + ... + + Some sugar was also added: the TRACE, DEBUG, ... constants are defined, so + one can: + + $ bunyan -c 'this.level >= ERROR && this.component === "http"' foo.log + ... + + And example of the speed improvement on a 10 MiB log example: + + $ time BUNYAN_EXEC=vm bunyan -c 'this.level === ERROR' big.log | cat >slow + + real 0m6.349s + user 0m6.292s + sys 0m0.110s + + $ time bunyan -c 'this.level === ERROR' big.log | cat >fast + + real 0m0.333s + user 0m0.303s + sys 0m0.028s + + The change was courtesy Patrick Mooney (https://github.com/pfmooney). Thanks! + +- Add `bunyan -0 ...` shortcut for `bunyan -o bunyan ...`. + +- [issue #135] **Backward incompatible.** Drop dtrace-provider even from + `optionalDependencies`. Dtrace-provider has proven a consistent barrier to + installing bunyan, because it is a binary dep. Even as an *optional* dep it + still caused confusion and install noise. + + Users of Bunyan on dtrace-y platforms (SmartOS, Mac, Illumos, Solaris) will + need to manually `npm install dtrace-provider` themselves to get [Bunyan's + dtrace support](https://github.com/trentm/node-bunyan#runtime-log-snooping-via-dtrace) + to work. If not installed, bunyan should stub it out properly. + + + +## 0.23.1 + +- [pull #125, pull #97, issue #73] Unref rotating-file timeout which was + preventing processes from exiting (by https://github.com/chakrit and + https://github.com/glenn-murray-bse). Note: this only fixes the issue + for node 0.10 and above. + + +## 0.23.0 + +- [issue #139] Fix `bunyan` crash on a log record with `res.header` that is an + object. A side effect of this improvement is that a record with `res.statusCode` + but no header info will render a response block, for example: + + [2012-08-08T10:25:47.637Z] INFO: my-service/12859 on my-host: some message (...) + ... + -- + HTTP/1.1 200 OK + -- + ... + +- [pull #42] Fix `bunyan` crash on a log record with `req.headers` that is a *string* + (by https://github.com/aexmachina). + +- Drop node 0.6 support. I can't effectively `npm install` with a node 0.6 + anymore. + +- [issue #85] Ensure logging a non-object/non-string doesn't throw (by + https://github.com/mhart). This changes fixes: + + log.info() # TypeError: Object.keys called on non-object + log.info() # "msg":"" (instead of wanted "msg":"[Function]") + log.info() # "msg":"" (instead of wanted "msg":util.format()) + + +## 0.22.3 + +- Republish the same code to npm. + + +## 0.22.2 + +Note: Bad release. The published package in the npm registry got corrupted. Use 0.22.3 or later. + +- [issue #131] Allow `log.info()` and, most importantly, don't crash on that. + +- Update 'mv' optional dep to latest. + + +## 0.22.1 + +- [issue #111] Fix a crash when attempting to use `bunyan -p` on a platform without + dtrace. + +- [issue #101] Fix a crash in `bunyan` rendering a record with unexpected "res.headers". + + +## 0.22.0 + +- [issue #104] `log.reopenFileStreams()` convenience method to be used with external log + rotation. + + +## 0.21.4 + +- [issue #96] Fix `bunyan` to default to paging (with `less`) by default in node 0.10.0. + The intention has always been to default to paging for node >=0.8. + + +## 0.21.3 + +- [issue #90] Fix `bunyan -p '*'` breakage in version 0.21.2. + + +## 0.21.2 + +**Note: Bad release. The switchrate change below broke `bunyan -p '*'` usage +(see issue #90). Use 0.21.3 or later.** + +- [issue #88] Should be able to efficiently combine "-l" with "-p *". + +- Avoid DTrace buffer filling up, e.g. like this: + + $ bunyan -p 42241 > /tmp/all.log + dtrace: error on enabled probe ID 3 (ID 75795: bunyan42241:mod-87ea640:log-trace:log-trace): out of scratch space in action #1 at DIF offset 12 + dtrace: error on enabled probe ID 3 (ID 75795: bunyan42241:mod-87ea640:log-trace:log-trace): out of scratch space in action #1 at DIF offset 12 + dtrace: 138 drops on CPU 4 + ... + + From Bryan: "the DTrace buffer is filling up because the string size is so + large... by increasing the switchrate, you're increasing the rate at + which that buffer is emptied." + + +## 0.21.1 + +- [pull #83] Support rendering 'client_res' key in bunyan CLI (by + github.com/mcavage). + + +## 0.21.0 + +- 'make check' clean, 4-space indenting. No functional change here, just + lots of code change. +- [issue #80, #82] Drop assert that broke using 'rotating-file' with + a default `period` (by github.com/ricardograca). + + +## 0.20.0 + +- [Slight backward incompatibility] Fix serializer bug introduced in 0.18.3 + (see below) to only apply serializers to log records when appropriate. + + This also makes a semantic change to custom serializers. Before this change + a serializer function was called for a log record key when that value was + truth-y. The semantic change is to call the serializer function as long + as the value is not `undefined`. That means that a serializer function + should handle falsey values such as `false` and `null`. + +- Update to latest 'mv' dep (required for rotating-file support) to support + node v0.10.0. + + +## 0.19.0 + +**WARNING**: This release includes a bug introduced in bunyan 0.18.3 (see +below). Please upgrade to bunyan 0.20.0. + +- [Slight backward incompatibility] Change the default error serialization + (a.k.a. `bunyan.stdSerializers.err`) to *not* serialize all additional + attributes of the given error object. This is an open door to unsafe logging + and logging should always be safe. With this change, error serialization + will log these attributes: message, name, stack, code, signal. The latter + two are added because some core node APIs include those fields (e.g. + `child_process.exec`). + + Concrete examples where this has hurt have been the "domain" change + necessitating 0.18.3 and a case where + [node-restify](https://github.com/mcavage/node-restify) uses an error object + as the response object. When logging the `err` and `res` in the same log + statement (common for restify audit logging), the `res.body` would be JSON + stringified as '[Circular]' as it had already been emitted for the `err` key. + This results in a WTF with the bunyan CLI because the `err.body` is not + rendered. + + If you need the old behaviour back you will need to do this: + + var bunyan = require('bunyan'); + var errSkips = { + // Skip domain keys. `domain` especially can have huge objects that can + // OOM your app when trying to JSON.stringify. + domain: true, + domain_emitter: true, + domain_bound: true, + domain_thrown: true + }; + bunyan.stdSerializers.err = function err(err) { + if (!err || !err.stack) + return err; + var obj = { + message: err.message, + name: err.name, + stack: getFullErrorStack(err) + } + Object.keys(err).forEach(function (k) { + if (err[k] !== undefined && !errSkips[k]) { + obj[k] = err[k]; + } + }); + return obj; + }; + +- "long" and "bunyan" output formats for the CLI. `bunyan -o long` is the default + format, the same as before, just called "long" now instead of the cheesy "paul" + name. The "bunyan" output format is the same as "json-0", just with a more + convenient name. + + +## 0.18.3 + +**WARNING**: This release introduced a bug such that all serializers are +applied to all log records even if the log record did not contain the key +for that serializer. If a logger serializer function does not handle +being given `undefined`, then you'll get warnings like this on stderr: + + bunyan: ERROR: This should never happen. This is a bug in or in this application. Exception from "foo" Logger serializer: Error: ... + at Object.bunyan.createLogger.serializers.foo (.../myapp.js:20:15) + at Logger._applySerializers (.../lib/bunyan.js:644:46) + at Array.forEach (native) + at Logger._applySerializers (.../lib/bunyan.js:640:33) + ... + +and the following junk in written log records: + + "foo":"(Error in Bunyan log "foo" serializer broke field. See stderr for details.)" + +Please upgrade to bunyan 0.20.0. + + +- Change the `bunyan.stdSerializers.err` serializer for errors to *exclude* + [the "domain*" keys](http://nodejs.org/docs/latest/api/all.html#all_additions_to_error_objects). + `err.domain` will include its assigned members which can arbitrarily large + objects that are not intended for logging. + +- Make the "dtrace-provider" dependency optional. I hate to do this, but + installing bunyan on Windows is made very difficult with this as a required + dep. Even though "dtrace-provider" stubs out for non-dtrace-y platforms, + without a compiler and Python around, node-gyp just falls over. + + +## 0.18.2 + +- [pull #67] Remove debugging prints in rotating-file support. + (by github.com/chad3814). +- Update to dtrace-provider@0.2.7. + + +## 0.18.1 + +- Get the `bunyan` CLI to **not** automatically page (i.e. pipe to `less`) + if stdin isn't a TTY, or if following dtrace probe output (via `-p PID`), + or if not given log file arguments. + + +## 0.18.0 + +- Automatic paging support in the `bunyan` CLI (similar to `git log` et al). + IOW, `bunyan` will open your pager (by default `less`) and pipe rendered + log output through it. A main benefit of this is getting colored logs with + a pager without the pain. Before you had to explicit use `--color` to tell + bunyan to color output when the output was not a TTY: + + bunyan foo.log --color | less -R # before + bunyan foo.log # now + + Disable with the `--no-pager` option or the `BUNYAN_NO_PAGER=1` environment + variable. + + Limitations: Only supported for node >=0.8. Windows is not supported (at + least not yet). + +- Switch test suite to nodeunit (still using a node-tap'ish API via + a helper). + + +## 0.17.0 + +- [issue #33] Log rotation support: + + var bunyan = require('bunyan'); + var log = bunyan.createLogger({ + name: 'myapp', + streams: [{ + type: 'rotating-file', + path: '/var/log/myapp.log', + count: 7, + period: 'daily' + }] + }); + + +- Tweak to CLI default pretty output: don't special case "latency" field. + The special casing was perhaps nice, but less self-explanatory. + Before: + + [2012-12-27T21:17:38.218Z] INFO: audit/45769 on myserver: handled: 200 (15ms, audit=true, bar=baz) + GET /foo + ... + + After: + + [2012-12-27T21:17:38.218Z] INFO: audit/45769 on myserver: handled: 200 (audit=true, bar=baz, latency=15) + GET /foo + ... + +- *Exit* CLI on EPIPE, otherwise we sit there useless processing a huge log + file with, e.g. `bunyan huge.log | head`. + + +## 0.16.8 + +- Guards on `-c CONDITION` usage to attempt to be more user friendly. + Bogus JS code will result in this: + + $ bunyan portal.log -c 'this.req.username==boo@foo' + bunyan: error: illegal CONDITION code: SyntaxError: Unexpected token ILLEGAL + CONDITION script: + Object.prototype.TRACE = 10; + Object.prototype.DEBUG = 20; + Object.prototype.INFO = 30; + Object.prototype.WARN = 40; + Object.prototype.ERROR = 50; + Object.prototype.FATAL = 60; + this.req.username==boo@foo + Error: + SyntaxError: Unexpected token ILLEGAL + at new Script (vm.js:32:12) + at Function.Script.createScript (vm.js:48:10) + at parseArgv (/Users/trentm/tm/node-bunyan-0.x/bin/bunyan:465:27) + at main (/Users/trentm/tm/node-bunyan-0.x/bin/bunyan:1252:16) + at Object. (/Users/trentm/tm/node-bunyan-0.x/bin/bunyan:1330:3) + at Module._compile (module.js:449:26) + at Object.Module._extensions..js (module.js:467:10) + at Module.load (module.js:356:32) + at Function.Module._load (module.js:312:12) + at Module.runMain (module.js:492:10) + + And all CONDITION scripts will be run against a minimal valid Bunyan + log record to ensure they properly guard against undefined values + (at least as much as can reasonably be checked). For example: + + $ bunyan portal.log -c 'this.req.username=="bob"' + bunyan: error: CONDITION code cannot safely filter a minimal Bunyan log record + CONDITION script: + Object.prototype.TRACE = 10; + Object.prototype.DEBUG = 20; + Object.prototype.INFO = 30; + Object.prototype.WARN = 40; + Object.prototype.ERROR = 50; + Object.prototype.FATAL = 60; + this.req.username=="bob" + Minimal Bunyan log record: + { + "v": 0, + "level": 30, + "name": "name", + "hostname": "hostname", + "pid": 123, + "time": 1355514346206, + "msg": "msg" + } + Filter error: + TypeError: Cannot read property 'username' of undefined + at bunyan-condition-0:7:9 + at Script.Object.keys.forEach.(anonymous function) [as runInNewContext] (vm.js:41:22) + at parseArgv (/Users/trentm/tm/node-bunyan-0.x/bin/bunyan:477:18) + at main (/Users/trentm/tm/node-bunyan-0.x/bin/bunyan:1252:16) + at Object. (/Users/trentm/tm/node-bunyan-0.x/bin/bunyan:1330:3) + at Module._compile (module.js:449:26) + at Object.Module._extensions..js (module.js:467:10) + at Module.load (module.js:356:32) + at Function.Module._load (module.js:312:12) + at Module.runMain (module.js:492:10) + + A proper way to do that condition would be: + + $ bunyan portal.log -c 'this.req && this.req.username=="bob"' + + + +## 0.16.7 + +- [issue #59] Clear a possibly interrupted ANSI color code on signal + termination. + + +## 0.16.6 + +- [issue #56] Support `bunyan -p NAME` to dtrace all PIDs matching 'NAME' in + their command and args (using `ps -A -o pid,command | grep NAME` or, on SunOS + `pgrep -lf NAME`). E.g.: + + bunyan -p myappname + + This is useful for usage of node's [cluster + module](http://nodejs.org/docs/latest/api/all.html#all_cluster) where you'll + have multiple worker processes. + + +## 0.16.5 + +- Allow `bunyan -p '*'` to capture bunyan dtrace probes from **all** processes. +- issue #55: Add support for `BUNYAN_NO_COLOR` environment variable to + turn off all output coloring. This is still overridden by the `--color` + and `--no-color` options. + + +## 0.16.4 + +- issue #54: Ensure (again, see 0.16.2) that stderr from the dtrace child + process (when using `bunyan -p PID`) gets through. There had been a race + between exiting bunyan and the flushing of the dtrace process' stderr. + + +## 0.16.3 + +- Drop 'trentm-dtrace-provider' fork dep now that + has been resolved. + Back to dtrace-provider. + + +## 0.16.2 + +- Ensure that stderr from the dtrace child process (when using `bunyan -p PID`) + gets through. The `pipe` usage wasn't working on SmartOS. This is important + to show the user if they need to 'sudo'. + + +## 0.16.1 + +- Ensure that a possible dtrace child process (with using `bunyan -p PID`) is + terminated on signal termination of the bunyan CLI (at least for SIGINT, + SIGQUIT, SIGTERM, SIGHUP). + + +## 0.16.0 + +- Add `bunyan -p PID` support. This is a convenience wrapper that effectively + calls: + + dtrace -x strsize=4k -qn 'bunyan$PID:::log-*{printf("%s", copyinstr(arg0))}' | bunyan + + +## 0.15.0 + +- issue #48: Dtrace support! The elevator pitch is you can watch all logging + from all Bunyan-using process with something like this: + + dtrace -x strsize=4k -qn 'bunyan*:::log-*{printf("%d: %s: %s", pid, probefunc, copyinstr(arg0))}' + + And this can include log levels *below* what the service is actually configured + to log. E.g. if the service is only logging at INFO level and you need to see + DEBUG log messages, with this you can. Obviously this only works on dtrace-y + platforms: Illumos derivatives of SunOS (e.g. SmartOS, OmniOS), Mac, FreeBSD. + + Or get the bunyan CLI to render logs nicely: + + dtrace -x strsize=4k -qn 'bunyan*:::log-*{printf("%s", copyinstr(arg0))}' | bunyan + + See for details. By + Bryan Cantrill. + + +## 0.14.6 + +- Export `bunyan.safeCycles()`. This may be useful for custom `type == "raw"` + streams that may do JSON stringification of log records themselves. Usage: + + var str = JSON.stringify(rec, bunyan.safeCycles()); + +- [issue #49] Allow a `log.child()` to specify the level of inherited streams. + For example: + + # Before + var childLog = log.child({...}); + childLog.level('debug'); + + # After + var childLog = log.child({..., level: 'debug'}); + +- Improve the Bunyan CLI crash message to make it easier to provide relevant + details in a bug report. + + +## 0.14.5 + +- Fix a bug in the long-stack-trace error serialization added in 0.14.4. The + symptom: + + bunyan@0.14.4: .../node_modules/bunyan/lib/bunyan.js:1002 + var ret = ex.stack || ex.toString(); + ^ + TypeError: Cannot read property 'stack' of undefined + at getFullErrorStack (.../node_modules/bunyan/lib/bunyan.js:1002:15) + ... + + +## 0.14.4 + +- **Bad release. Use 0.14.5 instead.** +- Improve error serialization to walk the chain of `.cause()` errors + from the likes of `WError` or `VError` error classes from + [verror](https://github.com/davepacheco/node-verror) and + [restify v2.0](https://github.com/mcavage/node-restify). Example: + + [2012-10-11T00:30:21.871Z] ERROR: imgapi/99612 on 0525989e-2086-4270-b960-41dd661ebd7d: my-message + ValidationFailedError: my-message; caused by TypeError: cause-error-message + at Server.apiPing (/opt/smartdc/imgapi/lib/app.js:45:23) + at next (/opt/smartdc/imgapi/node_modules/restify/lib/server.js:550:50) + at Server.setupReq (/opt/smartdc/imgapi/lib/app.js:178:9) + at next (/opt/smartdc/imgapi/node_modules/restify/lib/server.js:550:50) + at Server.parseBody (/opt/smartdc/imgapi/node_modules/restify/lib/plugins/body_parser.js:15:33) + at next (/opt/smartdc/imgapi/node_modules/restify/lib/server.js:550:50) + at Server.parseQueryString (/opt/smartdc/imgapi/node_modules/restify/lib/plugins/query.js:40:25) + at next (/opt/smartdc/imgapi/node_modules/restify/lib/server.js:550:50) + at Server._run (/opt/smartdc/imgapi/node_modules/restify/lib/server.js:579:17) + at Server._handle.log.trace.req (/opt/smartdc/imgapi/node_modules/restify/lib/server.js:480:38) + Caused by: TypeError: cause-error-message + at Server.apiPing (/opt/smartdc/imgapi/lib/app.js:40:25) + at next (/opt/smartdc/imgapi/node_modules/restify/lib/server.js:550:50) + at Server.setupReq (/opt/smartdc/imgapi/lib/app.js:178:9) + at next (/opt/smartdc/imgapi/node_modules/restify/lib/server.js:550:50) + at Server.parseBody (/opt/smartdc/imgapi/node_modules/restify/lib/plugins/body_parser.js:15:33) + at next (/opt/smartdc/imgapi/node_modules/restify/lib/server.js:550:50) + at Server.parseQueryString (/opt/smartdc/imgapi/node_modules/restify/lib/plugins/query.js:40:25) + at next (/opt/smartdc/imgapi/node_modules/restify/lib/server.js:550:50) + at Server._run (/opt/smartdc/imgapi/node_modules/restify/lib/server.js:579:17) + at Server._handle.log.trace.req (/opt/smartdc/imgapi/node_modules/restify/lib/server.js:480:38) + + +## 0.14.2 + +- [issue #45] Fix bunyan CLI (default output mode) to not crash on a 'res' + field that isn't a response object, but a string. + + +## 0.14.1 + +- [issue #44] Fix the default `bunyan` CLI output of a `res.body` that is an + object instead of a string. See issue#38 for the same with `req.body`. + + +## 0.14.0 + +- [pull #41] Safe `JSON.stringify`ing of emitted log records to avoid blowing + up on circular objects (by Isaac Schlueter). + + +## 0.13.5 + +- [issue #39] Fix a bug with `client_req` handling in the default output + of the `bunyan` CLI. + + +## 0.13.4 + +- [issue #38] Fix the default `bunyan` CLI output of a `req.body` that is an + object instead of a string. + + +## 0.13.3 + +- Export `bunyan.resolveLevel(NAME-OR-NUM)` to resolve a level name or number + to its log level number value: + + > bunyan.resolveLevel('INFO') + 30 + > bunyan.resolveLevel('debug') + 20 + + A side-effect of this change is that the uppercase level name is now allowed + in the logger constructor. + + +## 0.13.2 + +- [issue #35] Ensure that an accidental `log.info(BUFFER)`, where BUFFER is + a node.js Buffer object, doesn't blow up. + + +## 0.13.1 + +- [issue #34] Ensure `req.body`, `res.body` and other request/response fields + are emitted by the `bunyan` CLI (mostly by Rob Gulewich). + + + +## 0.13.0 + +- [issue #31] Re-instate defines for the (uppercase) log level names (TRACE, + DEBUG, etc.) in `bunyan -c "..."` filtering condition code. E.g.: + + $ ... | bunyan -c 'level >= ERROR' + + +## 0.12.0 + +- [pull #32] `bunyan -o short` for more concise output (by Dave Pacheco). E.g.: + + 22:56:52.856Z INFO myservice: My message + + instead of: + + [2012-02-08T22:56:52.856Z] INFO: myservice/123 on example.com: My message + + +## 0.11.3 + +- Add '--strict' option to `bunyan` CLI to suppress all but legal Bunyan JSON + log lines. By default non-JSON, and non-Bunyan lines are passed through. + + +## 0.11.2 + +- [issue #30] Robust handling of 'req' field without a 'headers' subfield + in `bunyan` CLI. +- [issue #31] Pull the TRACE, DEBUG, et al defines from `bunyan -c "..."` + filtering code. This was added in v0.11.1, but has a significant adverse + affect. + + +## 0.11.1 + +- **Bad release. The TRACE et al names are bleeding into the log records + when using '-c'.** +- Add defines for the (uppercase) log level names (TRACE, DEBUG, etc.) in + `bunyan -c "..."` filtering condition code. E.g.: + + $ ... | bunyan -c 'level >= ERROR' + + +## 0.11.0 + +- [pull #29] Add -l/--level for level filtering, and -c/--condition for + arbitrary conditional filtering (by github.com/isaacs): + + $ ... | bunyan -l error # filter out log records below error + $ ... | bunyan -l 50 # numeric value works too + $ ... | bunyan -c 'level===50' # equiv with -c filtering + $ ... | bunyan -c 'pid===123' # filter on any field + $ ... | bunyan -c 'pid===123' -c '_audit' # multiple filters + + +## 0.10.0 + +- [pull #24] Support for gzip'ed log files in the bunyan CLI (by + github.com/mhart): + + $ bunyan foo.log.gz + ... + + +## 0.9.0 + +- [pull #16] Bullet proof the `bunyan.stdSerializers` (by github.com/rlidwka). + +- [pull #15] The `bunyan` CLI will now chronologically merge multiple log + streams when it is given multiple file arguments. (by github.com/davepacheco) + + $ bunyan foo.log bar.log + ... merged log records ... + +- [pull #15] A new `bunyan.RingBuffer` stream class that is useful for + keeping the last N log messages in memory. This can be a fast way to keep + recent, and thus hopefully relevant, log messages. (by @dapsays, + github.com/davepacheco) + + Potential uses: Live debugging if a running process could inspect those + messages. One could dump recent log messages at a finer log level than is + typically logged on + [`uncaughtException`](http://nodejs.org/docs/latest/api/all.html#all_event_uncaughtexception). + + var ringbuffer = new bunyan.RingBuffer({ limit: 100 }); + var log = new bunyan({ + name: 'foo', + streams: [{ + type: 'raw', + stream: ringbuffer, + level: 'debug' + }] + }); + + log.info('hello world'); + console.log(ringbuffer.records); + +- Add support for "raw" streams. This is a logging stream that is given + raw log record objects instead of a JSON-stringified string. + + function Collector() { + this.records = []; + } + Collector.prototype.write = function (rec) { + this.records.push(rec); + } + var log = new Logger({ + name: 'mylog', + streams: [{ + type: 'raw', + stream: new Collector() + }] + }); + + See "examples/raw-stream.js". I expect raw streams to be useful for + piping Bunyan logging to separate services (e.g. , + ) or to separate in-process handling. + +- Add test/corpus/*.log files (accidentally excluded) so the test suite + actually works(!). + + +## 0.8.0 + +- [pull #21] Bunyan loggers now re-emit `fs.createWriteStream` error events. + By github.com/EvanOxfeld. See "examples/handle-fs-error.js" and + "test/error-event.js" for details. + + var log = new Logger({name: 'mylog', streams: [{path: FILENAME}]}); + log.on('error', function (err, stream) { + // Handle error writing to or creating FILENAME. + }); + +- jsstyle'ing (via `make check`) + + +## 0.7.0 + +- [issue #12] Add `bunyan.createLogger(OPTIONS)` form, as is more typical in + node.js APIs. This'll eventually become the preferred form. + + +## 0.6.9 + +- Change `bunyan` CLI default output to color "src" info red. Before the "src" + information was uncolored. The "src" info is the filename, line number and + function name resulting from using `src: true` in `Logger` creation. I.e., + the `(/Users/trentm/tm/node-bunyan/examples/hi.js:10)` in: + + [2012-04-10T22:28:58.237Z] INFO: myapp/39339 on banana.local (/Users/trentm/tm/node-bunyan/examples/hi.js:10): hi + +- Tweak `bunyan` CLI default output to still show an "err" field if it doesn't + have a "stack" attribute. + + +## 0.6.8 + +- Fix bad bug in `log.child({...}, true);` where the added child fields **would + be added to the parent's fields**. This bug only existed for the "fast child" + path (that second `true` argument). A side-effect of fixing this is that + the "fast child" path is only 5 times as fast as the regular `log.child`, + instead of 10 times faster. + + +## 0.6.7 + +- [issue #6] Fix bleeding 'type' var to global namespace. (Thanks Mike!) + + +## 0.6.6 + +- Add support to the `bunyan` CLI taking log file path args, `bunyan foo.log`, + in addition to the usual `cat foo.log | bunyan`. +- Improve reliability of the default output formatting of the `bunyan` CLI. + Before it could blow up processing log records missing some expected + fields. + + +## 0.6.5 + +- ANSI coloring output from `bunyan` CLI tool (for the default output mode/style). + Also add the '--color' option to force coloring if the output stream is not + a TTY, e.g. `cat my.log | bunyan --color | less -R`. Use `--no-color` to + disable coloring, e.g. if your terminal doesn't support ANSI codes. +- Add 'level' field to log record before custom fields for that record. This + just means that the raw record JSON will show the 'level' field earlier, + which is a bit nicer for raw reading. + + +## 0.6.4 + +- [issue #5] Fix `log.info() -> boolean` to work properly. Previous all were + returning false. Ditto all trace/debug/.../fatal methods. + + +## 0.6.3 + +- Allow an optional `msg` and arguments to the `log.info( err)` logging + form. For example, before: + + log.debug(my_error_instance) // good + log.debug(my_error_instance, "boom!") // wasn't allowed + + Now the latter is allowed if you want to expliciting set the log msg. Of course + this applies to all the `log.{trace|debug|info...}()` methods. + +- `bunyan` cli output: clarify extra fields with quoting if empty or have + spaces. E.g. 'cmd' and 'stderr' in the following: + + [2012-02-12T00:30:43.736Z] INFO: mo-docs/43194 on banana.local: buildDocs results (req_id=185edca2-2886-43dc-911c-fe41c09ec0f5, route=PutDocset, error=null, stderr="", cmd="make docs") + + +## 0.6.2 + +- Fix/guard against unintended inclusion of some files in npm published package + due to + + +## 0.6.1 + +- Internal: starting jsstyle usage. +- Internal: add .npmignore. Previous packages had reams of bunyan crud in them. + + +## 0.6.0 + +- Add 'pid' automatic log record field. + + +## 0.5.3 + +- Add 'client_req' (HTTP client request) standard formatting in `bunyan` CLI + default output. +- Improve `bunyan` CLI default output to include *all* log record keys. Unknown keys + are either included in the first line parenthetical (if short) or in the indented + subsequent block (if long or multiline). + + +## 0.5.2 + +- [issue #3] More type checking of `new Logger(...)` and `log.child(...)` + options. +- Start a test suite. + + +## 0.5.1 + +- [issue #2] Add guard on `JSON.stringify`ing of log records before emission. + This will prevent `log.info` et al throwing on record fields that cannot be + represented as JSON. An error will be printed on stderr and a clipped log + record emitted with a 'bunyanMsg' key including error details. E.g.: + + bunyan: ERROR: could not stringify log record from /Users/trentm/tm/node-bunyan/examples/unstringifyable.js:12: TypeError: Converting circular structure to JSON + { + "name": "foo", + "hostname": "banana.local", + "bunyanMsg": "bunyan: ERROR: could not stringify log record from /Users/trentm/tm/node-bunyan/examples/unstringifyable.js:12: TypeError: Converting circular structure to JSON", + ... + + Some timing shows this does effect log speed: + + $ node tools/timeguard.js # before + Time try/catch-guard on JSON.stringify: + - log.info: 0.07365ms per iteration + $ node tools/timeguard.js # after + Time try/catch-guard on JSON.stringify: + - log.info: 0.07368ms per iteration + + +## 0.5.0 + +- Use 10/20/... instead of 1/2/... for level constant values. Ostensibly this + allows for intermediary levels from the defined "trace/debug/..." set. + However, that is discouraged. I'd need a strong user argument to add + support for easily using alternative levels. Consider using a separate + JSON field instead. +- s/service/name/ for Logger name field. "service" is unnecessarily tied + to usage for a service. No need to differ from log4j Logger "name". +- Add `log.level(...)` and `log.levels(...)` API for changing logger stream + levels. +- Add `TRACE|DEBUG|INFO|WARN|ERROR|FATAL` level constants to exports. +- Add `log.info(err)` special case for logging an `Error` instance. For + example `log.info(new TypeError("boom")` will produce: + + ... + "err": { + "message": "boom", + "name": "TypeError", + "stack": "TypeError: boom\n at Object. ..." + }, + "msg": "boom", + ... + + +## 0.4.0 + +- Add `new Logger({src: true})` config option to have a 'src' attribute be + automatically added to log records with the log call source info. Example: + + "src": { + "file": "/Users/trentm/tm/node-bunyan/examples/src.js", + "line": 20, + "func": "Wuzzle.woos" + }, + + +## 0.3.0 + +- `log.child(options[, simple])` Added `simple` boolean arg. Set `true` to + assert that options only add fields (no config changes). Results in a 10x + speed increase in child creation. See "tools/timechild.js". On my Mac, + "fast child" creation takes about 0.001ms. IOW, if your app is dishing + 10,000 req/s, then creating a log child for each request will take + about 1% of the request time. +- `log.clone` -> `log.child` to better reflect the relationship: streams and + serializers are inherited. Streams can't be removed as part of the child + creation. The child doesn't own the parent's streams (so can't close them). +- Clean up Logger creation. The goal here was to ensure `log.child` usage + is fast. TODO: measure that. +- Add `Logger.stdSerializers.err` serializer which is necessary to get good + Error object logging with node 0.6 (where core Error object properties + are non-enumerable). + + +## 0.2.0 + +- Spec'ing core/recommended log record fields. +- Add `LOG_VERSION` to exports. +- Improvements to request/response serializations. + + +## 0.1.0 + +First release. diff --git a/task/node_modules/bunyan/LICENSE.txt b/task/node_modules/bunyan/LICENSE.txt new file mode 100644 index 0000000..ced38b4 --- /dev/null +++ b/task/node_modules/bunyan/LICENSE.txt @@ -0,0 +1,24 @@ +# This is the MIT license + +Copyright 2016 Trent Mick +Copyright 2016 Joyent Inc. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/task/node_modules/bunyan/README.md b/task/node_modules/bunyan/README.md new file mode 100644 index 0000000..0d830a1 --- /dev/null +++ b/task/node_modules/bunyan/README.md @@ -0,0 +1,1380 @@ +[![npm version](https://img.shields.io/npm/v/bunyan.svg?style=flat)](https://www.npmjs.com/package/bunyan) +[![Build Status](https://travis-ci.org/trentm/node-bunyan.svg?branch=master)](https://travis-ci.org/trentm/node-bunyan) + +Bunyan is **a simple and fast JSON logging library** for node.js services: + +```js +var bunyan = require('bunyan'); +var log = bunyan.createLogger({name: "myapp"}); +log.info("hi"); +``` + +and **a `bunyan` CLI tool** for nicely viewing those logs: + +![bunyan CLI screenshot](https://raw.github.com/trentm/node-bunyan/master/tools/screenshot1.png) + +Manifesto: Server logs should be structured. JSON's a good format. Let's do +that. A log record is one line of `JSON.stringify`'d output. Let's also +specify some common names for the requisite and common fields for a log +record (see below). + + +## Table of Contents + + + +- [Current Status](#current-status) +- [Installation](#installation) +- [Features](#features) +- [Introduction](#introduction) + * [Constructor API](#constructor-api) + * [Log Method API](#log-method-api) + * [CLI Usage](#cli-usage) + * [Streams Introduction](#streams-introduction) + * [log.child](#logchild) + * [Serializers](#serializers) + + [Requirements for serializers functions](#requirements-for-serializers-functions) + + [Standard Serializers](#standard-serializers) + * [src](#src) +- [Levels](#levels) + * [Level suggestions](#level-suggestions) +- [Log Record Fields](#log-record-fields) + * [Core fields](#core-fields) + * [Recommended/Best Practice Fields](#recommendedbest-practice-fields) + * [Other fields to consider](#other-fields-to-consider) +- [Streams](#streams) + * [Adding a Stream](#adding-a-stream) + * [stream errors](#stream-errors) + * [stream type: `stream`](#stream-type-stream) + * [stream type: `file`](#stream-type-file) + * [stream type: `rotating-file`](#stream-type-rotating-file) + * [stream type: `raw`](#stream-type-raw) + * [`raw` + RingBuffer Stream](#raw--ringbuffer-stream) + * [third-party streams](#third-party-streams) +- [Runtime log snooping via DTrace](#runtime-log-snooping-via-dtrace) + * [DTrace examples](#dtrace-examples) +- [Runtime environments](#runtime-environments) + * [Browserify](#browserify) + * [Webpack](#webpack) +- [Versioning](#versioning) +- [License](#license) +- [See Also](#see-also) + + + +# Current Status + +Solid core functionality is there. Joyent is using this for a number of +production services. Bunyan supports node 0.10 and greater. Follow +@trentmick +for updates to Bunyan. + +There is an email discussion list +[bunyan-logging@googlegroups.com](mailto:bunyan-logging@googlegroups.com), +also [as a forum in the +browser](https://groups.google.com/forum/?fromgroups#!forum/bunyan-logging). + + +# Installation + +```sh +npm install bunyan +``` + +**Tip**: The `bunyan` CLI tool is written to be compatible (within reason) with +all versions of Bunyan logs. Therefore you might want to `npm install -g bunyan` +to get the bunyan CLI on your PATH, then use local bunyan installs for +node.js library usage of bunyan in your apps. + +**Tip**: Installing without optional dependencies can dramatically reduce +bunyan's install size. **dtrace-provider** is used for dtrace features, +**mv** is used for RotatingFileStream, and **moment** is used for local time. +If you don't need these features, consider installing with the +`--no-optional` flag. + + +# Features + +- elegant [log method API](#log-method-api) +- extensible [streams](#streams) system for controlling where log records + go (to a stream, to a file, [log file rotation](#stream-type-rotating-file), + etc.) +- [`bunyan` CLI](#cli-usage) for pretty-printing and filtering of Bunyan logs +- simple include of log call source location (file, line, function) with + [`src: true`](#src) +- lightweight specialization of Logger instances with [`log.child`](#logchild) +- custom rendering of logged objects with ["serializers"](#serializers) +- [Runtime log snooping via DTrace support](#runtime-log-snooping-via-dtrace) +- Support for a few [runtime environments](#runtime-environments): Node.js, + [Browserify](http://browserify.org/), [Webpack](https://webpack.github.io/), [NW.js](http://nwjs.io/). + + +# Introduction + +Like most logging libraries you create a Logger instance and call methods +named after the logging levels: + +```js +// hi.js +var bunyan = require('bunyan'); +var log = bunyan.createLogger({name: 'myapp'}); +log.info('hi'); +log.warn({lang: 'fr'}, 'au revoir'); +``` + +All loggers must provide a "name". This is somewhat akin to the log4j logger +"name", but Bunyan doesn't do hierarchical logger names. + +**Bunyan log records are JSON.** A few fields are added automatically: +"pid", "hostname", "time" and "v". + +```sh +$ node hi.js +{"name":"myapp","hostname":"banana.local","pid":40161,"level":30,"msg":"hi","time":"2013-01-04T18:46:23.851Z","v":0} +{"name":"myapp","hostname":"banana.local","pid":40161,"level":40,"lang":"fr","msg":"au revoir","time":"2013-01-04T18:46:23.853Z","v":0} +``` + + +## Constructor API + +```js +var bunyan = require('bunyan'); +var log = bunyan.createLogger({ + name: , // Required + level: , // Optional, see "Levels" section + stream: , // Optional, see "Streams" section + streams: [, ...], // Optional, see "Streams" section + serializers: , // Optional, see "Serializers" section + src: , // Optional, see "src" section + + // Any other fields are added to all log records as is. + foo: 'bar', + ... +}); +``` + + +## Log Method API + +The example above shows two different ways to call `log.info(...)`. The +full API is: + +```js +log.info(); // Returns a boolean: is the "info" level enabled? + // This is equivalent to `log.isInfoEnabled()` or + // `log.isEnabledFor(INFO)` in log4j. + +log.info('hi'); // Log a simple string message (or number). +log.info('hi %s', bob, anotherVar); // Uses `util.format` for msg formatting. + +log.info({foo: 'bar'}, 'hi'); + // The first field can optionally be a "fields" object, which + // is merged into the log record. + +log.info(err); // Special case to log an `Error` instance to the record. + // This adds an "err" field with exception details + // (including the stack) and sets "msg" to the exception + // message. +log.info(err, 'more on this: %s', more); + // ... or you can specify the "msg". + +log.info({foo: 'bar', err: err}, 'some msg about this error'); + // To pass in an Error *and* other fields, use the `err` + // field name for the Error instance. +``` + +Note that this implies **you cannot blindly pass any object as the first +argument to log it** because that object might include fields that collide with +Bunyan's [core record fields](#core-fields). In other words, +`log.info(mywidget)` may not yield what you expect. Instead of a string +representation of `mywidget` that other logging libraries may give you, Bunyan +will try to JSON-ify your object. It is a Bunyan best practice to always give a +field name to included objects, e.g.: + +```js +log.info({widget: mywidget}, ...) +``` + +This will dove-tail with [Bunyan serializer support](#serializers), discussed +later. + +The same goes for all of Bunyan's log levels: `log.trace`, `log.debug`, +`log.info`, `log.warn`, `log.error`, and `log.fatal`. See the [levels +section](#levels) below for details and suggestions. + + +## CLI Usage + +Bunyan log output is a stream of JSON objects. This is great for processing, +but not for reading directly. A **`bunyan` tool** is provided **for +pretty-printing bunyan logs** and for **filtering** (e.g. +`| bunyan -c 'this.foo == "bar"'`). Using our example above: + +```sh +$ node hi.js | ./node_modules/.bin/bunyan +[2013-01-04T19:01:18.241Z] INFO: myapp/40208 on banana.local: hi +[2013-01-04T19:01:18.242Z] WARN: myapp/40208 on banana.local: au revoir (lang=fr) +``` + +See the screenshot above for an example of the default coloring of rendered +log output. That example also shows the nice formatting automatically done for +some well-known log record fields (e.g. `req` is formatted like an HTTP request, +`res` like an HTTP response, `err` like an error stack trace). + +One interesting feature is **filtering** of log content, which can be useful +for digging through large log files or for analysis. We can filter only +records above a certain level: + +```sh +$ node hi.js | bunyan -l warn +[2013-01-04T19:08:37.182Z] WARN: myapp/40353 on banana.local: au revoir (lang=fr) +``` + +Or filter on the JSON fields in the records (e.g. only showing the French +records in our contrived example): + +```sh +$ node hi.js | bunyan -c 'this.lang == "fr"' +[2013-01-04T19:08:26.411Z] WARN: myapp/40342 on banana.local: au revoir (lang=fr) +``` + +See `bunyan --help` for other facilities. + + +## Streams Introduction + +By default, log output is to stdout and at the "info" level. Explicitly that +looks like: + +```js +var log = bunyan.createLogger({ + name: 'myapp', + stream: process.stdout, + level: 'info' +}); +``` + +That is an abbreviated form for a single stream. **You can define multiple +streams at different levels**. + +```js +var log = bunyan.createLogger({ + name: 'myapp', + streams: [ + { + level: 'info', + stream: process.stdout // log INFO and above to stdout + }, + { + level: 'error', + path: '/var/tmp/myapp-error.log' // log ERROR and above to a file + } + ] +}); +``` + +More on streams in the [Streams section](#streams) below. + +## log.child + +Bunyan has a concept of a child logger to **specialize a logger for a +sub-component of your application**, i.e. to create a new logger with +additional bound fields that will be included in its log records. A child +logger is created with `log.child(...)`. + +In the following example, logging on a "Wuzzle" instance's `this.log` will +be exactly as on the parent logger with the addition of the `widget_type` +field: + +```js +var bunyan = require('bunyan'); +var log = bunyan.createLogger({name: 'myapp'}); + +function Wuzzle(options) { + this.log = options.log.child({widget_type: 'wuzzle'}); + this.log.info('creating a wuzzle') +} +Wuzzle.prototype.woos = function () { + this.log.warn('This wuzzle is woosey.') +} + +log.info('start'); +var wuzzle = new Wuzzle({log: log}); +wuzzle.woos(); +log.info('done'); +``` + +Running that looks like (raw): + +```sh +$ node myapp.js +{"name":"myapp","hostname":"myhost","pid":34572,"level":30,"msg":"start","time":"2013-01-04T07:47:25.814Z","v":0} +{"name":"myapp","hostname":"myhost","pid":34572,"widget_type":"wuzzle","level":30,"msg":"creating a wuzzle","time":"2013-01-04T07:47:25.815Z","v":0} +{"name":"myapp","hostname":"myhost","pid":34572,"widget_type":"wuzzle","level":40,"msg":"This wuzzle is woosey.","time":"2013-01-04T07:47:25.815Z","v":0} +{"name":"myapp","hostname":"myhost","pid":34572,"level":30,"msg":"done","time":"2013-01-04T07:47:25.816Z","v":0} +``` + +And with the `bunyan` CLI (using the "short" output mode): + +```sh +$ node myapp.js | bunyan -o short +07:46:42.707Z INFO myapp: start +07:46:42.709Z INFO myapp: creating a wuzzle (widget_type=wuzzle) +07:46:42.709Z WARN myapp: This wuzzle is woosey. (widget_type=wuzzle) +07:46:42.709Z INFO myapp: done +``` + +A more practical example is in the +[node-restify](https://github.com/mcavage/node-restify) web framework. +Restify uses Bunyan for its logging. One feature of its integration, is that +if `server.use(restify.requestLogger())` is used, each restify request handler +includes a `req.log` logger that is: + +```js +log.child({req_id: }, true) +``` + +Apps using restify can then use `req.log` and have all such log records +include the unique request id (as "req\_id"). Handy. + + +## Serializers + +Bunyan has a concept of **"serializer" functions to produce a JSON-able object +from a JavaScript object**, so you can easily do the following: + +```js +log.info({req: }, 'something about handling this request'); +``` + +and have the `req` entry in the log record be just a reasonable subset of +`` fields (or computed data about those fields). + + +A logger instance can have a `serializers` mapping of log record field name +("req" in this example) to a serializer function. When creating the log +record, Bunyan will call the serializer function for fields of that name. +An example: + +```js +function reqSerializer(req) { + return { + method: req.method, + url: req.url, + headers: req.headers + }; +} +var log = bunyan.createLogger({ + name: 'myapp', + serializers: { + req: reqSerializer + } +}); +``` + + +Typically serializers are added to a logger at creation time via +`bunyan.createLogger({..., serializers: })`. However, serializers +can be added after creation via `.addSerializers(...)`, e.g.: + +```js +var log = bunyan.createLogger({name: 'myapp'}); +log.addSerializers({req: reqSerializer}); +``` + +### Requirements for serializers functions + +A serializer function is passed unprotected objects that are passed to the +`log.info`, `log.debug`, etc. call. This means a poorly written serializer +function can cause side-effects. Logging shouldn't do that. Here are a few +rules and best practices for serializer functions: + +- A serializer function *should never throw*. The bunyan library *does* + protect somewhat from this: if the serializer throws an error, then + bunyan will (a) write an ugly message on stderr (along with the traceback), + and (b) the field in the log record will be replaced with a short error message. + For example: + + ``` + bunyan: ERROR: Exception thrown from the "foo" Bunyan serializer. This should never happen. This is a bug in that serializer function. + TypeError: Cannot read property 'not' of undefined + at Object.fooSerializer [as foo] (/Users/trentm/tm/node-bunyan/bar.js:8:26) + at /Users/trentm/tm/node-bunyan/lib/bunyan.js:873:50 + at Array.forEach (native) + at Logger._applySerializers (/Users/trentm/tm/node-bunyan/lib/bunyan.js:865:35) + at mkRecord (/Users/trentm/tm/node-bunyan/lib/bunyan.js:978:17) + at Logger.info (/Users/trentm/tm/node-bunyan/lib/bunyan.js:1044:19) + at Object. (/Users/trentm/tm/node-bunyan/bar.js:13:5) + at Module._compile (module.js:409:26) + at Object.Module._extensions..js (module.js:416:10) + at Module.load (module.js:343:32) + {"name":"bar","hostname":"danger0.local","pid":47411,"level":30,"foo":"(Error in Bunyan log \"foo\" serializer broke field. See stderr for details.)","msg":"one","time":"2017-03-08T02:53:51.173Z","v":0} + ``` + +- A serializer function *should never mutate the given object*. Doing so will + change the object in your application. + +- A serializer function *should be defensive*. In my experience, it is common to + set a serializer in an app, say for field name "foo", and then accidentally + have a log line that passes a "foo" that is undefined, or null, or of some + unexpected type. A good start at defensiveness is to start with this: + + ```javascript + function fooSerializer(foo) { + // Guard against foo be null/undefined. Check that expected fields + // are defined. + if (!foo || !foo.bar) + return foo; + var obj = { + // Create the object to be logged. + bar: foo.bar + } + return obj; + }; + ``` + + +### Standard Serializers + +Bunyan includes a small set of "standard serializers", exported as +`bunyan.stdSerializers`. Their use is completely optional. An example using +all of them: + +```js +var log = bunyan.createLogger({ + name: 'myapp', + serializers: bunyan.stdSerializers +}); +``` + +or particular ones: + +```js +var log = bunyan.createLogger({ + name: 'myapp', + serializers: {err: bunyan.stdSerializers.err} +}); +``` + +Standard serializers are: + +| Field | Description | +| ----- | ----------- | +| err | Used for serializing JavaScript error objects, including traversing an error's cause chain for error objects with a `.cause()` -- e.g. as from [verror](https://github.com/joyent/node-verror). | +| req | Common fields from a node.js HTTP request object. | +| res | Common fields from a node.js HTTP response object. | + +Note that the `req` and `res` serializers intentionally do not include the +request/response *body*, as that can be prohibitively large. If helpful, the +[restify framework's audit logger plugin](https://github.com/restify/node-restify/blob/ac13902ad9716dcb20aaa62295403983075b1841/lib/plugins/audit.js#L38-L87) +has its own req/res serializers that include more information (optionally +including the body). + + +## src + +The **source file, line and function of the log call site** can be added to +log records by using the `src: true` config option: + +```js +var log = bunyan.createLogger({src: true, ...}); +``` + +This adds the call source info with the 'src' field, like this: + +```js +{ + "name": "src-example", + "hostname": "banana.local", + "pid": 123, + "component": "wuzzle", + "level": 4, + "msg": "This wuzzle is woosey.", + "time": "2012-02-06T04:19:35.605Z", + "src": { + "file": "/Users/trentm/tm/node-bunyan/examples/src.js", + "line": 20, + "func": "Wuzzle.woos" + }, + "v": 0 +} +``` + +**WARNING: Determining the call source info is slow. Never use this option +in production.** + + +# Levels + +The log levels in bunyan are as follows. The level descriptions are best +practice *opinions* of the author. + +- "fatal" (60): The service/app is going to stop or become unusable now. + An operator should definitely look into this soon. +- "error" (50): Fatal for a particular request, but the service/app continues + servicing other requests. An operator should look at this soon(ish). +- "warn" (40): A note on something that should probably be looked at by an + operator eventually. +- "info" (30): Detail on regular operation. +- "debug" (20): Anything else, i.e. too verbose to be included in "info" level. +- "trace" (10): Logging from external libraries used by your app or *very* + detailed application logging. + +Setting a logger instance (or one of its streams) to a particular level implies +that all log records *at that level and above* are logged. E.g. a logger set to +level "info" will log records at level info and above (warn, error, fatal). + +While using log level *names* is preferred, the actual level values are integers +internally (10 for "trace", ..., 60 for "fatal"). Constants are defined for +the levels: `bunyan.TRACE` ... `bunyan.FATAL`. The lowercase level names are +aliases supported in the API, e.g. `log.level("info")`. There is one exception: +DTrace integration uses the level names. The fired DTrace probes are named +'bunyan-$levelName'. + +Here is the API for querying and changing levels on an existing logger. +Recall that a logger instance has an array of output "streams": + +```js +log.level() -> INFO // gets current level (lowest level of all streams) + +log.level(INFO) // set all streams to level INFO +log.level("info") // set all streams to level INFO + +log.levels() -> [DEBUG, INFO] // get array of levels of all streams +log.levels(0) -> DEBUG // get level of stream at index 0 +log.levels("foo") // get level of stream with name "foo" + +log.levels(0, INFO) // set level of stream 0 to INFO +log.levels(0, "info") // can use "info" et al aliases +log.levels("foo", WARN) // set stream named "foo" to WARN +``` + + +## Level suggestions + +Trent's biased suggestions for server apps: Use "debug" sparingly. Information +that will be useful to debug errors *post mortem* should usually be included in +"info" messages if it's generally relevant or else with the corresponding +"error" event. Don't rely on spewing mostly irrelevant debug messages all the +time and sifting through them when an error occurs. + +Trent's biased suggestions for node.js libraries: IMHO, libraries should only +ever log at `trace`-level. Fine control over log output should be up to the +app using a library. Having a library that spews log output at higher levels +gets in the way of a clear story in the *app* logs. + + +# Log Record Fields + +This section will describe *rules* for the Bunyan log format: field names, +field meanings, required fields, etc. However, a Bunyan library doesn't +strictly enforce all these rules while records are being emitted. For example, +Bunyan will add a `time` field with the correct format to your log records, +but you can specify your own. It is the caller's responsibility to specify +the appropriate format. + +The reason for the above leniency is because IMO logging a message should +never break your app. This leads to this rule of logging: **a thrown +exception from `log.info(...)` or equivalent (other than for calling with the +incorrect signature) is always a bug in Bunyan.** + + +A typical Bunyan log record looks like this: + +```js +{"name":"myserver","hostname":"banana.local","pid":123,"req":{"method":"GET","url":"/path?q=1#anchor","headers":{"x-hi":"Mom","connection":"close"}},"level":3,"msg":"start request","time":"2012-02-03T19:02:46.178Z","v":0} +``` + +Pretty-printed: + +```js +{ + "name": "myserver", + "hostname": "banana.local", + "pid": 123, + "req": { + "method": "GET", + "url": "/path?q=1#anchor", + "headers": { + "x-hi": "Mom", + "connection": "close" + }, + "remoteAddress": "120.0.0.1", + "remotePort": 51244 + }, + "level": 3, + "msg": "start request", + "time": "2012-02-03T19:02:57.534Z", + "v": 0 +} +``` + +## Core fields + +- `v`: Required. Integer. Added by Bunyan. Cannot be overridden. + This is the Bunyan log format version (`require('bunyan').LOG_VERSION`). + The log version is a single integer. `0` is until I release a version + "1.0.0" of node-bunyan. Thereafter, starting with `1`, this will be + incremented if there is any backward incompatible change to the log record + format. Details will be in "CHANGES.md" (the change log). +- `level`: Required. Integer. Added by Bunyan. Cannot be overridden. + See the "Levels" section. +- `name`: Required. String. Provided at Logger creation. + You must specify a name for your logger when creating it. Typically this + is the name of the service/app using Bunyan for logging. +- `hostname`: Required. String. Provided or determined at Logger creation. + You can specify your hostname at Logger creation or it will be retrieved + via `os.hostname()`. +- `pid`: Required. Integer. Filled in automatically at Logger creation. +- `time`: Required. String. Added by Bunyan. Can be overridden. + The date and time of the event in [ISO 8601 + Extended Format](http://en.wikipedia.org/wiki/ISO_8601) format and in UTC, + as from + [`Date.toISOString()`](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toISOString). +- `msg`: Required. String. + Every `log.debug(...)` et al call must provide a log message. +- `src`: Optional. Object giving log call source info. This is added + automatically by Bunyan if the "src: true" config option is given to the + Logger. Never use in production as this is really slow. + + +Go ahead and add more fields, and nested ones are fine (and recommended) as +well. This is why we're using JSON. Some suggestions and best practices +follow (feedback from actual users welcome). + + +## Recommended/Best Practice Fields + +- `err`: Object. A caught JS exception. Log that thing with `log.info(err)` + to get: + + ```js + ... + "err": { + "message": "boom", + "name": "TypeError", + "stack": "TypeError: boom\n at Object. ..." + }, + "msg": "boom", + ... + ``` + + Or use the `bunyan.stdSerializers.err` serializer in your Logger and + do this `log.error({err: err}, "oops")`. See "examples/err.js". + +- `req_id`: String. A request identifier. Including this field in all logging + tied to handling a particular request to your server is strongly suggested. + This allows post analysis of logs to easily collate all related logging + for a request. This really shines when you have a SOA with multiple services + and you carry a single request ID from the top API down through all APIs + (as [node-restify](https://github.com/mcavage/node-restify) facilitates + with its 'Request-Id' header). + +- `req`: An HTTP server request. Bunyan provides `bunyan.stdSerializers.req` + to serialize a request with a suggested set of keys. Example: + + ```js + { + "method": "GET", + "url": "/path?q=1#anchor", + "headers": { + "x-hi": "Mom", + "connection": "close" + }, + "remoteAddress": "120.0.0.1", + "remotePort": 51244 + } + ``` + +- `res`: An HTTP server response. Bunyan provides `bunyan.stdSerializers.res` + to serialize a response with a suggested set of keys. Example: + + ```js + { + "statusCode": 200, + "header": "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nConnection: keep-alive\r\nTransfer-Encoding: chunked\r\n\r\n" + } + ``` + +## Other fields to consider + +- `req.username`: Authenticated user (or for a 401, the user attempting to + auth). +- Some mechanism to calculate response latency. "restify" users will have + an "X-Response-Time" header. A `latency` custom field would be fine. +- `req.body`: If you know that request bodies are small (common in APIs, + for example), then logging the request body is good. + + +# Streams + +A "stream" is Bunyan's name for where it outputs log messages (the equivalent +to a log4j Appender). Ultimately Bunyan uses a +[Writable Stream](https://nodejs.org/docs/latest/api/all.html#writable_Stream) +interface, but there are some additional attributes used to create and +manage the stream. A Bunyan Logger instance has one or more streams. +In general streams are specified with the "streams" option: + +```js +var bunyan = require('bunyan'); +var log = bunyan.createLogger({ + name: "foo", + streams: [ + { + stream: process.stderr, + level: "debug" + }, + ... + ] +}); +``` + +For convenience, if there is only one stream, it can be specified with the +"stream" and "level" options (internally converted to a `Logger.streams`). + +```js +var log = bunyan.createLogger({ + name: "foo", + stream: process.stderr, + level: "debug" +}); +``` + +Note that "file" streams do not support this shortcut (partly for historical +reasons and partly to not make it difficult to add a literal "path" field +on log records). + +If neither "streams" nor "stream" are specified, the default is a stream of +type "stream" emitting to `process.stdout` at the "info" level. + +## Adding a Stream + +After a bunyan instance has been initialized, you may add additional streams by +calling the `addStream` function. + +```js +var bunyan = require('bunyan'); +var log = bunyan.createLogger('myLogger'); +log.addStream({ + name: "myNewStream", + stream: process.stderr, + level: "debug" +}); +``` + +## stream errors + +A Bunyan logger instance can be made to re-emit "error" events from its +streams. Bunyan does so by default for [`type === "file"` +streams](#stream-type-file), so you can do this: + +```js +var log = bunyan.createLogger({name: 'mylog', streams: [{path: LOG_PATH}]}); +log.on('error', function (err, stream) { + // Handle stream write or create error here. +}); +``` + +As of bunyan@1.7.0, the `reemitErrorEvents` field can be used when adding a +stream to control whether "error" events are re-emitted on the Logger. For +example: + + var EventEmitter = require('events').EventEmitter; + var util = require('util'); + + function MyFlakyStream() {} + util.inherits(MyFlakyStream, EventEmitter); + + MyFlakyStream.prototype.write = function (rec) { + this.emit('error', new Error('boom')); + } + + var log = bunyan.createLogger({ + name: 'this-is-flaky', + streams: [ + { + type: 'raw', + stream: new MyFlakyStream(), + reemitErrorEvents: true + } + ] + }); + log.info('hi there'); + +The behaviour is as follows: + +- `reemitErrorEvents` not specified: `file` streams will re-emit error events + on the Logger instance. +- `reemitErrorEvents: true`: error events will be re-emitted on the Logger + for any stream with a `.on()` function -- which includes file streams, + process.stdout/stderr, and any object that inherits from EventEmitter. +- `reemitErrorEvents: false`: error events will not be re-emitted for any + streams. + +Note: "error" events are **not** related to log records at the "error" level +as produced by `log.error(...)`. See [the node.js docs on error +events](https://nodejs.org/api/events.html#events_error_events) for details. + + +## stream type: `stream` + +A `type === 'stream'` is a plain ol' node.js [Writable +Stream](http://nodejs.org/docs/latest/api/all.html#writable_Stream). A +"stream" (the writable stream) field is required. E.g.: `process.stdout`, +`process.stderr`. + +```js +var log = bunyan.createLogger({ + name: 'foo', + streams: [{ + stream: process.stderr + // `type: 'stream'` is implied + }] +}); +``` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRequired?DefaultDescription
streamYes-A "Writable Stream", e.g. a std handle or an open file write stream.
typeNon/a`type == 'stream'` is implied if the `stream` field is given.
levelNoinfoThe level to which logging to this stream is enabled. If not +specified it defaults to "info". If specified this can be one of the +level strings ("trace", "debug", ...) or constants (`bunyan.TRACE`, +`bunyan.DEBUG`, ...). This serves as a severity threshold for that stream +so logs of greater severity will also pass through (i.e. If level="warn", +error and fatal will also pass through this stream).
nameNo-A name for this stream. This may be useful for usage of `log.level(NAME, +LEVEL)`. See the [Levels section](#levels) for details. A stream "name" isn't +used for anything else.
+ + +## stream type: `file` + +A `type === 'file'` stream requires a "path" field. Bunyan will open this +file for appending. E.g.: + +```js +var log = bunyan.createLogger({ + name: 'foo', + streams: [{ + path: '/var/log/foo.log', + // `type: 'file'` is implied + }] +}); +``` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRequired?DefaultDescription
pathYes-A file path to which to log.
typeNon/a`type == 'file'` is implied if the `path` field is given.
levelNoinfoThe level to which logging to this stream is enabled. If not +specified it defaults to "info". If specified this can be one of the +level strings ("trace", "debug", ...) or constants (`bunyan.TRACE`, +`bunyan.DEBUG`, ...). This serves as a severity threshold for that +stream so logs of greater severity will also pass through (i.e. If +level="warn", error and fatal will also pass through this stream).
nameNo-A name for this stream. This may be useful for usage of `log.level(NAME, +LEVEL)`. See the [Levels section](#levels) for details. A stream "name" isn't +used for anything else.
+ + +## stream type: `rotating-file` + +**WARNING on node 0.8 usage:** Users of Bunyan's `rotating-file` should (a) be +using at least bunyan 0.23.1 (with the fix for [this +issue](https://github.com/trentm/node-bunyan/pull/97)), and (b) should use at +least node 0.10 (node 0.8 does not support the `unref()` method on +`setTimeout(...)` needed for the mentioned fix). The symptom is that process +termination will hang for up to a full rotation period. + +**WARNING on [cluster](http://nodejs.org/docs/latest/api/all.html#all_cluster) +usage:** Using Bunyan's `rotating-file` stream with node.js's "cluster" module +can result in unexpected file rotation. You must not have multiple processes +in the cluster logging to the same file path. In other words, you must have +a separate log file path for the master and each worker in the cluster. +Alternatively, consider using a system file rotation facility such as +`logrotate` on Linux or `logadm` on SmartOS/Illumos. See +[this comment on issue #117](https://github.com/trentm/node-bunyan/issues/117#issuecomment-44804938) +for details. + +A `type === 'rotating-file'` is a file stream that handles file automatic +rotation. + +```js +var log = bunyan.createLogger({ + name: 'foo', + streams: [{ + type: 'rotating-file', + path: '/var/log/foo.log', + period: '1d', // daily rotation + count: 3 // keep 3 back copies + }] +}); +``` + +This will rotate '/var/log/foo.log' every day (at midnight) to: + +```sh +/var/log/foo.log.0 # yesterday +/var/log/foo.log.1 # 1 day ago +/var/log/foo.log.2 # 2 days ago +``` + +*Currently*, there is no support for providing a template for the rotated +files, or for rotating when the log reaches a threshold size. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRequired?DefaultDescription
typeYes-"rotating-file"
pathYes-A file path to which to log. Rotated files will be "$path.0", +"$path.1", ...
periodNo1dThe period at which to rotate. This is a string of the format +"$number$scope" where "$scope" is one of "ms" (milliseconds -- only useful for +testing), "h" (hours), "d" (days), "w" (weeks), "m" (months), "y" (years). Or +one of the following names can be used "hourly" (means 1h), "daily" (1d), +"weekly" (1w), "monthly" (1m), "yearly" (1y). Rotation is done at the start of +the scope: top of the hour (h), midnight (d), start of Sunday (w), start of the +1st of the month (m), start of Jan 1st (y).
countNo10The number of rotated files to keep.
levelNoinfoThe level at which logging to this stream is enabled. If not +specified it defaults to "info". If specified this can be one of the +level strings ("trace", "debug", ...) or constants (`bunyan.TRACE`, +`bunyan.DEBUG`, ...).
nameNo-A name for this stream. This may be useful for usage of `log.level(NAME, +LEVEL)`. See the [Levels section](#levels) for details. A stream "name" isn't +used for anything else.
+ + +**Note on log rotation**: Often you may be using external log rotation utilities +like `logrotate` on Linux or `logadm` on SmartOS/Illumos. In those cases, unless +you are ensuring "copy and truncate" semantics (via `copytruncate` with +logrotate or `-c` with logadm) then the fd for your 'file' stream will change. +You can tell bunyan to reopen the file stream with code like this in your +app: + +```js +var log = bunyan.createLogger(...); +... +process.on('SIGUSR2', function () { + log.reopenFileStreams(); +}); +``` + +where you'd configure your log rotation to send SIGUSR2 (or some other signal) +to your process. Any other mechanism to signal your app to run +`log.reopenFileStreams()` would work as well. + + +## stream type: `raw` + +- `raw`: Similar to a "stream" writable stream, except that the write method + is given raw log record *Object*s instead of a JSON-stringified string. + This can be useful for hooking on further processing to all Bunyan logging: + pushing to an external service, a RingBuffer (see below), etc. + + + +## `raw` + RingBuffer Stream + +Bunyan comes with a special stream called a RingBuffer which keeps the last N +records in memory and does *not* write the data anywhere else. One common +strategy is to log 'info' and higher to a normal log file but log all records +(including 'trace') to a ringbuffer that you can access via a debugger, or your +own HTTP interface, or a post-mortem facility like MDB or node-panic. + +To use a RingBuffer: + +```js +/* Create a ring buffer that stores the last 100 records. */ +var bunyan = require('bunyan'); +var ringbuffer = new bunyan.RingBuffer({ limit: 100 }); +var log = bunyan.createLogger({ + name: 'foo', + streams: [ + { + level: 'info', + stream: process.stdout + }, + { + level: 'trace', + type: 'raw', // use 'raw' to get raw log record objects + stream: ringbuffer + } + ] +}); + +log.info('hello world'); +console.log(ringbuffer.records); +``` + +This example emits: + +```js +[ { name: 'foo', + hostname: '912d2b29', + pid: 50346, + level: 30, + msg: 'hello world', + time: '2012-06-19T21:34:19.906Z', + v: 0 } ] +``` + +## third-party streams + +See the [user-maintained list in the Bunyan +wiki](https://github.com/trentm/node-bunyan/wiki/Awesome-Bunyan). + + +# Runtime log snooping via DTrace + +On systems that support DTrace (e.g., illumos derivatives like SmartOS and +OmniOS, FreeBSD, Mac), Bunyan will create a DTrace provider (`bunyan`) that +makes available the following probes: + +```sh +log-trace +log-debug +log-info +log-warn +log-error +log-fatal +``` + +Each of these probes has a single argument: the string that would be +written to the log. Note that when a probe is enabled, it will +fire whenever the corresponding function is called, even if the level of +the log message is less than that of any stream. + + +## DTrace examples + +Trace all log messages coming from any Bunyan module on the system. +(The `-x strsize=4k` is to raise dtrace's default 256 byte buffer size +because log messages are longer than typical dtrace probes.) + +```sh +dtrace -x strsize=4k -qn 'bunyan*:::log-*{printf("%d: %s: %s", pid, probefunc, copyinstr(arg0))}' +``` + +Trace all log messages coming from the "wuzzle" component: + +```sh +dtrace -x strsize=4k -qn 'bunyan*:::log-*/strstr(this->str = copyinstr(arg0), "\"component\":\"wuzzle\"") != NULL/{printf("%s", this->str)}' +``` + +Aggregate debug messages from process 1234, by message: + +```sh +dtrace -x strsize=4k -n 'bunyan1234:::log-debug{@[copyinstr(arg0)] = count()}' +``` + +Have the bunyan CLI pretty-print the traced logs: + +```sh +dtrace -x strsize=4k -qn 'bunyan1234:::log-*{printf("%s", copyinstr(arg0))}' | bunyan +``` + +A convenience handle has been made for this: + +```sh +bunyan -p 1234 +``` + +On systems that support the +[`jstack`](http://dtrace.org/blogs/dap/2012/04/25/profiling-node-js/) action +via a node.js helper, get a stack backtrace for any debug message that +includes the string "danger!": + +```sh +dtrace -x strsize=4k -qn 'log-debug/strstr(copyinstr(arg0), "danger!") != NULL/{printf("\n%s", copyinstr(arg0)); jstack()}' +``` + +Output of the above might be: + +``` +{"name":"foo","hostname":"763bf293-d65c-42d5-872b-4abe25d5c4c7.local","pid":12747,"level":20,"msg":"danger!","time":"2012-10-30T18:28:57.115Z","v":0} + + node`0x87e2010 + DTraceProviderBindings.node`usdt_fire_probe+0x32 + DTraceProviderBindings.node`_ZN4node11DTraceProbe5_fireEN2v85LocalINS1_5ValueEEE+0x32d + DTraceProviderBindings.node`_ZN4node11DTraceProbe4FireERKN2v89ArgumentsE+0x77 + << internal code >> + (anon) as (anon) at /root/node-bunyan/lib/bunyan.js position 40484 + << adaptor >> + (anon) as doit at /root/my-prog.js position 360 + (anon) as list.ontimeout at timers.js position 4960 + << adaptor >> + << internal >> + << entry >> + node`_ZN2v88internalL6InvokeEbNS0_6HandleINS0_10JSFunctionEEENS1_INS0_6ObjectEEEiPS5_Pb+0x101 + node`_ZN2v88internal9Execution4CallENS0_6HandleINS0_6ObjectEEES4_iPS4_Pbb+0xcb + node`_ZN2v88Function4CallENS_6HandleINS_6ObjectEEEiPNS1_INS_5ValueEEE+0xf0 + node`_ZN4node12MakeCallbackEN2v86HandleINS0_6ObjectEEENS1_INS0_8FunctionEEEiPNS1_INS0_5ValueEEE+0x11f + node`_ZN4node12MakeCallbackEN2v86HandleINS0_6ObjectEEENS1_INS0_6StringEEEiPNS1_INS0_5ValueEEE+0x66 + node`_ZN4node9TimerWrap9OnTimeoutEP10uv_timer_si+0x63 + node`uv__run_timers+0x66 + node`uv__run+0x1b + node`uv_run+0x17 + node`_ZN4node5StartEiPPc+0x1d0 + node`main+0x1b + node`_start+0x83 + + node`0x87e2010 + DTraceProviderBindings.node`usdt_fire_probe+0x32 + DTraceProviderBindings.node`_ZN4node11DTraceProbe5_fireEN2v85LocalINS1_5ValueEEE+0x32d + DTraceProviderBindings.node`_ZN4node11DTraceProbe4FireERKN2v89ArgumentsE+0x77 + << internal code >> + (anon) as (anon) at /root/node-bunyan/lib/bunyan.js position 40484 + << adaptor >> + (anon) as doit at /root/my-prog.js position 360 + (anon) as list.ontimeout at timers.js position 4960 + << adaptor >> + << internal >> + << entry >> + node`_ZN2v88internalL6InvokeEbNS0_6HandleINS0_10JSFunctionEEENS1_INS0_6ObjectEEEiPS5_Pb+0x101 + node`_ZN2v88internal9Execution4CallENS0_6HandleINS0_6ObjectEEES4_iPS4_Pbb+0xcb + node`_ZN2v88Function4CallENS_6HandleINS_6ObjectEEEiPNS1_INS_5ValueEEE+0xf0 + node`_ZN4node12MakeCallbackEN2v86HandleINS0_6ObjectEEENS1_INS0_8FunctionEEEiPNS1_INS0_5ValueEEE+0x11f + node`_ZN4node12MakeCallbackEN2v86HandleINS0_6ObjectEEENS1_INS0_6StringEEEiPNS1_INS0_5ValueEEE+0x66 + node`_ZN4node9TimerWrap9OnTimeoutEP10uv_timer_si+0x63 + node`uv__run_timers+0x66 + node`uv__run+0x1b + node`uv_run+0x17 + node`_ZN4node5StartEiPPc+0x1d0 + node`main+0x1b + node`_start+0x83 +``` + + +# Runtime environments + +Node-bunyan supports running in a few runtime environments: + +- [Node.js](https://nodejs.org/) +- [Browserify](http://browserify.org/): See the + [Browserify section](#browserify) below. +- [Webpack](https://webpack.github.io/): See the [Webpack section](#webpack) below. +- [NW.js](http://nwjs.io/) + +Support for other runtime environments is welcome. If you have suggestions, +fixes, or mentions that node-bunyan already works in some other JavaScript +runtime, please open an [issue](https://github.com/trentm/node-bunyan/issues/new) +or a pull request. + +The primary target is Node.js. It is the only environment in which I +regularly test. If you have suggestions for how to automate testing for other +environments, I'd appreciate feedback on [this automated testing +issue](https://github.com/trentm/node-bunyan/issues/342). + +## Browserify + +As the [Browserify](http://browserify.org/) site says it "lets you +`require('modules')` in the browser by bundling up all of your dependencies." +It is a build tool to run on your node.js script to bundle up your script and +all its node.js dependencies into a single file that is runnable in the +browser via: + +```html + +``` + +As of version 1.1.0, node-bunyan supports being run via Browserify. The +default [stream](#streams) when running in the browser is one that emits +raw log records to `console.log/info/warn/error`. + +Here is a quick example showing you how you can get this working for your +script. + +1. Get browserify and bunyan installed in your module: + + ```sh + $ npm install browserify bunyan + ``` + +2. An example script using Bunyan, "play.js": + + ```js + var bunyan = require('bunyan'); + var log = bunyan.createLogger({name: 'play', level: 'debug'}); + log.trace('this one does not emit'); + log.debug('hi on debug'); // console.log + log.info('hi on info'); // console.info + log.warn('hi on warn'); // console.warn + log.error('hi on error'); // console.error + ``` + +3. Build this into a bundle to run in the browser, "play.browser.js": + + ```sh + $ ./node_modules/.bin/browserify play.js -o play.browser.js + ``` + +4. Put that into an HTML file, "play.html": + + ```html + + + + + + + +
hi
+ + + ``` + +5. Open that in your browser and open your browser console: + + ```sh + $ open play.html + ``` + +Here is what it looks like in Firefox's console: ![Bunyan + Browserify in the +Firefox console](./docs/img/bunyan.browserify.png) + +For some, the raw log records might not be desired. To have a rendered log line +you'll want to add your own stream, starting with something like this: + +```js +var bunyan = require('./lib/bunyan'); + +function MyRawStream() {} +MyRawStream.prototype.write = function (rec) { + console.log('[%s] %s: %s', + rec.time.toISOString(), + bunyan.nameFromLevel[rec.level], + rec.msg); +} + +var log = bunyan.createLogger({ + name: 'play', + streams: [ + { + level: 'info', + stream: new MyRawStream(), + type: 'raw' + } + ] +}); + +log.info('hi on info'); +``` + +## webpack +To include bunyan in your webpack bundle you need to tell webpack to +ignore the optional dependencies that are unavailable in browser environments. + +Mark the following dependencies as +[externals](https://webpack.js.org/configuration/externals/) in your webpack +configuration file to exclude them from the bundle: + +``` +module: { + externals: ['dtrace-provider', 'fs', 'mv', 'os', 'source-map-support'] +} +``` + +# Versioning + +All versions are `..` which will be incremented for +breaking backward compat and major reworks, new features without breaking +change, and bug fixes, respectively. tl;dr: [Semantic +versioning](http://semver.org/). + +# License + +[MIT](./LICENSE.txt). + +# See Also + +See the [user-maintained list of Bunyan-related software in the Bunyan +wiki](https://github.com/trentm/node-bunyan/wiki/Awesome-Bunyan). diff --git a/task/node_modules/bunyan/bin/bunyan b/task/node_modules/bunyan/bin/bunyan new file mode 100755 index 0000000..3b84471 --- /dev/null +++ b/task/node_modules/bunyan/bin/bunyan @@ -0,0 +1,1705 @@ +#!/usr/bin/env node +/** + * Copyright 2021 Trent Mick + * Copyright 2020 Joyent Inc. + * + * bunyan -- filter and pretty-print Bunyan log files (line-delimited JSON) + * + * See . + * + * -*- mode: js -*- + * vim: expandtab:ts=4:sw=4 + */ + +var VERSION = '1.8.15'; + +var p = console.log; +var util = require('util'); +var pathlib = require('path'); +var vm = require('vm'); +var http = require('http'); +var fs = require('fs'); +var warn = console.warn; +var child_process = require('child_process'), + spawn = child_process.spawn, + exec = child_process.exec, + execFile = child_process.execFile; +var assert = require('assert'); + +try { + var moment = require('moment'); +} catch (e) { + moment = null; +} + + +//---- globals and constants + +var nodeVer = process.versions.node.split('.').map(Number); +var nodeSpawnSupportsStdio = (nodeVer[0] > 0 || nodeVer[1] >= 8); + +// Internal debug logging via `console.warn`. +var _DEBUG = false; + +// Output modes. +var OM_LONG = 1; +var OM_JSON = 2; +var OM_INSPECT = 3; +var OM_SIMPLE = 4; +var OM_SHORT = 5; +var OM_BUNYAN = 6; +var OM_FROM_NAME = { + 'long': OM_LONG, + 'paul': OM_LONG, /* backward compat */ + 'json': OM_JSON, + 'inspect': OM_INSPECT, + 'simple': OM_SIMPLE, + 'short': OM_SHORT, + 'bunyan': OM_BUNYAN +}; + + +// Levels +var TRACE = 10; +var DEBUG = 20; +var INFO = 30; +var WARN = 40; +var ERROR = 50; +var FATAL = 60; + +var levelFromName = { + 'trace': TRACE, + 'debug': DEBUG, + 'info': INFO, + 'warn': WARN, + 'error': ERROR, + 'fatal': FATAL +}; +var nameFromLevel = {}; +var upperNameFromLevel = {}; +var upperPaddedNameFromLevel = {}; +Object.keys(levelFromName).forEach(function (name) { + var lvl = levelFromName[name]; + nameFromLevel[lvl] = name; + upperNameFromLevel[lvl] = name.toUpperCase(); + upperPaddedNameFromLevel[lvl] = ( + name.length === 4 ? ' ' : '') + name.toUpperCase(); +}); + + +// Display time formats. +var TIME_UTC = 1; // the default, bunyan's native format +var TIME_LOCAL = 2; + +// Timezone formats: output format -> momentjs format string +var TIMEZONE_UTC_FORMATS = { + long: '[[]YYYY-MM-DD[T]HH:mm:ss.SSS[Z][]]', + short: 'HH:mm:ss.SSS[Z]' +}; +var TIMEZONE_LOCAL_FORMATS = { + long: '[[]YYYY-MM-DD[T]HH:mm:ss.SSSZ[]]', + short: 'HH:mm:ss.SSS' +}; + + +// The current raw input line being processed. Used for `uncaughtException`. +var currLine = null; + +// Child dtrace process, if any. Used for signal-handling. +var child = null; + +// Whether ANSI codes are being used. Used for signal-handling. +var usingAnsiCodes = false; + +// Used to tell the 'uncaughtException' handler that '-c CODE' is being used. +var gUsingConditionOpts = false; + +// Pager child process, and output stream to which to write. +var pager = null; +var stdout = process.stdout; + + + +//---- support functions + +function getVersion() { + return VERSION; +} + + +var format = util.format; +if (!format) { + /* BEGIN JSSTYLED */ + // If not node 0.6, then use its `util.format`: + // : + var inspect = util.inspect; + var formatRegExp = /%[sdj%]/g; + format = function format(f) { + if (typeof f !== 'string') { + var objects = []; + for (var i = 0; i < arguments.length; i++) { + objects.push(inspect(arguments[i])); + } + return objects.join(' '); + } + + var i = 1; + var args = arguments; + var len = args.length; + var str = String(f).replace(formatRegExp, function (x) { + if (i >= len) + return x; + switch (x) { + case '%s': return String(args[i++]); + case '%d': return Number(args[i++]); + case '%j': return JSON.stringify(args[i++]); + case '%%': return '%'; + default: + return x; + } + }); + for (var x = args[i]; i < len; x = args[++i]) { + if (x === null || typeof x !== 'object') { + str += ' ' + x; + } else { + str += ' ' + inspect(x); + } + } + return str; + }; + /* END JSSTYLED */ +} + +function indent(s) { + return ' ' + s.split(/\r?\n/).join('\n '); +} + +function objCopy(obj) { + if (obj === null) { + return null; + } else if (Array.isArray(obj)) { + return obj.slice(); + } else { + var copy = {}; + Object.keys(obj).forEach(function (k) { + copy[k] = obj[k]; + }); + return copy; + } +} + +function printHelp() { + /* BEGIN JSSTYLED */ + p('Usage:'); + p(' bunyan [OPTIONS] [FILE ...]'); + p(' ... | bunyan [OPTIONS]'); + p(' bunyan [OPTIONS] -p PID'); + p(''); + p('Filter and pretty-print Bunyan log file content.'); + p(''); + p('General options:'); + p(' -h, --help print this help info and exit'); + p(' --version print version of this command and exit'); + p(''); + p('Runtime log snooping (via DTrace, only on supported platforms):'); + p(' -p PID Process bunyan:log-* probes from the process'); + p(' with the given PID. Can be used multiple times,'); + p(' or specify all processes with "*", or a set of'); + p(' processes whose command & args match a pattern'); + p(' with "-p NAME".'); + p(''); + p('Filtering options:'); + p(' -l, --level LEVEL'); + p(' Only show messages at or above the specified level.'); + p(' You can specify level *names* or the internal numeric'); + p(' values.'); + p(' -c, --condition CONDITION'); + p(' Run each log message through the condition and'); + p(' only show those that return truish. E.g.:'); + p(' -c \'this.pid == 123\''); + p(' -c \'this.level == DEBUG\''); + p(' -c \'this.msg.indexOf("boom") != -1\''); + p(' "CONDITION" must be legal JS code. `this` holds'); + p(' the log record. The TRACE, DEBUG, ... FATAL values'); + p(' are defined to help with comparing `this.level`.'); + p(' --strict Suppress all but legal Bunyan JSON log lines. By default'); + p(' non-JSON, and non-Bunyan lines are passed through.'); + p(''); + p('Output options:'); + p(' --pager Pipe output into `less` (or $PAGER if set), if'); + p(' stdout is a TTY. This overrides $BUNYAN_NO_PAGER.'); + p(' Note: Paging is only supported on node >=0.8.'); + p(' --no-pager Do not pipe output into a pager.'); + p(' --color Colorize output. Defaults to try if output'); + p(' stream is a TTY.'); + p(' --no-color Force no coloring (e.g. terminal doesn\'t support it)'); + p(' -o, --output MODE'); + p(' Specify an output mode/format. One of'); + p(' long: (the default) pretty'); + p(' json: JSON output, 2-space indent'); + p(' json-N: JSON output, N-space indent, e.g. "json-4"'); + p(' bunyan: 0 indented JSON, bunyan\'s native format'); + p(' inspect: node.js `util.inspect` output'); + p(' short: like "long", but more concise'); + p(' simple: level, followed by "-" and then the message'); + p(' -j shortcut for `-o json`'); + p(' -0 shortcut for `-o bunyan`'); + p(' -L, --time local'); + p(' Display time field in local time, rather than UTC.'); + p(''); + p('Environment Variables:'); + p(' BUNYAN_NO_COLOR Set to a non-empty value to force no output '); + p(' coloring. See "--no-color".'); + p(' BUNYAN_NO_PAGER Disable piping output to a pager. '); + p(' See "--no-pager".'); + p(''); + p('See for more complete docs.'); + p('Please report bugs to .'); + /* END JSSTYLED */ +} + +/* + * If the user specifies multiple input sources, we want to print out records + * from all sources in a single, chronologically ordered stream. To do this + * efficiently, we first assume that all records within each source are ordered + * already, so we need only keep track of the next record in each source and + * the time of the last record emitted. To avoid excess memory usage, we + * pause() streams that are ahead of others. + * + * 'streams' is an object indexed by source name (file name) which specifies: + * + * stream Actual stream object, so that we can pause and resume it. + * + * records Array of log records we've read, but not yet emitted. Each + * record includes 'line' (the raw line), 'rec' (the JSON + * record), and 'time' (the parsed time value). + * + * done Whether the stream has any more records to emit. + */ +var streams = {}; + +function gotRecord(file, line, rec, opts, stylize) +{ + var time = new Date(rec.time); + + streams[file]['records'].push({ line: line, rec: rec, time: time }); + emitNextRecord(opts, stylize); +} + +function filterRecord(rec, opts) +{ + if (opts.level && rec.level < opts.level) { + return false; + } + + if (opts.condFuncs) { + var recCopy = objCopy(rec); + for (var i = 0; i < opts.condFuncs.length; i++) { + var pass = opts.condFuncs[i].call(recCopy); + if (!pass) + return false; + } + } else if (opts.condVm) { + for (var i = 0; i < opts.condVm.length; i++) { + var pass = opts.condVm[i].runInNewContext(rec); + if (!pass) + return false; + } + } + + return true; +} + +function emitNextRecord(opts, stylize) +{ + var ofile, ready, minfile, rec; + + for (;;) { + /* + * Take a first pass through the input streams to see if we have a + * record from all of them. If not, we'll pause any streams for + * which we do already have a record (to avoid consuming excess + * memory) and then wait until we have records from the others + * before emitting the next record. + * + * As part of the same pass, we look for the earliest record + * we have not yet emitted. + */ + minfile = undefined; + ready = true; + for (ofile in streams) { + + if (streams[ofile].stream === null || + (!streams[ofile].done && streams[ofile].records.length === 0)) { + ready = false; + break; + } + + if (streams[ofile].records.length > 0 && + (minfile === undefined || + streams[minfile].records[0].time > + streams[ofile].records[0].time)) { + minfile = ofile; + } + } + + if (!ready || minfile === undefined) { + for (ofile in streams) { + if (!streams[ofile].stream || streams[ofile].done) + continue; + + if (streams[ofile].records.length > 0) { + if (!streams[ofile].paused) { + streams[ofile].paused = true; + streams[ofile].stream.pause(); + } + } else if (streams[ofile].paused) { + streams[ofile].paused = false; + streams[ofile].stream.resume(); + } + } + + return; + } + + /* + * Emit the next record for 'minfile', and invoke ourselves again to + * make sure we emit as many records as we can right now. + */ + rec = streams[minfile].records.shift(); + emitRecord(rec.rec, rec.line, opts, stylize); + } +} + +/** + * Return a function for the given JS code that returns. + * + * If no 'return' in the given javascript snippet, then assume we are a single + * statement and wrap in 'return (...)'. This is for convenience for short + * '-c ...' snippets. + */ +function funcWithReturnFromSnippet(js) { + // auto-"return" + if (js.indexOf('return') === -1) { + if (js.substring(js.length - 1) === ';') { + js = js.substring(0, js.length - 1); + } + js = 'return (' + js + ')'; + } + + // Expose level definitions to condition func context + var varDefs = []; + Object.keys(upperNameFromLevel).forEach(function (lvl) { + varDefs.push(format('var %s = %d;', + upperNameFromLevel[lvl], lvl)); + }); + varDefs = varDefs.join('\n') + '\n'; + + return (new Function(varDefs + js)); +} + +/** + * Parse the command-line options and arguments into an object. + * + * { + * 'args': [...] // arguments + * 'help': true, // true if '-h' option given + * // etc. + * } + * + * @return {Object} The parsed options. `.args` is the argument list. + * @throws {Error} If there is an error parsing argv. + */ +function parseArgv(argv) { + var parsed = { + args: [], + help: false, + color: null, + paginate: null, + outputMode: OM_LONG, + jsonIndent: 2, + level: null, + strict: false, + pids: null, + pidsType: null, + timeFormat: TIME_UTC // one of the TIME_ constants + }; + + // Turn '-iH' into '-i -H', except for argument-accepting options. + var args = argv.slice(2); // drop ['node', 'scriptname'] + var newArgs = []; + var optTakesArg = {'d': true, 'o': true, 'c': true, 'l': true, 'p': true}; + for (var i = 0; i < args.length; i++) { + if (args[i].charAt(0) === '-' && args[i].charAt(1) !== '-' && + args[i].length > 2) + { + var splitOpts = args[i].slice(1).split(''); + for (var j = 0; j < splitOpts.length; j++) { + newArgs.push('-' + splitOpts[j]); + if (optTakesArg[splitOpts[j]]) { + var optArg = splitOpts.slice(j+1).join(''); + if (optArg.length) { + newArgs.push(optArg); + } + break; + } + } + } else { + newArgs.push(args[i]); + } + } + args = newArgs; + + // Expose level definitions to condition vm context + var condDefines = []; + Object.keys(upperNameFromLevel).forEach(function (lvl) { + condDefines.push( + format('Object.prototype.%s = %s;', upperNameFromLevel[lvl], lvl)); + }); + condDefines = condDefines.join('\n') + '\n'; + + var endOfOptions = false; + while (args.length > 0) { + var arg = args.shift(); + switch (arg) { + case '--': + endOfOptions = true; + break; + case '-h': // display help and exit + case '--help': + parsed.help = true; + break; + case '--version': + parsed.version = true; + break; + case '--strict': + parsed.strict = true; + break; + case '--color': + parsed.color = true; + break; + case '--no-color': + parsed.color = false; + break; + case '--pager': + parsed.paginate = true; + break; + case '--no-pager': + parsed.paginate = false; + break; + case '-o': + case '--output': + var name = args.shift(); + var idx = name.lastIndexOf('-'); + if (idx !== -1) { + var indentation = Number(name.slice(idx+1)); + if (! isNaN(indentation)) { + parsed.jsonIndent = indentation; + name = name.slice(0, idx); + } + } + parsed.outputMode = OM_FROM_NAME[name]; + if (parsed.outputMode === undefined) { + throw new Error('unknown output mode: "'+name+'"'); + } + break; + case '-j': // output with JSON.stringify + parsed.outputMode = OM_JSON; + break; + case '-0': + parsed.outputMode = OM_BUNYAN; + break; + case '-L': + parsed.timeFormat = TIME_LOCAL; + if (!moment) { + throw new Error( + 'could not find moment package required for "-L"'); + } + break; + case '--time': + var timeArg = args.shift(); + switch (timeArg) { + case 'utc': + parsed.timeFormat = TIME_UTC; + break + case 'local': + parsed.timeFormat = TIME_LOCAL; + if (!moment) { + throw new Error('could not find moment package ' + + 'required for "--time=local"'); + } + break + case undefined: + throw new Error('missing argument to "--time"'); + default: + throw new Error(format('invalid time format: "%s"', + timeArg)); + } + break; + case '-p': + if (!parsed.pids) { + parsed.pids = []; + } + var pidArg = args.shift(); + var pid = +(pidArg); + if (!isNaN(pid) || pidArg === '*') { + if (parsed.pidsType && parsed.pidsType !== 'num') { + throw new Error(format('cannot mix PID name and ' + + 'number arguments: "%s"', pidArg)); + } + parsed.pidsType = 'num'; + if (!parsed.pids) { + parsed.pids = []; + } + parsed.pids.push(isNaN(pid) ? pidArg : pid); + } else { + if (parsed.pidsType && parsed.pidsType !== 'name') { + throw new Error(format('cannot mix PID name and ' + + 'number arguments: "%s"', pidArg)); + } + parsed.pidsType = 'name'; + parsed.pids = pidArg; + } + break; + case '-l': + case '--level': + var levelArg = args.shift(); + var level = +(levelArg); + if (isNaN(level)) { + level = +levelFromName[levelArg.toLowerCase()]; + } + if (isNaN(level)) { + throw new Error('unknown level value: "'+levelArg+'"'); + } + parsed.level = level; + break; + case '-c': + case '--condition': + gUsingConditionOpts = true; + var condition = args.shift(); + if (Boolean(process.env.BUNYAN_EXEC && + process.env.BUNYAN_EXEC === 'vm')) + { + parsed.condVm = parsed.condVm || []; + var scriptName = 'bunyan-condition-'+parsed.condVm.length; + var code = condDefines + condition; + var script; + try { + script = vm.createScript(code, scriptName); + } catch (complErr) { + throw new Error(format('illegal CONDITION code: %s\n' + + ' CONDITION script:\n' + + '%s\n' + + ' Error:\n' + + '%s', + complErr, indent(code), indent(complErr.stack))); + } + + // Ensure this is a reasonably safe CONDITION. + try { + script.runInNewContext(minValidRecord); + } catch (condErr) { + throw new Error(format( + /* JSSTYLED */ + 'CONDITION code cannot safely filter a minimal Bunyan log record\n' + + ' CONDITION script:\n' + + '%s\n' + + ' Minimal Bunyan log record:\n' + + '%s\n' + + ' Filter error:\n' + + '%s', + indent(code), + indent(JSON.stringify(minValidRecord, null, 2)), + indent(condErr.stack) + )); + } + parsed.condVm.push(script); + } else { + parsed.condFuncs = parsed.condFuncs || []; + parsed.condFuncs.push(funcWithReturnFromSnippet(condition)); + } + break; + default: // arguments + if (!endOfOptions && arg.length > 0 && arg[0] === '-') { + throw new Error('unknown option "'+arg+'"'); + } + parsed.args.push(arg); + break; + } + } + //TODO: '--' handling and error on a first arg that looks like an option. + + return parsed; +} + + +function isInteger(s) { + return (s.search(/^-?[0-9]+$/) == 0); +} + + +// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics +// Suggested colors (some are unreadable in common cases): +// - Good: cyan, yellow (limited use), bold, green, magenta, red +// - Bad: blue (not visible on cmd.exe), grey (same color as background on +// Solarized Dark theme from , see +// issue #160) +var colors = { + 'bold' : [1, 22], + 'italic' : [3, 23], + 'underline' : [4, 24], + 'inverse' : [7, 27], + 'white' : [37, 39], + 'grey' : [90, 39], + 'black' : [30, 39], + 'blue' : [34, 39], + 'cyan' : [36, 39], + 'green' : [32, 39], + 'magenta' : [35, 39], + 'red' : [31, 39], + 'yellow' : [33, 39] +}; + +function stylizeWithColor(str, color) { + if (!str) + return ''; + var codes = colors[color]; + if (codes) { + return '\033[' + codes[0] + 'm' + str + + '\033[' + codes[1] + 'm'; + } else { + return str; + } +} + +function stylizeWithoutColor(str, color) { + return str; +} + + +/** + * Is this a valid Bunyan log record. + */ +function isValidRecord(rec) { + if (rec.v == null || + rec.level == null || + rec.name == null || + rec.hostname == null || + rec.pid == null || + rec.time == null || + rec.msg == null) { + // Not valid Bunyan log. + return false; + } else { + return true; + } +} +var minValidRecord = { + v: 0, //TODO: get this from bunyan.LOG_VERSION + level: INFO, + name: 'name', + hostname: 'hostname', + pid: 123, + time: Date.now(), + msg: 'msg' +}; + + +/** + * Parses the given log line and either emits it right away (for invalid + * records) or enqueues it for emitting later when it's the next line to show. + */ +function handleLogLine(file, line, opts, stylize) { + currLine = line; // intentionally global + + // Emit non-JSON lines immediately. + var rec; + if (!line) { + if (!opts.strict) emit(line + '\n'); + return; + } else if (line[0] !== '{') { + if (!opts.strict) emit(line + '\n'); // not JSON + return; + } else { + try { + rec = JSON.parse(line); + } catch (e) { + if (!opts.strict) emit(line + '\n'); + return; + } + } + + if (!isValidRecord(rec)) { + if (!opts.strict) emit(line + '\n'); + return; + } + + if (!filterRecord(rec, opts)) + return; + + if (file === null) + return emitRecord(rec, line, opts, stylize); + + return gotRecord(file, line, rec, opts, stylize); +} + +/** + * Print out a single result, considering input options. + */ +function emitRecord(rec, line, opts, stylize) { + var short = false; + + switch (opts.outputMode) { + case OM_SHORT: + short = true; + /* jsl:fall-thru */ + + case OM_LONG: + // [time] LEVEL: name[/comp]/pid on hostname (src): msg* (extras...) + // msg* + // -- + // long and multi-line extras + // ... + // If 'msg' is single-line, then it goes in the top line. + // If 'req', show the request. + // If 'res', show the response. + // If 'err' and 'err.stack' then show that. + if (!isValidRecord(rec)) { + return emit(line + '\n'); + } + + delete rec.v; + + // Time. + var time; + if (!short && opts.timeFormat === TIME_UTC) { + // Fast default path: We assume the raw `rec.time` is a UTC time + // in ISO 8601 format (per spec). + time = '[' + rec.time + ']'; + } else if (!moment && opts.timeFormat === TIME_UTC) { + // Don't require momentjs install, as long as not using TIME_LOCAL. + time = rec.time.substr(11); + } else { + var tzFormat; + var moTime = moment(rec.time); + switch (opts.timeFormat) { + case TIME_UTC: + tzFormat = TIMEZONE_UTC_FORMATS[short ? 'short' : 'long']; + moTime.utc(); + break; + case TIME_LOCAL: + tzFormat = TIMEZONE_LOCAL_FORMATS[short ? 'short' : 'long']; + break; + default: + throw new Error('unexpected timeFormat: ' + opts.timeFormat); + }; + time = moTime.format(tzFormat); + } + time = stylize(time, 'none'); + delete rec.time; + + var nameStr = rec.name; + delete rec.name; + + if (rec.component) { + nameStr += '/' + rec.component; + } + delete rec.component; + + if (!short) + nameStr += '/' + rec.pid; + delete rec.pid; + + var level = (upperPaddedNameFromLevel[rec.level] || 'LVL' + rec.level); + if (opts.color) { + var colorFromLevel = { + 10: 'white', // TRACE + 20: 'yellow', // DEBUG + 30: 'cyan', // INFO + 40: 'magenta', // WARN + 50: 'red', // ERROR + 60: 'inverse', // FATAL + }; + level = stylize(level, colorFromLevel[rec.level]); + } + delete rec.level; + + var src = ''; + if (rec.src && rec.src.file) { + var s = rec.src; + if (s.func) { + src = format(' (%s:%d in %s)', s.file, s.line, s.func); + } else { + src = format(' (%s:%d)', s.file, s.line); + } + src = stylize(src, 'green'); + } + delete rec.src; + + var hostname = rec.hostname; + delete rec.hostname; + + var extras = []; + var details = []; + + if (rec.req_id) { + extras.push('req_id=' + rec.req_id); + } + delete rec.req_id; + + var onelineMsg; + if (rec.msg.indexOf('\n') !== -1) { + onelineMsg = ''; + details.push(indent(stylize(rec.msg, 'cyan'))); + } else { + onelineMsg = ' ' + stylize(rec.msg, 'cyan'); + } + delete rec.msg; + + if (rec.req && typeof (rec.req) === 'object') { + var req = rec.req; + delete rec.req; + var headers = req.headers; + if (!headers) { + headers = ''; + } else if (typeof (headers) === 'string') { + headers = '\n' + headers; + } else if (typeof (headers) === 'object') { + headers = '\n' + Object.keys(headers).map(function (h) { + return h + ': ' + headers[h]; + }).join('\n'); + } + var s = format('%s %s HTTP/%s%s', req.method, + req.url, + req.httpVersion || '1.1', + headers + ); + delete req.url; + delete req.method; + delete req.httpVersion; + delete req.headers; + if (req.body) { + s += '\n\n' + (typeof (req.body) === 'object' + ? JSON.stringify(req.body, null, 2) : req.body); + delete req.body; + } + if (req.trailers && Object.keys(req.trailers) > 0) { + s += '\n' + Object.keys(req.trailers).map(function (t) { + return t + ': ' + req.trailers[t]; + }).join('\n'); + } + delete req.trailers; + details.push(indent(s)); + // E.g. for extra 'foo' field on 'req', add 'req.foo' at + // top-level. This *does* have the potential to stomp on a + // literal 'req.foo' key. + Object.keys(req).forEach(function (k) { + rec['req.' + k] = req[k]; + }) + } + + /* + * `client_req` is the typical field name for an *HTTP client request + * object* serialized by the restify-clients library. Render the + * client request somewhat like `curl` debug output shows it. + */ + if (rec.client_req && typeof (rec.client_req) === 'object') { + var client_req = rec.client_req; + delete rec.client_req; + + var headers = client_req.headers; + delete client_req.headers; + + /* + * `client_req.address`, and `client_req.port`, provide values for + * a *likely* "Host" header that wasn't included in the serialized + * headers. Node.js will often add this "Host" header in its + * `http.ClientRequest`, e.g. for node v6.10.3: + * // JSSTYLED + * https://github.com/nodejs/node/blob/v6.10.3/lib/_http_client.js#L88-L105 + * + * If `client_req.port` exists and is 80 or 443, we *assume* that + * is the default protocol port, and elide it per the `defaultPort` + * handling in the node.js link above. + * + * Note: This added Host header is a *guess*. Bunyan shouldn't be + * doing this "favour" for users because it can be wrong and + * misleading. Bunyan 2.x will drop adding this. See issue #504 + * for details. + */ + var hostHeaderLine = ''; + if (!headers || !( + Object.hasOwnProperty.call(headers, 'host') || + Object.hasOwnProperty.call(headers, 'Host') || + Object.hasOwnProperty.call(headers, 'HOST') + ) + ) { + if (Object.hasOwnProperty.call(client_req, 'address')) { + hostHeaderLine = '\nHost: ' + client_req.address; + if (Object.hasOwnProperty.call(client_req, 'port')) { + // XXX + var port = +client_req.port; + if (port !== 80 && port !== 443) { + hostHeaderLine += ':' + client_req.port; + } + delete client_req.port; + } + delete client_req.address; + } + } + + var s = format('%s %s HTTP/%s%s%s', client_req.method, + client_req.url, + client_req.httpVersion || '1.1', + hostHeaderLine, + (headers ? + '\n' + Object.keys(headers).map( + function (h) { + return h + ': ' + headers[h]; + }).join('\n') : + '')); + delete client_req.method; + delete client_req.url; + delete client_req.httpVersion; + + if (client_req.body) { + s += '\n\n' + (typeof (client_req.body) === 'object' ? + JSON.stringify(client_req.body, null, 2) : + client_req.body); + delete client_req.body; + } + // E.g. for extra 'foo' field on 'client_req', add + // 'client_req.foo' at top-level. This *does* have the potential + // to stomp on a literal 'client_req.foo' key. + Object.keys(client_req).forEach(function (k) { + rec['client_req.' + k] = client_req[k]; + }) + details.push(indent(s)); + } + + function _res(res) { + var s = ''; + + /* + * Handle `res.header` or `res.headers` as either a string or + * an object of header key/value pairs. Prefer `res.header` if set, + * because that's what Bunyan's own `res` serializer specifies, + * because that's the value in Node.js's core HTTP server response + * implementation that has all the implicit headers. + * + * Note: `res.header` (string) typically includes the 'HTTP/1.1 ...' + * status line. + */ + var headerTypes = {string: true, object: true}; + var headers; + var headersStr = ''; + var headersHaveStatusLine = false; + if (res.header && headerTypes[typeof (res.header)]) { + headers = res.header; + delete res.header; + } else if (res.headers && headerTypes[typeof (res.headers)]) { + headers = res.headers; + delete res.headers; + } + if (headers === undefined) { + /* pass through */ + } else if (typeof (headers) === 'string') { + headersStr = headers.trimRight(); // Trim the CRLF. + if (headersStr.slice(0, 5) === 'HTTP/') { + headersHaveStatusLine = true; + } + } else { + headersStr += Object.keys(headers).map( + function (h) { return h + ': ' + headers[h]; }).join('\n'); + } + + /* + * Add a 'HTTP/1.1 ...' status line if the headers didn't already + * include it. + */ + if (!headersHaveStatusLine && res.statusCode !== undefined) { + s += format('HTTP/1.1 %s %s\n', res.statusCode, + http.STATUS_CODES[res.statusCode]); + } + delete res.statusCode; + s += headersStr; + + if (res.body !== undefined) { + var body = (typeof (res.body) === 'object' + ? JSON.stringify(res.body, null, 2) : res.body); + if (body.length > 0) { s += '\n\n' + body }; + delete res.body; + } else { + s = s.trimRight(); + } + if (res.trailer) { + s += '\n' + res.trailer; + } + delete res.trailer; + if (s) { + details.push(indent(s)); + } + // E.g. for extra 'foo' field on 'res', add 'res.foo' at + // top-level. This *does* have the potential to stomp on a + // literal 'res.foo' key. + Object.keys(res).forEach(function (k) { + rec['res.' + k] = res[k]; + }); + } + + if (rec.res && typeof (rec.res) === 'object') { + _res(rec.res); + delete rec.res; + } + if (rec.client_res && typeof (rec.client_res) === 'object') { + _res(rec.client_res); + delete rec.client_res; + } + + if (rec.err && rec.err.stack) { + var err = rec.err + if (typeof (err.stack) !== 'string') { + details.push(indent(err.stack.toString())); + } else { + details.push(indent(err.stack)); + } + delete err.message; + delete err.name; + delete err.stack; + // E.g. for extra 'foo' field on 'err', add 'err.foo' at + // top-level. This *does* have the potential to stomp on a + // literal 'err.foo' key. + Object.keys(err).forEach(function (k) { + rec['err.' + k] = err[k]; + }) + delete rec.err; + } + + var leftover = Object.keys(rec); + for (var i = 0; i < leftover.length; i++) { + var key = leftover[i]; + var value = rec[key]; + var stringified = false; + if (typeof (value) !== 'string') { + value = JSON.stringify(value, null, 2); + stringified = true; + } + if (value.indexOf('\n') !== -1 || value.length > 50) { + details.push(indent(key + ': ' + value)); + } else if (!stringified && (value.indexOf(' ') != -1 || + value.length === 0)) + { + extras.push(key + '=' + JSON.stringify(value)); + } else { + extras.push(key + '=' + value); + } + } + + extras = stylize( + (extras.length ? ' (' + extras.join(', ') + ')' : ''), 'none'); + details = stylize( + (details.length ? details.join('\n --\n') + '\n' : ''), 'none'); + if (!short) + emit(format('%s %s: %s on %s%s:%s%s\n%s', + time, + level, + nameStr, + hostname || '', + src, + onelineMsg, + extras, + details)); + else + emit(format('%s %s %s:%s%s\n%s', + time, + level, + nameStr, + onelineMsg, + extras, + details)); + break; + + case OM_INSPECT: + emit(util.inspect(rec, false, Infinity, true) + '\n'); + break; + + case OM_BUNYAN: + emit(JSON.stringify(rec, null, 0) + '\n'); + break; + + case OM_JSON: + emit(JSON.stringify(rec, null, opts.jsonIndent) + '\n'); + break; + + case OM_SIMPLE: + /* JSSTYLED */ + // + if (!isValidRecord(rec)) { + return emit(line + '\n'); + } + emit(format('%s - %s\n', + upperNameFromLevel[rec.level] || 'LVL' + rec.level, + rec.msg)); + break; + default: + throw new Error('unknown output mode: '+opts.outputMode); + } +} + + +var stdoutFlushed = true; +function emit(s) { + try { + stdoutFlushed = stdout.write(s); + } catch (e) { + // Handle any exceptions in stdout writing in `stdout.on('error', ...)`. + } +} + + +/** + * A hacked up version of 'process.exit' that will first drain stdout + * before exiting. *WARNING: This doesn't stop event processing.* IOW, + * callers have to be careful that code following this call isn't + * accidentally executed. + * + * In node v0.6 "process.stdout and process.stderr are blocking when they + * refer to regular files or TTY file descriptors." However, this hack might + * still be necessary in a shell pipeline. + */ +function drainStdoutAndExit(code) { + if (_DEBUG) warn('(drainStdoutAndExit(%d))', code); + stdout.on('drain', function () { + cleanupAndExit(code); + }); + if (stdoutFlushed) { + cleanupAndExit(code); + } +} + + +/** + * Process all input from stdin. + * + * @params opts {Object} Bunyan options object. + * @param stylize {Function} Output stylize function to use. + * @param callback {Function} `function ()` + */ +function processStdin(opts, stylize, callback) { + var leftover = ''; // Left-over partial line from last chunk. + var stdin = process.stdin; + stdin.resume(); + stdin.setEncoding('utf8'); + stdin.on('data', function (chunk) { + var lines = chunk.split(/\r\n|\n/); + var length = lines.length; + if (length === 1) { + leftover += lines[0]; + return; + } + + if (length > 1) { + handleLogLine(null, leftover + lines[0], opts, stylize); + } + leftover = lines.pop(); + length -= 1; + for (var i = 1; i < length; i++) { + handleLogLine(null, lines[i], opts, stylize); + } + }); + stdin.on('end', function () { + if (leftover) { + handleLogLine(null, leftover, opts, stylize); + leftover = ''; + } + callback(); + }); +} + + +/** + * Process bunyan:log-* probes from the given pid. + * + * @params opts {Object} Bunyan options object. + * @param stylize {Function} Output stylize function to use. + * @param callback {Function} `function (code)` + */ +function processPids(opts, stylize, callback) { + var leftover = ''; // Left-over partial line from last chunk. + + /** + * Get the PIDs to dtrace. + * + * @param cb {Function} `function (errCode, pids)` + */ + function getPids(cb) { + if (opts.pidsType === 'num') { + return cb(null, opts.pids); + } + if (process.platform === 'sunos') { + execFile('/bin/pgrep', ['-lf', opts.pids], + function (pidsErr, stdout, stderr) { + if (pidsErr) { + warn('bunyan: error getting PIDs for "%s": %s\n%s\n%s', + opts.pids, pidsErr.message, stdout, stderr); + return cb(1); + } + var pids = stdout.trim().split('\n') + .map(function (line) { + return line.trim().split(/\s+/)[0] + }) + .filter(function (pid) { + return Number(pid) !== process.pid + }); + if (pids.length === 0) { + warn('bunyan: error: no matching PIDs found for "%s"', + opts.pids); + return cb(2); + } + cb(null, pids); + } + ); + } else { + var regex = opts.pids; + if (regex && /[a-zA-Z0-9_]/.test(regex[0])) { + // 'foo' -> '[f]oo' trick to exclude the 'grep' PID from its + // own search. + regex = '[' + regex[0] + ']' + regex.slice(1); + } + var cmd = format('ps -A -o pid,command | grep \'%s\'', + // Escape single-quotes to avoid breaking the grep arg quoting + // (leading to a possible *code execution*) and backslashes to + // avoid undoing that escaping. + regex.replace(/\\/g, '\\\\') + // JSSTYLED + .replace(/'/g, "'\\''")); + if (_DEBUG) { warn('(bunyan: exec cmd: %j)', cmd); } + exec(cmd, + function (pidsErr, stdout, stderr) { + if (pidsErr) { + warn('bunyan: error getting PIDs for "%s": %s\n%s\n%s', + opts.pids, pidsErr.message, stdout, stderr); + return cb(1); + } + var pids = stdout.trim().split('\n') + .map(function (line) { + return line.trim().split(/\s+/)[0]; + }) + .filter(function (pid) { + return Number(pid) !== process.pid; + }); + if (pids.length === 0) { + warn('bunyan: error: no matching PIDs found for "%s"', + opts.pids); + return cb(2); + } + cb(null, pids); + } + ); + } + } + + getPids(function (errCode, pids) { + if (errCode) { + return callback(errCode); + } + + var probes = pids.map(function (pid) { + if (!opts.level) + return format('bunyan%s:::log-*', pid); + + var rval = [], l; + + for (l in levelFromName) { + if (levelFromName[l] >= opts.level) + rval.push(format('bunyan%s:::log-%s', pid, l)); + } + + if (rval.length != 0) + return rval.join(','); + + warn('bunyan: error: level (%d) exceeds maximum logging level', + opts.level); + return drainStdoutAndExit(1); + }).join(','); + var argv = ['dtrace', '-Z', '-x', 'strsize=4k', + '-x', 'switchrate=10hz', '-qn', + format('%s{printf("%s", copyinstr(arg0))}', probes)]; + //console.log('dtrace argv: %s', argv); + var dtrace = spawn(argv[0], argv.slice(1), + // Share the stderr handle to have error output come + // straight through. Only supported in v0.8+. + {stdio: ['pipe', 'pipe', process.stderr]}); + dtrace.on('error', function (e) { + if (e.syscall === 'spawn' && e.errno === 'ENOENT') { + console.error('bunyan: error: could not spawn "dtrace" ' + + '("bunyan -p" is only supported on platforms with dtrace)'); + } else { + console.error('bunyan: error: unexpected dtrace error: %s', e); + } + callback(1); + }) + child = dtrace; // intentionally global + + function finish(code) { + if (leftover) { + handleLogLine(null, leftover, opts, stylize); + leftover = ''; + } + callback(code); + } + + dtrace.stdout.setEncoding('utf8'); + dtrace.stdout.on('data', function (chunk) { + var lines = chunk.split(/\r\n|\n/); + var length = lines.length; + if (length === 1) { + leftover += lines[0]; + return; + } + if (length > 1) { + handleLogLine(null, leftover + lines[0], opts, stylize); + } + leftover = lines.pop(); + length -= 1; + for (var i = 1; i < length; i++) { + handleLogLine(null, lines[i], opts, stylize); + } + }); + + if (nodeSpawnSupportsStdio) { + dtrace.on('exit', finish); + } else { + // Fallback (for < v0.8) to pipe the dtrace process' stderr to + // this stderr. Wait for all of (1) process 'exit', (2) stderr + // 'end', and (2) stdout 'end' before returning to ensure all + // stderr is flushed (issue #54). + var returnCode = null; + var eventsRemaining = 3; + function countdownToFinish(code) { + returnCode = code; + eventsRemaining--; + if (eventsRemaining == 0) { + finish(returnCode); + } + } + dtrace.stderr.pipe(process.stderr); + dtrace.stderr.on('end', countdownToFinish); + dtrace.stderr.on('end', countdownToFinish); + dtrace.on('exit', countdownToFinish); + } + }); +} + + +/** + * Process all input from the given log file. + * + * @param file {String} Log file path to process. + * @params opts {Object} Bunyan options object. + * @param stylize {Function} Output stylize function to use. + * @param callback {Function} `function ()` + */ +function processFile(file, opts, stylize, callback) { + var stream = fs.createReadStream(file); + if (/\.gz$/.test(file)) { + stream = stream.pipe(require('zlib').createGunzip()); + } + // Manually decode streams - lazy load here as per node/lib/fs.js + var decoder = new (require('string_decoder').StringDecoder)('utf8'); + + streams[file].stream = stream; + + stream.on('error', function (err) { + streams[file].done = true; + callback(err); + }); + + var leftover = ''; // Left-over partial line from last chunk. + stream.on('data', function (data) { + var chunk = decoder.write(data); + if (!chunk.length) { + return; + } + var lines = chunk.split(/\r\n|\n/); + var length = lines.length; + if (length === 1) { + leftover += lines[0]; + return; + } + + if (length > 1) { + handleLogLine(file, leftover + lines[0], opts, stylize); + } + leftover = lines.pop(); + length -= 1; + for (var i = 1; i < length; i++) { + handleLogLine(file, lines[i], opts, stylize); + } + }); + + stream.on('end', function () { + streams[file].done = true; + if (leftover) { + handleLogLine(file, leftover, opts, stylize); + leftover = ''; + } else { + emitNextRecord(opts, stylize); + } + callback(); + }); +} + + +/** + * From node async module. + */ +/* BEGIN JSSTYLED */ +function asyncForEach(arr, iterator, callback) { + callback = callback || function () {}; + if (!arr.length) { + return callback(); + } + var completed = 0; + arr.forEach(function (x) { + iterator(x, function (err) { + if (err) { + callback(err); + callback = function () {}; + } + else { + completed += 1; + if (completed === arr.length) { + callback(); + } + } + }); + }); +}; +/* END JSSTYLED */ + + + +/** + * Cleanup and exit properly. + * + * Warning: this doesn't stop processing, i.e. process exit might be delayed. + * It is up to the caller to ensure that no subsequent bunyan processing + * is done after calling this. + * + * @param code {Number} exit code. + * @param signal {String} Optional signal name, if this was exitting because + * of a signal. + */ +var cleanedUp = false; +function cleanupAndExit(code, signal) { + // Guard one call. + if (cleanedUp) { + return; + } + cleanedUp = true; + if (_DEBUG) warn('(bunyan: cleanupAndExit)'); + + // Clear possibly interrupted ANSI code (issue #59). + if (usingAnsiCodes) { + stdout.write('\033[0m'); + } + + // Kill possible dtrace child. + if (child) { + child.kill(signal); + } + + if (pager) { + // Let pager know that output is done, then wait for pager to exit. + stdout.end(); + pager.on('exit', function (pagerCode) { + if (_DEBUG) + warn('(bunyan: pager exit -> process.exit(%s))', + pagerCode || code); + process.exit(pagerCode || code); + }); + } else { + if (_DEBUG) warn('(bunyan: process.exit(%s))', code); + process.exit(code); + } +} + + + +//---- mainline + +process.on('SIGINT', function () { cleanupAndExit(1, 'SIGINT'); }); +process.on('SIGQUIT', function () { cleanupAndExit(1, 'SIGQUIT'); }); +process.on('SIGTERM', function () { cleanupAndExit(1, 'SIGTERM'); }); +process.on('SIGHUP', function () { cleanupAndExit(1, 'SIGHUP'); }); + +process.on('uncaughtException', function (err) { + function _indent(s) { + var lines = s.split(/\r?\n/); + for (var i = 0; i < lines.length; i++) { + lines[i] = '* ' + lines[i]; + } + return lines.join('\n'); + } + + var title = encodeURIComponent(format( + 'Bunyan %s crashed: %s', getVersion(), String(err))); + var e = console.error; + e('```'); + e('* The Bunyan CLI crashed!'); + e('*'); + if (err.name === 'ReferenceError' && gUsingConditionOpts) { + /* BEGIN JSSTYLED */ + e('* This crash was due to a "ReferenceError", which is often the result of given'); + e('* `-c CONDITION` code that doesn\'t guard against undefined values. If that is'); + /* END JSSTYLED */ + e('* not the problem:'); + e('*'); + } + e('* Please report this issue and include the details below:'); + e('*'); + e('* https://github.com/trentm/node-bunyan/issues/new?title=%s', title); + e('*'); + e('* * *'); + e('* platform:', process.platform); + e('* node version:', process.version); + e('* bunyan version:', getVersion()); + e('* argv: %j', process.argv); + e('* log line: %j', currLine); + e('* stack:'); + e(_indent(err.stack)); + e('```'); + process.exit(1); +}); + + +function main(argv) { + try { + var opts = parseArgv(argv); + } catch (e) { + warn('bunyan: error: %s', e.message); + return drainStdoutAndExit(1); + } + if (opts.help) { + printHelp(); + return; + } + if (opts.version) { + console.log('bunyan ' + getVersion()); + return; + } + if (opts.pids && opts.args.length > 0) { + warn('bunyan: error: can\'t use both "-p PID" (%s) and file (%s) args', + opts.pids, opts.args.join(' ')); + return drainStdoutAndExit(1); + } + if (opts.color === null) { + if (process.env.BUNYAN_NO_COLOR && + process.env.BUNYAN_NO_COLOR.length > 0) { + opts.color = false; + } else { + opts.color = process.stdout.isTTY; + } + } + usingAnsiCodes = opts.color; // intentionally global + var stylize = (opts.color ? stylizeWithColor : stylizeWithoutColor); + + // Pager. + var paginate = ( + process.stdout.isTTY && + process.stdin.isTTY && + !opts.pids && // Don't page if following process output. + opts.args.length > 0 && // Don't page if no file args to process. + process.platform !== 'win32' && + (nodeVer[0] > 0 || nodeVer[1] >= 8) && + (opts.paginate === true || + (opts.paginate !== false && + (!process.env.BUNYAN_NO_PAGER || + process.env.BUNYAN_NO_PAGER.length === 0)))); + if (paginate) { + var pagerCmd = process.env.PAGER || 'less'; + /* JSSTYLED */ + assert.ok(pagerCmd.indexOf('"') === -1 && pagerCmd.indexOf("'") === -1, + 'cannot parse PAGER quotes yet'); + var argv = pagerCmd.split(/\s+/g); + var env = objCopy(process.env); + if (env.LESS === undefined) { + // git's default is LESS=FRSX. I don't like the 'S' here because + // lines are *typically* wide with bunyan output and scrolling + // horizontally is a royal pain. Note a bug in Mac's `less -F`, + // such that SIGWINCH can kill it. If that rears too much then + // I'll remove 'F' from here. + env.LESS = 'FRX'; + } + if (_DEBUG) warn('(pager: argv=%j, env.LESS=%j)', argv, env.LESS); + // `pager` and `stdout` intentionally global. + pager = spawn(argv[0], argv.slice(1), + // Share the stderr handle to have error output come + // straight through. Only supported in v0.8+. + {env: env, stdio: ['pipe', 1, 2]}); + stdout = pager.stdin; + + // Early termination of the pager: just stop. + pager.on('exit', function (pagerCode) { + if (_DEBUG) warn('(bunyan: pager exit)'); + pager = null; + stdout.end() + stdout = process.stdout; + cleanupAndExit(pagerCode); + }); + } + + // Stdout error handling. (Couldn't setup until `stdout` was determined.) + stdout.on('error', function (err) { + if (_DEBUG) warn('(stdout error event: %s)', err); + if (err.code === 'EPIPE') { + drainStdoutAndExit(0); + } else if (err.toString() === 'Error: This socket is closed.') { + // Could get this if the pager closes its stdin, but hasn't + // exited yet. + drainStdoutAndExit(1); + } else { + warn(err); + drainStdoutAndExit(1); + } + }); + + var retval = 0; + if (opts.pids) { + processPids(opts, stylize, function (code) { + cleanupAndExit(code); + }); + } else if (opts.args.length > 0) { + var files = opts.args; + files.forEach(function (file) { + streams[file] = { stream: null, records: [], done: false } + }); + asyncForEach(files, + function (file, next) { + processFile(file, opts, stylize, function (err) { + if (err) { + warn('bunyan: %s', err.message); + retval += 1; + } + next(); + }); + }, + function (err) { + if (err) { + warn('bunyan: unexpected error: %s', err.stack || err); + return drainStdoutAndExit(1); + } + cleanupAndExit(retval); + } + ); + } else { + processStdin(opts, stylize, function () { + cleanupAndExit(retval); + }); + } +} + +if (require.main === module) { + main(process.argv); +} diff --git a/task/node_modules/bunyan/lib/bunyan.js b/task/node_modules/bunyan/lib/bunyan.js new file mode 100644 index 0000000..f988560 --- /dev/null +++ b/task/node_modules/bunyan/lib/bunyan.js @@ -0,0 +1,1629 @@ +/** + * Copyright 2021 Trent Mick. + * Copyright 2020 Joyent Inc. + * + * The bunyan logging library for node.js. + * + * -*- mode: js -*- + * vim: expandtab:ts=4:sw=4 + */ + +var VERSION = '1.8.15'; + +/* + * Bunyan log format version. This becomes the 'v' field on all log records. + * This will be incremented if there is any backward incompatible change to + * the log record format. Details will be in 'CHANGES.md' (the change log). + */ +var LOG_VERSION = 0; + + +var xxx = function xxx(s) { // internal dev/debug logging + var args = ['XX' + 'X: '+s].concat( + Array.prototype.slice.call(arguments, 1)); + console.error.apply(this, args); +}; +var xxx = function xxx() {}; // comment out to turn on debug logging + + +/* + * Runtime environment notes: + * + * Bunyan is intended to run in a number of runtime environments. Here are + * some notes on differences for those envs and how the code copes. + * + * - node.js: The primary target environment. + * - NW.js: http://nwjs.io/ An *app* environment that feels like both a + * node env -- it has node-like globals (`process`, `global`) and + * browser-like globals (`window`, `navigator`). My *understanding* is that + * bunyan can operate as if this is vanilla node.js. + * - browser: Failing the above, we sniff using the `window` global + * . + * - browserify: http://browserify.org/ A browser-targetting bundler of + * node.js deps. The runtime is a browser env, so can't use fs access, + * etc. Browserify's build looks for `require()` imports + * to bundle. For some imports it won't be able to handle, we "hide" + * from browserify with `require('frobshizzle' + '')`. + * - Other? Please open issues if things are broken. + */ +var runtimeEnv; +if (typeof (process) !== 'undefined' && process.versions) { + if (process.versions.nw) { + runtimeEnv = 'nw'; + } else if (process.versions.node) { + runtimeEnv = 'node'; + } +} +if (!runtimeEnv && typeof (window) !== 'undefined' && + window.window === window) { + runtimeEnv = 'browser'; +} +if (!runtimeEnv) { + throw new Error('unknown runtime environment'); +} + + +var os, fs, dtrace; +if (runtimeEnv === 'browser') { + os = { + hostname: function () { + return window.location.host; + } + }; + fs = {}; + dtrace = null; +} else { + os = require('os'); + fs = require('fs'); + try { + dtrace = require('dtrace-provider' + ''); + } catch (e) { + dtrace = null; + } +} +var util = require('util'); +var assert = require('assert'); +var EventEmitter = require('events').EventEmitter; +var stream = require('stream'); + +try { + var safeJsonStringify = require('safe-json-stringify'); +} catch (e) { + safeJsonStringify = null; +} +if (process.env.BUNYAN_TEST_NO_SAFE_JSON_STRINGIFY) { + safeJsonStringify = null; +} + +// The 'mv' module is required for rotating-file stream support. +try { + var mv = require('mv' + ''); +} catch (e) { + mv = null; +} + +try { + var sourceMapSupport = require('source-map-support' + ''); +} catch (_) { + sourceMapSupport = null; +} + + +//---- Internal support stuff + +/** + * A shallow copy of an object. Bunyan logging attempts to never cause + * exceptions, so this function attempts to handle non-objects gracefully. + */ +function objCopy(obj) { + if (obj == null) { // null or undefined + return obj; + } else if (Array.isArray(obj)) { + return obj.slice(); + } else if (typeof (obj) === 'object') { + var copy = {}; + Object.keys(obj).forEach(function (k) { + copy[k] = obj[k]; + }); + return copy; + } else { + return obj; + } +} + +var format = util.format; +if (!format) { + // If node < 0.6, then use its `util.format`: + // : + var inspect = util.inspect; + var formatRegExp = /%[sdj%]/g; + format = function format(f) { + if (typeof (f) !== 'string') { + var objects = []; + for (var i = 0; i < arguments.length; i++) { + objects.push(inspect(arguments[i])); + } + return objects.join(' '); + } + + var i = 1; + var args = arguments; + var len = args.length; + var str = String(f).replace(formatRegExp, function (x) { + if (i >= len) + return x; + switch (x) { + case '%s': return String(args[i++]); + case '%d': return Number(args[i++]); + case '%j': return fastAndSafeJsonStringify(args[i++]); + case '%%': return '%'; + default: + return x; + } + }); + for (var x = args[i]; i < len; x = args[++i]) { + if (x === null || typeof (x) !== 'object') { + str += ' ' + x; + } else { + str += ' ' + inspect(x); + } + } + return str; + }; +} + + +/** + * Gather some caller info 3 stack levels up. + * See . + */ +function getCaller3Info() { + if (this === undefined) { + // Cannot access caller info in 'strict' mode. + return; + } + var obj = {}; + var saveLimit = Error.stackTraceLimit; + var savePrepare = Error.prepareStackTrace; + Error.stackTraceLimit = 3; + + Error.prepareStackTrace = function (_, stack) { + var caller = stack[2]; + if (sourceMapSupport) { + caller = sourceMapSupport.wrapCallSite(caller); + } + obj.file = caller.getFileName(); + obj.line = caller.getLineNumber(); + var func = caller.getFunctionName(); + if (func) + obj.func = func; + }; + Error.captureStackTrace(this, getCaller3Info); + this.stack; + + Error.stackTraceLimit = saveLimit; + Error.prepareStackTrace = savePrepare; + return obj; +} + + +function _indent(s, indent) { + if (!indent) indent = ' '; + var lines = s.split(/\r?\n/g); + return indent + lines.join('\n' + indent); +} + + +/** + * Warn about an bunyan processing error. + * + * @param msg {String} Message with which to warn. + * @param dedupKey {String} Optional. A short string key for this warning to + * have its warning only printed once. + */ +function _warn(msg, dedupKey) { + assert.ok(msg); + if (dedupKey) { + if (_warned[dedupKey]) { + return; + } + _warned[dedupKey] = true; + } + process.stderr.write(msg + '\n'); +} +function _haveWarned(dedupKey) { + return _warned[dedupKey]; +} +var _warned = {}; + + +function ConsoleRawStream() {} +ConsoleRawStream.prototype.write = function (rec) { + if (rec.level < INFO) { + console.log(rec); + } else if (rec.level < WARN) { + console.info(rec); + } else if (rec.level < ERROR) { + console.warn(rec); + } else { + console.error(rec); + } +}; + + +//---- Levels + +var TRACE = 10; +var DEBUG = 20; +var INFO = 30; +var WARN = 40; +var ERROR = 50; +var FATAL = 60; + +var levelFromName = { + 'trace': TRACE, + 'debug': DEBUG, + 'info': INFO, + 'warn': WARN, + 'error': ERROR, + 'fatal': FATAL +}; +var nameFromLevel = {}; +Object.keys(levelFromName).forEach(function (name) { + nameFromLevel[levelFromName[name]] = name; +}); + +// Dtrace probes. +var dtp = undefined; +var probes = dtrace && {}; + +/** + * Resolve a level number, name (upper or lowercase) to a level number value. + * + * @param nameOrNum {String|Number} A level name (case-insensitive) or positive + * integer level. + * @api public + */ +function resolveLevel(nameOrNum) { + var level; + var type = typeof (nameOrNum); + if (type === 'string') { + level = levelFromName[nameOrNum.toLowerCase()]; + if (!level) { + throw new Error(format('unknown level name: "%s"', nameOrNum)); + } + } else if (type !== 'number') { + throw new TypeError(format('cannot resolve level: invalid arg (%s):', + type, nameOrNum)); + } else if (nameOrNum < 0 || Math.floor(nameOrNum) !== nameOrNum) { + throw new TypeError(format('level is not a positive integer: %s', + nameOrNum)); + } else { + level = nameOrNum; + } + return level; +} + + +function isWritable(obj) { + if (obj instanceof stream.Writable) { + return true; + } + return typeof (obj.write) === 'function'; +} + + +//---- Logger class + +/** + * Create a Logger instance. + * + * @param options {Object} See documentation for full details. At minimum + * this must include a 'name' string key. Configuration keys: + * - `streams`: specify the logger output streams. This is an array of + * objects with these fields: + * - `type`: The stream type. See README.md for full details. + * Often this is implied by the other fields. Examples are + * 'file', 'stream' and "raw". + * - `level`: Defaults to 'info'. + * - `path` or `stream`: The specify the file path or writeable + * stream to which log records are written. E.g. + * `stream: process.stdout`. + * - `closeOnExit` (boolean): Optional. Default is true for a + * 'file' stream when `path` is given, false otherwise. + * See README.md for full details. + * - `level`: set the level for a single output stream (cannot be used + * with `streams`) + * - `stream`: the output stream for a logger with just one, e.g. + * `process.stdout` (cannot be used with `streams`) + * - `serializers`: object mapping log record field names to + * serializing functions. See README.md for details. + * - `src`: Boolean (default false). Set true to enable 'src' automatic + * field with log call source info. + * All other keys are log record fields. + * + * An alternative *internal* call signature is used for creating a child: + * new Logger(, [, ]); + * + * @param _childSimple (Boolean) An assertion that the given `_childOptions` + * (a) only add fields (no config) and (b) no serialization handling is + * required for them. IOW, this is a fast path for frequent child + * creation. + */ +function Logger(options, _childOptions, _childSimple) { + xxx('Logger start:', options) + if (!(this instanceof Logger)) { + return new Logger(options, _childOptions); + } + + // Input arg validation. + var parent; + if (_childOptions !== undefined) { + parent = options; + options = _childOptions; + if (!(parent instanceof Logger)) { + throw new TypeError( + 'invalid Logger creation: do not pass a second arg'); + } + } + if (!options) { + throw new TypeError('options (object) is required'); + } + if (!parent) { + if (!options.name) { + throw new TypeError('options.name (string) is required'); + } + } else { + if (options.name) { + throw new TypeError( + 'invalid options.name: child cannot set logger name'); + } + } + if (options.stream && options.streams) { + throw new TypeError('cannot mix "streams" and "stream" options'); + } + if (options.streams && !Array.isArray(options.streams)) { + throw new TypeError('invalid options.streams: must be an array') + } + if (options.serializers && (typeof (options.serializers) !== 'object' || + Array.isArray(options.serializers))) { + throw new TypeError('invalid options.serializers: must be an object') + } + + EventEmitter.call(this); + + // Fast path for simple child creation. + if (parent && _childSimple) { + // `_isSimpleChild` is a signal to stream close handling that this child + // owns none of its streams. + this._isSimpleChild = true; + + this._level = parent._level; + this.streams = parent.streams; + this.serializers = parent.serializers; + this.src = parent.src; + var fields = this.fields = {}; + var parentFieldNames = Object.keys(parent.fields); + for (var i = 0; i < parentFieldNames.length; i++) { + var name = parentFieldNames[i]; + fields[name] = parent.fields[name]; + } + var names = Object.keys(options); + for (var i = 0; i < names.length; i++) { + var name = names[i]; + fields[name] = options[name]; + } + return; + } + + // Start values. + var self = this; + if (parent) { + this._level = parent._level; + this.streams = []; + for (var i = 0; i < parent.streams.length; i++) { + var s = objCopy(parent.streams[i]); + s.closeOnExit = false; // Don't own parent stream. + this.streams.push(s); + } + this.serializers = objCopy(parent.serializers); + this.src = parent.src; + this.fields = objCopy(parent.fields); + if (options.level) { + this.level(options.level); + } + } else { + this._level = Number.POSITIVE_INFINITY; + this.streams = []; + this.serializers = null; + this.src = false; + this.fields = {}; + } + + if (!dtp && dtrace) { + dtp = dtrace.createDTraceProvider('bunyan'); + + for (var level in levelFromName) { + var probe; + + probes[levelFromName[level]] = probe = + dtp.addProbe('log-' + level, 'char *'); + + // Explicitly add a reference to dtp to prevent it from being GC'd + probe.dtp = dtp; + } + + dtp.enable(); + } + + // Handle *config* options (i.e. options that are not just plain data + // for log records). + if (options.stream) { + self.addStream({ + type: 'stream', + stream: options.stream, + closeOnExit: false, + level: options.level + }); + } else if (options.streams) { + options.streams.forEach(function (s) { + self.addStream(s, options.level); + }); + } else if (parent && options.level) { + this.level(options.level); + } else if (!parent) { + if (runtimeEnv === 'browser') { + /* + * In the browser we'll be emitting to console.log by default. + * Any console.log worth its salt these days can nicely render + * and introspect objects (e.g. the Firefox and Chrome console) + * so let's emit the raw log record. Are there browsers for which + * that breaks things? + */ + self.addStream({ + type: 'raw', + stream: new ConsoleRawStream(), + closeOnExit: false, + level: options.level + }); + } else { + self.addStream({ + type: 'stream', + stream: process.stdout, + closeOnExit: false, + level: options.level + }); + } + } + if (options.serializers) { + self.addSerializers(options.serializers); + } + if (options.src) { + this.src = true; + } + xxx('Logger: ', self) + + // Fields. + // These are the default fields for log records (minus the attributes + // removed in this constructor). To allow storing raw log records + // (unrendered), `this.fields` must never be mutated. Create a copy for + // any changes. + var fields = objCopy(options); + delete fields.stream; + delete fields.level; + delete fields.streams; + delete fields.serializers; + delete fields.src; + if (this.serializers) { + this._applySerializers(fields); + } + if (!fields.hostname && !self.fields.hostname) { + fields.hostname = os.hostname(); + } + if (!fields.pid) { + fields.pid = process.pid; + } + Object.keys(fields).forEach(function (k) { + self.fields[k] = fields[k]; + }); +} + +util.inherits(Logger, EventEmitter); + + +/** + * Add a stream + * + * @param stream {Object}. Object with these fields: + * - `type`: The stream type. See README.md for full details. + * Often this is implied by the other fields. Examples are + * 'file', 'stream' and "raw". + * - `path` or `stream`: The specify the file path or writeable + * stream to which log records are written. E.g. + * `stream: process.stdout`. + * - `level`: Optional. Falls back to `defaultLevel`. + * - `closeOnExit` (boolean): Optional. Default is true for a + * 'file' stream when `path` is given, false otherwise. + * See README.md for full details. + * @param defaultLevel {Number|String} Optional. A level to use if + * `stream.level` is not set. If neither is given, this defaults to INFO. + */ +Logger.prototype.addStream = function addStream(s, defaultLevel) { + var self = this; + if (defaultLevel === null || defaultLevel === undefined) { + defaultLevel = INFO; + } + + s = objCopy(s); + + // Implicit 'type' from other args. + if (!s.type) { + if (s.stream) { + s.type = 'stream'; + } else if (s.path) { + s.type = 'file' + } + } + s.raw = (s.type === 'raw'); // PERF: Allow for faster check in `_emit`. + + if (s.level !== undefined) { + s.level = resolveLevel(s.level); + } else { + s.level = resolveLevel(defaultLevel); + } + if (s.level < self._level) { + self._level = s.level; + } + + switch (s.type) { + case 'stream': + assert.ok(isWritable(s.stream), + '"stream" stream is not writable: ' + util.inspect(s.stream)); + + if (!s.closeOnExit) { + s.closeOnExit = false; + } + break; + case 'file': + if (s.reemitErrorEvents === undefined) { + s.reemitErrorEvents = true; + } + if (!s.stream) { + s.stream = fs.createWriteStream(s.path, + {flags: 'a', encoding: 'utf8'}); + if (!s.closeOnExit) { + s.closeOnExit = true; + } + } else { + if (!s.closeOnExit) { + s.closeOnExit = false; + } + } + break; + case 'rotating-file': + assert.ok(!s.stream, + '"rotating-file" stream should not give a "stream"'); + assert.ok(s.path); + assert.ok(mv, '"rotating-file" stream type is not supported: ' + + 'missing "mv" module'); + s.stream = new RotatingFileStream(s); + if (!s.closeOnExit) { + s.closeOnExit = true; + } + break; + case 'raw': + if (!s.closeOnExit) { + s.closeOnExit = false; + } + break; + default: + throw new TypeError('unknown stream type "' + s.type + '"'); + } + + if (s.reemitErrorEvents && typeof (s.stream.on) === 'function') { + // TODO: When we have `.close()`, it should remove event + // listeners to not leak Logger instances. + s.stream.on('error', function onStreamError(err) { + self.emit('error', err, s); + }); + } + + self.streams.push(s); + delete self.haveNonRawStreams; // reset +} + + +/** + * Add serializers + * + * @param serializers {Object} Optional. Object mapping log record field names + * to serializing functions. See README.md for details. + */ +Logger.prototype.addSerializers = function addSerializers(serializers) { + var self = this; + + if (!self.serializers) { + self.serializers = {}; + } + Object.keys(serializers).forEach(function (field) { + var serializer = serializers[field]; + if (typeof (serializer) !== 'function') { + throw new TypeError(format( + 'invalid serializer for "%s" field: must be a function', + field)); + } else { + self.serializers[field] = serializer; + } + }); +} + + + +/** + * Create a child logger, typically to add a few log record fields. + * + * This can be useful when passing a logger to a sub-component, e.g. a + * 'wuzzle' component of your service: + * + * var wuzzleLog = log.child({component: 'wuzzle'}) + * var wuzzle = new Wuzzle({..., log: wuzzleLog}) + * + * Then log records from the wuzzle code will have the same structure as + * the app log, *plus the component='wuzzle' field*. + * + * @param options {Object} Optional. Set of options to apply to the child. + * All of the same options for a new Logger apply here. Notes: + * - The parent's streams are inherited and cannot be removed in this + * call. Any given `streams` are *added* to the set inherited from + * the parent. + * - The parent's serializers are inherited, though can effectively be + * overwritten by using duplicate keys. + * - Can use `level` to set the level of the streams inherited from + * the parent. The level for the parent is NOT affected. + * @param simple {Boolean} Optional. Set to true to assert that `options` + * (a) only add fields (no config) and (b) no serialization handling is + * required for them. IOW, this is a fast path for frequent child + * creation. See 'tools/timechild.js' for numbers. + */ +Logger.prototype.child = function (options, simple) { + return new (this.constructor)(this, options || {}, simple); +} + + +/** + * A convenience method to reopen 'file' streams on a logger. This can be + * useful with external log rotation utilities that move and re-open log files + * (e.g. logrotate on Linux, logadm on SmartOS/Illumos). Those utilities + * typically have rotation options to copy-and-truncate the log file, but + * you may not want to use that. An alternative is to do this in your + * application: + * + * var log = bunyan.createLogger(...); + * ... + * process.on('SIGUSR2', function () { + * log.reopenFileStreams(); + * }); + * ... + * + * See . + */ +Logger.prototype.reopenFileStreams = function () { + var self = this; + self.streams.forEach(function (s) { + if (s.type === 'file') { + if (s.stream) { + // Not sure if typically would want this, or more immediate + // `s.stream.destroy()`. + s.stream.end(); + s.stream.destroySoon(); + delete s.stream; + } + s.stream = fs.createWriteStream(s.path, + {flags: 'a', encoding: 'utf8'}); + s.stream.on('error', function (err) { + self.emit('error', err, s); + }); + } + }); +}; + + +/* BEGIN JSSTYLED */ +/** + * Close this logger. + * + * This closes streams (that it owns, as per 'endOnClose' attributes on + * streams), etc. Typically you **don't** need to bother calling this. +Logger.prototype.close = function () { + if (this._closed) { + return; + } + if (!this._isSimpleChild) { + self.streams.forEach(function (s) { + if (s.endOnClose) { + xxx('closing stream s:', s); + s.stream.end(); + s.endOnClose = false; + } + }); + } + this._closed = true; +} + */ +/* END JSSTYLED */ + + +/** + * Get/set the level of all streams on this logger. + * + * Get Usage: + * // Returns the current log level (lowest level of all its streams). + * log.level() -> INFO + * + * Set Usage: + * log.level(INFO) // set all streams to level INFO + * log.level('info') // can use 'info' et al aliases + */ +Logger.prototype.level = function level(value) { + if (value === undefined) { + return this._level; + } + var newLevel = resolveLevel(value); + var len = this.streams.length; + for (var i = 0; i < len; i++) { + this.streams[i].level = newLevel; + } + this._level = newLevel; +} + + +/** + * Get/set the level of a particular stream on this logger. + * + * Get Usage: + * // Returns an array of the levels of each stream. + * log.levels() -> [TRACE, INFO] + * + * // Returns a level of the identified stream. + * log.levels(0) -> TRACE // level of stream at index 0 + * log.levels('foo') // level of stream with name 'foo' + * + * Set Usage: + * log.levels(0, INFO) // set level of stream 0 to INFO + * log.levels(0, 'info') // can use 'info' et al aliases + * log.levels('foo', WARN) // set stream named 'foo' to WARN + * + * Stream names: When streams are defined, they can optionally be given + * a name. For example, + * log = new Logger({ + * streams: [ + * { + * name: 'foo', + * path: '/var/log/my-service/foo.log' + * level: 'trace' + * }, + * ... + * + * @param name {String|Number} The stream index or name. + * @param value {Number|String} The level value (INFO) or alias ('info'). + * If not given, this is a 'get' operation. + * @throws {Error} If there is no stream with the given name. + */ +Logger.prototype.levels = function levels(name, value) { + if (name === undefined) { + assert.equal(value, undefined); + return this.streams.map( + function (s) { return s.level }); + } + var stream; + if (typeof (name) === 'number') { + stream = this.streams[name]; + if (stream === undefined) { + throw new Error('invalid stream index: ' + name); + } + } else { + var len = this.streams.length; + for (var i = 0; i < len; i++) { + var s = this.streams[i]; + if (s.name === name) { + stream = s; + break; + } + } + if (!stream) { + throw new Error(format('no stream with name "%s"', name)); + } + } + if (value === undefined) { + return stream.level; + } else { + var newLevel = resolveLevel(value); + stream.level = newLevel; + if (newLevel < this._level) { + this._level = newLevel; + } + } +} + + +/** + * Apply registered serializers to the appropriate keys in the given fields. + * + * Pre-condition: This is only called if there is at least one serializer. + * + * @param fields (Object) The log record fields. + * @param excludeFields (Object) Optional mapping of keys to `true` for + * keys to NOT apply a serializer. + */ +Logger.prototype._applySerializers = function (fields, excludeFields) { + var self = this; + + xxx('_applySerializers: excludeFields', excludeFields); + + // Check each serializer against these (presuming number of serializers + // is typically less than number of fields). + Object.keys(this.serializers).forEach(function (name) { + if (fields[name] === undefined || + (excludeFields && excludeFields[name])) + { + return; + } + xxx('_applySerializers; apply to "%s" key', name) + try { + fields[name] = self.serializers[name](fields[name]); + } catch (err) { + _warn(format('bunyan: ERROR: Exception thrown from the "%s" ' + + 'Bunyan serializer. This should never happen. This is a bug ' + + 'in that serializer function.\n%s', + name, err.stack || err)); + fields[name] = format('(Error in Bunyan log "%s" serializer ' + + 'broke field. See stderr for details.)', name); + } + }); +} + + +/** + * Emit a log record. + * + * @param rec {log record} + * @param noemit {Boolean} Optional. Set to true to skip emission + * and just return the JSON string. + */ +Logger.prototype._emit = function (rec, noemit) { + var i; + + // Lazily determine if this Logger has non-'raw' streams. If there are + // any, then we need to stringify the log record. + if (this.haveNonRawStreams === undefined) { + this.haveNonRawStreams = false; + for (i = 0; i < this.streams.length; i++) { + if (!this.streams[i].raw) { + this.haveNonRawStreams = true; + break; + } + } + } + + // Stringify the object (creates a warning str on error). + var str; + if (noemit || this.haveNonRawStreams) { + str = fastAndSafeJsonStringify(rec) + os.EOL; + } + + if (noemit) + return str; + + var level = rec.level; + for (i = 0; i < this.streams.length; i++) { + var s = this.streams[i]; + if (s.level <= level) { + xxx('writing log rec "%s" to "%s" stream (%d <= %d): %j', + rec.msg, s.type, s.level, level, rec); + s.stream.write(s.raw ? rec : str); + } + }; + + return str; +} + + +/** + * Build a record object suitable for emitting from the arguments + * provided to the a log emitter. + */ +function mkRecord(log, minLevel, args) { + var excludeFields, fields, msgArgs; + if (args[0] instanceof Error) { + // `log.(err, ...)` + fields = { + // Use this Logger's err serializer, if defined. + err: (log.serializers && log.serializers.err + ? log.serializers.err(args[0]) + : Logger.stdSerializers.err(args[0])) + }; + excludeFields = {err: true}; + if (args.length === 1) { + msgArgs = [fields.err.message]; + } else { + msgArgs = args.slice(1); + } + } else if (typeof (args[0]) !== 'object' || Array.isArray(args[0])) { + // `log.(msg, ...)` + fields = null; + msgArgs = args.slice(); + } else if (Buffer.isBuffer(args[0])) { // `log.(buf, ...)` + // Almost certainly an error, show `inspect(buf)`. See bunyan + // issue #35. + fields = null; + msgArgs = args.slice(); + msgArgs[0] = util.inspect(msgArgs[0]); + } else { // `log.(fields, msg, ...)` + fields = args[0]; + if (fields && args.length === 1 && fields.err && + fields.err instanceof Error) + { + msgArgs = [fields.err.message]; + } else { + msgArgs = args.slice(1); + } + } + + // Build up the record object. + var rec = objCopy(log.fields); + var level = rec.level = minLevel; + var recFields = (fields ? objCopy(fields) : null); + if (recFields) { + if (log.serializers) { + log._applySerializers(recFields, excludeFields); + } + Object.keys(recFields).forEach(function (k) { + rec[k] = recFields[k]; + }); + } + rec.msg = format.apply(log, msgArgs); + if (!rec.time) { + rec.time = (new Date()); + } + // Get call source info + if (log.src && !rec.src) { + rec.src = getCaller3Info() + } + rec.v = LOG_VERSION; + + return rec; +}; + + +/** + * Build an array that dtrace-provider can use to fire a USDT probe. If we've + * already built the appropriate string, we use it. Otherwise, build the + * record object and stringify it. + */ +function mkProbeArgs(str, log, minLevel, msgArgs) { + return [ str || log._emit(mkRecord(log, minLevel, msgArgs), true) ]; +} + + +/** + * Build a log emitter function for level minLevel. I.e. this is the + * creator of `log.info`, `log.error`, etc. + */ +function mkLogEmitter(minLevel) { + return function () { + var log = this; + var str = null; + var rec = null; + + if (!this._emit) { + /* + * Show this invalid Bunyan usage warning *once*. + * + * See for + * an example of how this can happen. + */ + var dedupKey = 'unbound'; + if (!_haveWarned[dedupKey]) { + var caller = getCaller3Info(); + _warn(format('bunyan usage error: %s:%s: attempt to log ' + + 'with an unbound log method: `this` is: %s', + caller.file, caller.line, util.inspect(this)), + dedupKey); + } + return; + } else if (arguments.length === 0) { // `log.()` + return (this._level <= minLevel); + } + + var msgArgs = new Array(arguments.length); + for (var i = 0; i < msgArgs.length; ++i) { + msgArgs[i] = arguments[i]; + } + + if (this._level <= minLevel) { + rec = mkRecord(log, minLevel, msgArgs); + str = this._emit(rec); + } + + if (probes) { + probes[minLevel].fire(mkProbeArgs, str, log, minLevel, msgArgs); + } + } +} + + +/** + * The functions below log a record at a specific level. + * + * Usages: + * log.() -> boolean is-trace-enabled + * log.( err, [ msg, ...]) + * log.( msg, ...) + * log.( fields, msg, ...) + * + * where is the lowercase version of the log level. E.g.: + * + * log.info() + * + * @params fields {Object} Optional set of additional fields to log. + * @params msg {String} Log message. This can be followed by additional + * arguments that are handled like + * [util.format](http://nodejs.org/docs/latest/api/all.html#util.format). + */ +Logger.prototype.trace = mkLogEmitter(TRACE); +Logger.prototype.debug = mkLogEmitter(DEBUG); +Logger.prototype.info = mkLogEmitter(INFO); +Logger.prototype.warn = mkLogEmitter(WARN); +Logger.prototype.error = mkLogEmitter(ERROR); +Logger.prototype.fatal = mkLogEmitter(FATAL); + + + +//---- Standard serializers +// A serializer is a function that serializes a JavaScript object to a +// JSON representation for logging. There is a standard set of presumed +// interesting objects in node.js-land. + +Logger.stdSerializers = {}; + +// Serialize an HTTP request. +Logger.stdSerializers.req = function (req) { + if (!req || !req.connection) + return req; + return { + method: req.method, + // Accept `req.originalUrl` for expressjs usage. + // https://expressjs.com/en/api.html#req.originalUrl + url: req.originalUrl || req.url, + headers: req.headers, + remoteAddress: req.connection.remoteAddress, + remotePort: req.connection.remotePort + }; + // Trailers: Skipping for speed. If you need trailers in your app, then + // make a custom serializer. + //if (Object.keys(trailers).length > 0) { + // obj.trailers = req.trailers; + //} +}; + +// Serialize an HTTP response. +Logger.stdSerializers.res = function (res) { + if (!res || !res.statusCode) + return res; + return { + statusCode: res.statusCode, + header: res._header + } +}; + + +/* + * This function dumps long stack traces for exceptions having a cause() + * method. The error classes from + * [verror](https://github.com/davepacheco/node-verror) and + * [restify v2.0](https://github.com/mcavage/node-restify) are examples. + * + * Based on `dumpException` in + * https://github.com/davepacheco/node-extsprintf/blob/master/lib/extsprintf.js + */ +function getFullErrorStack(ex) +{ + var ret = ex.stack || ex.toString(); + if (ex.cause && typeof (ex.cause) === 'function') { + var cex = ex.cause(); + if (cex) { + ret += '\nCaused by: ' + getFullErrorStack(cex); + } + } + return (ret); +} + +// Serialize an Error object +// (Core error properties are enumerable in node 0.4, not in 0.6). +var errSerializer = Logger.stdSerializers.err = function (err) { + if (!err || !err.stack) + return err; + var obj = { + message: err.message, + name: err.name, + stack: getFullErrorStack(err), + code: err.code, + signal: err.signal + } + return obj; +}; + + +// A JSON stringifier that handles cycles safely - tracks seen values in a Set. +function safeCyclesSet() { + var seen = new Set(); + return function (key, val) { + if (!val || typeof (val) !== 'object') { + return val; + } + if (seen.has(val)) { + return '[Circular]'; + } + seen.add(val); + return val; + }; +} + +/** + * A JSON stringifier that handles cycles safely - tracks seen vals in an Array. + * + * Note: This approach has performance problems when dealing with large objects, + * see trentm/node-bunyan#445, but since this is the only option for node 0.10 + * and earlier (as Set was introduced in Node 0.12), it's used as a fallback + * when Set is not available. + */ +function safeCyclesArray() { + var seen = []; + return function (key, val) { + if (!val || typeof (val) !== 'object') { + return val; + } + if (seen.indexOf(val) !== -1) { + return '[Circular]'; + } + seen.push(val); + return val; + }; +} + +/** + * A JSON stringifier that handles cycles safely. + * + * Usage: JSON.stringify(obj, safeCycles()) + * + * Choose the best safe cycle function from what is available - see + * trentm/node-bunyan#445. + */ +var safeCycles = typeof (Set) !== 'undefined' ? safeCyclesSet : safeCyclesArray; + +/** + * A fast JSON.stringify that handles cycles and getter exceptions (when + * safeJsonStringify is installed). + * + * This function attempts to use the regular JSON.stringify for speed, but on + * error (e.g. JSON cycle detection exception) it falls back to safe stringify + * handlers that can deal with cycles and/or getter exceptions. + */ +function fastAndSafeJsonStringify(rec) { + try { + return JSON.stringify(rec); + } catch (ex) { + try { + return JSON.stringify(rec, safeCycles()); + } catch (e) { + if (safeJsonStringify) { + return safeJsonStringify(rec); + } else { + var dedupKey = e.stack.split(/\n/g, 3).join('\n'); + _warn('bunyan: ERROR: Exception in ' + + '`JSON.stringify(rec)`. You can install the ' + + '"safe-json-stringify" module to have Bunyan fallback ' + + 'to safer stringification. Record:\n' + + _indent(format('%s\n%s', util.inspect(rec), e.stack)), + dedupKey); + return format('(Exception in JSON.stringify(rec): %j. ' + + 'See stderr for details.)', e.message); + } + } + } +} + + +var RotatingFileStream = null; +if (mv) { + +RotatingFileStream = function RotatingFileStream(options) { + this.path = options.path; + + this.count = (options.count == null ? 10 : options.count); + assert.equal(typeof (this.count), 'number', + format('rotating-file stream "count" is not a number: %j (%s) in %j', + this.count, typeof (this.count), this)); + assert.ok(this.count >= 0, + format('rotating-file stream "count" is not >= 0: %j in %j', + this.count, this)); + + // Parse `options.period`. + if (options.period) { + // where scope is: + // h hours (at the start of the hour) + // d days (at the start of the day, i.e. just after midnight) + // w weeks (at the start of Sunday) + // m months (on the first of the month) + // y years (at the start of Jan 1st) + // with special values 'hourly' (1h), 'daily' (1d), "weekly" (1w), + // 'monthly' (1m) and 'yearly' (1y) + var period = { + 'hourly': '1h', + 'daily': '1d', + 'weekly': '1w', + 'monthly': '1m', + 'yearly': '1y' + }[options.period] || options.period; + var m = /^([1-9][0-9]*)([hdwmy]|ms)$/.exec(period); + if (!m) { + throw new Error(format('invalid period: "%s"', options.period)); + } + this.periodNum = Number(m[1]); + this.periodScope = m[2]; + } else { + this.periodNum = 1; + this.periodScope = 'd'; + } + + var lastModified = null; + try { + var fileInfo = fs.statSync(this.path); + lastModified = fileInfo.mtime.getTime(); + } + catch (err) { + // file doesn't exist + } + var rotateAfterOpen = false; + if (lastModified) { + var lastRotTime = this._calcRotTime(0); + if (lastModified < lastRotTime) { + rotateAfterOpen = true; + } + } + + // TODO: template support for backup files + // template: + // default is %P.%n + // '/var/log/archive/foo.log' -> foo.log.%n + // '/var/log/archive/foo.log.%n' + // codes: + // XXX support strftime codes (per node version of those) + // or whatever module. Pick non-colliding for extra + // codes + // %P `path` base value + // %n integer number of rotated log (1,2,3,...) + // %d datetime in YYYY-MM-DD_HH-MM-SS + // XXX what should default date format be? + // prior art? Want to avoid ':' in + // filenames (illegal on Windows for one). + + this.stream = fs.createWriteStream(this.path, + {flags: 'a', encoding: 'utf8'}); + + this.rotQueue = []; + this.rotating = false; + if (rotateAfterOpen) { + this._debug('rotateAfterOpen -> call rotate()'); + this.rotate(); + } else { + this._setupNextRot(); + } +} + +util.inherits(RotatingFileStream, EventEmitter); + +RotatingFileStream.prototype._debug = function () { + // Set this to `true` to add debug logging. + if (false) { + if (arguments.length === 0) { + return true; + } + var args = Array.prototype.slice.call(arguments); + args[0] = '[' + (new Date().toISOString()) + ', ' + + this.path + '] ' + args[0]; + console.log.apply(this, args); + } else { + return false; + } +}; + +RotatingFileStream.prototype._setupNextRot = function () { + this.rotAt = this._calcRotTime(1); + this._setRotationTimer(); +} + +RotatingFileStream.prototype._setRotationTimer = function () { + var self = this; + var delay = this.rotAt - Date.now(); + // Cap timeout to Node's max setTimeout, see + // . + var TIMEOUT_MAX = 2147483647; // 2^31-1 + if (delay > TIMEOUT_MAX) { + delay = TIMEOUT_MAX; + } + this.timeout = setTimeout( + function () { + self._debug('_setRotationTimer timeout -> call rotate()'); + self.rotate(); + }, + delay); + if (typeof (this.timeout.unref) === 'function') { + this.timeout.unref(); + } +} + +RotatingFileStream.prototype._calcRotTime = +function _calcRotTime(periodOffset) { + this._debug('_calcRotTime: %s%s', this.periodNum, this.periodScope); + var d = new Date(); + + this._debug(' now local: %s', d); + this._debug(' now utc: %s', d.toISOString()); + var rotAt; + switch (this.periodScope) { + case 'ms': + // Hidden millisecond period for debugging. + if (this.rotAt) { + rotAt = this.rotAt + this.periodNum * periodOffset; + } else { + rotAt = Date.now() + this.periodNum * periodOffset; + } + break; + case 'h': + if (this.rotAt) { + rotAt = this.rotAt + this.periodNum * 60 * 60 * 1000 * periodOffset; + } else { + // First time: top of the next hour. + rotAt = Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), + d.getUTCDate(), d.getUTCHours() + periodOffset); + } + break; + case 'd': + if (this.rotAt) { + rotAt = this.rotAt + this.periodNum * 24 * 60 * 60 * 1000 + * periodOffset; + } else { + // First time: start of tomorrow (i.e. at the coming midnight) UTC. + rotAt = Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), + d.getUTCDate() + periodOffset); + } + break; + case 'w': + // Currently, always on Sunday morning at 00:00:00 (UTC). + if (this.rotAt) { + rotAt = this.rotAt + this.periodNum * 7 * 24 * 60 * 60 * 1000 + * periodOffset; + } else { + // First time: this coming Sunday. + var dayOffset = (7 - d.getUTCDay()); + if (periodOffset < 1) { + dayOffset = -d.getUTCDay(); + } + if (periodOffset > 1 || periodOffset < -1) { + dayOffset += 7 * periodOffset; + } + rotAt = Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), + d.getUTCDate() + dayOffset); + } + break; + case 'm': + if (this.rotAt) { + rotAt = Date.UTC(d.getUTCFullYear(), + d.getUTCMonth() + this.periodNum * periodOffset, 1); + } else { + // First time: the start of the next month. + rotAt = Date.UTC(d.getUTCFullYear(), + d.getUTCMonth() + periodOffset, 1); + } + break; + case 'y': + if (this.rotAt) { + rotAt = Date.UTC(d.getUTCFullYear() + this.periodNum * periodOffset, + 0, 1); + } else { + // First time: the start of the next year. + rotAt = Date.UTC(d.getUTCFullYear() + periodOffset, 0, 1); + } + break; + default: + assert.fail(format('invalid period scope: "%s"', this.periodScope)); + } + + if (this._debug()) { + this._debug(' **rotAt**: %s (utc: %s)', rotAt, + new Date(rotAt).toUTCString()); + var now = Date.now(); + this._debug(' now: %s (%sms == %smin == %sh to go)', + now, + rotAt - now, + (rotAt-now)/1000/60, + (rotAt-now)/1000/60/60); + } + return rotAt; +}; + +RotatingFileStream.prototype.rotate = function rotate() { + // XXX What about shutdown? + var self = this; + + // If rotation period is > ~25 days, we have to break into multiple + // setTimeout's. See . + if (self.rotAt && self.rotAt > Date.now()) { + return self._setRotationTimer(); + } + + this._debug('rotate'); + if (self.rotating) { + throw new TypeError('cannot start a rotation when already rotating'); + } + self.rotating = true; + + self.stream.end(); // XXX can do moves sync after this? test at high rate + + function del() { + var toDel = self.path + '.' + String(n - 1); + if (n === 0) { + toDel = self.path; + } + n -= 1; + self._debug(' rm %s', toDel); + fs.unlink(toDel, function (delErr) { + //XXX handle err other than not exists + moves(); + }); + } + + function moves() { + if (self.count === 0 || n < 0) { + return finish(); + } + var before = self.path; + var after = self.path + '.' + String(n); + if (n > 0) { + before += '.' + String(n - 1); + } + n -= 1; + fs.exists(before, function (exists) { + if (!exists) { + moves(); + } else { + self._debug(' mv %s %s', before, after); + mv(before, after, function (mvErr) { + if (mvErr) { + self.emit('error', mvErr); + finish(); // XXX finish here? + } else { + moves(); + } + }); + } + }) + } + + function finish() { + self._debug(' open %s', self.path); + self.stream = fs.createWriteStream(self.path, + {flags: 'a', encoding: 'utf8'}); + var q = self.rotQueue, len = q.length; + for (var i = 0; i < len; i++) { + self.stream.write(q[i]); + } + self.rotQueue = []; + self.rotating = false; + self.emit('drain'); + self._setupNextRot(); + } + + var n = this.count; + del(); +}; + +RotatingFileStream.prototype.write = function write(s) { + if (this.rotating) { + this.rotQueue.push(s); + return false; + } else { + return this.stream.write(s); + } +}; + +RotatingFileStream.prototype.end = function end(s) { + this.stream.end(); +}; + +RotatingFileStream.prototype.destroy = function destroy(s) { + this.stream.destroy(); +}; + +RotatingFileStream.prototype.destroySoon = function destroySoon(s) { + this.stream.destroySoon(); +}; + +} /* if (mv) */ + + + +/** + * RingBuffer is a Writable Stream that just stores the last N records in + * memory. + * + * @param options {Object}, with the following fields: + * + * - limit: number of records to keep in memory + */ +function RingBuffer(options) { + this.limit = options && options.limit ? options.limit : 100; + this.writable = true; + this.records = []; + EventEmitter.call(this); +} + +util.inherits(RingBuffer, EventEmitter); + +RingBuffer.prototype.write = function (record) { + if (!this.writable) + throw (new Error('RingBuffer has been ended already')); + + this.records.push(record); + + if (this.records.length > this.limit) + this.records.shift(); + + return (true); +}; + +RingBuffer.prototype.end = function () { + if (arguments.length > 0) + this.write.apply(this, Array.prototype.slice.call(arguments)); + this.writable = false; +}; + +RingBuffer.prototype.destroy = function () { + this.writable = false; + this.emit('close'); +}; + +RingBuffer.prototype.destroySoon = function () { + this.destroy(); +}; + + +//---- Exports + +module.exports = Logger; + +module.exports.TRACE = TRACE; +module.exports.DEBUG = DEBUG; +module.exports.INFO = INFO; +module.exports.WARN = WARN; +module.exports.ERROR = ERROR; +module.exports.FATAL = FATAL; +module.exports.resolveLevel = resolveLevel; +module.exports.levelFromName = levelFromName; +module.exports.nameFromLevel = nameFromLevel; + +module.exports.VERSION = VERSION; +module.exports.LOG_VERSION = LOG_VERSION; + +module.exports.createLogger = function createLogger(options) { + return new Logger(options); +}; + +module.exports.RingBuffer = RingBuffer; +module.exports.RotatingFileStream = RotatingFileStream; + +// Useful for custom `type == 'raw'` streams that may do JSON stringification +// of log records themselves. Usage: +// var str = JSON.stringify(rec, bunyan.safeCycles()); +module.exports.safeCycles = safeCycles; diff --git a/task/node_modules/bunyan/package.json b/task/node_modules/bunyan/package.json new file mode 100644 index 0000000..3f6383b --- /dev/null +++ b/task/node_modules/bunyan/package.json @@ -0,0 +1,49 @@ +{ + "name": "bunyan", + "version": "1.8.15", + "description": "a JSON logging library for node.js services", + "author": "Trent Mick (http://trentm.com)", + "main": "./lib/bunyan.js", + "bin": { + "bunyan": "./bin/bunyan" + }, + "repository": { + "type": "git", + "url": "git://github.com/trentm/node-bunyan.git" + }, + "engines": [ + "node >=0.10.0" + ], + "files": [ + "bin", + "lib" + ], + "keywords": [ + "log", + "logging", + "log4j", + "json", + "bunyan" + ], + "license": "MIT", + "// dtrace-provider": "required for dtrace features", + "// mv": "required for RotatingFileStream", + "// moment": "required for local time with CLI", + "optionalDependencies": { + "dtrace-provider": "~0.8", + "mv": "~2", + "safe-json-stringify": "~1", + "moment": "^2.19.3" + }, + "devDependencies": { + "ben": "0.0.0", + "markdown-toc": "0.12.x", + "tap": "^9.0.3", + "vasync": "1.4.3", + "verror": "1.3.3" + }, + "scripts": { + "check": "make check", + "test": "tap test/*.test.js # skip dtrace tests" + } +} diff --git a/task/node_modules/call-bind/.eslintignore b/task/node_modules/call-bind/.eslintignore new file mode 100644 index 0000000..404abb2 --- /dev/null +++ b/task/node_modules/call-bind/.eslintignore @@ -0,0 +1 @@ +coverage/ diff --git a/task/node_modules/call-bind/.eslintrc b/task/node_modules/call-bind/.eslintrc new file mode 100644 index 0000000..dfa9a6c --- /dev/null +++ b/task/node_modules/call-bind/.eslintrc @@ -0,0 +1,16 @@ +{ + "root": true, + + "extends": "@ljharb", + + "rules": { + "func-name-matching": 0, + "id-length": 0, + "new-cap": [2, { + "capIsNewExceptions": [ + "GetIntrinsic", + ], + }], + "no-magic-numbers": 0, + }, +} diff --git a/task/node_modules/call-bind/.github/FUNDING.yml b/task/node_modules/call-bind/.github/FUNDING.yml new file mode 100644 index 0000000..c70c2ec --- /dev/null +++ b/task/node_modules/call-bind/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: [ljharb] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: npm/call-bind +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/task/node_modules/call-bind/.nycrc b/task/node_modules/call-bind/.nycrc new file mode 100644 index 0000000..bdd626c --- /dev/null +++ b/task/node_modules/call-bind/.nycrc @@ -0,0 +1,9 @@ +{ + "all": true, + "check-coverage": false, + "reporter": ["text-summary", "text", "html", "json"], + "exclude": [ + "coverage", + "test" + ] +} diff --git a/task/node_modules/call-bind/CHANGELOG.md b/task/node_modules/call-bind/CHANGELOG.md new file mode 100644 index 0000000..717bcc3 --- /dev/null +++ b/task/node_modules/call-bind/CHANGELOG.md @@ -0,0 +1,77 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [v1.0.5](https://github.com/ljharb/call-bind/compare/v1.0.4...v1.0.5) - 2023-10-19 + +### Commits + +- [Fix] throw an error on non-functions as early as possible [`f262408`](https://github.com/ljharb/call-bind/commit/f262408f822c840fbc268080f3ad7c429611066d) +- [Deps] update `set-function-length` [`3fff271`](https://github.com/ljharb/call-bind/commit/3fff27145a1e3a76a5b74f1d7c3c43d0fa3b9871) + +## [v1.0.4](https://github.com/ljharb/call-bind/compare/v1.0.3...v1.0.4) - 2023-10-19 + +## [v1.0.3](https://github.com/ljharb/call-bind/compare/v1.0.2...v1.0.3) - 2023-10-19 + +### Commits + +- [actions] reuse common workflows [`a994df6`](https://github.com/ljharb/call-bind/commit/a994df69f401f4bf735a4ccd77029b85d1549453) +- [meta] use `npmignore` to autogenerate an npmignore file [`eef3ef2`](https://github.com/ljharb/call-bind/commit/eef3ef21e1f002790837fedb8af2679c761fbdf5) +- [readme] flesh out content [`1845ccf`](https://github.com/ljharb/call-bind/commit/1845ccfd9976a607884cfc7157c93192cc16cf22) +- [actions] use `node/install` instead of `node/run`; use `codecov` action [`5b47d53`](https://github.com/ljharb/call-bind/commit/5b47d53d2fd74af5ea0a44f1d51e503cd42f7a90) +- [Refactor] use `set-function-length` [`a0e165c`](https://github.com/ljharb/call-bind/commit/a0e165c5dc61db781cbc919b586b1c2b8da0b150) +- [Dev Deps] update `@ljharb/eslint-config`, `aud`, `tape` [`9c50103`](https://github.com/ljharb/call-bind/commit/9c50103f44137279a817317cf6cc421a658f85b4) +- [meta] simplify "exports" [`019c6d0`](https://github.com/ljharb/call-bind/commit/019c6d06b0e1246ceed8e579f57e44441cbbf6d9) +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `safe-publish-latest`, `tape` [`23bd718`](https://github.com/ljharb/call-bind/commit/23bd718a288d3b03042062b4ef5153b3cea83f11) +- [actions] update codecov uploader [`62552d7`](https://github.com/ljharb/call-bind/commit/62552d79cc79e05825e99aaba134ae5b37f33da5) +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `tape` [`ec81665`](https://github.com/ljharb/call-bind/commit/ec81665b300f87eabff597afdc8b8092adfa7afd) +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `safe-publish-latest`, `tape` [`35d67fc`](https://github.com/ljharb/call-bind/commit/35d67fcea883e686650f736f61da5ddca2592de8) +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `tape` [`0266d8d`](https://github.com/ljharb/call-bind/commit/0266d8d2a45086a922db366d0c2932fa463662ff) +- [Dev Deps] update `@ljharb/eslint-config`, `aud`, `tape` [`43a5b28`](https://github.com/ljharb/call-bind/commit/43a5b28a444e710e1bbf92adb8afb5cf7523a223) +- [Deps] update `define-data-property`, `function-bind`, `get-intrinsic` [`780eb36`](https://github.com/ljharb/call-bind/commit/780eb36552514f8cc99c70821ce698697c2726a5) +- [Dev Deps] update `aud`, `tape` [`90d50ad`](https://github.com/ljharb/call-bind/commit/90d50ad03b061e0268b3380b0065fcaec183dc05) +- [meta] use `prepublishOnly` script for npm 7+ [`44c5433`](https://github.com/ljharb/call-bind/commit/44c5433b7980e02b4870007046407cf6fc543329) +- [Deps] update `get-intrinsic` [`86bfbfc`](https://github.com/ljharb/call-bind/commit/86bfbfcf34afdc6eabc93ce3d408548d0e27d958) +- [Deps] update `get-intrinsic` [`5c53354`](https://github.com/ljharb/call-bind/commit/5c5335489be0294c18cd7a8bb6e08226ee019ff5) +- [actions] update checkout action [`4c393a8`](https://github.com/ljharb/call-bind/commit/4c393a8173b3c8e5b30d5b3297b3b94d48bf87f3) +- [Deps] update `get-intrinsic` [`4e70bde`](https://github.com/ljharb/call-bind/commit/4e70bdec0626acb11616d66250fc14565e716e91) +- [Deps] update `get-intrinsic` [`55ae803`](https://github.com/ljharb/call-bind/commit/55ae803a920bd93c369cd798c20de31f91e9fc60) + +## [v1.0.2](https://github.com/ljharb/call-bind/compare/v1.0.1...v1.0.2) - 2021-01-11 + +### Commits + +- [Fix] properly include the receiver in the bound length [`dbae7bc`](https://github.com/ljharb/call-bind/commit/dbae7bc676c079a0d33c0a43e9ef92cb7b01345d) + +## [v1.0.1](https://github.com/ljharb/call-bind/compare/v1.0.0...v1.0.1) - 2021-01-08 + +### Commits + +- [Tests] migrate tests to Github Actions [`b6db284`](https://github.com/ljharb/call-bind/commit/b6db284c36f8ccd195b88a6764fe84b7223a0da1) +- [meta] do not publish github action workflow files [`ec7fe46`](https://github.com/ljharb/call-bind/commit/ec7fe46e60cfa4764ee943d2755f5e5a366e578e) +- [Fix] preserve original function’s length when possible [`adbceaa`](https://github.com/ljharb/call-bind/commit/adbceaa3cac4b41ea78bb19d7ccdbaaf7e0bdadb) +- [Tests] gather coverage data on every job [`d69e23c`](https://github.com/ljharb/call-bind/commit/d69e23cc65f101ba1d4c19bb07fa8eb0ec624be8) +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `tape` [`2fd3586`](https://github.com/ljharb/call-bind/commit/2fd3586c5d47b335364c14293114c6b625ae1f71) +- [Deps] update `get-intrinsic` [`f23e931`](https://github.com/ljharb/call-bind/commit/f23e9318cc271c2add8bb38cfded85ee7baf8eee) +- [Deps] update `get-intrinsic` [`72d9f44`](https://github.com/ljharb/call-bind/commit/72d9f44e184465ba8dd3fb48260bbcff234985f2) +- [meta] fix FUNDING.yml [`e723573`](https://github.com/ljharb/call-bind/commit/e723573438c5a68dcec31fb5d96ea6b7e4a93be8) +- [eslint] ignore coverage output [`15e76d2`](https://github.com/ljharb/call-bind/commit/15e76d28a5f43e504696401e5b31ebb78ee1b532) +- [meta] add Automatic Rebase and Require Allow Edits workflows [`8fa4dab`](https://github.com/ljharb/call-bind/commit/8fa4dabb23ba3dd7bb92c9571c1241c08b56e4b6) + +## v1.0.0 - 2020-10-30 + +### Commits + +- Initial commit [`306cf98`](https://github.com/ljharb/call-bind/commit/306cf98c7ec9e7ef66b653ec152277ac1381eb50) +- Tests [`e10d0bb`](https://github.com/ljharb/call-bind/commit/e10d0bbdadc7a10ecedc9a1c035112d3e368b8df) +- Implementation [`43852ed`](https://github.com/ljharb/call-bind/commit/43852eda0f187327b7fad2423ca972149a52bd65) +- npm init [`408f860`](https://github.com/ljharb/call-bind/commit/408f860b773a2f610805fd3613d0d71bac1b6249) +- [meta] add Automatic Rebase and Require Allow Edits workflows [`fb349b2`](https://github.com/ljharb/call-bind/commit/fb349b2e48defbec8b5ec8a8395cc8f69f220b13) +- [meta] add `auto-changelog` [`c4001fc`](https://github.com/ljharb/call-bind/commit/c4001fc43031799ef908211c98d3b0fb2b60fde4) +- [meta] add "funding"; create `FUNDING.yml` [`d4d6d29`](https://github.com/ljharb/call-bind/commit/d4d6d2974a14bc2e98830468eda7fe6d6a776717) +- [Tests] add `npm run lint` [`dedfb98`](https://github.com/ljharb/call-bind/commit/dedfb98bd0ecefb08ddb9a94061bd10cde4332af) +- Only apps should have lockfiles [`54ac776`](https://github.com/ljharb/call-bind/commit/54ac77653db45a7361dc153d2f478e743f110650) +- [meta] add `safe-publish-latest` [`9ea8e43`](https://github.com/ljharb/call-bind/commit/9ea8e435b950ce9b705559cd651039f9bf40140f) diff --git a/task/node_modules/call-bind/LICENSE b/task/node_modules/call-bind/LICENSE new file mode 100644 index 0000000..48f05d0 --- /dev/null +++ b/task/node_modules/call-bind/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Jordan Harband + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/task/node_modules/call-bind/README.md b/task/node_modules/call-bind/README.md new file mode 100644 index 0000000..48e9047 --- /dev/null +++ b/task/node_modules/call-bind/README.md @@ -0,0 +1,64 @@ +# call-bind [![Version Badge][npm-version-svg]][package-url] + +[![github actions][actions-image]][actions-url] +[![coverage][codecov-image]][codecov-url] +[![dependency status][deps-svg]][deps-url] +[![dev dependency status][dev-deps-svg]][dev-deps-url] +[![License][license-image]][license-url] +[![Downloads][downloads-image]][downloads-url] + +[![npm badge][npm-badge-png]][package-url] + +Robustly `.call.bind()` a function. + +## Getting started + +```sh +npm install --save call-bind +``` + +## Usage/Examples + +```js +const assert = require('assert'); +const callBind = require('call-bind'); +const callBound = require('call-bind/callBound'); + +function f(a, b) { + assert.equal(this, 1); + assert.equal(a, 2); + assert.equal(b, 3); + assert.equal(arguments.length, 2); +} + +const fBound = callBind(f); + +const slice = callBound('Array.prototype.slice'); + +delete Function.prototype.call; +delete Function.prototype.bind; + +fBound(1, 2, 3); + +assert.deepEqual(slice([1, 2, 3, 4], 1, -1), [2, 3]); +``` + +## Tests + +Clone the repo, `npm install`, and run `npm test` + +[package-url]: https://npmjs.org/package/call-bind +[npm-version-svg]: https://versionbadg.es/ljharb/call-bind.svg +[deps-svg]: https://david-dm.org/ljharb/call-bind.svg +[deps-url]: https://david-dm.org/ljharb/call-bind +[dev-deps-svg]: https://david-dm.org/ljharb/call-bind/dev-status.svg +[dev-deps-url]: https://david-dm.org/ljharb/call-bind#info=devDependencies +[npm-badge-png]: https://nodei.co/npm/call-bind.png?downloads=true&stars=true +[license-image]: https://img.shields.io/npm/l/call-bind.svg +[license-url]: LICENSE +[downloads-image]: https://img.shields.io/npm/dm/call-bind.svg +[downloads-url]: https://npm-stat.com/charts.html?package=call-bind +[codecov-image]: https://codecov.io/gh/ljharb/call-bind/branch/main/graphs/badge.svg +[codecov-url]: https://app.codecov.io/gh/ljharb/call-bind/ +[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/ljharb/call-bind +[actions-url]: https://github.com/ljharb/call-bind/actions diff --git a/task/node_modules/call-bind/callBound.js b/task/node_modules/call-bind/callBound.js new file mode 100644 index 0000000..8374adf --- /dev/null +++ b/task/node_modules/call-bind/callBound.js @@ -0,0 +1,15 @@ +'use strict'; + +var GetIntrinsic = require('get-intrinsic'); + +var callBind = require('./'); + +var $indexOf = callBind(GetIntrinsic('String.prototype.indexOf')); + +module.exports = function callBoundIntrinsic(name, allowMissing) { + var intrinsic = GetIntrinsic(name, !!allowMissing); + if (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) { + return callBind(intrinsic); + } + return intrinsic; +}; diff --git a/task/node_modules/call-bind/index.js b/task/node_modules/call-bind/index.js new file mode 100644 index 0000000..184ee2b --- /dev/null +++ b/task/node_modules/call-bind/index.js @@ -0,0 +1,44 @@ +'use strict'; + +var bind = require('function-bind'); +var GetIntrinsic = require('get-intrinsic'); +var setFunctionLength = require('set-function-length'); + +var $TypeError = GetIntrinsic('%TypeError%'); +var $apply = GetIntrinsic('%Function.prototype.apply%'); +var $call = GetIntrinsic('%Function.prototype.call%'); +var $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply); + +var $defineProperty = GetIntrinsic('%Object.defineProperty%', true); +var $max = GetIntrinsic('%Math.max%'); + +if ($defineProperty) { + try { + $defineProperty({}, 'a', { value: 1 }); + } catch (e) { + // IE 8 has a broken defineProperty + $defineProperty = null; + } +} + +module.exports = function callBind(originalFunction) { + if (typeof originalFunction !== 'function') { + throw new $TypeError('a function is required'); + } + var func = $reflectApply(bind, $call, arguments); + return setFunctionLength( + func, + 1 + $max(0, originalFunction.length - (arguments.length - 1)), + true + ); +}; + +var applyBind = function applyBind() { + return $reflectApply(bind, $apply, arguments); +}; + +if ($defineProperty) { + $defineProperty(module.exports, 'apply', { value: applyBind }); +} else { + module.exports.apply = applyBind; +} diff --git a/task/node_modules/call-bind/package.json b/task/node_modules/call-bind/package.json new file mode 100644 index 0000000..f946e1a --- /dev/null +++ b/task/node_modules/call-bind/package.json @@ -0,0 +1,90 @@ +{ + "name": "call-bind", + "version": "1.0.5", + "description": "Robustly `.call.bind()` a function", + "main": "index.js", + "exports": { + ".": "./index.js", + "./callBound": "./callBound.js", + "./package.json": "./package.json" + }, + "scripts": { + "prepack": "npmignore --auto --commentLines=auto", + "prepublish": "not-in-publish || npm run prepublishOnly", + "prepublishOnly": "safe-publish-latest", + "lint": "eslint --ext=.js,.mjs .", + "postlint": "evalmd README.md", + "pretest": "npm run lint", + "tests-only": "nyc tape 'test/**/*.js'", + "test": "npm run tests-only", + "posttest": "aud --production", + "version": "auto-changelog && git add CHANGELOG.md", + "postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\"" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ljharb/call-bind.git" + }, + "keywords": [ + "javascript", + "ecmascript", + "es", + "js", + "callbind", + "callbound", + "call", + "bind", + "bound", + "call-bind", + "call-bound", + "function", + "es-abstract" + ], + "author": "Jordan Harband ", + "funding": { + "url": "https://github.com/sponsors/ljharb" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/ljharb/call-bind/issues" + }, + "homepage": "https://github.com/ljharb/call-bind#readme", + "devDependencies": { + "@ljharb/eslint-config": "^21.1.0", + "aud": "^2.0.3", + "auto-changelog": "^2.4.0", + "es-value-fixtures": "^1.4.2", + "eslint": "=8.8.0", + "evalmd": "^0.0.19", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-strict-mode": "^1.0.1", + "in-publish": "^2.0.1", + "npmignore": "^0.3.0", + "nyc": "^10.3.2", + "object-inspect": "^1.13.1", + "safe-publish-latest": "^2.0.0", + "tape": "^5.7.1" + }, + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "testling": { + "files": "test/index.js" + }, + "auto-changelog": { + "output": "CHANGELOG.md", + "template": "keepachangelog", + "unreleased": false, + "commitLimit": false, + "backfillLimit": false, + "hideCredit": true + }, + "publishConfig": { + "ignore": [ + ".github/workflows" + ] + } +} diff --git a/task/node_modules/call-bind/test/callBound.js b/task/node_modules/call-bind/test/callBound.js new file mode 100644 index 0000000..c32319d --- /dev/null +++ b/task/node_modules/call-bind/test/callBound.js @@ -0,0 +1,54 @@ +'use strict'; + +var test = require('tape'); + +var callBound = require('../callBound'); + +test('callBound', function (t) { + // static primitive + t.equal(callBound('Array.length'), Array.length, 'Array.length yields itself'); + t.equal(callBound('%Array.length%'), Array.length, '%Array.length% yields itself'); + + // static non-function object + t.equal(callBound('Array.prototype'), Array.prototype, 'Array.prototype yields itself'); + t.equal(callBound('%Array.prototype%'), Array.prototype, '%Array.prototype% yields itself'); + t.equal(callBound('Array.constructor'), Array.constructor, 'Array.constructor yields itself'); + t.equal(callBound('%Array.constructor%'), Array.constructor, '%Array.constructor% yields itself'); + + // static function + t.equal(callBound('Date.parse'), Date.parse, 'Date.parse yields itself'); + t.equal(callBound('%Date.parse%'), Date.parse, '%Date.parse% yields itself'); + + // prototype primitive + t.equal(callBound('Error.prototype.message'), Error.prototype.message, 'Error.prototype.message yields itself'); + t.equal(callBound('%Error.prototype.message%'), Error.prototype.message, '%Error.prototype.message% yields itself'); + + // prototype function + t.notEqual(callBound('Object.prototype.toString'), Object.prototype.toString, 'Object.prototype.toString does not yield itself'); + t.notEqual(callBound('%Object.prototype.toString%'), Object.prototype.toString, '%Object.prototype.toString% does not yield itself'); + t.equal(callBound('Object.prototype.toString')(true), Object.prototype.toString.call(true), 'call-bound Object.prototype.toString calls into the original'); + t.equal(callBound('%Object.prototype.toString%')(true), Object.prototype.toString.call(true), 'call-bound %Object.prototype.toString% calls into the original'); + + t['throws']( + function () { callBound('does not exist'); }, + SyntaxError, + 'nonexistent intrinsic throws' + ); + t['throws']( + function () { callBound('does not exist', true); }, + SyntaxError, + 'allowMissing arg still throws for unknown intrinsic' + ); + + t.test('real but absent intrinsic', { skip: typeof WeakRef !== 'undefined' }, function (st) { + st['throws']( + function () { callBound('WeakRef'); }, + TypeError, + 'real but absent intrinsic throws' + ); + st.equal(callBound('WeakRef', true), undefined, 'allowMissing arg avoids exception'); + st.end(); + }); + + t.end(); +}); diff --git a/task/node_modules/call-bind/test/index.js b/task/node_modules/call-bind/test/index.js new file mode 100644 index 0000000..1fd4668 --- /dev/null +++ b/task/node_modules/call-bind/test/index.js @@ -0,0 +1,80 @@ +'use strict'; + +var callBind = require('../'); +var bind = require('function-bind'); +var gOPD = require('gopd'); +var hasStrictMode = require('has-strict-mode')(); +var forEach = require('for-each'); +var inspect = require('object-inspect'); +var v = require('es-value-fixtures'); + +var test = require('tape'); + +/* + * older engines have length nonconfigurable + * in io.js v3, it is configurable except on bound functions, hence the .bind() + */ +var functionsHaveConfigurableLengths = !!( + gOPD + && Object.getOwnPropertyDescriptor + && Object.getOwnPropertyDescriptor(bind.call(function () {}), 'length').configurable +); + +test('callBind', function (t) { + forEach(v.nonFunctions, function (nonFunction) { + t['throws']( + function () { callBind(nonFunction); }, + TypeError, + inspect(nonFunction) + ' is not a function' + ); + }); + + var sentinel = { sentinel: true }; + var func = function (a, b) { + // eslint-disable-next-line no-invalid-this + return [!hasStrictMode && this === global ? undefined : this, a, b]; + }; + t.equal(func.length, 2, 'original function length is 2'); + t.deepEqual(func(), [undefined, undefined, undefined], 'unbound func with too few args'); + t.deepEqual(func(1, 2), [undefined, 1, 2], 'unbound func with right args'); + t.deepEqual(func(1, 2, 3), [undefined, 1, 2], 'unbound func with too many args'); + + var bound = callBind(func); + t.equal(bound.length, func.length + 1, 'function length is preserved', { skip: !functionsHaveConfigurableLengths }); + t.deepEqual(bound(), [undefined, undefined, undefined], 'bound func with too few args'); + t.deepEqual(bound(1, 2), [hasStrictMode ? 1 : Object(1), 2, undefined], 'bound func with right args'); + t.deepEqual(bound(1, 2, 3), [hasStrictMode ? 1 : Object(1), 2, 3], 'bound func with too many args'); + + var boundR = callBind(func, sentinel); + t.equal(boundR.length, func.length, 'function length is preserved', { skip: !functionsHaveConfigurableLengths }); + t.deepEqual(boundR(), [sentinel, undefined, undefined], 'bound func with receiver, with too few args'); + t.deepEqual(boundR(1, 2), [sentinel, 1, 2], 'bound func with receiver, with right args'); + t.deepEqual(boundR(1, 2, 3), [sentinel, 1, 2], 'bound func with receiver, with too many args'); + + var boundArg = callBind(func, sentinel, 1); + t.equal(boundArg.length, func.length - 1, 'function length is preserved', { skip: !functionsHaveConfigurableLengths }); + t.deepEqual(boundArg(), [sentinel, 1, undefined], 'bound func with receiver and arg, with too few args'); + t.deepEqual(boundArg(2), [sentinel, 1, 2], 'bound func with receiver and arg, with right arg'); + t.deepEqual(boundArg(2, 3), [sentinel, 1, 2], 'bound func with receiver and arg, with too many args'); + + t.test('callBind.apply', function (st) { + var aBound = callBind.apply(func); + st.deepEqual(aBound(sentinel), [sentinel, undefined, undefined], 'apply-bound func with no args'); + st.deepEqual(aBound(sentinel, [1], 4), [sentinel, 1, undefined], 'apply-bound func with too few args'); + st.deepEqual(aBound(sentinel, [1, 2], 4), [sentinel, 1, 2], 'apply-bound func with right args'); + + var aBoundArg = callBind.apply(func); + st.deepEqual(aBoundArg(sentinel, [1, 2, 3], 4), [sentinel, 1, 2], 'apply-bound func with too many args'); + st.deepEqual(aBoundArg(sentinel, [1, 2], 4), [sentinel, 1, 2], 'apply-bound func with right args'); + st.deepEqual(aBoundArg(sentinel, [1], 4), [sentinel, 1, undefined], 'apply-bound func with too few args'); + + var aBoundR = callBind.apply(func, sentinel); + st.deepEqual(aBoundR([1, 2, 3], 4), [sentinel, 1, 2], 'apply-bound func with receiver and too many args'); + st.deepEqual(aBoundR([1, 2], 4), [sentinel, 1, 2], 'apply-bound func with receiver and right args'); + st.deepEqual(aBoundR([1], 4), [sentinel, 1, undefined], 'apply-bound func with receiver and too few args'); + + st.end(); + }); + + t.end(); +}); diff --git a/task/node_modules/caseless/LICENSE b/task/node_modules/caseless/LICENSE new file mode 100644 index 0000000..61789f4 --- /dev/null +++ b/task/node_modules/caseless/LICENSE @@ -0,0 +1,28 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +1. Definitions. +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: +You must give any other recipients of the Work or Derivative Works a copy of this License; and +You must cause any modified files to carry prominent notices stating that You changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. +END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/task/node_modules/caseless/README.md b/task/node_modules/caseless/README.md new file mode 100644 index 0000000..e5077a2 --- /dev/null +++ b/task/node_modules/caseless/README.md @@ -0,0 +1,45 @@ +## Caseless -- wrap an object to set and get property with caseless semantics but also preserve caseing. + +This library is incredibly useful when working with HTTP headers. It allows you to get/set/check for headers in a caseless manner while also preserving the caseing of headers the first time they are set. + +## Usage + +```javascript +var headers = {} + , c = caseless(headers) + ; +c.set('a-Header', 'asdf') +c.get('a-header') === 'asdf' +``` + +## has(key) + +Has takes a name and if it finds a matching header will return that header name with the preserved caseing it was set with. + +```javascript +c.has('a-header') === 'a-Header' +``` + +## set(key, value[, clobber=true]) + +Set is fairly straight forward except that if the header exists and clobber is disabled it will add `','+value` to the existing header. + +```javascript +c.set('a-Header', 'fdas') +c.set('a-HEADER', 'more', false) +c.get('a-header') === 'fdsa,more' +``` + +## swap(key) + +Swaps the casing of a header with the new one that is passed in. + +```javascript +var headers = {} + , c = caseless(headers) + ; +c.set('a-Header', 'fdas') +c.swap('a-HEADER') +c.has('a-header') === 'a-HEADER' +headers === {'a-HEADER': 'fdas'} +``` diff --git a/task/node_modules/caseless/index.js b/task/node_modules/caseless/index.js new file mode 100644 index 0000000..b194734 --- /dev/null +++ b/task/node_modules/caseless/index.js @@ -0,0 +1,67 @@ +function Caseless (dict) { + this.dict = dict || {} +} +Caseless.prototype.set = function (name, value, clobber) { + if (typeof name === 'object') { + for (var i in name) { + this.set(i, name[i], value) + } + } else { + if (typeof clobber === 'undefined') clobber = true + var has = this.has(name) + + if (!clobber && has) this.dict[has] = this.dict[has] + ',' + value + else this.dict[has || name] = value + return has + } +} +Caseless.prototype.has = function (name) { + var keys = Object.keys(this.dict) + , name = name.toLowerCase() + ; + for (var i=0;i", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/mikeal/caseless/issues" + }, + "devDependencies": { + "tape": "^2.10.2" + } +} diff --git a/task/node_modules/caseless/test.js b/task/node_modules/caseless/test.js new file mode 100644 index 0000000..f55196c --- /dev/null +++ b/task/node_modules/caseless/test.js @@ -0,0 +1,67 @@ +var tape = require('tape') + , caseless = require('./') + ; + +tape('set get has', function (t) { + var headers = {} + , c = caseless(headers) + ; + t.plan(17) + c.set('a-Header', 'asdf') + t.equal(c.get('a-header'), 'asdf') + t.equal(c.has('a-header'), 'a-Header') + t.ok(!c.has('nothing')) + // old bug where we used the wrong regex + t.ok(!c.has('a-hea')) + c.set('a-header', 'fdsa') + t.equal(c.get('a-header'), 'fdsa') + t.equal(c.get('a-Header'), 'fdsa') + c.set('a-HEADER', 'more', false) + t.equal(c.get('a-header'), 'fdsa,more') + + t.deepEqual(headers, {'a-Header': 'fdsa,more'}) + c.swap('a-HEADER') + t.deepEqual(headers, {'a-HEADER': 'fdsa,more'}) + + c.set('deleteme', 'foobar') + t.ok(c.has('deleteme')) + t.ok(c.del('deleteme')) + t.notOk(c.has('deleteme')) + t.notOk(c.has('idonotexist')) + t.ok(c.del('idonotexist')) + + c.set('tva', 'test1') + c.set('tva-header', 'test2') + t.equal(c.has('tva'), 'tva') + t.notOk(c.has('header')) + + t.equal(c.get('tva'), 'test1') + +}) + +tape('swap', function (t) { + var headers = {} + , c = caseless(headers) + ; + t.plan(4) + // No Header to Swap. + t.throws(function () { + c.swap('content-type') + }) + // Set Header. + c.set('content-type', 'application/json') + // Swap Header With Itself. + c.swap('content-type') + // Does Not Delete Itself. + t.ok(c.has('content-type')) + // Swap Header With a Different Header. + c.swap('Content-Type') + // Still Has Header. + t.ok(c.has('Content-Type')) + // Delete Header. + c.del('Content-Type') + // No Header to Swap. + t.throws(function () { + c.swap('content-type') + }) +}) diff --git a/task/node_modules/combined-stream/License b/task/node_modules/combined-stream/License new file mode 100644 index 0000000..4804b7a --- /dev/null +++ b/task/node_modules/combined-stream/License @@ -0,0 +1,19 @@ +Copyright (c) 2011 Debuggable Limited + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/task/node_modules/combined-stream/Readme.md b/task/node_modules/combined-stream/Readme.md new file mode 100644 index 0000000..9e367b5 --- /dev/null +++ b/task/node_modules/combined-stream/Readme.md @@ -0,0 +1,138 @@ +# combined-stream + +A stream that emits multiple other streams one after another. + +**NB** Currently `combined-stream` works with streams version 1 only. There is ongoing effort to switch this library to streams version 2. Any help is welcome. :) Meanwhile you can explore other libraries that provide streams2 support with more or less compatibility with `combined-stream`. + +- [combined-stream2](https://www.npmjs.com/package/combined-stream2): A drop-in streams2-compatible replacement for the combined-stream module. + +- [multistream](https://www.npmjs.com/package/multistream): A stream that emits multiple other streams one after another. + +## Installation + +``` bash +npm install combined-stream +``` + +## Usage + +Here is a simple example that shows how you can use combined-stream to combine +two files into one: + +``` javascript +var CombinedStream = require('combined-stream'); +var fs = require('fs'); + +var combinedStream = CombinedStream.create(); +combinedStream.append(fs.createReadStream('file1.txt')); +combinedStream.append(fs.createReadStream('file2.txt')); + +combinedStream.pipe(fs.createWriteStream('combined.txt')); +``` + +While the example above works great, it will pause all source streams until +they are needed. If you don't want that to happen, you can set `pauseStreams` +to `false`: + +``` javascript +var CombinedStream = require('combined-stream'); +var fs = require('fs'); + +var combinedStream = CombinedStream.create({pauseStreams: false}); +combinedStream.append(fs.createReadStream('file1.txt')); +combinedStream.append(fs.createReadStream('file2.txt')); + +combinedStream.pipe(fs.createWriteStream('combined.txt')); +``` + +However, what if you don't have all the source streams yet, or you don't want +to allocate the resources (file descriptors, memory, etc.) for them right away? +Well, in that case you can simply provide a callback that supplies the stream +by calling a `next()` function: + +``` javascript +var CombinedStream = require('combined-stream'); +var fs = require('fs'); + +var combinedStream = CombinedStream.create(); +combinedStream.append(function(next) { + next(fs.createReadStream('file1.txt')); +}); +combinedStream.append(function(next) { + next(fs.createReadStream('file2.txt')); +}); + +combinedStream.pipe(fs.createWriteStream('combined.txt')); +``` + +## API + +### CombinedStream.create([options]) + +Returns a new combined stream object. Available options are: + +* `maxDataSize` +* `pauseStreams` + +The effect of those options is described below. + +### combinedStream.pauseStreams = `true` + +Whether to apply back pressure to the underlaying streams. If set to `false`, +the underlaying streams will never be paused. If set to `true`, the +underlaying streams will be paused right after being appended, as well as when +`delayedStream.pipe()` wants to throttle. + +### combinedStream.maxDataSize = `2 * 1024 * 1024` + +The maximum amount of bytes (or characters) to buffer for all source streams. +If this value is exceeded, `combinedStream` emits an `'error'` event. + +### combinedStream.dataSize = `0` + +The amount of bytes (or characters) currently buffered by `combinedStream`. + +### combinedStream.append(stream) + +Appends the given `stream` to the combinedStream object. If `pauseStreams` is +set to `true, this stream will also be paused right away. + +`streams` can also be a function that takes one parameter called `next`. `next` +is a function that must be invoked in order to provide the `next` stream, see +example above. + +Regardless of how the `stream` is appended, combined-stream always attaches an +`'error'` listener to it, so you don't have to do that manually. + +Special case: `stream` can also be a String or Buffer. + +### combinedStream.write(data) + +You should not call this, `combinedStream` takes care of piping the appended +streams into itself for you. + +### combinedStream.resume() + +Causes `combinedStream` to start drain the streams it manages. The function is +idempotent, and also emits a `'resume'` event each time which usually goes to +the stream that is currently being drained. + +### combinedStream.pause(); + +If `combinedStream.pauseStreams` is set to `false`, this does nothing. +Otherwise a `'pause'` event is emitted, this goes to the stream that is +currently being drained, so you can use it to apply back pressure. + +### combinedStream.end(); + +Sets `combinedStream.writable` to false, emits an `'end'` event, and removes +all streams from the queue. + +### combinedStream.destroy(); + +Same as `combinedStream.end()`, except it emits a `'close'` event instead of +`'end'`. + +## License + +combined-stream is licensed under the MIT license. diff --git a/task/node_modules/combined-stream/lib/combined_stream.js b/task/node_modules/combined-stream/lib/combined_stream.js new file mode 100644 index 0000000..125f097 --- /dev/null +++ b/task/node_modules/combined-stream/lib/combined_stream.js @@ -0,0 +1,208 @@ +var util = require('util'); +var Stream = require('stream').Stream; +var DelayedStream = require('delayed-stream'); + +module.exports = CombinedStream; +function CombinedStream() { + this.writable = false; + this.readable = true; + this.dataSize = 0; + this.maxDataSize = 2 * 1024 * 1024; + this.pauseStreams = true; + + this._released = false; + this._streams = []; + this._currentStream = null; + this._insideLoop = false; + this._pendingNext = false; +} +util.inherits(CombinedStream, Stream); + +CombinedStream.create = function(options) { + var combinedStream = new this(); + + options = options || {}; + for (var option in options) { + combinedStream[option] = options[option]; + } + + return combinedStream; +}; + +CombinedStream.isStreamLike = function(stream) { + return (typeof stream !== 'function') + && (typeof stream !== 'string') + && (typeof stream !== 'boolean') + && (typeof stream !== 'number') + && (!Buffer.isBuffer(stream)); +}; + +CombinedStream.prototype.append = function(stream) { + var isStreamLike = CombinedStream.isStreamLike(stream); + + if (isStreamLike) { + if (!(stream instanceof DelayedStream)) { + var newStream = DelayedStream.create(stream, { + maxDataSize: Infinity, + pauseStream: this.pauseStreams, + }); + stream.on('data', this._checkDataSize.bind(this)); + stream = newStream; + } + + this._handleErrors(stream); + + if (this.pauseStreams) { + stream.pause(); + } + } + + this._streams.push(stream); + return this; +}; + +CombinedStream.prototype.pipe = function(dest, options) { + Stream.prototype.pipe.call(this, dest, options); + this.resume(); + return dest; +}; + +CombinedStream.prototype._getNext = function() { + this._currentStream = null; + + if (this._insideLoop) { + this._pendingNext = true; + return; // defer call + } + + this._insideLoop = true; + try { + do { + this._pendingNext = false; + this._realGetNext(); + } while (this._pendingNext); + } finally { + this._insideLoop = false; + } +}; + +CombinedStream.prototype._realGetNext = function() { + var stream = this._streams.shift(); + + + if (typeof stream == 'undefined') { + this.end(); + return; + } + + if (typeof stream !== 'function') { + this._pipeNext(stream); + return; + } + + var getStream = stream; + getStream(function(stream) { + var isStreamLike = CombinedStream.isStreamLike(stream); + if (isStreamLike) { + stream.on('data', this._checkDataSize.bind(this)); + this._handleErrors(stream); + } + + this._pipeNext(stream); + }.bind(this)); +}; + +CombinedStream.prototype._pipeNext = function(stream) { + this._currentStream = stream; + + var isStreamLike = CombinedStream.isStreamLike(stream); + if (isStreamLike) { + stream.on('end', this._getNext.bind(this)); + stream.pipe(this, {end: false}); + return; + } + + var value = stream; + this.write(value); + this._getNext(); +}; + +CombinedStream.prototype._handleErrors = function(stream) { + var self = this; + stream.on('error', function(err) { + self._emitError(err); + }); +}; + +CombinedStream.prototype.write = function(data) { + this.emit('data', data); +}; + +CombinedStream.prototype.pause = function() { + if (!this.pauseStreams) { + return; + } + + if(this.pauseStreams && this._currentStream && typeof(this._currentStream.pause) == 'function') this._currentStream.pause(); + this.emit('pause'); +}; + +CombinedStream.prototype.resume = function() { + if (!this._released) { + this._released = true; + this.writable = true; + this._getNext(); + } + + if(this.pauseStreams && this._currentStream && typeof(this._currentStream.resume) == 'function') this._currentStream.resume(); + this.emit('resume'); +}; + +CombinedStream.prototype.end = function() { + this._reset(); + this.emit('end'); +}; + +CombinedStream.prototype.destroy = function() { + this._reset(); + this.emit('close'); +}; + +CombinedStream.prototype._reset = function() { + this.writable = false; + this._streams = []; + this._currentStream = null; +}; + +CombinedStream.prototype._checkDataSize = function() { + this._updateDataSize(); + if (this.dataSize <= this.maxDataSize) { + return; + } + + var message = + 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.'; + this._emitError(new Error(message)); +}; + +CombinedStream.prototype._updateDataSize = function() { + this.dataSize = 0; + + var self = this; + this._streams.forEach(function(stream) { + if (!stream.dataSize) { + return; + } + + self.dataSize += stream.dataSize; + }); + + if (this._currentStream && this._currentStream.dataSize) { + this.dataSize += this._currentStream.dataSize; + } +}; + +CombinedStream.prototype._emitError = function(err) { + this._reset(); + this.emit('error', err); +}; diff --git a/task/node_modules/combined-stream/package.json b/task/node_modules/combined-stream/package.json new file mode 100644 index 0000000..6982b6d --- /dev/null +++ b/task/node_modules/combined-stream/package.json @@ -0,0 +1,25 @@ +{ + "author": "Felix Geisendörfer (http://debuggable.com/)", + "name": "combined-stream", + "description": "A stream that emits multiple other streams one after another.", + "version": "1.0.8", + "homepage": "https://github.com/felixge/node-combined-stream", + "repository": { + "type": "git", + "url": "git://github.com/felixge/node-combined-stream.git" + }, + "main": "./lib/combined_stream", + "scripts": { + "test": "node test/run.js" + }, + "engines": { + "node": ">= 0.8" + }, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "devDependencies": { + "far": "~0.0.7" + }, + "license": "MIT" +} diff --git a/task/node_modules/combined-stream/yarn.lock b/task/node_modules/combined-stream/yarn.lock new file mode 100644 index 0000000..7edf418 --- /dev/null +++ b/task/node_modules/combined-stream/yarn.lock @@ -0,0 +1,17 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +far@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/far/-/far-0.0.7.tgz#01c1fd362bcd26ce9cf161af3938aa34619f79a7" + dependencies: + oop "0.0.3" + +oop@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/oop/-/oop-0.0.3.tgz#70fa405a5650891a194fdc82ca68dad6dabf4401" diff --git a/task/node_modules/concat-map/.travis.yml b/task/node_modules/concat-map/.travis.yml new file mode 100644 index 0000000..f1d0f13 --- /dev/null +++ b/task/node_modules/concat-map/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - 0.4 + - 0.6 diff --git a/task/node_modules/concat-map/LICENSE b/task/node_modules/concat-map/LICENSE new file mode 100644 index 0000000..ee27ba4 --- /dev/null +++ b/task/node_modules/concat-map/LICENSE @@ -0,0 +1,18 @@ +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/task/node_modules/concat-map/README.markdown b/task/node_modules/concat-map/README.markdown new file mode 100644 index 0000000..408f70a --- /dev/null +++ b/task/node_modules/concat-map/README.markdown @@ -0,0 +1,62 @@ +concat-map +========== + +Concatenative mapdashery. + +[![browser support](http://ci.testling.com/substack/node-concat-map.png)](http://ci.testling.com/substack/node-concat-map) + +[![build status](https://secure.travis-ci.org/substack/node-concat-map.png)](http://travis-ci.org/substack/node-concat-map) + +example +======= + +``` js +var concatMap = require('concat-map'); +var xs = [ 1, 2, 3, 4, 5, 6 ]; +var ys = concatMap(xs, function (x) { + return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; +}); +console.dir(ys); +``` + +*** + +``` +[ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ] +``` + +methods +======= + +``` js +var concatMap = require('concat-map') +``` + +concatMap(xs, fn) +----------------- + +Return an array of concatenated elements by calling `fn(x, i)` for each element +`x` and each index `i` in the array `xs`. + +When `fn(x, i)` returns an array, its result will be concatenated with the +result array. If `fn(x, i)` returns anything else, that value will be pushed +onto the end of the result array. + +install +======= + +With [npm](http://npmjs.org) do: + +``` +npm install concat-map +``` + +license +======= + +MIT + +notes +===== + +This module was written while sitting high above the ground in a tree. diff --git a/task/node_modules/concat-map/example/map.js b/task/node_modules/concat-map/example/map.js new file mode 100644 index 0000000..3365621 --- /dev/null +++ b/task/node_modules/concat-map/example/map.js @@ -0,0 +1,6 @@ +var concatMap = require('../'); +var xs = [ 1, 2, 3, 4, 5, 6 ]; +var ys = concatMap(xs, function (x) { + return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; +}); +console.dir(ys); diff --git a/task/node_modules/concat-map/index.js b/task/node_modules/concat-map/index.js new file mode 100644 index 0000000..b29a781 --- /dev/null +++ b/task/node_modules/concat-map/index.js @@ -0,0 +1,13 @@ +module.exports = function (xs, fn) { + var res = []; + for (var i = 0; i < xs.length; i++) { + var x = fn(xs[i], i); + if (isArray(x)) res.push.apply(res, x); + else res.push(x); + } + return res; +}; + +var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; +}; diff --git a/task/node_modules/concat-map/package.json b/task/node_modules/concat-map/package.json new file mode 100644 index 0000000..d3640e6 --- /dev/null +++ b/task/node_modules/concat-map/package.json @@ -0,0 +1,43 @@ +{ + "name" : "concat-map", + "description" : "concatenative mapdashery", + "version" : "0.0.1", + "repository" : { + "type" : "git", + "url" : "git://github.com/substack/node-concat-map.git" + }, + "main" : "index.js", + "keywords" : [ + "concat", + "concatMap", + "map", + "functional", + "higher-order" + ], + "directories" : { + "example" : "example", + "test" : "test" + }, + "scripts" : { + "test" : "tape test/*.js" + }, + "devDependencies" : { + "tape" : "~2.4.0" + }, + "license" : "MIT", + "author" : { + "name" : "James Halliday", + "email" : "mail@substack.net", + "url" : "http://substack.net" + }, + "testling" : { + "files" : "test/*.js", + "browsers" : { + "ie" : [ 6, 7, 8, 9 ], + "ff" : [ 3.5, 10, 15.0 ], + "chrome" : [ 10, 22 ], + "safari" : [ 5.1 ], + "opera" : [ 12 ] + } + } +} diff --git a/task/node_modules/concat-map/test/map.js b/task/node_modules/concat-map/test/map.js new file mode 100644 index 0000000..fdbd702 --- /dev/null +++ b/task/node_modules/concat-map/test/map.js @@ -0,0 +1,39 @@ +var concatMap = require('../'); +var test = require('tape'); + +test('empty or not', function (t) { + var xs = [ 1, 2, 3, 4, 5, 6 ]; + var ixes = []; + var ys = concatMap(xs, function (x, ix) { + ixes.push(ix); + return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; + }); + t.same(ys, [ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]); + t.same(ixes, [ 0, 1, 2, 3, 4, 5 ]); + t.end(); +}); + +test('always something', function (t) { + var xs = [ 'a', 'b', 'c', 'd' ]; + var ys = concatMap(xs, function (x) { + return x === 'b' ? [ 'B', 'B', 'B' ] : [ x ]; + }); + t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]); + t.end(); +}); + +test('scalars', function (t) { + var xs = [ 'a', 'b', 'c', 'd' ]; + var ys = concatMap(xs, function (x) { + return x === 'b' ? [ 'B', 'B', 'B' ] : x; + }); + t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]); + t.end(); +}); + +test('undefs', function (t) { + var xs = [ 'a', 'b', 'c', 'd' ]; + var ys = concatMap(xs, function () {}); + t.same(ys, [ undefined, undefined, undefined, undefined ]); + t.end(); +}); diff --git a/task/node_modules/concat-stream/LICENSE b/task/node_modules/concat-stream/LICENSE new file mode 100644 index 0000000..99c130e --- /dev/null +++ b/task/node_modules/concat-stream/LICENSE @@ -0,0 +1,24 @@ +The MIT License + +Copyright (c) 2013 Max Ogden + +Permission is hereby granted, free of charge, +to any person obtaining a copy of this software and +associated documentation files (the "Software"), to +deal in the Software without restriction, including +without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom +the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/task/node_modules/concat-stream/index.js b/task/node_modules/concat-stream/index.js new file mode 100644 index 0000000..dd672a7 --- /dev/null +++ b/task/node_modules/concat-stream/index.js @@ -0,0 +1,144 @@ +var Writable = require('readable-stream').Writable +var inherits = require('inherits') +var bufferFrom = require('buffer-from') + +if (typeof Uint8Array === 'undefined') { + var U8 = require('typedarray').Uint8Array +} else { + var U8 = Uint8Array +} + +function ConcatStream(opts, cb) { + if (!(this instanceof ConcatStream)) return new ConcatStream(opts, cb) + + if (typeof opts === 'function') { + cb = opts + opts = {} + } + if (!opts) opts = {} + + var encoding = opts.encoding + var shouldInferEncoding = false + + if (!encoding) { + shouldInferEncoding = true + } else { + encoding = String(encoding).toLowerCase() + if (encoding === 'u8' || encoding === 'uint8') { + encoding = 'uint8array' + } + } + + Writable.call(this, { objectMode: true }) + + this.encoding = encoding + this.shouldInferEncoding = shouldInferEncoding + + if (cb) this.on('finish', function () { cb(this.getBody()) }) + this.body = [] +} + +module.exports = ConcatStream +inherits(ConcatStream, Writable) + +ConcatStream.prototype._write = function(chunk, enc, next) { + this.body.push(chunk) + next() +} + +ConcatStream.prototype.inferEncoding = function (buff) { + var firstBuffer = buff === undefined ? this.body[0] : buff; + if (Buffer.isBuffer(firstBuffer)) return 'buffer' + if (typeof Uint8Array !== 'undefined' && firstBuffer instanceof Uint8Array) return 'uint8array' + if (Array.isArray(firstBuffer)) return 'array' + if (typeof firstBuffer === 'string') return 'string' + if (Object.prototype.toString.call(firstBuffer) === "[object Object]") return 'object' + return 'buffer' +} + +ConcatStream.prototype.getBody = function () { + if (!this.encoding && this.body.length === 0) return [] + if (this.shouldInferEncoding) this.encoding = this.inferEncoding() + if (this.encoding === 'array') return arrayConcat(this.body) + if (this.encoding === 'string') return stringConcat(this.body) + if (this.encoding === 'buffer') return bufferConcat(this.body) + if (this.encoding === 'uint8array') return u8Concat(this.body) + return this.body +} + +var isArray = Array.isArray || function (arr) { + return Object.prototype.toString.call(arr) == '[object Array]' +} + +function isArrayish (arr) { + return /Array\]$/.test(Object.prototype.toString.call(arr)) +} + +function isBufferish (p) { + return typeof p === 'string' || isArrayish(p) || (p && typeof p.subarray === 'function') +} + +function stringConcat (parts) { + var strings = [] + var needsToString = false + for (var i = 0; i < parts.length; i++) { + var p = parts[i] + if (typeof p === 'string') { + strings.push(p) + } else if (Buffer.isBuffer(p)) { + strings.push(p) + } else if (isBufferish(p)) { + strings.push(bufferFrom(p)) + } else { + strings.push(bufferFrom(String(p))) + } + } + if (Buffer.isBuffer(parts[0])) { + strings = Buffer.concat(strings) + strings = strings.toString('utf8') + } else { + strings = strings.join('') + } + return strings +} + +function bufferConcat (parts) { + var bufs = [] + for (var i = 0; i < parts.length; i++) { + var p = parts[i] + if (Buffer.isBuffer(p)) { + bufs.push(p) + } else if (isBufferish(p)) { + bufs.push(bufferFrom(p)) + } else { + bufs.push(bufferFrom(String(p))) + } + } + return Buffer.concat(bufs) +} + +function arrayConcat (parts) { + var res = [] + for (var i = 0; i < parts.length; i++) { + res.push.apply(res, parts[i]) + } + return res +} + +function u8Concat (parts) { + var len = 0 + for (var i = 0; i < parts.length; i++) { + if (typeof parts[i] === 'string') { + parts[i] = bufferFrom(parts[i]) + } + len += parts[i].length + } + var u8 = new U8(len) + for (var i = 0, offset = 0; i < parts.length; i++) { + var part = parts[i] + for (var j = 0; j < part.length; j++) { + u8[offset++] = part[j] + } + } + return u8 +} diff --git a/task/node_modules/concat-stream/package.json b/task/node_modules/concat-stream/package.json new file mode 100644 index 0000000..f709022 --- /dev/null +++ b/task/node_modules/concat-stream/package.json @@ -0,0 +1,55 @@ +{ + "name": "concat-stream", + "version": "1.6.2", + "description": "writable stream that concatenates strings or binary data and calls a callback with the result", + "tags": [ + "stream", + "simple", + "util", + "utility" + ], + "author": "Max Ogden ", + "repository": { + "type": "git", + "url": "http://github.com/maxogden/concat-stream.git" + }, + "bugs": { + "url": "http://github.com/maxogden/concat-stream/issues" + }, + "engines": [ + "node >= 0.8" + ], + "main": "index.js", + "files": [ + "index.js" + ], + "scripts": { + "test": "tape test/*.js test/server/*.js" + }, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "devDependencies": { + "tape": "^4.6.3" + }, + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/8..latest", + "firefox/17..latest", + "firefox/nightly", + "chrome/22..latest", + "chrome/canary", + "opera/12..latest", + "opera/next", + "safari/5.1..latest", + "ipad/6.0..latest", + "iphone/6.0..latest", + "android-browser/4.2..latest" + ] + } +} diff --git a/task/node_modules/concat-stream/readme.md b/task/node_modules/concat-stream/readme.md new file mode 100644 index 0000000..7aa19c4 --- /dev/null +++ b/task/node_modules/concat-stream/readme.md @@ -0,0 +1,102 @@ +# concat-stream + +Writable stream that concatenates all the data from a stream and calls a callback with the result. Use this when you want to collect all the data from a stream into a single buffer. + +[![Build Status](https://travis-ci.org/maxogden/concat-stream.svg?branch=master)](https://travis-ci.org/maxogden/concat-stream) + +[![NPM](https://nodei.co/npm/concat-stream.png)](https://nodei.co/npm/concat-stream/) + +### description + +Streams emit many buffers. If you want to collect all of the buffers, and when the stream ends concatenate all of the buffers together and receive a single buffer then this is the module for you. + +Only use this if you know you can fit all of the output of your stream into a single Buffer (e.g. in RAM). + +There are also `objectMode` streams that emit things other than Buffers, and you can concatenate these too. See below for details. + +## Related + +`concat-stream` is part of the [mississippi stream utility collection](https://github.com/maxogden/mississippi) which includes more useful stream modules similar to this one. + +### examples + +#### Buffers + +```js +var fs = require('fs') +var concat = require('concat-stream') + +var readStream = fs.createReadStream('cat.png') +var concatStream = concat(gotPicture) + +readStream.on('error', handleError) +readStream.pipe(concatStream) + +function gotPicture(imageBuffer) { + // imageBuffer is all of `cat.png` as a node.js Buffer +} + +function handleError(err) { + // handle your error appropriately here, e.g.: + console.error(err) // print the error to STDERR + process.exit(1) // exit program with non-zero exit code +} + +``` + +#### Arrays + +```js +var write = concat(function(data) {}) +write.write([1,2,3]) +write.write([4,5,6]) +write.end() +// data will be [1,2,3,4,5,6] in the above callback +``` + +#### Uint8Arrays + +```js +var write = concat(function(data) {}) +var a = new Uint8Array(3) +a[0] = 97; a[1] = 98; a[2] = 99 +write.write(a) +write.write('!') +write.end(Buffer.from('!!1')) +``` + +See `test/` for more examples + +# methods + +```js +var concat = require('concat-stream') +``` + +## var writable = concat(opts={}, cb) + +Return a `writable` stream that will fire `cb(data)` with all of the data that +was written to the stream. Data can be written to `writable` as strings, +Buffers, arrays of byte integers, and Uint8Arrays. + +By default `concat-stream` will give you back the same data type as the type of the first buffer written to the stream. Use `opts.encoding` to set what format `data` should be returned as, e.g. if you if you don't want to rely on the built-in type checking or for some other reason. + +* `string` - get a string +* `buffer` - get back a Buffer +* `array` - get an array of byte integers +* `uint8array`, `u8`, `uint8` - get back a Uint8Array +* `object`, get back an array of Objects + +If you don't specify an encoding, and the types can't be inferred (e.g. you write things that aren't in the list above), it will try to convert concat them into a `Buffer`. + +If nothing is written to `writable` then `data` will be an empty array `[]`. + +# error handling + +`concat-stream` does not handle errors for you, so you must handle errors on whatever streams you pipe into `concat-stream`. This is a general rule when programming with node.js streams: always handle errors on each and every stream. Since `concat-stream` is not itself a stream it does not emit errors. + +We recommend using [`end-of-stream`](https://npmjs.org/end-of-stream) or [`pump`](https://npmjs.org/pump) for writing error tolerant stream code. + +# license + +MIT LICENSE diff --git a/task/node_modules/core-util-is/LICENSE b/task/node_modules/core-util-is/LICENSE new file mode 100644 index 0000000..d8d7f94 --- /dev/null +++ b/task/node_modules/core-util-is/LICENSE @@ -0,0 +1,19 @@ +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. diff --git a/task/node_modules/core-util-is/README.md b/task/node_modules/core-util-is/README.md new file mode 100644 index 0000000..5a76b41 --- /dev/null +++ b/task/node_modules/core-util-is/README.md @@ -0,0 +1,3 @@ +# core-util-is + +The `util.is*` functions introduced in Node v0.12. diff --git a/task/node_modules/core-util-is/lib/util.js b/task/node_modules/core-util-is/lib/util.js new file mode 100644 index 0000000..6e5a20d --- /dev/null +++ b/task/node_modules/core-util-is/lib/util.js @@ -0,0 +1,107 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. + +function isArray(arg) { + if (Array.isArray) { + return Array.isArray(arg); + } + return objectToString(arg) === '[object Array]'; +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +exports.isBuffer = require('buffer').Buffer.isBuffer; + +function objectToString(o) { + return Object.prototype.toString.call(o); +} diff --git a/task/node_modules/core-util-is/package.json b/task/node_modules/core-util-is/package.json new file mode 100644 index 0000000..b0c51f5 --- /dev/null +++ b/task/node_modules/core-util-is/package.json @@ -0,0 +1,38 @@ +{ + "name": "core-util-is", + "version": "1.0.3", + "description": "The `util.is*` functions introduced in Node v0.12.", + "main": "lib/util.js", + "files": [ + "lib" + ], + "repository": { + "type": "git", + "url": "git://github.com/isaacs/core-util-is" + }, + "keywords": [ + "util", + "isBuffer", + "isArray", + "isNumber", + "isString", + "isRegExp", + "isThis", + "isThat", + "polyfill" + ], + "author": "Isaac Z. Schlueter (http://blog.izs.me/)", + "license": "MIT", + "bugs": { + "url": "https://github.com/isaacs/core-util-is/issues" + }, + "scripts": { + "test": "tap test.js", + "preversion": "npm test", + "postversion": "npm publish", + "prepublishOnly": "git push origin --follow-tags" + }, + "devDependencies": { + "tap": "^15.0.9" + } +} diff --git a/task/node_modules/deasync/.github/FUNDING.yml b/task/node_modules/deasync/.github/FUNDING.yml new file mode 100644 index 0000000..cfc3025 --- /dev/null +++ b/task/node_modules/deasync/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: [abbr] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/task/node_modules/deasync/.github/workflows/npm_test.yml b/task/node_modules/deasync/.github/workflows/npm_test.yml new file mode 100644 index 0000000..e81a012 --- /dev/null +++ b/task/node_modules/deasync/.github/workflows/npm_test.yml @@ -0,0 +1,20 @@ +name: npm_test +on: [pull_request, push] +jobs: + npm_test: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [macos-latest, ubuntu-latest, windows-latest] + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: '21' + - run: npm install + - run: npm test + - name: Upload bin folder + uses: actions/upload-artifact@v2 + with: + name: bin + path: bin/ diff --git a/task/node_modules/deasync/.travis.yml b/task/node_modules/deasync/.travis.yml new file mode 100644 index 0000000..fbbe737 --- /dev/null +++ b/task/node_modules/deasync/.travis.yml @@ -0,0 +1,4 @@ +language: node_js + +node_js: + - node diff --git a/task/node_modules/deasync/LICENSE b/task/node_modules/deasync/LICENSE new file mode 100644 index 0000000..94149a1 --- /dev/null +++ b/task/node_modules/deasync/LICENSE @@ -0,0 +1,9 @@ +The MIT License (MIT) + +Copyright (c) 2015-present + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/task/node_modules/deasync/README.md b/task/node_modules/deasync/README.md new file mode 100644 index 0000000..cdf923f --- /dev/null +++ b/task/node_modules/deasync/README.md @@ -0,0 +1,112 @@ +DeAsync.js +======= +[![NPM version](http://img.shields.io/npm/v/deasync.svg)](https://www.npmjs.org/package/deasync) + +DeAsync turns async function into sync, implemented with a blocking mechanism by calling Node.js event loop at JavaScript layer. The core of deasync is written in C++. + + +## Motivation + +Suppose you maintain a library that exposes a function getData. Your users call it to get actual data: +var myData = getData(); +Under the hood data is saved in a file so you implemented getData using Node.js built-in fs.readFileSync. It's obvious both getData and fs.readFileSync are sync functions. One day you were told to switch the underlying data source to a repo such as MongoDB which can only be accessed asynchronously. You were also told for backward compatibility, getData API cannot be changed to return merely a promise or demand a callback parameter. How do you meet both requirements? + +You may tempted to use [node-fibers](https://github.com/laverdet/node-fibers) or a module derived from it, but node fibers can only wrap async function call into a sync function inside a fiber. In the case above you cannot assume all callers are inside fibers. On the other hand, if you start a fiber in `getData` then `getData` itself will still return immediately without waiting for the async call result. For similar reason ES6 generators introduced in Node v0.11 won't work either. + +What really needed is a way to block subsequent JavaScript from running without blocking entire thread by yielding to allow other events in the event loop to be handled. Ideally the blockage is removed as soon as the result of async function is available. A less ideal but often acceptable alternative is a `sleep` function which you can use to implement the blockage like ```while(!done) sleep(100);```. It is less ideal because sleep duration has to be guessed. It is important the `sleep` function not only shouldn't block entire thread, but also shouldn't incur busy wait that pegs the CPU to 100%. + + +DeAsync supports both alternatives. + + + +## Usages + + +* Generic wrapper of async function with conventional API signature `function(p1,...pn,function cb(error,result){})`. Returns `result` and throws `error` as exception if not null: + +```javascript +var deasync = require('deasync'); +var cp = require('child_process'); +var exec = deasync(cp.exec); +// output result of ls -la +try{ + console.log(exec('ls -la')); +} +catch(err){ + console.log(err); +} +// done is printed last, as supposed, with cp.exec wrapped in deasync; first without. +console.log('done'); +``` + +* For async function with unconventional API, for instance `function asyncFunction(p1,function cb(res){})`, use `loopWhile(predicateFunc)` where `predicateFunc` is a function that returns boolean loop condition + +```javascript +var done = false; +var data; +asyncFunction(p1,function cb(res){ + data = res; + done = true; +}); +require('deasync').loopWhile(function(){return !done;}); +// data is now populated +``` + +* Sleep (a wrapper of setTimeout) + +```javascript +function SyncFunction(){ + var ret; + setTimeout(function(){ + ret = "hello"; + },3000); + while(ret === undefined) { + require('deasync').sleep(100); + } + // returns hello with sleep; undefined without + return ret; +} +``` + +## Installation +Except on a few [ platforms + Node version combinations](https://github.com/abbr/deasync-bin) where binary distribution is included, DeAsync uses node-gyp to compile C++ source code so you may need the compilers listed in [node-gyp](https://github.com/TooTallNate/node-gyp). You may also need to [update npm's bundled node-gyp](https://github.com/TooTallNate/node-gyp/wiki/Updating-npm's-bundled-node-gyp). + +To install, run + +```npm install deasync``` + + +## Recommendation +Unlike other (a)sync js packages that mostly have only syntactic impact, DeAsync also changes code execution sequence. As such, it is intended to solve niche cases like the above one. If all you are facing is syntactic problem such as callback hell, using a less drastic package implemented in pure js is recommended. + +## Support +Pull requests and issue reporting are welcome. For issues to be considered by maintainer + 1. they must be reproducible + 2. there must be evidence the issue is related to DeAsync + +To that end, the issue should contain platform information, error message relevant to DeAsync, and preferably code snippet. If code snippet is supplied, it must be self-contained, i.e. independent from your runtime environment or other modules not explicitly specified via `require` in the code snippet. + +## License + +The MIT License (MIT) + +Copyright (c) 2015 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/task/node_modules/deasync/app.code-workspace b/task/node_modules/deasync/app.code-workspace new file mode 100644 index 0000000..4302896 --- /dev/null +++ b/task/node_modules/deasync/app.code-workspace @@ -0,0 +1,10 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": { + "cSpell.words": ["ldflags", "libstdc", "loongarch"] + } +} diff --git a/task/node_modules/deasync/bin/.gitattributes b/task/node_modules/deasync/bin/.gitattributes new file mode 100644 index 0000000..31b8cf2 --- /dev/null +++ b/task/node_modules/deasync/bin/.gitattributes @@ -0,0 +1,2 @@ +* text eol=lf +*.node binary \ No newline at end of file diff --git a/task/node_modules/deasync/bin/darwin-x64-node-0.10/deasync.node b/task/node_modules/deasync/bin/darwin-x64-node-0.10/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..497fd083766d7d7067d10be7a594208a172f6e97 GIT binary patch literal 10344 zcmeHNU2Ggz6}}t)B&4Zhq#~uzG#hF|XxiOuoETf>r`velHE}m9uM@07dOJHawl|%f zU3O;e81Z8%Ey`AMF;X9p$U|SM7SXr9l!vyo2~8`+PpLow0R^NAThNyxC_<3sJ9o~F zXD4w~DkNU!O6Q*Q-Fxo2=bkw;x^riK`p>s7ZxtfZC4|@p+5sx|2=T~r0+J9ngZ6C^ zLdxmf%(QCitol2lU<{iAW<)P{OX=IE{SDoyy$dukN+Ot65XQ6{rCTg-0P@H4n`Q4x zQ`FuoHwInWWx{M)b!=mM8~%|!Id404y8(@;y<7SMdrt>U5Wc>Drsp>*?i}k!?OkAd zw{pM63_ES3QOc&fSaB^`ac64^cV3S_vOS9pXsqo;xs>+2oNX9YJLrk}m){w*KgR83}ab%t$GZtnuECWT0W|Nb^y zUtFXcAQwSYD0hj-pS>WyKK1ZxH&1r2Z28VqIn*@ujifhU3We7;&R{8SC8#J zHh?zeYR`5&n6|6u(g^DY_Z^|FBHi>FX{S;q@_ftOzdtpcLJC#N=tiN(O2@da@1iBq zF|M@a`F1sR&vnO%NARfV95-j0(o1E+!^Fp6o%}wV44$W-U`%n0OB{hX0&xW52*eSH zBk;eAK(;iwvU}*S?RK`*9^8-J$j&{YJ$O5W)%4Fn(XtKu9$DVG10o5Z@v3M z8)fYTIwx8e^Q|{Cf6x4U?Ji~E;@X|yusBJYFK1qZ#ci;dl_%Htpl7u`IEGD8dvILU zc~yT-)sw0&sJf`?DOFFa`h==yRDHjyzo_a5P-DWC-EU)w>*p@F+mP2uUJc~8NPakw z|3LETK>jVsP9Xn^mUEX&4 z4%QRdzW#4)IdY?Z|0KOJ(4SbZ5Y-z$)ALyOH@isB0Zp-<8P&V@O!s4OnDib8t*{<; z(LssKEBb#R+h50CmAQV;-PaeWA7Xwt^GW72%q`}1=3ilcmign%pJ4tB^XHh;`$V|t z_u${r#vSFCtQVlTjw299AdWyBfj9zj1mXz95r`uYM<9+s9Dz6jaRlB^1n658jthEs zF;6n5@0ZkmfH|Lt^xn;wzA;jNk@*bs2bs?^r_(UfJI(wF@NVF5gX4Ilca`yln{Vp9 z!`!Y;Wh}JmG7KS%v%s@m3GtinjFw1;j$cx!^m)NK;DHc+5%^({E~GyI(&sRQ3#h`F z>}}_dnXi+62>%)QTJ}t|Q_=RqnCw;A-d@OLPh-+2fAskbVe%)8Y5XFO|14x0ukks^ z*Yc+TJ5}mWe8j{q(euU?1>TuhzT*FR!XFTVzLQgVgD@7azkB~07{f0Iz34+Sh4H=!&PMR52>ww7_jh;N zOGWTK5nPI3BZBJ@{Iv+)i-mj?bQ@>@Gzg+^#vcdKJxAY*ZwKuMQBKmqFMVTwzvGf3 zecZDfUV64+TZ^`nvgOgZ0T`QkT z`9@>T_OI9vAJf+GkHYL`sG%{JzmRonHwT-4JPt?Oh0;NZrDWvc z6Nb~Yu@v|V81nZ$I85Q9$;nMV(&kGhl!pyLKg*~;p=2392jO=k{RdO+m2+YQ%nbVjM` z869*alUulE$5^;ycpRbhD>Zl8uGSsHw=ERlf?#N((sqEK7K_jH+_4gT8&(l$tUx~q=6mOWc>ZHv~0+X2XEIzD9*@<`tw72LWT$iuzf0a=y4!3gmmp*v?x literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/darwin-x64-node-0.11/deasync.node b/task/node_modules/deasync/bin/darwin-x64-node-0.11/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..1901902c631e81a9d2811ac2b077986ac8ccf23d GIT binary patch literal 10808 zcmeHNeQX>@6`xCN$K=z21k%!vb8DBjZtlEx>^MkOeX%dOYh1_VoHT0cPS(dT2&P)WuvyJNEJv>a{S)x zjJ>z9T@d`ojr``l-^_b&-oBk#@6FCH{{HTjO^gLLGRA5_TS4cm89Or-fW+7}pj$UE z#(97AWWQ)CujDd=jWUoBYY^Qj~Z@|KfXOX+;&GA z5~ew_R-t*agamWm9qEsFwAB1qgVQ`Azcg2Xi*r-w`N`42 zjLEZh?yC6eq@#0kNWxx!6yHZz!h!v0hHgUI=0gQ5d6mEO(jToQDuliMKH@en*SKEY z)|cT`{+^TmI;9F>ufG*bSK>UG86C}7s@;D-9O-XDDS&(ZdDjT3(0z@8IPZz~9*K6x z)iWT7Mk>-D3kt+KHoKhi=JiEuWe;dJ$XEyX#RkSkaMNko_kpO~EU60oQ=pxowMr-K z@wZZfjC~yFlOP)B+Ul3@PT#%%FVBDN=k?R?eebWND?+VCfVG>&bB^L5U3VQ5+QhZl~Tz-B?FZVR5DP>0A(PO=$W~`>HShEk|;IajQ^rLZe*p# zn;;yI75^ByH*zAR)K;8>n)7Ga$7c@L z#m>AM+Yz0Mon`Uj;XN4Kc?CVO>G{r6k^3VLMEJlQ1v_xL8nzU z9v8GrKP;g*Kc?2=obw~McQ@J)taeHJX;hna9uvI_&IGu)%-3VZ7oE=oIZwL=Z{gJk z2B#tq3|xK!O*9~~@I^EaTs|!u5`D4aKb(8X;>@e|w%FNLm^k#}^7aO87NOUk8kj3J zzKGX|Qsca+UlR4pqW+nv7e)Pws4t58lBjfefbNz}g=^=qPjUDR)g`VXRh6E*Jg zaj?r#$uGEa8_CbRvPSZG zSKdqVmtFZblAmzpMv@-br#NL_S)T~70R7do4S}6os>nUcE|;;uXOFSKL|ve6>!#Xs=(_{$6vcNwpb1ziU66V# zvc2xH4PD!6j!f4)S^ZQMO(7}`pdL^Yu8)d*J;q{{`lN(Hdi3*no78)l8mTC~uIZ|$ z;FI*80iBR~%kRiak8Ds#Zyt1))T8%CQIy`nX*a^USzh`aUWp}FzjJ401{Wn?lKf4{ z-;?|U$!q2B&s~xSCBH-R4#~SE@00v~$wwr&C7+UfyYw%ix(aqqHatr&mN; zO{c{4O_1#RBtI$ngOZO(o|Sw;@+rw_w~g%2N&Z#I&x2!|rRE}d75FST;TOOOFMeWI z&4s|`ht<9Z?f#@ds?TKK!T;f7^%O_2Dh} z#_o-;-iKR!xYLJ^`tX1c(|3A$R?z*u9n=J(HMbWO0);`%APv+4Y6a~BwSn3}`$3JM z|COI03m?xLxqNsiXQajrOYJ0w<;JqwPNtpZH8ckcX)_f*W|-K6Ho}>~heEcV8#e4^ zSKbZk3{FPe*LtjA9Xrz7GS<=3d~zNJ(oJ(vPo9qByiU9~!P`#gX2FO?qpNIj z`vM7BnUt}2crqJq4ry9QYs1Lde0Z!QoVJo?A!R@ejgTKwqys4h)5wP{-6BE{Lh8}9 zB=*yjBU~TXC;JW*#&|kq8az*(`{FpiLgBW@bPKH%U;EL)hm52x16<89Pmg9zW7M#0 zoi31TEjR~bis5p`a2jVGa$IfJW03Y<-Rd>Q<225JzFc}VZKubOfZjwiZ|lhv+R#5qO>g2ZVrK8OQQI8vofX}M>G#5o*pW-_M>*$=z&RpL}*{ik>F z!_)X*<$!J$omRS!(x++eeM%%VSwm~-${D(CxJ}VM+`Epnh2&ehxj&xInCPQcZTXh2 z>ZVH*rpp$qDs^kovDG_TJRR+7&i5ObAsAlM4jZ;=Tu-qT6Qn$hzC&YJNeTXMEF{b% zzC3gGiK!IfG?fn|(!-W+7jm@R(klLz=4d{tXZ1l-rcPwDT{I$LWqDMKVSU@RQYfuk z6Nc@L5s@uF1TfQ;@AiZ^C#Y%2#i3kg^te6L;mgU9BrO_^vgIoGPiBpkD^vGSYew3; v3b`DXC}rKVh`E~ijN?g=GKTbmY15*?l2MNaI@Gp;@_6W#L8(d~=}`U!wh1qW literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/darwin-x64-node-0.12/deasync.node b/task/node_modules/deasync/bin/darwin-x64-node-0.12/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..32ae998db922c7205f3e75e33f2a60d17b38f8ed GIT binary patch literal 10848 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�nEV-T9#q zf#V?g6-@Xv{`H6y2qyaV1RxMh^mJEsLU+YQ4Dz@EFi5e@$NuaC+(g?vt?c zpIarY{NbAtR{rg1JoiMe{M9rGEB`Y`!pfhtN?7@an|^gALv+;G}+DvB4kP;2hXCgh}F` zV1r9+@C7#5Z-bZF;P2Ytdu;Gl8~maTrYr7N`Es(;;Yl{Q#0Gn9aH9=gX@hUI!4KHr zUK`wRgS8Rq@{PB_`2vPjiBMo`FS51Y3A7D}KSjI?@n?v4Bi@7f3&f3xzeKzr@jnqa zAwGckAmXnOe}niC;=_oW5g$R^g7_%nZxJ6u+=@saDfA#df%qiiHpHh8e}}jou@`X% z;?s!FAU=!u9OCa0pGVw@xC`+GM1(TLj&(?GM?~oOHIn~pW65XOd-(i23qU^7CdI#D z;~rhA4fjEQ#9La`K7*xd$PEFGleT|AHA8RATUxE%{Jnj6PG;*SeLEZ&)_rW-MmV*8 z{w;9A{$JYs{%2WPw!H-_+lDtPp%!f0sjY5Qe4c}}OthiS&j!I9>c|YJ{J4yAI`TkH z=U|lK=xgZRciCdyc9&JD{dQSl+h~`yVh<6(AjfH+W5eBwlD35@8?0OG=~ZfPJ*_sm zsh(Dw+~Z|w)z)qF^ainio>phsI2ZMqJLan1wpA{w)Az_lopp0u)EseFJcXjR!&5c( zeehI^Z38^jkkpFY`A)T@w!BkynS0%$ZO~0_(PZD<7PUv(*0x{_Vhm{;*#cEspWM1u zd)65Tw}lIEfE6i(1ve}Ugw!WWh4pRC!G=Ql-IDrRi9TF9BL4gUzQBqE3R~(gpBD9n zF=a`H*6*KM=;5oLWBJ_ajAczeIvN~;I~^0!ALGJ_K%|g>(|rvMEuqu#xl|$ToS)tt z3QlWch2G}+urIu#urkmd2-0y)VMWW*r8rCR;*_GUr6m~Qf5WLcVFNXYFjXO`VK`++HO7|C^G)x$ofyD|ci@+^q8X4~cB{(Sd)Xbs3#HP$= zh*to4xgbN{5`0XUexblF!}M8nEJwZI5<;qRh<^C-Zc3UnYx#W7T!60yFXGo5tm6?X zD?YQ1PF~9+7x>zJwf=B(Yt*AYR+Pi%Dv@9EmDC2J^kHA=EO{u3W9)Xo$?Fq!7AccR zG|s<&%>oxKij1_As5%1!7i*-Ln19_34rtMKYsBj=Dvw5e{w98Dq#ClO4%I&AJ(3aw z>hieV{CF)A^+nqvY2&R)KY6REGd$G`g0&S!O?$0wc#Kj5hpX)^R|Gt$Lk<3?Y$Bx_ zx~igXxK!aS?TbnJ58Zh2EC{xHFgn`^tk#gy7Tv0;C{8#0p>ER5uBfp5?apAp&FnQL z88v5Q)Rbn_%*?297iCrzXI5o)=g#cUJw21~%*?7xA&QG=Le*~r@rZh?RT*9=t#t^$ zAaQKJ4d@-%;_d{}-@9!@(hYs7iMM8SBk?Vx@y?LzCpX{0mR@j5Taqoy-x1cJ&%a6# nf6L&9eZ6II`gi;KVaNOVuNn?J-t^_+pLD#L9x>&rupjq7cV*%T literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/darwin-x64-node-12/deasync.node b/task/node_modules/deasync/bin/darwin-x64-node-12/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..ba7eae005036837284b3ea85ff22c98d119ca8da GIT binary patch literal 23460 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 P`pH}emhmin)9e2L+c?*8 literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/darwin-x64-node-15/deasync.node b/task/node_modules/deasync/bin/darwin-x64-node-15/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..be453e4b7164d5974b61a4699971f81a46ff53b2 GIT binary patch literal 27660 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� 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 xr(Zviyzsj~Ev2Y6yV@wJP3hHXD*Q?8f~QKp(mi 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 literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/darwin-x64-node-17/deasync.node b/task/node_modules/deasync/bin/darwin-x64-node-17/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..bbd10c35586b6ce75036ba77df5a395aad89d721 GIT binary patch literal 43552 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

NB-rC&rE$wX6mUODfB>LTxHUUe+o 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

*WWl>rgjU@2oJzhFD+#YVF2c4yL(P%3k zsJAHMx#6Z@vNbVzWhkL)N|W(eDPH`bfwe?Jt;xo4X=u`<(so~|*gTJ9c=QT@)MUJr zkaL2KjnT+C_}ow_U6kjvL|P{|vwv;(BlwonVXXh*{(l(w4J9m=zw5t~Bi~z&VD)^S zdZAj|PBYipp)5NYy;zccdr7>Vbl4qA*omCsS4RH`x1+!N#V1Ujvnd|=i(<~E$ZzY! y#_jtjH$~g)Ygmd$cD``fGmBc=VZva0uR1L`tf0?1Q5n#Tq!+uUZHuQfGWI`81f>fA literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/darwin-x64-node-18/deasync.node b/task/node_modules/deasync/bin/darwin-x64-node-18/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..3d1244caa4d11c1996f3fd7d23f1110e8278add5 GIT binary patch literal 43576 zcmeHQ3wTu3wcckYflGK5F)nGgof)DQy!rBytcOeQ26CUG7CeAFoc z%Q!~yS}84UjY!q@s*TnvdVNG`33|1n_IhcxLTjrB)Aoz#1*}T$zxHG1%t?Z@z2EJ< z-*@(x{aAZF_TFpnv-Zh8=d5}4uYW!`k}=KA81o>GMof-iY)w)_iLv7lx4RfKjD`Ni z3wc#;Ql1Mk3Fo7lBFUs+81e9mxF`!aS6Pt?aURrda! zGfkj8Vi=5IS>yP2MO;QNKP)jxp>fh2($Ox|ph1=pr zJXmj+w{wPIy;2GxI7ePqGA|iMC>D=4N0!QZyS%CA3B;cyUcnL^BpdQtBeCp+*yVZ8 z7o4?HfP$4gdu|ws$nxe$gV7vmYz5LTFD~Vcmii<3(Blm^8I954vao2$E-!h3s87QarDV5__%l%R|}`?|}Wk1i>1gQO?eD$gbk{b>lsgV|d9{FcoU zI9-wud?*TV=o}z@@)t>nz2zR*C0~3Sw^b61JQ>#Tqs+QF${q` z0d>^Q=HBYly3f5R_8srZYu|5w;Lnp#S4i|DkHkPm^L>E&PqfrG=I(|$)>v^O7A0R;3Q;so$Vy6VbB@W69R% z=q(cS4G0RPwt);o>NO{zdwP1>(qkzbUxTbFwcp$ZB0;`clBasBQU^_w^p&1AQ&68O zsW*V8V3eNPN~~)D^qnMu6#(?qF7rg5_nHR|4h#U5>F3oF{~2Dqq2BBSzTo85e0f>* zGg(i4s;4kNsl*P<-MwQ$-Z^jQQ}n)(SqUM~RYesIsdL(9-o`H9>%JGwCcHd_`Nc>V z?H2Pp59N2NQhUwcVwN$lJD{M+ISP6deIW&OK!z(%%@!ScNjW0n)gS-zkG~zb` zq?i5XI>3D+1l;kdmNAM3A=9MTD!3at4`_Bgk8rRWy_09`F zhf0H1Pr*E?w}W!(M*% ziY5OD5SAP;tte0(q`dC5DBy~Gz`V2w8AXofdg5kYm zxcFC*k$68b6bXh?6hkRpBJ|cK7UbiC{%%P>9yA4``dob&62A-&V&!Kp!w>mou*PW_7rmx2FqO4d0~(YRDu5hC^3T>$~99!l)P~li;q(>ZkH|e zLk3+muTUR5=WPcUERvpj!K{=NN60>;%g1#b7+LU5n)D}MMpAI^^RX3J8!+$lU^Dmo z_L(Peo&;*iiek;l%VJyQM2sW94x59xzT5?u_Y{n+^n#!SqR{<)@e`{$uP?0X40$2z zDKv_HePTWVdx8~gh}{6|=}KXBbKAX%Q^nWfLZ3*suXEZaWM(%>?z}KxR2@N8-xpPT z>6-1FRzOv^h^keBYAsbQM->cF=Y=l`x>KpLUeG-us?MaUOHqY2U9m53lClE9&3Wi*pcjc)kzeKHz2>w}$Xdw#OHb|9d$$cB=)KQVX8s0bjTtef$N8pe%nNy_}o%NrANCfq~pXU0p4Zm(yY< zc(Z`9xaIAD8x=5exi1oA+d?GR$lOIZBp#t++Hpc7ISeR^-3W1pL*&e+@3y%b;8W~yrrM( zsfksoCXb#TW0DyZMv07B?+bJd1yVg`2$W=3ze`tN`bOOJEb4)JV7ac4m?W+B&hh(* zpwlnR;d{8{`7*~R8uVU2kzh&tdvFW1mS1N6b*S!=)!R}1K(D`>gT4MOJnx*BlqQYL ztN96Tf1s`juwt;2{a8ec$+9gGwyi4lzIiPu#DuRzi53)1hK8ftUAt+vNS;e)A^I)N7XFN-|df@V(Xd6b5UypiCp3APM$< zr0)0R{u)TV8A$D?mD)QJW(!TzMRqy%n7I@6-nsOqI41ehrmD`RUOta=>rn0Gq@9~&1v|2w_6mzI}aP;tO~p0`q2hyQ9O z<2u5GfmKgE56kJtBJv6ulQO%QnBi}Oi(e_&FmX}-X8*uI-*EzULoVt$pfLM|v<0Qd ze}daEQa~$+GIuCf@-FN$k+Ff(=w5i>G!IXYr6VGjQ6`JRQf=2|S(1)8l!1 zB2Q1^sh6jx@^lhUPv_}mo}R_ib9h?B(-NN2{qewQQ+Ya_r)4}nkEa*#^dg>?^K=$Z zXY+IpPj#Mtg{M_Kt>$SBPZ#iXAx|&k>0+LKji>ZqK@;s@dya?po9L^fJ%v=-hGfqO zD)m$8Ga#A@anbDAOQo}@L`rO$OQmz(exUXU^!URM^r)|5vn@BbdQIzirRtGUPQjG zDT2y9?_p&(Jx8UtsYHs~^E#EzrqXsQ&7#t?R0>h)F)H0ir5{u2E-H0V=}{`JrxG={ z=T<8Hf!be%5?08@y{B+ zMHP>@aEH9r<$2e|{+(C+&NY*<@4EBvcWZaMEo1R%r?Y#}v3p&GSRFrgg&14!J_f}f zxi3RM-T8OsX{+<_Kd(|D8yL{eVpt{@`R{bG4h`!2q2@`tpt;i-dqeYlq_MZO3BY}* z@h{&7HqO@qYzkvjPQ1s(zLx(Tmu5h5*L!Xy_A?m!vE~`j*rVD6ptoxn$XlA{bB(>L zP54w}pJ>=#9(3hD>Czst%)tN@3`D7CK0E(R^m71OUW;L@b&dLw3!0$1jXupgc67b_ z%n?=Y;yH{ZJU46XModgf%U`eM-=-!;ObheCTtm(YjLvYL)jXeQY#a6F*P3U)#(t-r zjagh4j>UpY!^|Izwnoo8uR6S(MS^Y3#?o*cU!TR|Mwk%dOTY{wh;IW!E#Y8PlJGAh zn_DA7inlr9jRfP(?O|^y*wRuT3|%8+Hpk>glpr{(7@vXCSCK{{ z-dL7X&-Xu1>#q)n;tP}vg_xPC2~^h_(*>2^?`O5~nc`DW8Zci(n0x+xYzcB&RAgsp3Ql3J z`9aM+pQ<&c%^y1|Z~o+R#^`(4$52^?crGqT3ItOYRhrH(;d`gRpfE9xdc?mkugglAM>}llv$X_NH>uNW0FFH03RvwlT-*}D1 zw`gLabmNoA9`tcHI=REeT>UQQu5sflF%Z_}v%KU;=IR;=oQG-NBVhoKWcfQrF_#xB zuV*yNdu?$(#^`d5V(5r&XQdY>%mRR8VmQr{_P z*VR<l$&^--DMAoH7LE~ti2*GanX%6zlTAC~zRnd`E>1v0-<=8ZCM zllgTrUoG?7WWGV>n`Hi=%paF|kIY|^`LAUDj?7J&@0IyyG9MxPS19x2Wj;yfMKUjw z`7D{gEb}Uvm%wfh709krAiGXM`Ay(P5%663oxOsKB)q+XlZ$VBQEar)S-Grf0)-pD>+%Uej@Um)O34SSl#fo5kbGy$s17$dPi5c;g zZDH=;#n0wnyWL$^_}IE3=%;`;);yRcxm)-sfS;Km*?fl4zHBHyFDGvZ*0i&v3IAn0 zXmzaXK(4@s7EstLBf({Z>y{6yGnTGc0Y@{@SZgHM(i~rDw3o2thOGRf%khKP4RAY? zs5k2IgZJSmTL)#+@P)6K84clhu(>7Xn^Gw~+04c-lm}|&z$MJI%YrS5uz$fNC};73 zNMoztUpvL{&$v7qY(wMz8ea)_aubfU8%E6(0VvNnT=Rwj)fWo=1w_k3_@zlE^KwX( zBb(#_I1uDPPJt9LtOuLqcDEFiiF_q< z!|}>Q6i$ZX{&u3#1}fdbn64}auAs8@4`k~bqhXu4?kqCi6m4Bjg0^Uw4Bk6& zEEZ~Q<1^c1qqO67yE~{_ltsbzWxFOH;d?B@EwNIo(>9 z!E$9PO%mgV45|^PutoR>BScpQLB7L=brA;22XZJw^}@Rt5ZyTlyZbQ^Y{?3RF6w6v05?Fgt zEczIh3bkNnkeG?cA=YVsE}?yy9>}0$(6pRaKK`UzO?u|)SnGz7!>Vct^X0gXC=%@k zc}kN*5#|*w46|G~1TOUetWp%lT#29BGc{Zfd?M93hluz|G+Q_V)RP zwvg@A+^nmHxmnKw=FaPGgiEqo_Ir5hdl^2>M2FaCTFy?>3r}Zi^V;GXV$XfXHS8w# zg3F!P)sB`PrlgmW_uA2>Z0S8$PD>BNpW3jZHo1pr`hiT(9&_jAZST-nUfxcg_VYBk zTKVnSUEQq}cDedBZ(UutyDQJz?b_jL>v5HMyEsV&9H^b7B{Tko$gwuTh43>+;ab2) zfl~P?x<%rZejl|2hgLVCr9;^k;Pk{1}nEq=bD(2$=laQD_5vRG#pqM=<%zCzyQdQTUdG z$+sSb`y@<0_9$$TF!|b}@REed=N^T(CCq*A0sf1G$p;?=4LlBYrDP{ObC@P4X+4=t-Ymaz=)r_^mMUD|^u``4ybu7wlPn z3rzgVzPuv&6|DG6sDMBj_1_8;zp_Vtl3&3@PyMf<0s>{kZ-t3p*{|bqZIb>KO!UOx zhDd>6;yrEmCVFbW1d)Q`x5C7)?CUWFqW=n3 z{9ewT<+sAbuk7*Dl3&4!zstsNg^6F;?<)&M`wCY4$`2yJ)kqY)5%j0$W$pb#5?1z} zT;UU5+56WdtnB@}5?1#9za*^e{YW?@C4Ob^kCU*n_vc7h+53wntnB>)2`hUamaww- zDWZ=-*x;va@NOHt*9PaqbFx+5nKpQ?4gRVPZUKC{WxpZ)H&7x2UDgGF zmHnh`o?vC4t2vy^tk35O#(t*!67G^Pll$3T2`fK`EIMq0{(^#UT=f%x52-(!3S(G z{h)%zl9~3-w!x(~_&gh2!C~s62=oIE*8WCp@J%-OE*reb25%8?Mqh8);E!$aNL)K; zKSTc|8(eCGzhZ+!Hh8%WzTF1jZ-bw;!LQrkKiJ@r`MLe2A5yXQztjd-+2BSSe4Pzm zZ-XDP!M!$kj}6vve{Jp0I2-I0FjkcalWq7C8~zTE{R`rqh~Gk_ABb9y_-(|Eh~Gn` z9|t18wRaMK8W}b;=_nPLF`6+1o2VCpCUen z_%p=E5uZTZg7_rjQ;7eD_%z}(h|eNEhuDLNP>z^fi{utWgyd!<&m;an91HU@{QrIU z|6POlQ2(g^6ArJ@TX`>2DU3J@(Dk4LUlVlm_# z<_c1|`sDGgI=3D4&=QwH^(B@cx0t%TDM$~hXbran@rxStw9&|1%5>RO;Q_EZn>OSR zWbn&M9A63xI@`yE$cLe_u0+;}1_vEnmf~TUzvhwJavHD6J)5stX!xrawbWJ`HSM*!;Wx?* zJbr0!y(a8O9cu8GotW(NZ+e)mo`DCjhy8s${hOYN`xmve`!PD(2&_|+)fPQ>ubh&* zz=nI)KDV+`KBP3_^qjDS*=wc@swo{*Gi^}K^g%T<2Gx`es__kO-sc-kHMmQ@!F}=# z?t*UyO(!;Pi+%7@Rn-hbSTI(+2+x3H#dstX2}g^Uw??l~zn+uH>l4i_4aM@Ob<_{) z&~NJ;Ht&KkelRE&E^e*Ax+oruVkgK5xBgsDtL4HM21gmQ;)=GmmS#LY#)H*Z@!}Ak zyc@pKqA5kbBD`l&T-h3l6LVW=HhouM33&=;Ju3~ENwi@nsg@zco}!hZw*grdp- literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/darwin-x64-node-19/deasync.node b/task/node_modules/deasync/bin/darwin-x64-node-19/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..537e730b2c918008257de2ad26603299b481d828 GIT binary patch literal 43224 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 pP+jCb%|J&&t3r`bI2dA) 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 WBabysDCi50KC+sT^kS3rG4|hqWn-%V literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/darwin-x64-node-4/deasync.node b/task/node_modules/deasync/bin/darwin-x64-node-4/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..b815431ded4b40f4f2f53bfa653874ea42eddef5 GIT binary patch literal 11920 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 literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/darwin-x64-node-6/deasync.node b/task/node_modules/deasync/bin/darwin-x64-node-6/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..fac05182abb03975826c3212e6cd2aad66ac651b GIT binary patch literal 13032 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 literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/darwin-x64-node-7/deasync.node b/task/node_modules/deasync/bin/darwin-x64-node-7/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..56806d32500d59e39c12f2fa61e24324c0d836d4 GIT binary patch literal 13088 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 KS1)UQB>W5AG?OF% literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/darwin-x64-node-8/deasync.node b/task/node_modules/deasync/bin/darwin-x64-node-8/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..3bfce12fa76b815a96abf9ea1b331d2b8368e68b GIT binary patch literal 13112 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 xc-zZJ@e$G!Jcj+w<>C%KwFb{t35*+718! literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/darwin-x64-node-9/deasync.node b/task/node_modules/deasync/bin/darwin-x64-node-9/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..b1c5ecf1b2dd9ea02088d6e01e8a5be73f278b44 GIT binary patch literal 13104 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 W)l+WKo7ANW;rT+nt{{o`jQ;=-b`Zn> literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/linux-ia32-node-0.11/deasync.node b/task/node_modules/deasync/bin/linux-ia32-node-0.11/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..561860966cc15c27aefee0a02c308d8304abd1cc GIT binary patch literal 7914 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 B;~@Y5 literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/linux-ia32-node-5/deasync.node b/task/node_modules/deasync/bin/linux-ia32-node-5/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..49bf1067ccfab62c2916c513eeada3d95d396b0f GIT binary patch literal 12551 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 C2jTnx literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/linux-ia32-node-6/deasync.node b/task/node_modules/deasync/bin/linux-ia32-node-6/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..f752062abd4057873b973f683d1cb2c1a0643f88 GIT binary patch literal 12551 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 Cdg2fO literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/linux-ia32-node-7/deasync.node b/task/node_modules/deasync/bin/linux-ia32-node-7/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..18d632c94758fb857f82c9ce8fa6961a859fd00c GIT binary patch literal 12832 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 Z*FWb5`%n+y+HmWe`vmm4&J0@L{{k)zVL1Q* literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/linux-ia32-node-9/deasync.node b/task/node_modules/deasync/bin/linux-ia32-node-9/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..4d22527451c0f0f19ef104ac61e035c7aa06e746 GIT binary patch literal 12832 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 b^~Uwjxxqfv1GqNa`sV)-`dnuQt?z#UyCGx% literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/linux-x64-node-0.10/deasync.node b/task/node_modules/deasync/bin/linux-x64-node-0.10/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..3bc92c988a49dd1fea6c518e8614ea5383d49ef9 GIT binary patch literal 9580 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 literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/linux-x64-node-10/deasync.node b/task/node_modules/deasync/bin/linux-x64-node-10/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..baa2f9db2d97e56d93554f05e7f50acc80e780be GIT binary patch literal 30336 zcmeHwdtg-6wfCNxOo;MGRKWN^M-&Q*A>j>5O$Y-gFo857N)$Rq>TBJULfKatIRcjHeMtpF_pyC6I&)nbIkC{CuXSDab{p)@` zI$3A^_S$Q&z4qSgycbt{eT$q92UDAieVY;InJAEaRnVw*7|UmK*f9J(gN@^|?nKd$ zy^KWyQWTmwKy9Ss*T0mrpdP-X=t?TYwnkD_&k2m6nqn#?>PezmB!ErP48gKAQ2OnY zUA5A4q@1E8OIyiXp(@&c;oF=YLU#+8DXQvy2le8nOPQ}DS+cNHwwKB;9@&7RvOBzQ zqoKov-{NKE?7*g<9{*pf=C&Q(pH?tDFzSTg1@hz zH6`b;B`jmD(fi$Vcb)&^{80`z!Ra7bwJpHTLi`K~6oD?mPYxkRX;_x?J;usFSKxQC z+pN%_9IvMTkh+4rc z=2c_fyKQ34rZdL$FWNBh{QILmz3;&Md*8hL1|#F-bN_Vh12G=<)K0W-JF8{dTeI5Skb8mj> z`zudB@p|YFn1B4;8#i9{+~PTX5B1uS$W_eDLUs<$gs9JPY=mXe0j^FgtudCbbmhG9zH?LP8Jl9=odkc{jmxPi^go!w zZ&MK;?CiNEh5yshFS~Y4$lK`|Oc8&Au-|Tej!R)rZwmkXA_YDc<7;P6UJ5@fOfl{= zQ{bA4a9<*T=B)EH;{T`#gM=O_FQvUf|=|aF%tR04|XD52QSk=QAFOzYa=z z`lTL){~N}O^z=^=g3n0#8uW|sZmD<=^wQP{I|*MiTkyxBpR_H*c%8*Yvc2;BW~6}G zSkM#M2v##+0+PHg?eCWM|5)NdBV!4(b1gWxM<&4Q2B=KAN>j zc@@*1l=@4g{})I-VNmjall0rE68|IgWU*7&oKlZO1bJQh(>i}PN??Sdx)K9V%?E^f37g(S~+hQOF#6<{?3$k{zU5U zvdkay--+xvRx@4-O7c8kzr&eF$``9*zkgkQV}rjrR1pmM{mft6P#a?YY7pixT2bt; z3Iqe|YMVoW;ELkHy2ggUii)*$0a0dO;;(G2AO#h5wO2xLNsGT!YACF$Xl@QPGykQ_ zW-O~{s?EzQXx`9Jc}ZjNia>Do!a#E<*to&lVqZRYaUfJ0Xb#tfyvxe`)4dHXUIc$rQC8X56j(To>soQKY%RIe%Nk&Uzp}2eIpD99_596Lk-;ggt^TG! zu(^@C5!&Ey$xT?5tY=}KZn32-S1+5!dt2Dp5DK)0ti~l3O4};PI~W1(mqhzXqRGuC z7wN6f^ag{CK})LwBtI@IYo38|YMPeoFY^cLo6zN8pb68WF<7xKAS6O_1Fe;TrciBT z1J}d-R~4uWgaQz*#zbkTgzw_I@^bw&f5fPkE-kAls^p6J*h_nK=SfJnI%$Sjj87_) z9+TDx$F0Y_N_b75YspSaD$!dP2F+Yl5vr*3mMpC-o8}jjrkW6cfIJ#+KnPD?7Fh2s z$;;)w2{g1|N%7rvfsh}wKO`z)l~p&2g4$+(+^d*z4OO)b>lj>C7if?ZG#IFWg8`w$ z9}ZQ|Ny3E@Vk!&C#8AXru4t&jL=RL1r44ErlQe}kGzAiUlJh}~VQq60R*5%0hUE?G zYoU^sV?B*{!}@yson9JlC|xQS+cdQli_q1?u+Odvgeq$5n)Bl23*pP6l0{h4GcT^F z3sWoDPn7feUbx;n`;uTq6BcE%e@mtbXUCT?`Bu5TQn;i#+)zo=77Lq#6Bc`8B{?UN%+xzX&UK*7CKN2P#8eFD-T)a}hbbH2 z!iW)me-p+jP*LT-BCx?P0u-yOUE3V0syy$!oaV-yS;W@I_tsTb`kRT%BV1M{K9~4P zA?FWNA&x@%S~!`X%rQTvDXR+bV_^=(2)4Me&_5m37W;}86#A#-Ov{?aBg-~D}QWAxl1c|vg>6z>3jbE zD{w`X#vI3s`!u1+H{uGy$wq*uP2K+o$hRXC1vQs?_>RKW^NAxCyhqA2c|D@!6>okg zSx>IK&N*hm7f4)P*U)7m-D{-l2-?(jnHA5L?GnD4ONu`p4L=8v(lbfJOEvji4OjQX zsW@N5&)4)A8h(kUXQhU#`|wm;qv7hlJmFh3d@%uX>(THv3Iy$4?%^EG&oz8c{MoL_ zFVpZ|4X@PjBN|?;;m0(*O2f0{bvOCBK*O^&Ts>!?;#>`1rOD6HaG!?fYq+`wreZ_G z)pHKQOEi2D0diZZ;q<&iZEG|JYRvJ+caE% zP|>a7V>J1DG`vK^do*0#E1}};8t&EP_i6Y74e!%%dS0ZqN%B4ejjxXH*W{-uVbFdJ zSN8&_*wpYsP5y{n@1%d7hUaSS&eibj5)bEay8sa}v3WFH#CuUTNyEhvK;XF=PO)BX zb2MBZ-+T?Hw$)~6cs$0TutdXUh~`yRYPbxw9ABg12>kJ_M#D$MQO24ye58iAYWOG( zZ_{uU^Qd@>hM%CxcWJnOpLd&vpQOomYxrmlzemH>y+|tV(eRTs`Ry96?#)qguZHXM ze4mD^du=4&r{Sj&Ah-P*{v8E^_G|b!4L3FX3=Kb`;T{b?rr~F4IFs|7=FWHx&(QF* zH9Skhmuh&nhELFNkA|y5FBMPH@Na4Ixf(u6!{=!DWDU>P@N+fX&~SMxl$Vxh_!Lck zrH1Ed_!Urrl4OjP|si0fK zTddo^6167dTAH2fk>PoIV_(Qu>vaE1|ek38SQ zjE>%r+oXfP(Y`xlmnMYW!I?pb3{D8)Z|0f#*dxA%gkt@J*d|;~JcZy`ALrK+PoX!~ z%lS)*r;r=#;e09a6l!DLoL@pbh1ggZ=NAx9ht60V=jRbm%O%#t`Dw&ch>fk`{JF$a zXpNO{emwCMQe*j?Kb3e2rLkPjpGf=&;ys){o_GqKu`JFziKmbmW1RnN3V1p+$Bujj zV8VyQXA$4e`FDsvf%rboA0(baWvrL;2Z*N-8SCNvbHr0XW8IuzLOg}ASQqCP5Ko~i*2ejH#8b$MHF16#@f50JYdC){@f4zBC7d5m zJcXuMKIcy*o?&w3a-(zpb|6ONt<|wc0M$8}XKqF*!}45+CEV#gM#Y`;$*yu^@-avn?Z-x~cdp)r z1wUgl3bEinTs_!N>lyMpg*>&Rye@h&(xX zkm|S1zXtVK_*+K%{P$4|6_K|>Bhdb|2_9ySgA2_XxNY^5?v)U9e6)*dC5%Qj20<2@ z2;;8j`g=pCQZL^*2aQGE8thvgy95d{&unAZVoR}~sNRL<{>FW=>vNLf%@F=m`&|PN9Ke0Iy)(xTHFXf6;U* zSYdRA%`zOaJVw-?0eK^`y5Ia6>cDMF%o(wsg`ZJ3!+oUvTS9WV5e=J0 zbW^`C8t5|*ehPv1-5w*d-xoQE&ZurohBPGmrKz8hqUe~jC-O0!LIf&95E32Z<&jq* zjlP)A2uR0#LMf%-Fk_F9}duNX*zvhhwz?+G1SWWRz^_T3MZ);y8&~QH4 zS5LlAvhR$zeJF1Dgb$6?&g%gW`~`NNZ)fMfb2~pGnOl?WwDDiZ_!Q%rhHl0!i542t zvkyW(d@(GZBR!hWLQ^2ePr(6uBs__QCIE&P;m7vf)B!P{;pbd)?@`$HdvUysZp=1+ zOFY)l{MArD#P2`k{W+WZbKN)f=fSg5^k)WnQq9jqf8K(8_y zgi75w2kF2GH|iC4yz9$cXqppY6jhlGp|(xkEVJVgXrd$0Rn+m$VubZ4e3ADkU_K?) zho$ROXoX{1P4l)7A%^)?PHvWQ;be+i;p2FO>ZEcx zjj221gxYaJ?FYE5GM5NwyntRMXf_}j=lFcV`5Da_eq0bIWkwXiv%S^CNQ-H5b%xO~ zn7Mfg#>UsVsn>{X>MiPApJ8r=0W>oT`JjowdJ36lbe6Z7XUH+w5EbC?Xyj>$t^oWslmA!Dv36em^(K+T`v&%l3)6QECFi8$>mitI6; z=3N}~@#(zsmmuUkFXZ`LgR{xe0r0*^|G+PWiid<>gaLcZ>xGUUq2pnx!+|4e1HbMudpJAhrPH`;4uX(t&PCID z?7bf#Ofe5aI`%X_MczaHe-3YXfN(Az3qWdMAYngD;kN(rJz=|-%J1RF zg@K?_ ziJsHC{3CE*^e)2aP>aB_9c#D8d;z9V`9@xkAHFj;X9^{d;)}raOC=9;oMXP|6}dhf zG>mBRK3`{X8zvh35tPO;}_PmY`*v-?y0ud5fWCnAqDf=TKJM zjT3$Ia%o9BZv;5X%|D}MnwSVWxEHn_YOz+x88U>&<8Rxe)Bp?phdO3IBDz`LW&TVw zc(0gsZ-9dge8<<+1DqZ6$|-#8-v*%p%t5o_`0dSmlMgoaH}ARFapXU`U=X&OGn4H5 z%V8>g&AbDsXe|u&i8;PlG}a^<+aMd;2~=Mow2gc_u@^6@_6?j6ymRD^X?x4q3%zOi;MEOMb`=O`-S*+Db65{ zYIGH|2LiDHOl!$g{n)cK&EFe1Ja8Z}#|K_b><^jm?T1^9c0SoZ!%*XHfe~$?Q}xWv z<(M44&Ol#LbW;XRnmzD1P2Vs0r1AFgbr8V?HVJz;xG|dqZ=)(y z?lE@?wR^;Ta8bR){C)w2m=9l$p?3g#kaL*hD zp{YM3u1u82S4vcfKOn>(mEvxQ!(?jhDQfL`_zw(e;`Pz@8@UKy9sf=uJrJqx8aPac z1r+}X7>Qp2G2CJKvwl7%@2~KybPrulW3u*}1*n1hD_)E;zkbCXI)0kfXZ|)OCf{vh z=Hfv@xX*N&N?hDzF|PrDndQOEQnyx~MMVhrOUK>8*)jV@bJzTd2rNAX?Fvtda(VpR zZ8izQ13>2d}Ox+#(eI>O`(^2N5Ww`GxbIqR0!x?S>4U2t*DJ+)87X#v6Fe+)5Pj zkdL11%62XbCme{?!&d|3JbpiF=;JQNUvTu)Hh3B;LbWXcPo;d}KJh}R_3db0W8OTx zPc39@UzFx=D9V?7|6ksamW^=2=-t@*Kyx!*cxO2|Q=5a8Q`PHpm6hsEI+`BXc*FD_ zYsy!vg`E2P4KF$}`PTH%w;YpSN=|yY&~cjUf?hOmGJcP|F*x{FP#?zR&NO^$jPas# z$vV)}U5s6bWwrv;N6`%Bw}Pgj{1MP8pnnD33i<`;1E3e;0P$DQt3cCm)%OhO6wo@H z5UcrGQC+H(MWqO8q(8E-Yi;B%??^ax*J_5S+7;xfod-Qa){|xRahd@We zX4)KAmNG|cmgBS$!!o+i?m56t$8Y~ZT)d+m8hRkFIS;6iTRk#e3Q+l0{4(G_Twy2l zXypVut}O9!ONZU^$_XBJnr<)IY)JiS=fP-$Y*{=q-6xGeIm!6&%ZJ=d(6nKY<2Dz< zmUh<_Qk3LE_^pH-J=acq15VZC!kXNzC~tz?0+M??S*}%++l}&Vkoz&o-I6TlTuS~j zhEuzT@yo(IAiZhpEplZExzQM>Es%SL|mXNQ&LGO~G$7^iVl{TbDKfM)_l5r)z7P(e8GgcQ>2z;RMnKrlkH|egM+-_+2-0l8Fy6cDOBm+ay6~3VlYp1|ZiznQk#Fk3v_x0)Qdak(J?S9qG9^(5ixiLx5(oFLAj8pL?=T+{XI@yin?t2~X zPAA*xa07jbfDaw+`(|v|xs(U`00nES;zN#AGLD_uA^eX>- zPR9X<^G=uRMyLBLrwcWKJmz%&*u{2{mN%Rjf7hoRzJq!~u099#|GE9s1ON2EKRxhI z5B%Tqfckz$eJ>OLK1OxZ=TUqAFp4vz_~ztS8F3b0`uzX7;W*1T`WA{d#ouJ%>02zl zoW8x%dHU9hHhN){wtmTv5NtfZ!AQl=7dxj&UVUFhFKE)nUtj^{*NC9%dn!6VrA-ar z(XR#@i9aF@$EgF~vSmZ+dSoTe)o43j5SA@>_(cRTaVDw0iUUyM;gV`z@Nw1UiCQ0v>^dU)~ zl=MYO-^<4ck~rCrUa?(nXS9ENQi*Es|a*=}nT}E$Ks&J}K#olD;kJCz7U5 zknKx4QPNqGE|TGjitS%=Apl&6}A!Yua?rq|!i@$EXMi{QT*2Cx4S}7owrc z$EeG?aI{eICK-1z6=#z1G^XNFGVW$-T_@vM-6|ky1uiy>skoxS_>wmx9)FVYp?PJf z+=VFECD%u?Jo3$0#!1Kz&9@}*k$CS}*C6&?I0~q|lzOR)WwLGhM;Wrvg=l|kp)RTP zoDl!+RxfoSV~#o=B;zNsV@o|c#P?lv*V5*E!o|kK^K|N!T*xw|zIRN<5rpM&AsNqR z{onEE5Z`y%@7-9(}7kNA2ekGTBMd3BsqjF&Y())lS0qF6!`Ng@V9}B7J0MrKSxvGbgz{@ zI|>Hl^L zyd1cS;d(Q;lgr1&n$Pd&61V2Ddki?`5wzyddtJ&~^Wl9gacf@2GjV~#=fgZ<4Lz%% ztr)mnzt*L|e*oNWd~XBJ^B2l_t4@PDD-byDfILS`y zJQ)Yvu3xz+@WsIG+NCc}?eItnJ-4Tj|25_j`9EKd`yAQpUqjx`Z)OTTbb(KKC9U}& z-5gJHC1*|sPX4jxWy}X|*RNG6^!z~TvF5+L8MvMO`=oq6p1sg^t03%U;CAgElk(QQ zlB010!)_cW0JqBlvD-c1;TT))e}GnnM236!=TP`MjbpXtD8Un?c#i#Op3RyQh{@jK$NBA)h2qXhjuf`$cXt zRv8R6hr-p>ImqkgUs71=_Z5|`KnlP_?oxlKo-%zlQ1VfKRil4hUE^A0aI8Xl%VvK? zxRq5l);Cci%c`7N(`U}K7vfn_{T0Dr#RlZo3I#W?>L9Y%`K!Y9^_0?2<9Oz^BvHSA zQE5T37j9TcX;!(JVt?T!ImnWiGc*ICDzHsP>c>3^zt@mjjfJJmzu32YL4nV|e9@vZ z?+X8lf(1S=wS>H_@m8yv8)c$C=3n^TWd+4Wh47?&`AE-$sdCu;kCVySrHe~?Yl$a^ z8=C%ArDL@uY~=GxPr{g-PS29O);8BH658eG^OR>Yx0!8+WlB)WCp$#CtT~ZM(58?l zPPI#vX^|C4b(7QjC1q5!$)&2YQl?Ci7k?4W`u-d*5ZP@lDIHZpT$S)HuEHjb;@71B zwwpIv7GGh2H7BXP^C?rWW^ko^J5Xl8lzA&fR#fR!nZAx!;yE)@i?gN0Zcx_W1!a8K>l*No^-3t4?y4ZDw`u{CJ|{f*tyLD)jr&YEkk3GWo zT6*9lFR5i@wL~PPUpC|K&e{w`Uz7h?<$WERu-;;gB{MB|Msgl=Wbw8-GafdQgEW%w zCZzyJHJMsA?&Fm2#iKiANdKLjdD+@7rK4AAn1_^U38|BFv-7iV#&VFNJ5;e2G!zuH zM(s5;h5|Y38p1hi!?kr)=hs#-&ec>j*RY(b4GpL%XecO3TJUcGP~vbdCK*4Ow4s|I-OMl-!@?@N>PKU?b1Un-i#!7Y8*}sH-?AMQUG>gWL~8@y{x79pbt{ z=urEYSE3>*qn4qUTUk+GTL~qNXb*pKxDld3WC3P5xTdMcbqc>;{NMhe_b70y3(ri% zrk-OedXB^u!EM!~jV@d99X`E<%s2JCQ_(7U-w(H?`G(t1NgLh2!KHn?ef3;a(O%rY zp^e%lRjR(a-Yj|EKd{tS&m$G}%J*4h^&$6k zHe2eefA2?8Iek?1A@<)O>ns1O=hTX>uuK?bw^DecrM`M@r|51aC@GD#zIB74CRF?C zxwoQemI`Y8l#c(j)K|~P6|GZ>Wd(~m_6Tr#7fTJ3dcUfFsiuWDb>eGtpk>Z|AN zM`V2^C$uHzpTb{20rg+Cub#^v`-b{T-%FPIOx_pfALF2`#xi~$RZ-HnL22%*_SO4D zHN`?e{X3k>Z^~}vm-iv2+ppdSXk9Mq)B4gkRbSDMQK;9Czc)}KYVEh!uj(oKrKP@l zZr}eMQGcZ%@xPwSQJaks1wA z#v#8(tJZhZ)>2z9CADg)uf`%m#a~U;Dq3r!t#Za-!8eMU`(67nv*+ZD_TFFrx%cDI z$vW%1*Is+=wb$NfpEG9`S9-jQ(;N<_4ktUG5!XLSAce9Zze%2e6tcN&1pc1JPUW($ zMA5LbUXOqjWz5Y1Y9oWryqpDfixWv#^Fqd|Bvtj&AVtvDQX#&z)Xh&6Wh6j{q?v+a z>7ex4C%bB;6Q!J@Buhv68=)FH-*P@@hta16%oJ7izJ+>m)1}N8k!)GGLbjL6FT4{Z zD;tvC;p`Z|PJEV>RkC?gA6>A&VBos<2X|h1?V8Z)QLzKLRE>tU5Fe^ezIiHrrMu{= z3^wh!_2m=UQkJ>a===7WyU)I{aI}L>N^_8`Iu_z&5k7_lNYq?NcG(Ln zqW9l=NzT9SoVpTFT}FE23v z)X@B2&GUApU9;f2(|7K_F7oRgm-oIfxb8=n@8}%+-2;Dq?wxb?pKw*T@08$tjza4%a=Am7`su8Gm_z38?!yiq7e%ng&!8B z824Ez@V}+db2Nn?MyKf4`>^wLmc#nwerAfCYxe@5z(%sZGX-$2#J?xy-Eu$UmiTL+ zq=#AXA7Z>nPxmw-sP-T0(J#WwrQ$u%OGgvzBs_bL;EzK;=_tc^oz6zH4RU`oO2BL^ z=!t9;%UvJ=NnVrom!Bno8zr6teWbrIPXJV(j)fAhlK52EO~)~5f7RK7e^C&2megM* z{o|JS7Ab#3wtI)fFOdCm&lJGxQvXsuzVNeje46ybZAyN=kUvM_|HOPGKa@*9jFb8^ z5r^deDmjj{zSHq*v_p8I92Y~ttXkS{9pAgS{v4Js_3+IY>NuqT>tws5rJe;G&tW}M zUae_QO8rdwVWE@{gOdN<(r@D>z6W};*?6{kg6w zCO@OtUtho0Uwv6cbyIU-(R8kB<%P1fCnghX> zChA6LqpvkTVO6r8MFqOWma=@kY&!34aZ_U`&=#^9msBWi^OJWl0^Bc&_LD@Dn@=v% zTc70#2AhJGRs~3YEURdliE(P4p6{#h1sa;sI0zwgliEfjn(j7TvtK9kK#v+>WXC*{*r30h>yLrM|YltbgPph#A19>ne>>n zMmTN*;ws@aJ=T()mQ~m@YA%9(cOF_JR5qw!vz8G_Q)`kB1Ftvj7 zL^-eTf$KeURt5ddn3T!>EuSu&9iPJFTjlm@;gZ^LV>N{>CN?cjnCwl}w`@jlHAm?v0-gfeG-J}90+2e5MWIJi(kOk9K=cz4Ao)13@ZxAaHFubM)rm;h1Ry0Y14J)hV_1GHDPI>rP|+2SA=An zz zNuGvk!52)&0)=UD8H^9s2yY_pTQ>NcJu513o#G*|7FVxETp>c$>m`C&s(8CA+05mQ z%azYFzHH}qUB3OMF z6%_d3UtHYiVxF`Zl^0Cs1;Sz4+El$(tVx*5e)3k0AJ}Z+hM=R=j$3(ZUj6LEa1juU-ui zd269|hIq6r{)+?hL~Kp5@x>v|aT9_={8eXyOXDd0C7wQ{lQ9=RR|q!09CzS3`+xF3 z+;`x=oB5ubF*jN%pSuF!8`R40A6D+v%G21jvYhlixAQXG zNu{%oBo>-_1MVEq=i{jqhrE9P$d8`Mf@WH9^}R&41+S9w1K)DUZvsc-j|BkYqfTheP^PMZVkr-iXXRVIE{fidNjOHfuQ$jxc&u2uZH6( zQ~cPa;pK6Zu|5q~&q%0vpN4xh`2!lhP{Ri_yh6hbIUgw=bllYBr)%;@G+aFcpyHz% zUaZMyYx>t|c)5np)9~DKH|Ow}04rkRaBH|&@kQAb4Hwq{f#+*Dt@i4etKrm!Itn#h ztyxrNXt-R8d6jYvS4%1ttk!TW@bRNc!$-zZ#JPr#((q;tAFbhS8m`tzDsI>CuW9mI zHC%s=+pXbW*W_=}@G%45vhELG&qZ)pOhBJ8`q?lT!;h7pfNyD=>TwY3f zX|9HUQhRdxCFX+{9`DmBpyEOa)O;4YOFV%3P<4~p%byc42W=3aUC~c_U=y)P?cU)p< z)_o`%nsh(@W}Q}uGve1%d2C<^$E05pPfKa6pYuN^NFWRZ0yMA047Z*KAZRf&YwyA*NE@u z`~>1@DU9`TemwEC1jc$feBOe?0MYsg8AXK8<)<0%Pr*|703?TKZzmoPU>i zTJmC5oPUdWx^&0NIsZEGwDiRaIsY>8wB*I|IsYv2v;~g2IsX*#w8X`-IsXUZX=#fw z&ObyvZJlCAKBNBMN4%T(0nY!Dcv{+G{ha>^@wBAH`Z#|Z@wAl1dO3ds@w9c0^>F?= z;%VuMb#wk|;%Ui>wR8S*;%TXhHFG{lJS|bND$ZX@JS|PJa?Y=SNy&-MQZcOYOp^YZ?yK9C9X#PUJK**Eb zO8)VqP9yRMN44e_oS;h6vsv-jExriGzNJiI9v}_f82(8}eqtvFk3$;4? z!rQ%Fo_3=vXDXHd(TKbX5%U#McAe3+xx1k6cVrsGx*wti)*Jc!J>y;@+DRI{k;h48 zq;oYGBjUNmh(cS$v&(#m8}5zrlB~}2sJv^|Z?VLn&O@{kQxBtea$D-Ta5&G1R(2ba zm%I@edf419&{@V+Pml|}5z`xa_u`^Uiq;f;r^vTvxA4UPq!PZk4_xdpd@TxTe7uo= zNk`p8h0mg}B=Q8g=nYdS<@5m_@}UXMC( z+fs8iDnYMV2>KW~hM3|{sGH$_(teVVTy8|erV-sd;Ee|Q&DTGMK*tkqBXYnSc^#cm z-53XHNDfF--y%iPoQ}y9E3>u{fyx>PiH`B|$g7Y>U(82@bfu8~4hW6nY*I-fw|RhU zFl(u8X!#Rx>4ATsB8ff>h{gla)DLKIfAV~RKi)MWpTjHUk4$qUV#|o|i}b~q;2m!{ zU`Y6Mb0TkXulWdCGGBzEg1*6*N$Gwv5KUJ=fX|msuy2I2jOd6pMzk=KmIbUMYj$G@ zK+)b&WA73^B|vE+F=OutPOt>gEV>>OwbF=g$c7%HqYq?+5xp{VO|19m&=8GZg%LR> z_Z0z})FhgaGb0eAO$MyGcunlsN7nhR*LUglJ3mBIp|4S6=1TJD-eO@Nl))Lwe!c#l ziCX)5{V|sM!kES+V`wC_{^X+X3rL^p%M!QI)n*#!E@%Q8o=aZ-jQSRB$u>Ga42^Ez zl*>Y6H7j$umF?V_(M_4=IcRS1?^qINK>?QLRoS7j9s7okWIdkN*>~kmg!5tZc9OX} zT7I-^=}^Qt8tEVWXJR?5rS(wtm+ZUq3_JUt0U9nO`_>Gz@6@<`C~o|a4~^B%YXJ|w z2s^u=XqcTp=XSnFGIu1|Y2&{)Ccr)w5Bhk#Pc5tQj20WxvpHn>h4AQH>Cr+Kng%(( z)duXA@DvuB1Q^!AzK$oT10tS{=%##g?+38$kK%e6-IQzomUzse1&_j_n}{JoUZyc zE)h==-mhiodu$V~33}IF)7Ia;kE0N41eTpYA-K#>(33>OQM?sZ(pC0-sOzJtPODeP zA;Z|~>4o>1SqCdR`?5M$VQI!isjs7L%<)-UW`OfXr=U^~_8^_uV544X=iA<_MW#6x zMp2bH5NhAt!?HRbfhM{VT|pi1D#fz?2V6~P!F))n4@>n?V@yXZt>a_YhU{H{nDN}e zJu|X8e@ds(%6?Sty1=r!qt2wd9pZHPH!hB(=8;?(U*%D zGa|+A&^V)OS+=|qA2jcKPuP4jHPrEhf$IvtLefH1h@c|P2hBsG(JgfEfvfNu^c#Df zU8CS92OQg-Y+@Pu7F!L`_;@HicS}9RC>(qcnl6C~Xlf))6wiPf1avV$BoF8=0qr2@ zdO&pXi59z|6^>~$%{$+P7~;!AZkFrTNwjW-kHgH#G`px=I)}P5N~k?WsC{Q7)Xo>s z1OdHD&^H0e{Tq)L?9V7>_;o>S%8V!$&yF?|BQ3(@%1onkC~M17jE%QzbDt5}+*i`I zA=BIj11K_z`Jjn~bsU*ybXB&SqvaTEPJ=U|;dXBnW7$>Oja}7#7(y0rk_rmB0&H@k z;e8P4!L_;1ER%(`)NHh&j|#ofa1TY^PoNuHuik<`7CbArMLXXS#*jGTqwQ2TjQyF| zjbRQTQX+hBhN$l~x|$tk9x70bk%oh26*L-Az8^HA3y(mUhB~_NXlGwr7709~3v^MT zr=U-^JwvvgOKo>;a%1CV?&R{KNpU55;}qPccP`@gVVK4CZP>=`n>4D?Fuct7Fh{wS zIoG2uc09L%kTF3L!p7<;P_q+%2LG4X0L36KwtXd$J?6ur@=8&84X=FIoCSFvYj8F> zx)QuMGBEfnp<+9)Bn{YOZV)=Mg^qDj$2&lUIF*aNByG7$g!Jp*;N}j3kh#0#(o~+1 zK3PcLFQgxp(l-I+_DSbG&;)1m84*3qEsZ${=vZ(&D!|{kGB1m-q*>qp5q7fJjhmlC zICevP&-=^~@@orrHt_2nvxl=e^F-4NdDDl@@n~9Kdv_w(s9VoMI<}v0k@rxC{s6u- za)>Vn&_>WsK-i1N0+1RUOxO=oxb4sUOW5wA@_YDoVerR^wOd_}wYhi;U%alI%d)l{ z;|nIXa;x%jFM|7zzM=Abd5O*1;^iT=DHr!M{J!Bv^ql79Gr+ykpAklvS}ZKPFn4>+ z=V1z!Z{qd%D9f1b_c&9#YJpQrM z{MFk+>qp$y&6s2ll%r+r@7v91d5fVk1oke(9Lh?2u+cX!m6mkyMu4N-+=G@WFtO-_ zT;>L-#atn0$R#|!{v zAT)rdqFHhM_7wb+4>t9;;Mv%5lI(l&5S9Mj{60|8S^(-3F+N8$)<2Fn z_7Vs+_G_R*T9k)-rEQr){KrE4ms0#{LL<8ew~9JWF4Tf0jrZqya#1v=LDXrLb;{yR zi1K*%e1SmQ}cQFs(G&YE^mORyu{fWZ-UxSAR zUrxmM;H!!AVe#H^sLkl$!Tt$`8cz$1Xe({iv$j+sIJ{kf{*vhCObVI@;BgAyPkGRI z`uRMF;0Bw7-5lJMOM=^^;N7Gk+5o{#`6XSUiC6kn{=%5Gf2@)7qv^lX5p1xAwZdhUNqXu_|!ut;z2N8~q)$nP-^@K!=I5j_V)S!o~H z)+}46&Z#nUKgCkV6Kyik+aD!0EQHV#d+ZlveD|8a7Hap1cz6$-7T-^BHfPOAJmhLY zDCEwEauwfi^XH|we!;D=M=(@;J)-_0-p8qUM^9k2Ig6}9gzo?q?RD@5uuTz9T2_ko z-X6=_`;Z94$-hFJ$`co*$wK<~LV6zvUD12u(xN;b+#kWY2<~nnek&J0Xnr>?PUR)h zFs-px0KfLUkYW#LYY@8n;2In%HuO-lMo*x#7~jp9{`2P)Y?Nh zjXekdfgvCB`sn-B&?sla4@smKBDLLvhv>3^;tsCipm{OG@Py?r`hHA4U*UJ@Zn~XD zunw37sDbAz9*i=-f5j6zzRl`4e;yOTcc+M4d|?poH%~N`xOm87UIhS=~gqnvzNX-v`O82eC>EKT3w`Br1&w#qYSNZ*Q;=y8t(RC-y7u*P7`c}BT zUCY*cyNYvh|I=pd<$DSG=E8_P+QtJs+>W~$D4u>v4@lZAL`!cmSD{T>ZLTB1 zsHfXFm#bO7bNyCNlY!^YFJ4lV2iEdKu7h zvh&=1(4ULX)BhM6`X}gl7?Y8>4tYWENXKu4F>ds&VLj+XC(1G1R)c!6T+wg5?f{*L z@<%`o&{sh30sR#8Y0&dou8P1@p78HYZFD~5dmvKy#?a7S(DePf{P&&z zmG0?sdA4PgcZ_gW@LEMDOhKLJA@&N!n|}Y6{;*bO**0fKdfFP&UnKS8bxhWd_^01k zCCQeM{w~+H3@E=!DwlnjN&UkeD*f&*{g|fTLw!IOPT}%P=?iu0a}DI~z{4Z@{b70m z7}aMbKQ^JC?7tBrSKyKMIb{E3n*0)O|0T+P8sk0`GprY-AnBWwY{{q$PlvNi3X%;b zidJL((r+Wvo0J^lb77a$vn_p5hbwJR>7_aIJZ!xO^OnA}7xpfV&l!S-h8$n^IeEgJ zXe^TE`n{9wOxw)ZLryyV+(}d5mp#^*Y%P95lQUr)#&9ZFjo%IN4)P7nhkt zzX3jD@>33WmBaPAgZ(;PXE;A}x*&OXy6aem^CA3oI-gBxm?5Q*t{vJ$o^}E<- z{QME>$@5Ovvo7|QlL|Z1UA-=LYq|@Sew*%k-o^f#pTC*zdcnm$O(&U~T&_MByBCc+ z$y2qny^Q_H;Rp8+SNdX_>t8PRHb4IrHL%y|de_DNMyDS*T@Slhl1opjf=8SGlFxX0ys)x{p<=P$VsBxq?C`FrMg{NnNo*KKL+26Fek4p&zid)(my z`Vs-}I$S%_*w!=x?nwiHW9asAj_fSgsg8483)oCx20rlBDc|kEkc)>N`;XtK%yVeC2_!Jn)qVzVg6- z!UO7eHtKgZ>UT8%3Eio5&^ApSX>?pMTLJx)-?({HrsP(1x6OXuk~ zSai?}sC2v_`H_N+=R4r{d%#pa4|)NVA6_>nCkrnAJ12gR2~7RYiuS>DsNwqH^Pwi< z>7JSnY*F};D;uJF96IP8osQ!LVWZ^<-4D0vm=t9EX(ow4=-2!lFk1=PvUv= zEIp~6Ab?g$uaWd-Nw-V-prlVq`huiyO8TLs8D|K6V1;_COM0QCwUV|G5&7d1Z9AhP&Ea_}X7fX7fq_vW^N_vf?H%q!*(g!7dQqmVB zeN)m8CC!*5+n02*q_ZVmEa`=k)=Jtc={1txEa`ShACy#RAO3gXTkheYhNyLAV1WkW zRQ(Pz8U6P;{J3_$drIZnaAPR!o|!i{Z`Ro}!y8F9 zC;n6GO){R&)Vh?6yO^5a$#@1+>q0Uj@T_?L%49v+tX%)`hb(j=BiN#1T~eGoDFc_hZs?^> z_VxJnA{igUa&6^vnA;W~i~OE$T?IdPV%1l_lhg~Hw5rSNMlwE**~P!pCLa>jb24=m zOlYC-OK0y4B@l5&*Vi zcy>zkZG7z7Jqp}`r^Hr&y3h{kKVpfW5fXPxdq_7O<0Wq0@8tt`X#N4qj|(_He0=HE zCTh3GqCd#xhsQ~(eqGPyvss}f-hRaK;r%6}?EFLd)ySXfccf|`@Px$G?>rSg0GzSm z^Wr@&KRm9EOB4F7`LuE*ZjHAI93LLfX91r8zghE^8Ng4ZIGIXzC4Lhf0-i0Pq`wj1 zl!vTG&Lbs*2UfQE$$pbU&%PA+b1CpQfxD9|5zGfEaC+X0Xc%^U133A?nulz53i+ie z@O3HhA8>s5I(aK_-fq4yN#zy86Ife6KM9=ttkx^#=U58)v~+tt`fq(`Qu zkY57aJ@cf9AGwk)Bp8~H0uGVn989Y(uU9PgBRtp4xidZZB=*$v#zZ>H2^&2yQC8&a~<8Yia!x9eAa3VaE0 zyLRapu6B4Ng`T@o$lr%JBL7#(^=hu{^L>!F^P8DM4?O^&Je1b_kuHvFj+Cb-0Vn?y zTINe3aJzn8l0wh-q#kR&%v*um*}qT9AE7ViaM1U~bo>>#UAsr6eEXR~j=uAzV+qY|FIts{ta^FFGZv}>+vKG_{A&q5k0G@hi&ik-67TYbMPA?X#fvLE zD}5`A7J5C@67sypTdiqnl8OD8Z_&5Qib_k0;Ys=Olb$zI<-GepPCjRsUM}gaDV|Jj zc)D1XzSWZ8k;j*wv@tpTo+a6>ZEjj5z$+}|$R%D`xodsStzOqo)TJBSi6THoIjujbjMfK&-|Rf4>@3Y)ZxUz9S~ zE^f4}zrp}(4pV#QQ)XYyVD)yQ%$O9k0Z5Y^KO5$&((dWQWNqkH0Lz zX;RA67jNp@+I7gMC5RN0i1`=VTGD6j*g5*TTdY0euDk_UQyHf z-%4P~!z(G>EJrB1Y}2vI_i>Z*|Ef8kJP>lxB~6Lkv1-i3@?etyIVnA*H8p68q@9-j zCyiZv@>}v_^IV%)?=87~ZB->Dk6xrFeNOIiBGI*aYgtSGYn!WAzj#sY6_oOp&HENxf*FUm%llN*kKgc2aWdBzM_nV&~3}C&o?EE!6TW zOR7azT^f?7y&RS=PEBt0N>ZrAH6&91+RIy46{;AYHHqZ7YMHT{hcT@B;hdVkA$mRGZ}5j6!31w~0K{>=bNG|t5&<3m|6Q17P- z@~pW&#Paw*wUCF?ymd`r>0bq4d3@8C7i{8*ee(kAUwx0PDF1DVRzW?JQS^J3`s({;MU}lu zh2j;x)>2=6pQ)(F(gD@3(${6Fuii&eRED1tAJ+dL$ogvh)c4$quCxT4wf);I^{xM| z9b_>HB$`hH!}dZk!au(rPkIKAr?Z$>_s zWnNLi+F#YaqJM^1mR4WA-<2)vD>%geb4kF5B;+;KV_%<ocwRadUP28 literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/linux-x64-node-12/deasync.node b/task/node_modules/deasync/bin/linux-x64-node-12/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..0d43e22f6afb7307e8ecc369e1ab70ed63d019a9 GIT binary patch literal 30448 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 literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/linux-x64-node-13/deasync.node b/task/node_modules/deasync/bin/linux-x64-node-13/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..0d43e22f6afb7307e8ecc369e1ab70ed63d019a9 GIT binary patch literal 30448 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 literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/linux-x64-node-14/deasync.node b/task/node_modules/deasync/bin/linux-x64-node-14/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..baa2f9db2d97e56d93554f05e7f50acc80e780be GIT binary patch literal 30336 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 literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/linux-x64-node-16/deasync.node b/task/node_modules/deasync/bin/linux-x64-node-16/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..47c346e7059599fe5d02cd427220177622fde52b GIT binary patch literal 30600 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 literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/linux-x64-node-17/deasync.node b/task/node_modules/deasync/bin/linux-x64-node-17/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..58bf96e28829c004b4a5ee2dc6735ff769d45534 GIT binary patch literal 34704 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 literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/linux-x64-node-19/deasync.node b/task/node_modules/deasync/bin/linux-x64-node-19/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..e3e5c267dc4202b28687178b623747db574f4b32 GIT binary patch literal 33432 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 literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/linux-x64-node-20/deasync.node b/task/node_modules/deasync/bin/linux-x64-node-20/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..d84762f8f767ddf1e81587933e0ada8ae2c58177 GIT binary patch literal 33496 zcmeHw3wTu3wf~vSOb8+*C?NGkz}SLl%mk2!r6wc;Co&0<5I_qKLo$$PUd|(cN{x+C zreSDo^-8s3^j4)_xu&(PwADHk5Ukn;tw`0{;EOX2N=z#vK5~C+KTh@>X4Lk6-~apW z_vf_ZI_tOBUVH7e*WPEJeZt;1xjl2!Y&K0^cI{i*Ag5^sBH_UGQi8A<+A#b#TN}q@ z9fL_H+%;u$NK!3}^HheDZu2;ArGGh>Jn)= zGe*;v3M%uZL5%WsE$8xG^@+4kI7?Ddyhb+CZ!0NCLbDmF!H4{^=G!asS!s@tmz2t& ztKywd^}kbIxyV;=1=nMxZ*y3aRF-!I@{wP@>Lr?8TPVs))ebFou2E9qUgk^ELCrI- ztWtw}Vq}XDXX&E^PwC&=cE{;2ublJGjRR}e-@7Jf*bVNRe~x5rB!08-qrBwv%N^y} zg*T^b4%>?I9PM%~V~!rX;)0zy9R;W6WlT$B#gqIu@%t8jh4>ZWN0%Ev9ly)*^Way8 z-vaz7Bp2dWiQkp@H9z?3?3d=v=-$*cbNdrNeRcM+ZLiLrGiLt&<$mK&*^fQRXlpEYEj9oW|P#FoArzh1NcTyOKXwk_9hYb(h(;Ii%1A5q7p1F{ppc*djw?luja)%-?lHt)5^({sxNM_HN6!O1={$%oRq>vwtAf=eK zUIi)a{6`A?Z7KY@DTUwaQq=3A6#Ab?p=S#WPv*}LQq*?_@MQAmrijBODeP=bffuBR z^Kc43M^n^yAca3)OcDQ&q^NIQ3jOm^*tsu-{FW5 zt3|sM&_f+p7(8812s`_PooH@$^@@7siFyqe_zdA^-Qwpk(#g&&Vb2*t{!U?kPcaAb zh5da3FQ3oxI_RZqy09}_*eM_483JD+;z}fI6VM;YZ`(zC&ERUZPnrE=v>IWjaG&-R z`a9Vf^Kijo!Viaq-|~e1^MxLo(~vxy5aC|7`#mY-mx^*bg*{`X9@xpsE#Sat@a*z> zSJyW-c!MEdAmsIG-jYS7-fDlqzq&RU@&^``7S%O2_!s$B*7T3?DMW(yVl#}4+I;@;?O#8bDp&fmuhD|t4C2|L&(22WGUX2km%M}kv^(73T8Dn zRVRuTe?bv>YUxvoe06mzeO1?1R5dpFt;Hv%it?-K8iRgsmB{A}QpQ0u60;=QVM$XB z5#B!$nl{%L^3}P^=T}wad$|Kv5#sezbD8Dx{8P&OYux3oJmx2VLo<7uVXK#1RLv6Ay*!HL{T_^m<@?=XlShVyQrg> zFw#7YjZN$M04;&gI*v1CQj=Q0FDr%VP6!(|giNP8t#!Fv`73?F+A1MXQdJRhxvFXq z3Za0nHWVzWa##59ANTZtKj;rM``v7ustEn7`7c3!jGFHHDy`mMU)8iuICUk);0E;J zP*sgU5c`t9s$tFGusFTiA3_WUU1pdSqx+SV&&5DGZ83S!jYzEU4yLm(bfdSrr!NWk zn&8dEE?J(>`=>dAPk$FkeOy+2u72NGd;lK?8eQ@T&7jWDf~7H1jW6L}6SQyxiC9tEdXp zHig`>kIS-npqsH-wUUob-m4Id=pEI*ay-!nyM%Y8uiEPi1bpkf4gNJ=j8dyZXuzvn zE-%6tkE7a#+EBvySMJJZ2|OM#9HN(dNwU7NI*dL-flq8R9$4_Vx7o#gCLhI84mdh% z1@Ejg7s|(730nS=1uL)dSB2be@__8mUnH`)%$3Lbfp2APv&%&>jlntSWrHLI15+f* za!upv%_7xOk|!qW&qrCo+Ak_%u>J7ZS53=@Tbt{X=Pgm^1I#y8KujSLCMqzVwPsT| z;P*Dy20~%PZe8ulV5quk^5ooLW9}uyuCBt+K%9%XDvnqC*^@t)noyfpROFqKo2Sk5 zl*}pe=I2f|?_7ho`MJ}yqNPg<=ahI|xl?jysLV`-;dz%Xg~qA5`7V{Ed0d)i6aTX_ z>cGmK6RU0#wc(y~=?qKLhJa>>^t1%Yp#rtDJd}%mr!bV4qv{y;zhuQ6-T#7FF-v<)z;!wAVaGb*d4e32WIl=T7%%jXV&7*sjb6*>9XN| zqDUit?Y_sLf2h_buyu?dqWwVdFFkfGX6O#>KEYpi>@LjE?b;)P4^8?3X4q-kuffwL z*R=uiOT0&J5c6+|$Ha@l_UpKq#3e7^OX)R)-kat7seBK#;+utj!VB<|mz?(#J{~`* zXR9J#D1|}06kNQ5u~hj!LwfS?lX_x`ym+Nz^4$u46+`%cdK7$)f*(`xQU%Wv?@Ls! zcokx)2O7B$8an|WtH{&3vAnVs{M!-)ouS}M6udyeD-?XGf|n@x3I(65;2RWNz6(-v zhk}}19aOnVb>|G@cgfn<);NWO+r`r`)&1_nA9PYad(@qH#w3z7Zt9VSl;kp1zW znLI5#_Q&rxd0KGnkKb(EoypU}Vt?Fc^0c7XAHTxnX#u%EUTE^P zu-G4WnLI5h_Q%JYJS`;l$48nxEg<&CZ6;3(hyC#nK9}{)V*EjqAIbQACQlzsP=AxB z1w+)|sK3e6 z0v+ma^0Y9A`kOp0$f5owPYZFVzsb`A9O`fKwD5-dn>;PJq5dXM3vH;s$TmM2 z;D-8}JT0`L{-4VF=P~}E$-5Z8&*W*L4fQv9T3|!{C6C^85xzlWjw{w!e*z!1@NE`; zy@d~3_<9TPxA4m?e5HjiweW5WKik4jv+&mXoNq}#$HI@c@WU;<)53p-Z-J`6KD6-f zS@?G>{9i5n%NG6x3%}dKKV{*6Y2mk7_y;Zgy%zpX3m>)cZ5DpLg%4Z!dJFHj@XIZH zrG+oG@NNq~+rm$?@E2M5^DX>27JjsaA8z5D7XCAQOHF8h$v<6yzGbXJSM@~R)gyaK zBD;;X7`XNJ(I4Y`r`|s8IEW{5#Fzt=OV5C`-X88|;=7CzF8&8D{u~oOWSkC^9&RO( zU3&ZaZpa@nj<8}58Q(C|c6%a+44uJ8j4T18G~_a9yy@M^i`im>TU%;g&GwCBn5Gc2g*|3XcIbv)y;aybeZ45qSgt?A)u@n!N z90H-#i-8ioO-L;usaC@l{+jX6PjDOAW84VH_y{#|#o`*87`dp9n={w%POy6GODi#MaKbg`p+ljndcyguQI{QWX`l?6X37x99&)yGb8Ij|t zLN(gv8RuWY+m<7*rsj{YL87pS^y!h0^tPj+QNN?-eEje5#H!rPakqfcw4JL4?=#00 zu<^SR#T8Z-F4Cjn1DH$YdD>TJRO{`I^XWOIN8E-hhA{C&{N2V2@N`=&vn>eE88H|} zKAs2=^mjCkGR`6}8s1BR^*7v;^cj$*0Hi?lwAb%7R#EG;yNzmnGA|{Zg(+K}C(`4I z{Jn5l;qv7>jfIe*+QereH=M@pCxqF%q$Ki6;o_3WQL?-w^6Ar5*$VyU!y7-V~1 z#(pxYefVwo^5Z({iAHPSF!VGu%tk=^p5KEZeJjNgYSnaaAAsGKQg;P6I?mDVR?`+~qJ(1{A+!^;HM_VlXxa(O@w2k_>C-OeZ z)T5*4QILKYs*#&SAr)Pfc_gMsm$&?eyy}VkQEzV}eVLQoEqdfH$cMX5G|mPjkTS3x zV7G#H8NXshWwsR~0n)#r2`sXB+P6{7_2{&_Fl943jFt#*o=Dsi`P>uv$T)>H zTKGb=&)&iI8LQvCi#+Rz^m!u3zfEmacy*x{?eqxBitnfT4~Q1S;1TyDCY1Q<*CXf| z?;yr7S2w1kzIp_q;6L{4P9Cv)z{d-aDM@^8r}^~KF21Try{l|Vc7L|WC{vIq+HM0H= zd)lA^Gdr3OMR>z~##+vpEusK+gZwR*I) z8xL5@7Wut#^q*XIfl!Yg+TC6-s`Z#X^R`D&e(Nz?=55<>gKRO3Xc(E^5?L;0S)6xZ zj*lTXRvHcEFxa^a-7O@oJ%=gL85UQ^Xjy*98V|w zY2XkY$Dx1Vwb*!+L*yBh*F(^cICLI|@+sr3fN12wGlK#wyJY6)AthRGLo!9{0E#rD z^)w!>;Zt}>R{Voxju`(%wMo*ymJ}ia3m1uTX{j1`c!KGzH%&yuY+{XzQKM}j^Ol>5 ziH0}pk@X$MFJJ;i*9S}@nB{4|Hp3J3Z=j|`e|eLNE*CPNGMVrOCKEY`2T%*@O%j`6 zBxxCn6%fQ6o-N_c9!RvKgfx-Xf;2qDJ3Q@Sk$%KjOb&>;J6zAYUgS}1*oF9+OqILC z6J6g4gSwt^ccCb_!rw_f9X)C*1)fm^6)3KQ6bu;7e&Q-Se+|PRP7&^z`KF%fF70yT zdHxWR$M^d35vas?53_`pl0qZ+Ue3A8dsD`_wSt%i6osm<(h1jAZ-=+=FbAzT3!017MQ=I2H>qW&Q;SweY8= zcz++I2k``AFCElg5Wj_sw+ZnVO!1u%$ApDRKV!TM9MX%q^b#ihk#V0XeP@F7!(4hI zm!2e~uQR1rCrGd3(#Nst0mDB5p+T|;DDQ&1de`v^=dl`uG3{YBDCGHm&-3kM`HmRF zlze5P564>&15#O~yg5tW%oJk1izIR>xo$i!ZZqo*)o?a-`He>~)Z7Io-cPeX7|MI+CT+cU62Bk3j4RADL|hf1fYQj}-iMQo4`Os^JzSs;4fITEy=jJ) zdCO_6Didzt<72z=h|v2hR)O^}J36H996S`)B=$iBvg?`zxeybMxG5Wy_ z8Y%yqYK*!V=d)Ubw(vmP^B!rUAp?Q7%Q(PVZ}gQ|wnKnk1wxVV0MJ!!rVshJ;ZzByF@>zhr1J(Oaw`fGtysvdcnQyK zSn+2NQhc^4ei|>LOBj6~7yk(te^7|OC+v&U`z6^I|2A%TdHW8tT8|Y9-em3^UBwkt z3k8n?<>C)Od~k{27hHN8m%c_G+bXOWe#2r|Z>1VajYe=^v4l=G0o z7z1BYP{&!&Va9^qqesHsY7e5AHr|6RBzPl>{(3Yi>p^?bgJMRO&|*vMLE9}o=%+%* zP^P1DJM|#yIZ=1_uK~dictqmO@gt*ADEuxnYdtKWuCv{Eg=q-QM?mdG*8$GDPC+j> z?mi~YlZ<;Ho7hWM(yO@AOIlDS`pI@J^qA}?J7hokjHwL$j5pzZe^>g+ZljB-9__+% zIGQjYghs{dff`}tqvk?);{5_Ql=u|Wz`DX-LxUtW@LEt_z_$_$SilSD#`-%7*at#7 zzGjMNa&Z~K*~jXu-n+irE|IT#X@?GDP0d~v=W94HnMyN3Gpk<9=JeF-EFMk$`0nR>b?m= z)x7|ybme5$r@BO6i04BSIdCNnesH=rMj8FdVxfjY_oEG~%fTLvI8{D#rH1Pebb zE|emf`?bhmvBjHVm$8U7?dX@!W4_oALKQt1C>I}*$R|O*I1b%cw33V`2AZ^2BL~&UWYs<%lN(&cxqIiPJRipk2wid9f#nK>|Bim}w;(Ym|Z3S-A zsa5u{^&#Bh*4@IONa+Te1Q=Jp%Uf?BYrXX?`lU}%w&s~wHqmz&-^7SVDLW3?jng5j zM|QYf&td}ZiS)A}=nz(%5WDUT#weyKd?ng)uO4Mu^!9SJR^{G-EEde_8W3( z1Z#nn^b#p1&BO7s-C~Y8#$w2bmMDq*Ies&Y;O#M+tZ4rwRg-m@-Nt<8^wH0cXMykn z2)TDOP@ZGh2|2#TbKK2y+#_i9>TW20` zYow|q^7=v#uz!-AUE7e|;0x6@`?IUW77hGg^wPidweEqya?F~AT@$!W((Mq~zaRcz z?1LZ*VT9Rl{&VM)J0R5igF)YFzef8E3|?RIkB>E;p5)&I3l%(F{%c>XkSjZSkcjOp z`=xJ#o`qk}8v_HhCYAT*z`#V%0?-1`7DQ{79sm9j@w*vxA84lo|Aq&l-GX!)_uj^w zrVF$h=_@eUu0?t$=#!vbpxvM`(4~;?2BrOB`apjHO3$?(&`wYX^z?yF1f}P-2XqB! z6KD_UW>5{&o?n2rU`m^Z@;dSA`Xp!%7Ud3uW?`N7Y?Rl6^=KWGF8ObpY}YT;Y-_V@ zXPr7EqXT8;Ank1Y4*Ydspd5L%5m|FbjJ-T_*qV$M?XojxT`(nQ0#KH}m~IZj7evKH zdY9pMtOvfL{Nf^+5PmB#&Yz-S8*oq0yfYN+$GF$w)A0f$d+4%VU+!Vn4!P$b{-oh7 zX)`9%%M>*w~S=x z4Nsp7fqBnpBty2|0huC_c?~jB-<*y1kkGRkX)(xP7Na?S3mFgTS;+MO%f|0X{GNvl z?dRjTCs9u$^pL-M@G~HDBgx#5D3i97Y%d!|%hwbe1&9&$@3ELYi-yzV3+o434$_K| zM*AK)E>(0CZ?Z=nB^#ag0vl=9b)fh#m|FEmgmpN zQ;hN-1$A7emO<~#qf02Cd`y6X`U`IXbTaftnS zcK^21dFK%OaiPV#?9cOD*M?@1?l7`C2O2R3C*o2_a8VRLrcwcpq% zrU*OTxeS(J5#JfqmR!lOs=5h3OxL<>{+)L1XqprM{h{6Yyj}aLo$jBo!3q?t-RE>d%M(uLYfkM2C&?UhIv-8fHl-7eqF1@+Yue9k zSKnjT-bi!ezn`Qze`42ex6}PjI|_K+?!?xM{S0V#I3IIp_fxsu4(Gd0?OnS4+~GXp z)b4OnmTgYwF{k#N(|LQkc90<((=iI5B-h0dEggeMeAwp1V)s)vC+_##oX2h2VRnCS zn)Br}?eR3yo+jF6rY(2?)mhTQudBa?BJUY)bBuCMumM@b_>s1Z5zZWK92j5)ASbVr9ysZN|4%(Ilh<4BNAkb% z0tRFAO3N^B*^Qc(nDT#%!;r}?+Czpe$sEMQlMD46D-boF75L6@9&>=yRX ze2*@gx6mcTG_8sAvK@Occce?cmki;oCf^G>gy9nJ774N*F`-x#YnF$FJ!XHFkjGL4 zm+9xUvMz7Bo-L0zu0KT_I?bpe=%S2-+!Vm!L60y9MnLv`TfmfUP+bc^X$7+6M!PC|(@^q|v^% zV%#1t1iAzsqd&jIbw4NCOQ0m*C**0aO;w(*_iqkFp3YJ|FhL6_dcqd@I67X_0Q7?%<$>c|w z`*2A-mHn?V`O~zV#Zq#RCaW)fL8Bevw9tCyUQ0 zaMr%xpQuK=5IFO{h=2Lqp9egd{mYsBiHdGW zpd{s~YR7A>x@zdpz?`nd~3~ zWe4UjNtP5}Wc@hZ+Mx zuP?k-t7@!oqN5S2u}N`K2|CiDR%~XCo#q4Uv{eD@!0xRM*VofFYcNeg2nfZpwK;&r>iDxv>M%G`s zDF(mc%RR!yHvEcq^+b%MXGNs?l5g&DZaJWVpM`;wFaG^)=T%S8*3zm8es+QbLryqG zgP~@yiOtH{CgkEPf5OQa#q8V&wzIafvwgwf-q&b2^%N0q6}HW$9kTgx4+#*LKJmbU z1dUgz$0Aq`R8XrKZ%oG9;v9llX+ct1vB1b|Ql87-ny?4AOVg*O`CmSCK;z21GhSpez zA$H!4(pb4OMR!bcV#in6>tFOl)zG8|?O2X8F&(G)EwMM#xWn8g&H<4}{#d+Aot}w_ zKTb+K48n5igFKiZ$)5*(;d2*lOQ$e!qty{z?KLUR7*Kp|hKT6l{Cu88iKhsdeI@A` zC8CzrqhwMZ$McmBbYaDQ(b*|{IAo2H^aKi}o;YNHHwlZWFFGY9>ED_qkN&~aoz&)5 zkLdWieUm(!PogU+;E%m+fg zm7t*jr#14fp)usoUEL7QHBYO-VIKlo8Lq9XzNofZV*)k4V2zery{-YuI1L4Oia5w6 zf$<_O;IH#h265L^7t(U+O+w4XZSLwuaTD}cX}NR~nU>2Y#<_vUYMl3@<@#&HjJ&2A z+9Zc!a8wCD(8-J1;3PMul~2~W4tY;{$PB1tCj07ZQ5H%j3xKdZh2<@Z!c zKNaFKpSAq?NXM(SX}|p5Dk-fO(S_wmtkVyE-<9iC6~M5BZ048WZzYxAYazle(xG18 z21DOYrTy}IsifP5u(V&wNm_$+`W7pB`8`(Bn8;7|lbzQ3uK`B7Wq$enS5o=?SC%jH z%lh9e^3MUKOMXw5v`1tlg0C57`7(byF!BkOMfsJNNX6%AnR-I|--;A9f40akX*pF| zx#Zf1q_-nY&EF)x8%iqWqzcJPdbcHii^wl&!IzZ(pO*acyP%}(4^(C0pt4*E{nV0Q zey5UD{@sF`N>Dx+Py0wQD?y{zRQL?Zp|hioSK_Z;%vb!&N&m-Id4%~bNs z@1Gl%0mLQcI5)^k{9`0g{bl(bbzHJTxJcZ({|jNSC;r5b|=)1I89aVz<(k&E&{peEo>pmtwn$$#_~J~164Q!^kNkgYKTh@>W~lA`zW?{# z?{eC4o%P#muf6u#YwxqqK4I@W+@9HKHk&3dyY@A0kkhmRk#Oi1DM8pYZ5aNWtzFDy z9fL`y+%;u$NK!3}^HheDZu2;ArGL1HYdxD$BbL`N%Jy_Y%#n%@^gRYKIm(*C?rQFY_hopyruV zR;j@~F|tL7v-FXIr}X)^6c4}Y7vnc>|I2?ra{lO5Lwz^BeJ+x<5%|r(kMfewuXU7X z7v7n!Ic&?ybF^!D#yc;Eyv;Z2jZRS)=D3TY2Uf z`OV$q9{rAQtnr)rCi`78zxC8x-}u(7AG>EGS; zjVES|zWLCBO4nx5qhL^yYsL^wV-B*UO#m+2PEC3Zj!%ZqhsToPFQCDa;bmyhWaYk= zLjJEXBAK51Q|Oru`Ejb@;(j~yCo6X-0wWn7O;O)sbb@5|j7}l{OXyD~|9T4fQ3z6s zS?g7h!p^^^(BGEApBq#7tu95qo=Bm8TM9j!VR$lszMrDL(|{+FzbHir&{SlfupeDdab&u;PKG_n z+N(K5eY;ZlnfgRFe%7lbMLhf{MZGFg_~9iePG%>XD`~m$6naJtO+KDnonZ2J#R9(??J|}|CNU5AqQL*i@X=bI#m@Vn=Umv+b2S${OUQ2) zda{L{a|B)^H`<-*o2_%;GWd%wztGbu^ho_* zN`Y64b}68TI<7Eyy0!^B`-GinZg%yGdgY0F4Hx({;b-0A=P=UA&MaZic|!hvVSi6C z2l9peeF86^%ketsrE99NGh5gxAL1DTUnb&8Bx~c)AIWdqMSD%-YP3(7{iC%SVW)7P z_B{GK*%|Y2!C}G=M}^<=g#Jr~9-7mTJev^VUbg!~DdZQ6ayx}RW27F~$;vI@z$ozS z@_JX+H#T^KAzvWm^=jUd1*P6v9za*ECcuY7E@u4@@og2Sb6zHSXr*>C@-vWn1j|LQ7#Q>eDFfk`#M3RI`gAM$$x z{uQWKLlx}vu3Wv^+vE=f8_D9(8gFx+wG5YPXFjV(QDZ~MzdB?o-j$H()>x4~sy7N| zH8xcziWZ-yh&;9QNkzW8y5+vAn<}aroBY<|6H`U`RdtO)zqd-{^9Cv7pc#o-678_0 zsfGyep9)Qx?F;$p+~sqtD)PPD0V@dc`l-3ha(VtqW&Ty}a#tSnlfR)ELC0=a`a|A2 zUogZod21V1H1dSnpx10vG+IM-ZNo|pj;-@IaDl3T--q@EgcNT$v|?HU&W&JY2+6@n zP|?tuCcm)QG|1Ob?X9Zw`vSr=8C(b<^q8ufyj3+fc~|&q>ojj=!>U?HQwZ0SuP4n9 zH_V?aIzql|!V*+Vv=N%5!CQk8>R`KUp#0`(Q%i!4b*PXl4?UtN96-#5L^w1wR{LGl zQA`+Vp2o%|cX^qT)2)S@y@9ZB4>>m6Q0+(e^j8bdu<%GMn{{CXOk))})ATrMvY^D$ z(U@qcCeXMFeqcR6;7`m_HkSbGTY@DhH{j2$}LVk>z?)oaN-d|tUv_?2}ImX}y z^x;rdjX)6llE0y0)!?u=wb~y-3k9;YYrGBqRbGrzD?@0& z8(c0g!WWOD+J@Rt!uVJ2%4Z2Y9x)uEmwQRFzOg!tK0<*{Y%?BM@VB?w#eF6p#ZnG9 zI%@^*tkdVq$6X0p{;GM)zu~V6x!vRe*`H4*varmR$NGV9d2O@HMKO)RIp}4BBn1Og zB+7D4;p)vI)l!ltChE^eS;5-V6*1U;c zDID;7n`;B1Fk-i^c6l&VT{UrHZm==;Dq>ewVQ3)EMO+oftNrZBpG!@s%_%DKPRh;G z=6FhG6?yY>C!2S!!Q1@YDO%Cu#f7s*9@as?h^4LV8e=|Tcj7Do+E2(@hXs^RSWFCd;SA6`E;#8@Zs}oap%<5;J)e)5v@e!|D% zC-rPmk<( z$`!9dEcH+$7eZqv;A0edS~r$gwt|0Mf}qnBe360|D0qc}FIMmp1z)D%vlV>3g3EV7 zO72kbaz%cVg6j(2so;whe2aq9+PA#+DgIIMP6em+a(Qi0aQRM2X(SMY@j z9#imZ6ueu(#Va{W?NRUrihNA;3u<>2Hxzlf#z5Kn6#Obh&j|$=U6G~kQ}kb<$d75_ z43;4ag10ERTyvu2^$MP;$ag4smV$3m@DU2$ zso-Bw@GS~X-=E~wrQo9^2)bRtvAShmF$I@vMU=Qt!R6Ws;oS;8p8#&8c&CC-QSdDaew~7MDfm#j9-WCg` z4Rq_RyE1k%V+N+Y0l0tQ(ls{Y_Q!1|PYZ|r@%KNI_03}ZVUr)h_yZqd0HSu{Y{=022p>Lrv*XO-{ff_5cM~CTIfUlO`aC`P=AxBg+0{Y zf0L($JJkPES^sRtA2#{1j6Y!Vv~Y*|n>;Ppq5dXM3w5Z! z$TmM2Fo*h^JT1tf{w7Zgaj3t^(*hjoZ}PP8hWeX4Ex4inCQl1(sK3e60zB$( z^0eTF`kOp0w4wf=$ol6o{;-gE`NL1bQBtg-$CK5F6H zEc{vvAGYxI7T#~+msx9|^J`1>t<)WWw}__Y>3Y~kxIyx+nv zweXb|zSP3IE&NOiKgGgdVc{>e@L#gpW<6;Li~V+FdZC-ROS z*;^9XZLG$?t+$W*2;V#P_9-VpJdtC@ETCL^8l?61a5od*Wt4F7Uvu%7nD`On3qa}N zRub8zx3BGn{2}8QE9Qvt6*FzOCvwEl8GOvh5->_bE`!FK-krS2-RS$C$Z=8PYZzH! z;9_3l^`gW_fpX~wn6#|U54iMYTzVptK4t`ga{HJKyI7WE#s(AKMU~#l;3Gzu>v#uC z@o>oz5K6rgDABux)I5@EHEiK88vpnhw~@WZZGemqQ4?1zz5&m1V@k2(WHrk@Cn!qnn+Di>3Wp#wcaZs(wU36q~Pi^zn}^hlq+07a26|SoIFR|tl$M!J(KdUWe*te>ioBYdKfVfy!XDD6M?Tcsj)zA6lAiPNzrhnLax*Vp2S(F&t{A+} zytsgk-<2q?u(EK09t|JDTq@7gzA~d)Z+Bcu&nZ3PHe4};i6`RkHul5QZL!R@AUtQp zU>Ny$JV4N2(lpArfWT;Y9|hK5aZl3cL7D=P0@2f6zt31ft<&x{s`ZJylyDZNYSiX78es$ZLfQOCra~@{-6WFHmJG^gEBP2UV@# z=ZYBz$*A_>cjL>C>$oQxt%1YP)6g&*0O@;w1s;)fq-3v~=4M)H#3+flHDfbuK(k-Q zJV}xEFck3^fA%A_%kG9?{Oc4>?M%7rxE{T~i7WL)qKk27Jc=A`vGB957d_E7>f@fs zdni+nj+#S3`c0@tZW4u5bVcT|m>yl)@^kX4C-NJ;y^Zu`PH?yAkv||G?mE#p>ybdp zz;=M$0@`K#logfPR*VEl|C}bU$l__=N;TJ`Qy##S&FDD6ikhRhSGIT}aZltkPvk@6 zEY@h@%h5jj2HR(he&;UotS8dviJbg8wNc@Xge-0;;Ube zpl7^|7{grMn2P%95rl&O#EUz5#O?(jFF>Xw@wuJaWGC-8EFvEGFfrcShYT#s7))ob z+dGE>0^xfibHotJoESe9dgNpA-cXC_jouo|(j!Ck_B*omXi=U%eQ#*E-j17Slg-!y zKk1Rb8rdw0f?3qL(pzpFqlJd*?MqPw^hdq@)(oQ&c5x)3JcQW?m{RHOs}SY99B3F- ziPAFQ6ywD4fq|u>emm9fDdtx!-YLd~!COvM21D-1FrI-T*3AABzZ`?gzZicP7O5Ip ze}_G7P=WFX4HBl5qN*^(94^@Vk+po?Qa%+u5*ZVV4p7la^Pj+cQ#t|;FNqfCFpr;8 z(oT2e@+rs+b;eexEol$sFrQ}>w%nEjuU{YwDqwXSN(IUGEor|kC&PH>13bF^kPv@+ zcOdcy^u2o+f!Ak2wPN4G!pf4!2Q+fA;RKx>-kzooB!^rveXl!)GBslgJWV58D|#n& zl-AWF&&piq1?Oo;4Z<%_{;2atyjhjD9rt7w_ZhQbCS|FCP|MmEw9Gd80~zXZi(#!E zE$zkwma;{DWgPzpmz^inqlb347mRE@Vb8q#DU{!O!j^gWR@@+43?mvwrZ+{FD_Iuj zeVF58$c>doLpgb+k-D6WlD)+_yh|Vk3-=VmlO+*HPH7~RlTB&ksbYlZ;Zb)ybbd+H zlanPzpJPU`u>MUdwB3Ek92qj(?j@*o*EEdYd{|HesMSbk##XR#M;dz&HIA17>VU6e zWd42J{B=iZXoybP4@>bVE(bA&LfC9yDPJw*>7}>#H^^}|&v6mucnyihxy-9m#&A5H z@E3qX^kNSE9k0d4(;Ontpu8S}zRRIYIFwHr?*c?451ttmVA&lDj7y8vz{3+vZ@ptYB4#6NT#OoR1DWgY zBqkc(q(|0v7(a#y6kYE#iC~te{iY00)W4pZ68+^3D!N?Ae8ObH>zPdCFdjfHs5eP$ zgps6WC{{oab9lCdH+dk@juO&DS_{(f5byA`hei4^V<9;p>h5s8=z4`mv0)eD=QCCA z4o`G#Ck*P^(Lh$D-TG7F2-@a?Um4Iz4fFmG!qkjS-&mJa2T=2aULtE_bxfFgmsxCipG+zhbWLbN68WUj*pOK7xpL>u^(svvAXaG#opT%MUrp!MEp%(tc z6z}h&^dO!j4~<7m>H8C;pXAcx zx%31feX}XOGC_I`mp+MA4;cP22n~`&KzSG3)w_mQIFHpJjA;+6K_SogE1qvB%XiEe zrsOLVeK_8N7?8>;<;?~1X1WmTT_BOG$#r9Sahq6gsD`tt%WpV_q2>WF@qU{9!O)XH zdS9aqeRTIn!rq~~Zqn9!Kk)~_%ecZkL&Q}93Mh>n?R_%Y_#j4y)}saL&_K_m);p$Y znd{DFT>+7?2$B7<-d>QWU+sJXD@pu`gMjWvr8SxxVTu?--_I^>dpC3;B5;fztweym zXIu#bs9VthfiB*KGbd*D1Zb+@sMD?6OSs`~~A zRrfNW(v=fgpXw5QA)XIS6m0)9UnhUj4LY2y$b)Ni&MuR}i;GwK*X19g-GSX>a{w*)|9_zk0X2^M}> zTqs2{_iK^CVv9G!E@J^}+EKs1g!$qi2vzhVpj>=pqWGm;{0T1pq!2#_?NnhJj=n}W zy&p(+Dp#}rNJ9HiebD$`u4b7~vjr%XuCX#j@U{|z@%tB|3`7;l{22|Y zr&ig^)`xJ1TXzeCBBkqT5@6i;4sX2!to7Em=vO~a*_x+g*+k!Ad=(=erR+FjH@*N- zJ+i~?dJz+FPo$p>K}WFSgxGbjH%2l|;p@?s`}8Q&qPLf$wJP@wWYHL;M_%O*wx5$r zBUlTpq?brBX&#Q3?G|&)F&08bv_whdckw%61aFU-WJUW=sG6+H>^9~yr;mDhEDMDF zAmrXrKzWW~r{wq|&+#D7@sP;zCW{B8n00NUxmzu`e>w;-Lyy|*x@ z=>n}r`Z5f*tC8Lb`W$E%Xg6pKbTQ<+L1}-OKF}Y7(sQi`v=h_;J$<0#LFswz0bK^# z1lj|-2~@+h=f|Ken9}Bc?V9svTsA3Z98i|Om~IZk7evKH zdY9mLq6faB{Nf^+5Pr)r&Yz`V>v2!dyz><7d$`x()3E|0d+4&=Qtn~a4teM>{-ogo zX)`9%%K4=clevyono-)hLZNcLkmZVAcG z8J<2H0(16gBty2|2bm(0`4eQMzF8aWA)#jz(qfRoEJkzu0x}-bGoR}LmW|(Y_`M7n z+Rw-FP@Bq6Lxgr-f=Ovqjd-@Nsl@=I=*cu zKU@y@&*%rV50fKP(L0y?u)*1yZlA+c&K}16wge(au_QwKPB~^LmA`_?>%*AeHjq4) zEUCXbXz5SJMG5(>)tPo1_Z-xQSZHd#W(q`fX2O>tmAqz67> zaY_Fyoart>JZ-R-3OR}c8ha+d57Th(xC3&$J?zxS4k7K&(4qD*8Uqdi8;W#!4Gh?{ z6u%3vdH|JsGR^svL;E1@G2B1yp!+_DQ=>dXb3w2E@@A%B)EAr>HYPZiYO|bc*lw#K z)?Ei4sGnf5x?P`^|6aQN4-V(abo(&}L!3@D@@A(KGCy@XHw>}A z% zVv4XYIG4aOEaE$Z+M??jR#i9dJLy`N&A-#G9Zz%Ozu&PtU$$#Mu+#lEJDk}<)%>o* z`KCjA#zE*lhx4dId!5}!oX%IA+9OUUv}|)a|K!y6J4xn*)A@9|wlSS>6urVdSJQrE zyYV5r_IjEV|NS`4`F*=~kDcy!+EKut?M`gH*w27=hw~YS_9&Ix?Qp*1)ZU@n&m7KU zPVGJ?W!dU&3V$M9cA|q zr#XM0rahZR+S5eaOtq~-`MUaxDDt7x(naTqe$MSIB5C3)JjM&)Ub8oKCDndzD*__I07Csnu~F8G(r z_>CNnUPG63r`$V0?kB?@5K8(7pA9sUe4lVQo(1gc5Czlxlde9@G3b)>j@`mO zn(xs?^A@^QZ8*Jz{@K7w9Wa0#N#0iMhr z+HaoZ%cUUC#@<&6Z?WJjg}n87vlh4wt2o`luVC2~VfZLbj&}maD*-Q86ZMk#b4-4u zxeu4bQ`!F~CV#G$vrtM7(q#3eFKDzQyga8tO4BE2n|8itjSKoq6vFq3ddczcQs8M? zrY6UIsfS+eNj_$gFJ|%>t!2Lz8LnmW=V{h)g!bVkJ<^|2zn9^7$}~xYQ(A{OHxXjo z-N0!-W9$CPk1~1et9>=k5dz?1pm z))e?g;LOfqUbx)%`o9Ej-PfGXNl3OI`JaF%EBDhBcorrg$>c8qJ|c-9764D?hY)bG z$GZP_TMGT1OdgYjdS1wQQPz)ulOL@6ZRcQOlx)BDYk()Se=+c6c76kRvN*geg`S5~ z;6D+1toy9@NSqcZaj~^U&`*FTv*#R4z>?vY08du0tAUfBt^3p82%PF=-B11Q6#5?% z^49&}p9h|-+~#i z6gX?&uX5p)B2Oo9Dp&5$DC_t`;PPHkul+g&emDjGaSB}B%Tm=}f{Asqc3%ZNnLXc4 zf#-|yS?>QRALq|Pp8R0lhyK+RdJN#n?3s#3S~7fo3OoRu%I(DZAzim|qO}P;R=@$d zpZ)hz=y?`+GC%wpc(Qh<1=?&;mP#(b3lrI6J;&gyz?0Rhg5js0+t3U=nLUvd_=CWy zpIXm(c$(=~E#&tv11CGJ=Np`4dQLqD<4c%mW}m7?yBs+4zleYN+@AwHnf*(d{Hcm= zO`%_tJLXnZVS`?AZh+j++T+SA3}Kt~8n&HvSw)_*gZ1a!;d+u6dmg)8F7`bWTegS7 z!PD)%T)x2TE~~7oDDsv!SLj~1cd~bOWtkg1IQ$4(+=7ExQ7IYOP_jR zL4w8`)MF7W2P&x54DxO3O((0(BsZRyi9GD&F&wG4Kxg{d-tDw)f3ia)m_(A}3n7qL(IkDsO?Da2tqH1W;gLW*(nV61K{Fd08Y20CM6X$@)BY!O3rB2Vp z#2+Um9tL4K^+6s?kmS#UPW#+N+tMiv+-P+~S9?v0GX@l2n;{~4I6t3fLEc)R^whBgdajsD6b4V;_lgTkAaU`N{s>YnzF-4T9=XjjrdpUhcIOt5v#e5*- zTMilua9Shp8X80X+?5UCT=TRV9QGlg<>A`8>MLriH6~Ew3)X14)oU7{jMGqnr-*}G z5*RPi0{%K5We|5wbs;U6-XyeK+~%%q6gNSCm6l5yY=Phs=OVX0oro7G->y%r+uA|2}W zbujepRN61UmrA-_2uu5=oTN2Kr*E;6m)~P0jfwnZKiO%m|0-alTjrPFe2~PO6Z+qz_v1w}||b7W|X)|I?CReixLK{eh}198{Jop&wZC z%kNZ@%D-EX^0FNz|BT2l+n@arFC~_9iJ9aa<+7H)4QV7I^ULpTlD?(nrCV$HyMd|s z$Is^(B(-Lc@yDe!?YGwa;``uuLFw;M)yrD`VI0%r9vsGOPK`@0B9sc2T}mAoEE&#*$xtm)-8;IpjED z%`f?jke_tP`pfUA-6Fp%N6JGy;kpC>VR;EC{-jgnpJ>5lewA86jOSR+Nftd^aMAZ4 v8q1_TvR+tjH*LqQd1Z<3VfSPGRlQ`n5~DS6S$ByMeS8h)F1KW`u-g9vA4kzf literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/linux-x64-node-4/deasync.node b/task/node_modules/deasync/bin/linux-x64-node-4/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..a5610943ee8caff094a2ad3fd80bf3093a2d62e7 GIT binary patch literal 13989 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 literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/linux-x64-node-5/deasync.node b/task/node_modules/deasync/bin/linux-x64-node-5/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..199cd7eca56567cddb3b351b94f2ca79e84965a4 GIT binary patch literal 13989 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 literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/linux-x64-node-6/deasync.node b/task/node_modules/deasync/bin/linux-x64-node-6/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..787899ce5c226703774b5af30528019f81df32e9 GIT binary patch literal 13989 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 literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/linux-x64-node-7/deasync.node b/task/node_modules/deasync/bin/linux-x64-node-7/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..6b4d14ea3430760d85481708d2bfb7699c8758a3 GIT binary patch literal 14014 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 RmZr=9LSX$LK<{0F`Y8ovMl literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/linux-x64-node-8/deasync.node b/task/node_modules/deasync/bin/linux-x64-node-8/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..54c8960ff4304f2de0b06c5f58a03acecf8b0a7d GIT binary patch literal 14014 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 literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/linux-x64-node-9/deasync.node b/task/node_modules/deasync/bin/linux-x64-node-9/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..2e7c9f4e03ed8ecfc4e54b444eb62a375c8c8ad1 GIT binary patch literal 14014 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 z%0D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 literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/win32-ia32-node-10/deasync.node b/task/node_modules/deasync/bin/win32-ia32-node-10/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..2dd1c2f01b965f09d9d0e3e65864178e6e3df81c GIT binary patch literal 88064 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

)2Wc7(0j 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

IB-j(A2M)Gb8%r0A~$g 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

$8tuk&YH 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 literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/win32-ia32-node-13/deasync.node b/task/node_modules/deasync/bin/win32-ia32-node-13/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..a6c722fda1795337f9920de5d3b098899f752093 GIT binary patch literal 418816 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 EFDT`FfdBvi literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/win32-ia32-node-14/deasync.node b/task/node_modules/deasync/bin/win32-ia32-node-14/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..c2728ac64a88f717e656eccd6ea927d44919aee7 GIT binary patch literal 446976 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 z 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 U4xHG56FYEX2Ttt3|9J=g2R{GZN&o-= literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/win32-ia32-node-15/deasync.node b/task/node_modules/deasync/bin/win32-ia32-node-15/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..2961592147d1c0fab155c8ba2264c1e4456a83a3 GIT binary patch literal 94208 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 literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/win32-ia32-node-16/deasync.node b/task/node_modules/deasync/bin/win32-ia32-node-16/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..1ccd8f2332febfa994d820ef704841b2ce625f7b GIT binary patch literal 94208 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 literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/win32-ia32-node-4/deasync.node b/task/node_modules/deasync/bin/win32-ia32-node-4/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..a8c55fd8490f05f7443cc5fea459c743dfb8d3b8 GIT binary patch literal 106496 zcmeFae|%KM)jxhWyPIsthFv6qAOQmeMFF4K1tl)gMA;--0viGwA|~J?q}wfO8tw+H zBqZL%W^>(2TWxKnRf_h(*0!`-z#o;}EanFy2ISF1hz3jT#7!j#O%@2b-}jljn{3eb z)93Z==daI`*K6;bIWu$S%z>Ggdmkxhbup@}X~3-uFP-{r5fi;6q~Ce{M*tbU&E(%?Hz#EH6rX;Gy*! zZcI!ZmmVhl(#5Lz?3t9B$nUp@T5B%D|Jy^Mn(uP=LQON=h3ns|3G#STYSzR3OZ(-T z&$xTArkA^cu-n4j72mwyNi_da3G6mOSgO$rRkndukvKg<%!~w$Q4rdI`9j6sngQ30 zUk~@2IUFMhvD`cA3IdQ+iTH~VvNb#rrK1GgRh_i2YlON?L3qAiBg~=T4vo-**kAes z^5g_Tu%8lyMPCXWMKFtIY+Ln!4bVG&%N6)=k{iVhTSUOVR(yyrDr=Z;K>ROF5Z2vT zx&A)!K0(;>E1-JtdkMe8_(lC?qnq5QMiY8&Lcn%poCJ3Z+^D~7WOrlbrpo()<7Gve zsk(&6zZ5U~#>x#FA3{VbJCA%7-0yuU-W|aH@87?n1_Fo2{$1&pHDfWdf2?1b?fiwt zJW50MH|vB^@8LqPF5Rvqrz4VVP?FQ&mPAu%#h&RiQp<-{%kXQGkySF5HpXXD~-L2U}MA4f)^zgX> zzebENX46vzK{}|DTi2F>OlvHK^B@P)hJ#utgo@RwdHxE1$Un+YL%SF&Yg`&7%yX;e zl`-LRj&8Itp!cuvOF2aI`{2~E{8D(B-=c8P2*0QdogA;s-WqNtc?tYxd7PZ1)NYA; z(;W|lL0(dq5Ku$_hm_v`F(FZpuj;6CTyy zvqr|}FVE{G zwufQVe`R@jdl{p`qdNOYdzz!dlg5-+rJpn!4tnQI4+-Z?+cf7)HQDGY<)-&@MhH;+ zNVuGB_T(VKNaApQ6fXOTLUafM@z<(3s5YePJ$z*hH9UGeQvA_8qT1&l&YzSbdOUtK zX>7w#c(_FZ;h>QgY1Q02mcNmiL}geFkLHi!|IhfN6w&mHdUv?-{Qo z_tRuI!g#noX)f(UK-kOsQ-jZ~381m4;dy&&@Wt?^>E?>!9hN6x1@P*&M>>gvPrGN8 z#6tNn_<2`JZUhobCZ8up>SKa@hq|&% zqe@W3M-x^k$?GXOn34_}cu@?rrXUc%WRb$q>(#1q$T!IjrS>~mnv6t1Uh-H1t-WQ+ zY+9Ij{YL7J^5p9q;z_=xL^&YGV`Xc~j!TbQ9OKr>ISB!aFFHQa&s9wO>~Tb0`Xo+1 zB%RWE4AR9|F+sW*BgR^Ml%Jf-vpo!Y{&ekPji~*aFQ6`(lKVX9NaPa0&R!4%xg@Sg;pIG!Ww*{*27m^ zBlSx3ijisRU!k}3-%Kz6-%M}GznNb4znR|Re>1&B|7Lm%{s;7E=8#unwoR(z6A1U~ z>PGt0e%e+$2mU-r+Pc8FaJT5Ek*%%!>GYemyuQ%~*QAF=3SD z*zh<0ak!DwHzE(ClDvN;-q`dVBlvJ}uAqPV{}A5ukHg30|H??bvH9;A!AJ6^^+K6_ z5_lCu^^Wx$OI&#Jn%y}PMlsa*$478u>A&t351{+i*Sq@vWBKo9}#w;mpaURnZH}9 zeHbgLNvVvi!bpy!0-u?qlM>M+V9j>V*7PK0Wjb~>y0vA}!7KWk)R$JYN}kUvtIJWW z{I?w1Z=WHU8+@kvk1$S(A$z1N$r&gN&n2lC3&7Lxq0p()L8B{1Nq(HX*i$0ABs(aC zR}54IagZt>L6RpaPDaB(MEG!0CJ0Rd?(!KK0Ce*~nkN5kSWS;;6? zlGmx>@W9C;e?f!yrM zdr@_qhOi`F$14#`?a(mbfz&52oCCjmobo_|j<94;4bO`jtj zOlnZjHt(aWCV|F0H9R^W5-6{dj})V}<{@P*h_5X}EsotUI@wOpPc|cz>xHDP={k+5 zxA-upIzZUyJWLE!8QEJKQ%}1Ulc{zPc71Wf}m7_juMncP%A;{1pSF1s+``J38L=N`yxTq z%X^`5cB{+`2^ih&{Bd*2(lBjoFHnNUK>HwH+!uF zQQi06L=g4t-s=cjPtY`isH65yB#63PZ#+R21S#ke`$dBOPS6&Df&^_P=oCTJHoYGZ zR8P=51T_*AAn0*|UL|NdLBAvDNrGM==xKtUA!r9d-zVrfg1$@8^8{5Bw40z!1ieJi zHwoH9&{~3CA!rpr`w99wL2nS0Ly(W4TL?Nx(0qd02%1IEVS=U*)IpGmpyLGT3F;*1 z(q%v=2|7zq4?%w==rlpy1Tli%BdCv{c7pl|IzZ5Qg8oQQh@f8sQf3ple~A3ga6f_j zY5MJzDJIQQy>)=BiH7YMSuy7Vy)RFM7Cri}m^wL4j!76vM%gbP)wWoNs|?nV=}{*R zW=yZmUjIvtS+gnb-1EJYfvCGsiym!y^au$Jt(KM-P4K$MBc2(VXiSfO2#F`0N-#

dkqxRD>vP0>N1v_ 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

m%LL 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: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 literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/win32-ia32-node-6/deasync.node b/task/node_modules/deasync/bin/win32-ia32-node-6/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..3729028e97a855bef929b3f33aea50dd2a916998 GIT binary patch literal 101376 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 EpJP{_w*UYD literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/win32-ia32-node-7/deasync.node b/task/node_modules/deasync/bin/win32-ia32-node-7/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..278c54dcb0fbdc0bdea60344d132e66daac03323 GIT binary patch literal 75776 zcmeFadwdi{)<4{n%p^lHVFpMbV30w=8aKj52V8JK6J#JN(FuVWMonOMCB^}jg>FD4 zkl2Z4=$)1Qt?uRV^2p-uvUm2;<>GaQ!CVj_Tvihy8Wgp%9W`PML1Oy-p6Z@l#JxQ4 z=lA~iqUo-#%c)aUr_MQb>Qqh9ZQF!IK@iON(=0Q!0k@(;7j_*Y7!}sxyX_0aKePv_|-Xo^BMc4E9+tCXCJ{hI>7q(_Z zzK{1^(z_8W-hZ3^R&*tQzY{Iz@5vGUeTsiCzWWCiR9C!ZUXLIwG9?MiMrACE$F&Oy zlT%G21>sr5)akLkh&PVgcfeaI0Vk`ejxr>|YN_6LaLeS*H>`Nm!Z5BXNEz7H9xj|B7; zZ%gJy`Q{A)|NjSv^uSW3Qz^3f{7R*@wn<71-|AF6j?lt9#giUdI3v6;)9bI8GD>h1 zvoy>ArAt2GsO=HcHeYJr(^Gv|5R$9ZG0LrG`yP|GIGEsPBLEwDmMisTr7-~4q;$n& z)g*@|*|arT+L}ye1|a!BdTnI0)xIZ^Mlg6*pCVbc^;z2bOqNYq$}{noB?JOGB*kNM z9rL}iDJnQ>BcelTR=UDBnYJd(tBFYGbB`)T*6=)&{5`WEf6pd_t_l@c2g>>UF71^n z6ja_q(Xo2bgmNW8-k(tJZjipnJ$m#@0$^TBD)z6bz!Ll%Df!%N(JN>1vYf6cFK4*5siB z(GfE=DcfICOdWK1G4+mQWjEWwh2Jb&etYTuY=MTxV@vfo#A(V>t8$Z7nP;0)WSin~ zq&A`v^Bl@e=~Fz2a=7O?B#Zl|bkTfuq%^k6#Jf}ObUfp-nHTtcWIGwkW|HWXyhj57vr`#2iktTN?;(%2zju~b=|jdn|da*IPL(CmBilkK}B zbN8TxIC1W7dW{X5!t=A8-ta9BEkl?Eq~~X6siU+X+KaV}Q{Oc?yaucB42xv{!=Q+4btIr$o1i-TmgJ)IKw6&>=hr&xoCWkk)Iy+rkl8rjdWu>6q z*r6f+xfqZjExsx#g1)iTnl1&gw? z{9y|zb6(K5QIIx#!Ff~rCuCqX?# zk<-k`h~7{RDMHYM5jqTj^Rs7wJjZEyel4Q~xsZ0d*pG01nK`kg$oJhe)9rvP8Hj4C7kxkh-#J@Bt33)dGn3#Q~o<6i58r#vz zVL$rpN|dys<;%;^n_0u?tKu0z)H1S=8lVJuQ?}V8T3nI+R>23rwu){-V7-lvyM(3{ z4eW#p0TY?x5(navT#+&q!ANKHMFa?f4yqr~^Cxn?giM9gkCpIjS1$0}TkIGCCT{1I?PI`=@2YNYQ&10i2 zf}mPhC$t~%C3O-PR#ujYjti&`xzZunACDl#%f^Ar1xokZgrK7$$ASL*GsIm`VEKR$ zfEY@4MLOD1jCla7&h!3rrn=IP`Xw*gq`3Q1>bd+ar@;Db_1Sj$)78}aDh zA{ynT(Ab>+zf(d~)uGo<`+vEtP zT}jW39C}X7rsqs2J?CcOS^lGpLjFpd!(S6K`OA{dUsE0YHO+?ClaE^R@lrg(jv4%I z-Z2aBu*bS%K7H4o>eI9aOBIOC1SM=cCGMDmuLesVo`iRUWd={B`Im2mg63tbB0@ve ze0I9gH|WLf#BJpENkL~Iw-KuD@kW=0 zqIe>{eM;e+#76s`g7k24W@0k}NvpbY63@Ed6vsoKbl+rKn*tRqah}cHxYj1`&vCyg z{R7OrG^XrV&$B`dE2enj)sfhp+leLlUh#r;C|e@)b#bmR{{U&J>8?D#GgMCiUOcaKvMk`D+s02h&tC2m=NiYsPp+ShNW&l zhVoUyn2)F2sKv(<`ZAPdD9FG5^{-#0@_Gb{Aa0ilvCFx}8?-P|kPii|6?Mdu6k=}R zNqdWK6NK{F7!biBt=Nt=zoU9DeUJr0x^*Ac_eie85Idv-(9J$d%Z+-A+4JBM#OK9t zpUcliY?ULkU}sR*v7>REssu|EbDNzB2>aCL+gqkcYq{pe2su~${1mq)lF z`-qMn(bo!9bE(e-F{!H3CP)}uE1Qb}qxX&Aseype(Y%)wP&oCFd>Wz>^e*>mQZidH z5rmVfclH5<1L)dIBIlZ?c&vOX5Udx#ANA;#LLMo1rpqh4(LcQc2krB}ddr9TFM=;a zjyH&Dwe{kNbIm(w@~P!vPd9i@P6W$1Pp^xHqfg7o#^+TOaO#1urxTg7C{s~a*wg1K z>U0(LxfQ2NAFrY3Q&sf*+a`Lxyb;gx zA3gpoe}#X+Ur&krRlA12e!ZH%{#1e2laJOuiI?IrhiV@~AWVU05NO~S5Ytrh`-0w3 z?KYme)8}PRV;-RZaB1-D#Kg{T@ca>UDug`GYZ-ay7GHRocJ5@@vlDYeZ^?v{7?=K- zE;quSUW^6_4seb%`|jAemP;a&E!4=e+lhh7QztQQ~iso#=ai=yDSp}}=ug1Cz zf4S{gMsOMgHMw5%hE_67>Qy{_#!RC2dAjc0LFLZIKwEc$T<|Zj95|sR#b;@l<*7fS z=E$8_mbgydFk+%34~!&*J^Fyo^+fcYys}epMdUO}N^mv#{Go|dCR}-<#QrPg^V>to zp$+EHt=5p=rg%;$MeX1-)t}vc@5&n$ UBiYr&ALd>+xT)6UHDYfxjYtXc8LQ_zv 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 literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/win32-ia32-node-8/deasync.node b/task/node_modules/deasync/bin/win32-ia32-node-8/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..11a6ef1df0f0660a34923dc2a1a050b4f06a15dd GIT binary patch literal 75776 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�d_b{7K>G${4PxJ?7R%HjzDayk2(#7y`V)! zK{1d88V$LiC6v{8FcZp#a-dmIE>r*&K_yTHv;?YymP0F`RZt_e23iZPgVsYEppDQb zXfw10+6rxlnxNfKGqewCfet~f&=IH&ItH~vC!tf&Y3K|T_9A(JVxU;a17$$7pe4{c zXghQSIty9$;0DTt>Y$C#Zs-uy3bjF}py*~TYA6&3xu9$)0Ih>|Lnon_y;_tL%7K}eKP=H!AbLIq! zip2uWoH>PgRRL37Lm8J>2AxSbC8lQ19Dm;2VsT#)s7!Q%mHw(gWpO?)<>t((E~Bc< zqg86AsU*Zw=3gjrTMGOo{(xWeqW1YT&BN=wt5M57{HvkcZr8N(3V&rDaf|zS+*}7< ze?4kM>mpr8sa<2(U8mguj)VwC^WY!nnhzWe#$BsvcY(8^CD1i^T7u#_?5~I7p&Ou) zkPlBD0=NeC5@Xwn_J=^h2Pwoxjodvl~G!5U{Qs?yilyQT-sV*iKQw)lg+ox ztIn$|Q0BszvUy5fBjo}IFsl~kVw$Vitk{CX-nQ5m_zUx@O9Gbs@-ow#CBLM+s=898 zOUf><^8EgT;rH}Thhgwn64f1lSLi*hyX;lczdn@Qn&QepHMuV+uBs@>%lDVkuUSg- zDkOjYBFncVp{JW}-dMVm(Ibp+N`{u3UtY23JdDb%E(lmEjq$=Lj@`C2a z*HzlVvJC3KK0v9@Qdbq@{i4)z%S+3OEmAkCilxMJyP2VCeUF0sirsCu_prrpX=>j)h72~{7bh-J~#7G{$!n1D(w^w@&6jl233e09}_CJ>4!z~1>S+Z&8mht|o z{L11A)oeA(SZT`RO7g0zde~U<0+zU5c4?KBd5hpj&}l|7O|LS)Xi*PO*ou95X@&HR zmYe3zr{}d~(w_w5lDB~a#SzbysFC>_4@Y}+saK;851PyFKvVsr9_q#(YS~g~y7@^D zwd_4K&A0UFR`Z=?mw5#7$Q+|TBy%Zq2IberFzYJe$0bqamFbjwR%Lm?z0itDjEzu8juv$>B!2#Yc|(R4^$fJ)7QSGE2HdLL-#@K;PAUGy z{d2*vO2KJCwakCyED)K`m~$FI;Uk+wH2AAs2web4p87$ON8y8@m{RiFzqB< z@hd12LJ3zAB4!ss7Y9kqWtmW(2h9~Ho-raxqqdWR#6EqLgHKom1t?z^R#LH3hgE)Aydk0 zwDJCYanCrsNc>b93c|&2ei4ZOV&NnHjdcfMkUGq(=T%oRk0GppzjUrKFDJ}$Q4y|b zB;j|d(A1Kvga2hKRk_C#t0(3?+LI2%)6;4%`3l*NMJ-W@ZS*27PtDJ6sDxPk= ziceg1o83sPlGX`?HW!?XUg}&LHBeCWlByexG%6Gxr=gz*PQ#zn)tl%sBrj9Qdkr`q z^L$W+Uu}dc;iz~j@h$O~`4zRSv&?vljrO48G>X!Qza;2h#a&JAB}Ow10b(o-uJz3H zly~V>x_Y`W)7aZAjU3C96~xKl4e+ag|3$(0MJK<}v{bQ|pQX!0Tq&0sT85TFno9Yv z;wO(EZpUlW;hTEmUSa(NSs^Fnf;>pXru}~c3gfgIzV4Aa0&w>h|5-0#I zftEw7pmoqDXgkyb9fM9o;jgjgf?^;G6bD%$7nBNRKv_@@lnWI>wa_YPEhO$YK%1fM z&_1XQIt7Kb5H4ha;vf%H0M$a0?9>DB3=(-lGpHRTK4>F!8WI_U^$=@QXcN>9x&91) zp?1j1#lIqt5IIC0>aUkOh-n4oT~2Kf$v`~yTH1Di_FjsKDMv6R5Z^9?kd`Vn`+OmM zeLBq1Tgg94f-#Hq!i@Rb{FRW0eBv%4<%^9p6dS#onFAHpx2OO7;Yi!8B1}o0;oIV_HFB=%iTF0l`TXgYc)II|)KBS6MM`GM&yJS=z{aP*d=gQ*Fm9oXty7Gu=0sr%eQzU&7 ztCYFq;;X#-`fz*axPWv?O)n?Rx%}7u7sF9ys5mEimlEmSYP!qRweDXZ>fgWfGyPlse_sLWmfc;y{CnU3 z!HSjlG^|?v!yh&N_$NPI^Rs(@zV^Of{Bqs>zxwt12OfNA!^4j}y795!{C3mt9)Du< zlfQpz%O9S8X6v)t{BkAOHN|)Q2B^eEO45JI;Le`M=J7@nxqL(kC>m?*;wB z`wtixap9oIsEaPXBzo|rm&IH@_+ zT*)bJkJqQC=FLTzTsW_&c>aQt(z5c3J1VOJ)in!i7cIVR7JEf=&u{rCJw1PK+F7P{GDkx)r26z*g1<`KsZXkFFeFWGB zUI?B92Z3k6NHFa0)CVvMya<%J&BdV1Z7uxk74UPa?z*z7II1+3JuK`bkqd={l`T$0N z*MTwM^P)4)^UIPfeu9*jP&MWurlZ~{0QoCvzWN#J<;AYSVZU@JK&ENvC4Gf{9 zIt7M-XTg48_zBVhMuP)D3m5^828Vzy&<$pR3&2^R?2ae_!@ydwAGjRs4>p1Wz;$2* zxDgxzZUNn36Bt5=*8+xtN5FnyJJ=sQ4GsXcllTWCz#(7^=mxD|2pwZ8*dNRU2Y@+X z1XutL0V_Z^xB?8Jqg)I22RDENz|G(ga69M*4}l>T>J``@JOvH_&x$=5{txV9Ne9>; zj0FdPR?rQ4#6FJnh&`Ai_F#dSk0w204lWUMaD|v#X`f;at`~D~lbAbcpJEQ~7IUyg z%w6zH^kBQ_J@8BPp!QGnsqhON0LBQ8C!K;Bq*E}HbP8tCPQkDxv{P^hSO6-is>b?K zq^26{);t5vHC9GYBACyrSss!5C{*%KktWF_>s*D(o$POsr;s(UJVm%rD3WFkTjfsH z?nSyHkI1p)5&4QdRl#w;O1mSd7pX682Nw#JJ6WB} zQ%sKJk-a$bRCVP?rK`k{8q0eSr7sMovnH6oBIF73(T49wM9&S%Yv&>O(wbo`zcLM7%auld)LpMZA`7)CQ>w@!B{|##X5h@krHW zTo&1)sMAp^DdR+AT`qMY9tpdQV}w4Gt?qInZ!E_ zRVU(E^^5y5QYUH||D|rkBN-5LsUMPN318|+JSuS`^+ePXzSI?oOWa6(k^D;frOw2Y za|x#kZiu<$Me0sGDWFNA7QfksU#UY9ulSXEBDJ;+1J<5=T;n$#@`Q}`gV zMd7D}FLf-QSY_@a^-R=~U#V*nrleEqTRbjg-XnER(kX8Qq~3}8R{k^51%l-)_0TLY zsf+QrmUN1JJg%jDYmIy<^~8u!B45bk~T?CsgdT%Mw&(9 zW|oW8ZHf05+(`Y7Ck0Yxq>hVP>Xp=UQA_wz*M)EA=0)nhS$1=c^s9KKEtqML_F$@| zO?0bO9g}oQ+c3>bjj}M)FXgDzRXzMlo00U3-+Uv@6Ddh)ds2?7EvR;6`j-4idy-O? zT$}AmLXpzds9`FXV+}4!Jr*7*zLy$2onr7vwZlo;R3i+@!#Jb3r;{IfR6f&VS$v#XT|DHic)ZOjLg|Hkgi5#xk=7 zm~o6Z%2dTM*(iB44%HV(9ID(^9OH~OukxqTA@3xl9MkykT}CQCRRU&wlZ~_}zD+W6 ztHRAP%vHFPjS^6N`}%OD6{*@{hMR4atqNDwSrzVhBTqfU>RkqQ|%0$|t$uH^S#gEwZ_M=*&O7mEw986wFn^5)dMkD>o zO?I%(N$hDxIVd-oM%y>@F6&Dbj;hJZ&36phvvQLaY_Af|ILge7E3HR)OgHMD@;kPN z`>Y=3Q-ftG;iz6i#XHUDQIt9(ST5pbN^pD;b(WF-?zxZv{7kZ-86CC&4CgJ-8425!ed81|9?d44wiHfM>zS!0=DCsAs`w za5rcHkAR~==?PrmK5#rJM}1_0&7jB}t_5eImk;~`-~zA~^Q*yC=<`KSdPBgq=w%Gv z0Nx312A=`zuHt+}Fdd&NRC(+AzzY)F2hR&dW5De?kqJ9iU zfzoz|f=_{Q;BP^ZG052JMBe~z#(zI>JbIB~Y(*aqW}$xwoCUrD7J-|<0Js;d1AhXp z0=I!{!56>{;1+N*_!n?H*a9|#GQJ-Io4_{kAlO8F{lSyy_k(A^x4^J7TGZ=c6!;Q2 z6#N4i2kro!;2|&-+yG{RzXNl?x4{DNr(gxx1}*{r2(AEM1=oN_!S&#q;3n{|;8yT3 zxEp*C6dBYAum!yz6xou4BUb~4{XQ%Ag~ENOEyD> z7zyq}|1+=^oC==7oixy6=w*J`N;vW0DfH61&!D$~XVKS!spKaG4F6n@STF;7lIqXYH$lU9Sq0a#b6Wqd%=BRHrNXO9E`&L z67U%M)u4rV62VjG?*e16j|R`8pCR_>2ZQ1NQZmD6aIKhwt3WIGYcLhu2*%<5QZNgB zj@YBW44j2tW_%)x^ngX^zXt}uN5ML<23!TM15@#LIk*=6ZDNmpIJg0Q0k|1_4r~H< zfi2)>unpV_o&sM6wX>Xx1Z3cU2pENa7FfXA{#|e=`kkN?{1cc7J|gzueP9;;t^k*y z{{^@Lyd4ZD9}aL0`o*BgP*cJ6=#pq~pC;r=QxjGK~j!6@821=0Tsj03+5Zp7UvFcp0< zms0Af-=?n_wBcB>b4sb$_|nwK-XG1YhUFqajJX)db| zQ>|8lDy~JrG|T!*&E)fOS;^W!9%Z8bOVF8XNRf%elQIcY$pVy=NUgzSPl=ezJYz1t zWRF9)UnMV)*@>*3#7(}zABi^}?nr)>?4W>knW!Z$@o%ctzB^?u|E9U@{OMLp-=Jg{ zvPVN&n9R#$%`?xK<*2z>9;+^Mt~u98hcZ{vE>kUOQfiexr7kw&R_ggi87OsGk8moC zdZ5geq(-S_H-#Cdszb_ru~GJF?j|K9ZWJG-&MI}jQ97o&r+K$~+0$XVSNj^3d-*rb z=NUXz=0!%CDRn99f74Bw!Bb_fBuu7S_-?AZ^qUol(hj~qqZ?ewx2i3Ah z7hk4qqu9v1k`F0~p^`BuDVbWQD9M~stMW3{()N^E{!Mj>QP#@5lv-!5*HyeqPN3?p zl0T_Eol2fzn#NNcZA;%m4qL%cly|PLMlV{WiCHqm5M3HO8!%fMfT8FE8tkg={ zsrItWM^+^=328a9XULS1EHLVol2xemm@)>X6L%ulT43Z^$x;>={f&|xDM_W0DJkit zk}IhCs$@Y*I;mtJDpa*{Qc^;Z9ZDXgeXCWNw0KipYLu~(`N+R1i&K(XC2vq=rqoK3 zt7H$R8{v^^4@!ok;!<)vCFxaiytzgmm0C%D%{9F2hmyzCtJ>eKuP``j$^ezLSjhmD z#8}CBRJ=+?pz5Det8^;0{L7k2BU2ztT6T@=!8U*?lc?K*?tXF`6<# zB~9v?XJw-Pd*(sONo$Pys^pt0UbP06wkR#r+(RaMslnZPspraVkrBUA%g$NTyvk^6 z$~<87<4Sg_;wdSgXR}Ixy`EDt#pXGsJHnL8M5XKgm$P)g=BYEyN!tcJk0jNFmLa0RjBfBnk(#1e{XYBXC0?h zCY}oVKeaT(u;|9mUj6xt(JK>Dz00mG=>OC3rs>NQ=GW~V*>oV`-XneHpVd3=i@EF9 zzr8dy;mL(ZK3e?I^WkY@o-bK^tID4lo#aV!BoDbe^62Z&ey{M3CofDjOyJFhsU3;q zBGz91>Ce6h`fSrf{k78Js)yH+A1>FTKK}uShd@_i+f6}ak-N>ypQ+bffqnjq9iKm>>z^$9aBgBa_8;7G)n$+B zZ)U%y5Bbxj*zf7n==+WS{evydGY{|;ZtAXhhy8c@u;F=5QQT&|ChLi~ zhL6$bet2@&x+nER)2Cgfw~@Xk{})#beoFt@yj5X!?{FDG?hAFJe!4~f_~E&)Y}(Bi zwsps6SM_~b|Mi^@jCgI=WrTO*>V*rQ(HEDkzqmbgDE^O48Tgm2`rVmR_WeyGKdG_9 zw>Y-x2{Y$8D?Uub|D)MY|Ll+Yo+&l4vj<)4<>h{#Yu?|kzx?u;yRY4U!lSJ(*|BBp zbNcbgt3QtX8(;J0&VRD+>gV-G7e4dg!$0I}UyJ93UzRrM>7O6{=jvs4;pZmbg*)`e zPu0Jie$Q22ttBv6-?~FT)cMm7FCQ3!{-(ZPPTi?DEsRU;zv)Yl)^>WRwPUBAmOtde zJ)c;;TGpb-iZ#3Rg32L_^y9SG^;@O|uHCIWzq9>?{;vu@zWhA)rQQ0}qW8v*vyAa- z*8Ue)&wW9Uzw9?poqQYr+NVQ?eDs2TNuDqMiVt-3jh8;S`bE9vzI)G(Uh@wRE2xqj z%O3re?9{m%EqocBHMH|*TlVNLIDT9-I)wbKf3@&Iy;=YDh#!1^$BP_*e`-d=pnc8y z+v{I@V9UGktL5(>ynV}F{cmlZi~Cq&NzZ|a!;bIOEwLY!402FEQbQXyl)a=cz3uvE zH=S_c|K=B-(O%Z8ep8THe46+wK3nqMikJ1u^|ixCbi%LHG27m~V4uF^Pt#u+{Ic+` zKV2lwCIn2 z{QRA7DfB5O31nPV3&gX7O-LE%n8$Q_20yl@41V*}e*Nu15hKRrjPhz3 zV{aOC%>n(hVH@J2?ix&Z7dqNHDKDo*B0^SXgG zJN|q?e?C0&xxc=jLVft-qfbQ~)a|WLUw+?DXwP5Q|MwU_j80){a6Ad(srEOFp3lU# zI;A(UX_(TRxc<4rhIDYG=}la#DZPnpTj&pXOsp$cdJ`?zDZPnJ$6htuo0$7+ zr8iN#Rq0J^yh7vn^;k*^d@RI zD7}ew9WNXHP1Kr{z6-TBJ&;!>%WEwUg^6|)G7XU_h#2Sljn7)O!jf|10FA=DxyIb2 zw7ft>!dgjznsUv_R~B=M7FCopYbnHm*cVm??H5_KIg4yinKp-skH}%>l=*7|d4*kv z)kI?!rG*%>L%CLQ2zt4YQDm2L0pu`Hfid6_P-Mi%K#>if z1c!sC!4cpYQ08c7!I7ZG{Ug@^;UN4q_zsT^6l>NEOMA~DwK~}`aWgZ%blxn=w>o3k zd6H?oW#n7c{5z_PEB(`Mp2>&(3({-zORB4iYy8^H9EZY50$(wg7-q@efAI<9?4*i; zA%>han)ivlf?@Jm$#>IZ#>}d!%%4?20v46!kI5IgOi-g0m(Q;<&ty9Hd?pF&=)2Zi z1p7c^A!kI0<~%JX-F8w=Qb%gBt3Ag~%6>&CvUluO1?@00o)!uscQhOxqx9+7Gp&+= z?+*%Faed!={@7P4i1AoBz(v#4u~2d%)QsZ1aW`jc!+V_;HC*d6p;&#(q=oeIOZaj~ z!B>2Coh#MLYoF`2$;J7VjR0o3G>~}@1og3{M&F<{!FwVc!)Nq?yjT(EYt#eU zCuUY_e&IaYps6P_u{qcllck#So0TJRjPLC(M;vDKHZ#J@>}8fM&a|xFW`?_5F}smCI8Y#v$NLiw z#W&Jx=wqvDl`+$`5Tn5;cd?75{z;gPn9KWt9_BVN??)Y`y7n}eZdr3+9@5)9SW!vWE0>mn3GJF}oQY z<5vs~yCQ`C9KEWGMx3KDi|#fv;!G7Y7#4J=;^h3fGcYA+X2hvkL$qdOGGl_})tuBT z4Mts$a}j5M+{{(yEofOG+6swpUSV-TmEy$;%w)_6n#n5_8dHd|cWX=~U1O}(DBoPn z>Lgvt%t*iC_MAVtr9q5Zf@td5|7`TXrvA`5_D_F<{o2dfD*;KkrvKI+{&!r-o&ZSf zj|I)o4gV9TvVRNw2V{nGuDd&3z2iC8{?(xU*TwS)tG?er=S!!U4^97O`?&GnY`^kb z><@j5{nAOj!#_8Fld^l;_vEvr|MMxm?a%dp;FfQ;|M6|g-sInw9_1+E|7`X*`)?2W zKVSL1Sk&7;mv|cW(R9DAytn=CbL@9kDtjX>s7-(8)@OfJ?{LoL!^}W$`*YJV>ASt{ z&kcX+vflRRhTrdpz3qFJQ}KhmvxaD{n)LV54@mzY{h9Pt|L!AwT>#n!orQ)EMh`VZ z$Dl!%hG>`8G5Xo3{{dkqnF22dumqNj7e4HC7icqXmV0j zDBT}{k1H>e2}7#s%7`#6y=R!F6R{!`BO!Ws2)(>cOCv^G(2=H(;{>gMKO?WKpv0f5 zU>fJK`Hg&i2e-IZM_Z*9lMW-xy%Oy-bPgbx@^1`r+&6@n;m@lGMs-f0x^6o+X;ahE zgZb30UuV~Ytu`}daAZPtnQ;VWs;S6kR%bB3CtEq8Xs$n4UZz8XAuzYQB+ucxk$t1| zO)tH|?p+JM*2!0DLtb|CDM$_0PGLE@>)8T(vAipcZ}3mXax%Khrk8(J zlQ_?{XM}h#A~Z6WI%f)L?e>07RqVFt6|T+9+d1hPS6*Fa#?`CN8i`b?flrgDDtTr3 z{$Q%kb=jS|V9V*jt#3+fSNLBSZtqs3LhKdsxrN%Db+gf&>)eR1x@L|nrFmqPJO?RC zb%~$zP`eNH#YON8Pvj`&760x4^xt&X7F?gd!+0a3o=L6fk3enEP{zj(z^+yQ7|Day zm3q=`NCxKMB7?cP`4q{S&`s>?>S6Y|1$)fC?s-q_c>Z&KcK7+&1%2ogCL6Uy^>=BS z_MP;br=({(>|+Y#G~T=WPA@AmhSLJXMI1-Rfy>A-4C&jrzBKCdTKAW*&68h(2QcRK z&GuK87SnJ0yUt`R4V_dK)Rb3FVECp>&*IQt4vf*_!=_gID;H(?D~)rgX{|=%M%ppp ztD$qQ%%C2o*~V#_7;1kJ(`k!1-?}urxYVCkC4v}HY2OL$K2>^JCMRGsXcuVnNYQxz z-0FGr{FP=(o-@J-8k2UDwIk0nr&} zZT~7nAhUQb$9^u-?w3>v%hL)9U^J51M?*8q^LXuM*r(T$#@~hA94MJywy?OYKpQCK z+#^>bL((Pv=Oj_n9t_R&=hd8hJU1s>hKx6kTRzvr)R3Nsa~5{kT>R{H)$~z1r>sv<}5=z z@w<$iPUBp3O-nS?H~Uq-hfBHji0x=!?v`Sq^Jjs*U3y=-_-wYg2K^M2t{oYG2A3mBL)*LEEXR3AF?= zQ%eoIIj^|N-_^5d+K^DyP|e}a>PXbm#?MI0nq>A!Ed~dS)@+o_1AS+xgP*C<0nV(| zw1-R+qw~gG52Hs=W6X>k6AX?89)@=hYl8De}}6w)Uwd;_w{+`AXueRa^` zBX29k0}m@)_G@;e^Q7KYXW&NM?|A5qhb+qaEC0*BR7R;m{KLQLJ}v0}Y23f|;IRjX zXn%XK{XzKxp!d@i{#_3kKBgiIo%+V?H!RwmH|D?bRk7f*gROsU`%KepcbPtWhxfm( zi#qS4!m^zA`CpIgf3T19pEIQreg1Qh{s(93e@D{JTRnnp^1Ri<^1mbY|MOw|-%&B7 zk35%`A(nGZ{ylvk{GD%H_@)rVpNu>I&LeVSUZwKBTRpLi3*p>^{%y20_{8Bp0{7=5 zQx0vWrFyNYQfRzX3mUbu&!8za z3Kc+QP%U&fvu3jvf>c}H;@T1r)Zk-s#rDxQm3)LxbN{PNP2 zysFYMHMUXQ%2QTc$OS|*dd5aj7K?{ViK>iy$AX~^|CZ1k!wrA@N0{()m%HkRpob&uuU6wtq(`)f6lC4aCjlaZFBLCh|c~xplPvs~}b#Yq0+#uo| zRhU;&FFC)|)QEulDJS;7wz9!z*T;b6j%gyRVv2_cCC69*>_OT0GG zk?2jFm^d}@wnTqodE%nP`oz_VKTmuh@wbV8NPIqVZ{nfEFK1` zk`5&uO&a6+j%&Ir-&O6p$JOk5Ao)=8@RaLQ5>vb>x2NQ%6sMG@RHuA5dS`j>@YZ_o@-}*Z;r*94+;@X7$(QB3$M>-BNnew1ukSCuzWRmwReG#`ot~(B z^f`K?u32a^@X&3&)mmV!wl1^YWBrl!57uqgx2+#q2idZ0vu%rP%Wap~huUN93+#*S z%k0nCo9wUHTkS{fr|bhA!yR5nuA>4jKjk>=I16`Uoi{n}a4vPWJBt(UNT^RZlyElT z!NgAz!;|Wg;#^Kwg{#i>bJwq3dtHBXopx!-gOaVusmbZdHzwC5e=qr-=KahY>buA{+UNC6^7(z=^ZnHK3*UO* z?|r-B&JkalK3RW3e_LSW$P2RcWndUK!tsSW1Hhc$JI`&bAof0 zv&y;H`F-bo&R;oy<9x!|s&t9k6e!A3CYuwYm#3}ek1wXl(dwFl&jq?_tWmr-4UL# zo{64pPp)T?XO-u9&#Rt;o@1W(J)d~K@PvB@c`x@4^Tt#9Ztrd0T<iNTNlob-wF- zJK^Jm^2E5L8R4Ql*N?d11XPDtB+Hk!`v6Uo$d+l zsqPu>+uSwoI`=yFqwY=aC*Awpe{p~0{=(hI)6X;9Guo5kndZsy-0u0V=X;(9JexdE zdY<;Y?)keX6b@YCjq!fRTkdV3q<`sM?|sgD)O(V$9^|{+7w@yv3U2Yu^VLw+n|xb+ zFZxpToAf-rO8=4mJN+5H*LX#LN9Xt#Z8zmT*gDiY!g`%`ymgxOcI$j=z`ERe#2Rh8 z!ItJIbNtA$hMwdp$8(N9JNi0@IOCi)XQA_c=RxOt&f0`c^cGhoUX_TUB_LPWP5T^aswRsBsn7GqLj;0hNfJXGKDt(yOh^b&ZZ1)p?}_qr!|CR6ISd5S!bk=I?G7IOQz_j;exm+71BYw$hm`-krn-yq$hkJg=frk<~B zx$Mg&4;nT0Ve9jh^bu>j^|ZB*?PA*~o6nYKTVh*j`?>95+h*H~wl{2%_RAfmj*lJx zaJD7HC-zM$OIn+>Cn?@l=vv~s-!+&vd2@0Bb#g`WFOoMUKbPE+{7&-e2z7gT1%{vwllVV_G|1u`%3$d?f2Oqus>$sV}H$Vqu-nAxZP3gSm|hSeD3Ju9Ok^i z>2}`eoRYAVc7G;eFr$Staam&jq>7}GuKQe1yIyo%kvueIG`)U$%Jh`Nlzl0$r@TXN z_F;;{J=HUDZ}wQdKli@mE%M#vYxND*hv_N$L;7R- zl7f`N&um$J=H`q4XHqjz1j#x*WW3H zN0uYok>i-f7+2sZa+EOA1st`GC5}4Ba>l$>jz;=~wT^X;^^OgWjgC!@&5kXOt&Z)E zCdY0^vtu811m zWOm|lraH$vGn|>uEN8Yehmj`NSwQbx;;e86n6oT#);X6uS2$NW8=Y(Dv)4J-J2yBt zIyX5p+*$4%_bhj=yTD!KE^$}Tqb#9kUG84tUgd6duW_$+Z=jFe?B3$u>fY{#SuNBb z__M;g%GzjMV_j=qXI*dIK>OTe-E7@r-AX%cvhKDvTlZO8tcR?v^eb)FWArU2t*7W; z&REY{HCvc1+!kSrvPIis;IqXR+l$v3woFExY+H_PmMzy-U@Nkf1o^+jR>%Beg>99s z(YD66*0#>JzN<{O*tXiX+nQ{n;r0l7 zls(!W!z{(ZC>>`XZMWK;c9-2_4^N6nib{%3%4U94;4Se6yi2^xy{o9z>%1H2v$lA* zdv`Nt9`YVx)I8}u?LA8^kMKqNhWcWeD>!`~-+21mY~L(;j1phKx5T&Hw~D@Foo@pp z$`;>t<`4UPhnPVe^PTja_MP>G=@ELgK9rf3^vxbxMy8&v&(aI@66)#_eK{>?QVqeTjX!eU*KUeVu)S zeUp8QeY<_PeV_f1{fPaT{iOZ0{j5FA5#fk-45e+2rd@exQ<=1hP};_5+J%QUkx6@)MO&aH_-cK1z7@Vk-&*>j zjlRwF=1sn4`tw#_o3Gt>%6G=6>EU{m9>XXZr(1QGo~mc)S$dA1OTSS;uTiJ3U>3Yq zU$1Y}H|tyVCguYzdaK^Xcy&rYqid)5_MURktl`!u`Z5cBiq-0}rdl(sS&U)1)*@?# zwboi^T|wJfOS{=fo7qZxX{N2T(oWiGBWGwI;k1ny+C?1wkBj~%gZ7X^TPUI()Y1l4 zQ2*Cb_cziPZKcjPQ{P*u>r&ItP|L%q;W5O_+^l?`Dw^aJJEc&%v`m_rAvpV{+ zM*6Y!^kJLnznbW~TIjdh=(A4IUupDJQS?(5`Y0>?Q!0H^7X4B#eNqMeQ5}6zBmK~N z`k>9ut;~d*oh{B*XB(@4Q_eF^Eg?K1Dj_Dpk`R|*O>iZoCS)XJCFCUJCKM%9B-AF< zC9Fu8ub1hSdJVNd#8{UPO^!_-o$O5ZB#%$dOwLZ8#cZU65nxI3a>n;H$?K9gFfZAX zyghk$@;+8nN0N^vpJaw|HhD|R)|93cc^j8S(WO#KODG}f)tZc6tlb)J^iLUZe+3+G zhRfk_HUn<1fP>9&?X*1#PG!NJMx$4kI>3H&U??TuNJuS|?kP$(CfL_WA6JoRW&Y<% z@+74ujZex*%1p{i%1+8G)l!aN|r%5X{2rlieDTbWZgC+$mWVSU(|bR?-Q=~z;G l(n;0^r<2Ykon?g(<_dR3xT2Uv#<+&MEH0w{&(nhg{||KAr$PV# literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/win32-ia32-node-9/deasync.node b/task/node_modules/deasync/bin/win32-ia32-node-9/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..f6b0bde58ce9a96bd662065e59e8c0c68f9e32ed GIT binary patch literal 75776 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
J<-iFoDLzZXEKmIr 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 literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/win32-x64-node-0.10/deasync.node b/task/node_modules/deasync/bin/win32-x64-node-0.10/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..3b030a9299201bffdb185f789339377d7a8124f9 GIT binary patch literal 82432 zcmeFadw5e-)<2#!2@P$-370^TTZDqudZ|{lC3MUwCwd~O76oNSP@HN-MP%9pa0F>h zs}0*IGvjr}8JQVh$MG`awSWpq3$&$N3aAuODeBCe5R`&iT0qY4v-VEX;yCa7{=R>F zpZEJbFAt|@?Y;JWuf6u#Yps1!`m+x*Cemk|E8IlN&Hf4{L|J>GxKJi6g^yzjm9g$--)e&fjn z8;;<;aZ~+ckzNF+84Lq>RNvdM8dw@U{7W;;LqKFozWy~VV%Cf{8m^&CV~mEW z^hPb6RM8@%VUv|268}~i4d+`7hOS0~p)eWuBkxs1jfO@2<0B{v?frNEF7)5N)DPqb zuiy_gnfjjS2O$2>X)w&Yu=2KB{kIwnTPhG0!80Gv8+iKtbAwzi6v+&QQ-H`vM~35l z7ImoapBp7yxJV@AeMDak8NgHee*fH5US(BfIpX-3U~FjY4O4zB-R%qRMM4@Q1ICI^ z(A0lPR|4$+{`-*;Q1ywuuNw^8lK^Bs0D&w% zl+Ela+o?M)L5%M3iwuFQkb&As=~Ol+Cm&64-ol%JR#a3-<7)Zns4iPq~VHz2ci z5QVFC`vZ3E2o}3`9fI0lZCEiBxguC>MxS;6Vy%c8ac}TMTHt18>jH1m&dH{nk-*Q^ zF9mxDt43|$7{ss+L`t<*nl9GPY?~LUK(1-rGsf>-K}Z(cPRLMAmh-Kxij zYagOhu|21CJ$S-|5o^^}W8JRhRD}5eNpN~lL;f5)Ckij?VIQmPD2=p5+l$;j*39;( zY=@Xc=FchQGZ~{zjOdANQbV(yzK}aRRAyI0s`Z8&Sq=v+k_h?H}P|Ti6~i+o65?y{;#s z#nk^A`BT`B(NNYynSv*cflD!b`M?$IrkopiClY~IQ4DJP!)uA!lBx9ey8V7j@T4hl zd8*JFq&?m-s&&Fn)*Hg|@{dN&+Y&kL$z*6Pub4H*(+VOgdp4&YEyEa<$v59}a}!_R zPONX;aVuE=IvV(D9kJ@|=Yn0_g2C0MIH*_!^AxgNSwQQS;9$gx@JC31PFzIM zA@G->!xqj8G^TwX3d{%EQU9tEI{eyvfU2)w))x_8R2$G1*#53rI%58|<+J zY`&1!Du>;tVze6~${4VMv&F{qdR~5!N)EkAui$-Vt5kOk(E5CeWx>_-3O3q(AzxaL zT5}?T@Unl_6g`R!m%R&0HUy;RAiaZlVt>S+nxa)eCZlU8dL@tk6-8%>)Wj0wi))I0 z(=V=$;(lIJ6z&)IAjMr%Q}kHBxQ8fiN=*^gMXEfiAwH?5=FFbzt&{&WWY71)waj1UF|1O>4`m?&);3 z1kzbcEQcopf1w#Tm&OzukKi%1*)eY+Fn)`6shvi2x++4GL}<1MWsA^!5y}vuMIv-c z;`x?}(APY~s?m56@u`SdO%Y*B^UHX-T2S3)#Ba1AmhIHSSa+*b#z+JQ(V{$6`_Dot zuL4kAJ^n$#D-3~wl;UL+uu7D0YBUmq0p#<>&Y@Mx_sA5_V75<37!AQ*-9Mi8jX_$* z5VYLZf=Db2u>9c&QwdLs6$OSa@@gZgQGCw`Si`Dadj^Y1$N@;xCj;n?PyRwBE=Gy0 zM|&B2Tq4(1*m?L4q^+dQlNaT`gxP$&?sn~2o;11jT!`v)$5NEVH=d9wp053Dkik%} zpCp57iYGy#pBT{B29=%Q;*aI*myj$}vl?XuZ?zkmWr*xxKs7D+OVHYB_)`(8xeWol z?gI0{2){dySWXR}#NZznVb3(IqY2jjhB3hO1_{%pCn7_bG%@&(adap-eStyXi$^%8 z3Pz9vbU`m|5zVs5Q3~*kJ|xE)W2iOvF0-vi z2}B}UT07_{X!|R|#9nh_T@VjM8`(Y|-vz>sNB)WeT6IU3*gQrNi5Ef+q0{c7UgN@Ekq6UkfpgqBFrSXO1>@H|k!X?JoUqo2sLw9y`BPHAC&j$510oGo~ z%X-=5!gXy%~F8dP&x>OX6-3#IkRxx4!#hC`$4bmd~2pU?k@tVQX8wD=bk_j8p=y5mEN#8v}*BY~lG9ftwi4ZQrd z0*UZXc=$zxeXcJ879V!Jbw2h54QQ^)zM(e+@@&Ci80!W@kKB&so8SX`C@1U;&mWowq3KG)OEadM-JM8!^xbSMI@js z1r@pFTjZPNx$+!-3MJmDJ0>9&M9jJfR{V7+PN+fLgH|*YlelpLmnQuKTd1Vn>WTY|o+ ztTyLqY6VdaBzl7{yvXbWl@zMw`Cd~u5sX{jXn;(p6cs9xukc+YGSFlyMa5IlzU5Ua z+v`OiZ^vd&i<|mL9UQ2z;*m%YzfLXR;|p6XXo@#vZdZ&Kq#@eN%oEN&( z@|`LsH`-$f9vr9My>GVHG-or$o0I4OHDr=k4yd1IRm0QmU|{Q4W7f3Y=(;{FOK+x? z;?=i^!3k~wEnsNkwaKP5>Bd$s>QD!%LS6aZC;N8W&&5wJHxF7EG0Btqz2v>a)DIFT!v<%L~M!XE+w>d zwCHl|JhVhm_O%c-3nISovpEqo*voE$LZ&L$%kIxFW#xrl_Jvqp{myhroq`%J9&oPF zu)&RdDjP>!`EoTJB+8DD3ErP&@MqAV>y9eXTVx1a12M_qS zz9X>z z%o9khhKk4L(l9_1Q0+1VOe#A-hiBCXJ)4_$JCe9Pyx4yZ_x$MC!hBzcXHXJfiANOp9MG>jUUilfKeapRVf7 z(mMr&*r8p7Mxqx(et-wkUEA#+RrgikHFx!Cr+)zc4h;O6${4uiD&2rxS#K-o#=uIo zpP>!aE+-B1z<>o=<41Y?7Q~lQrQXmL)HYc+=Wz8=L2I0n>CtM}96!n!ADCRbH82Jn z1D5?XV|C$p6vH~=nKVgt-RK4D+7*l2b?|oGKVVDx9CQIKu4@e(UTLb0_4Zlw4p_tc^(ao?mr9tv#msXn|RleFEI%53}6Nz9#PbPy(u;qQ=h2AAnJ&X zL=^SH>;=VA7ii+#bXZnt_ArIZ_!K(%ikTy57qi%32Lb}_orb9b0soqx@y4{_oKt|R z_6J7OUhy`DYHBgWnr0HDCQ-}vCe_qIy$k#!e3fxMmO4nZMcWF1NH1i`pC}gjMhM)? zP#nhGkJhwl|2&uGqd2_C=)X`c|2m;%-mX1HSwmcYn#(o4AAhK|>n^ zqbD^GUw+VEF2k7_qA=+d{FigRun$a~*&auhg5A2K_8H!|5!x4Y5@#K{;{>)iwE7!_ zNiWJzPC_no&QjT7a0@3G;B8hkJ$QSzL4Eg8Bn?EY6{$|hD)<`$CW5mWgaXs z5BSt7Dlwv7OmGfi!llk+I16FsajMZyC!+0Y0pJ1;-q9qdK>7&?6!g`iN=g*db1mO18AO)#1jZc zWVC3eEgAiLk{35e)W+pP_w_e$*__vQ2S>k2wPER@zInX99lB#yqQ0WO`sPu6^HcRL z>R;cMM17NxO>YkBY0F-x{@rpjH_Cwg{{9n8c7f$H3-m@{Je@ETorknE=ayXp*Vqq7 z<#62l0{22c+=(X>xW5YA%6_UutwUwg3Um*B_#G}aWdgn)u%`CJpXKc#e25ce;_ zBGDapq9(|}C46nQ@U{BD6Flk)9@U28w`0e~TG&!dr=58MdoE!MEN>8s_G8N$jx7<` zQ3CsT3j14*%@J6ez%EWO zF0c=!upe;jaDhD_u=7*c4IJA8{WB(JpTJ(7!oJ9{9}DarfjvKk{WZtFN7w?3gQCNZ z9h8XA(K3$xgUGvABF9#6Z1oxS?oMILIQHiPyI5O`prm%xJ)+(^OMBbmJum+Aj1OXjgX%g6}DeT8C8s}{S`?kQ2O<}ij?B4|TF9K^w zVc+4{RRa5rztPO+k<>i!D3}@E7;t!F@^Puyd6tp2|RiE-F2F7VjtX(jMq6*sro&o1EB={_P&@WRuTDLDUM~1ggC7>{R7B5LKP1_&e-`Y_dMqXh>AQqpxa| z{hwC-@9Xa0ca`yu`}^w7Q&Bm3A409X_lwYoWbgfm>}x{ff7OKk{sZALk9~m-hKuX* zibH>Hq8*qNZ3z__RCClJjNC2#Yz|O~-XZeM`|spCbH2~epOvy(t);BU%YIr|ns=&O zHdmCgqdo@ZUQDW^GltB5p~58H0_$|Ut3V3g1F@2wR!urnPMV>lk{)~ssSvPIAc&)& zA-L?M9VZl!B7s>({|KP7`2OZ)A9_ujU@49)UH*W-X1RgPU4dLENC#bxg8gH$vsnOX zxx@JpX;4y*)*WBtc+Gq#?K0n4c|qH>TVYS|vMb$e=1IH4O0i;~JV8XR*YtspZH8JU zAxf!_K^0Ms)cTg#WKb@w=P#mtUiJ&8%07Ik~f zIOjlw#xbYR!=k08NC{J#%&M!a(n%21nO#-Gk=|ZXq%_$BnE1_tPkbV|?D>zN@iQac9a(z>x|l{N=WtTI|Q{egPmsvd-?~%a<04sC3w|(Z2hz?7K6u)48Jldth%&w)@s#p&>8_c0|$g zR{!u|5s`7pQJO_YC1^hxL&dO8Dh>3NNa5_4A{SJG6jZ2Y?H7Nli%JP5`+XHvR)U0d z%2sP)rzw30Ps8kp+E`6h6)^Q4(=vhR9;WZJg6n7?sO47C z7D}Kkqr~Aip)W(?`*YtH!)-Z8lUa0C7n%Je>e3MEv`s7JWe?Ik^bW4T=)1E&V@r}vB2LiF)+F61#(EkrsG5_u_&Ymk zsydi0G7tx%`WCbTmb&2D2mphBkmlw1rzsfE6Q<^4Cuo(18O5p0aU&R)(2cMTksx{s zWkMHZ4NrG!?|nfPz+}-+w~_SmJ3$0Kjb`E}DjTV~KK5U%h6a;L@<~yI|7;Aj_9{3> z5L%pJnE75l^BtrMZqrUts-$mIYB$ID;|v)ro<&xJz_4|&cmKcN;XiNXrf}E$!F8;jC&8fm=+iwY)K38 zz?Ny*#(279Py0q%0X~x$Hg2bMC)_aMS)rgu!HKUDzYd-}9T?JV`2%2tz%@G`#!NYa zC%+F2YqmU`ijE>0I>-^hlcxeh$gj%TY`HUmWwXuI;IEwN;HVt@BX#V1Ub$Q70DffO zQo}#ZhA-axkfuQeZ3^3rhB0hr#Bd+TQbSjo)zCvuSdG@v@{<}O72mv!ee*@Eel_p( zO7pmSQex6-`bG^uIugaKr!K5C7u6e8J*w(kf%uU%M)Eq^1FiD1oa|X@_>~;K_0$}$ zwopqfmw$&>0UZD8$ln6iSGWjqbqvl!4;c*aQYBdRSFZ`32G($!S?-AX0r zhAm3YA}3|JAwFJ_-YGFk@3h2iuC}T{EV@O>TIAHDva4nB*YL7RTbTxx=Ev+RGgLeI zuu&l^H#3Fn$l+RHZ3z{z(9GX79y4}Zj@y6?Dtn4X2dUxW;8}z&<#Qp66#9!4)&zwW z)IeIc^WS8tTZ9grnM+=4K#7Tr2cT2*ppHV%~ zF0WLq|BTzZ)6)F*>VZxK2mZ6ZhDIr#zJr5%v`u^V16?Ph4b2>6uxuD?oRGif zVv5BabN>x(^L|?9Jad)Lglgzvo|joh^AOC}e3wU2qK1RVkv7TSKKYC? za{nPNp^&03bq-A0WEVNPQ9Yma%E6tw_U*@%r%TJmI#$^qs5Urz3S*qQS z;a``F$?9l99vKqoov2)4J!nTA z+<4HAN2wi<2|qYNGRZ*rNsB12YX{ufx=9QU@!oamrtXJ`tE5SFm_tLir3^Y4qg2;} zxD7Vy{|@c9-(up}G;_%E))1UXrddOl*8o6}pml;H``Z+~7Y5sz@Wc+ygg@;G%W{WW zzEx^are{^ip;}d)0li0K{ByRK@HHohJ1rlIBrBDX*(LS0M#JSi!9lW_*62j#%ZJ1G zy0Ug8aUe=zFGPywI81xC(b(Ex&w$&E5z-fWXUjm0=v_AN-5A=B&^t804Kigs4-Qp< zNf?r7FD3j;>{EyTi5=)jI?2R1eHr4G0!%bq0k9Uhy}^$oJkIfDWESK0Gg+KTq0(QF z*>nWv-u&SAmdeB7hqKe*mf&iZ9->K=8ld=oq(-nvs0+a@Fp#7Te=HG+ zb1@>PXBX_ofe{I`Cn0%-?gzJjljcb&!pKSwy}(n=%$eja^yf_S7r6^7jegjJe`y3q zO;cRWOUB4#HV#kAR!vbkuSX7NT~Tc{dri&Wyqy7f%QU9B3oi+PX-zw89rg@EwbhzL zvgziU*z?#){TBvfX1_BSv-yYU@Yp2X{dkN~`AUrPNC4LnfQ{TD6OaxdAAlO-B&CGz zx5iDODwx&p&ypIp@Qn()6cDRI2+c2_LX&efz_1KQ{(rySWtH+U^UFc4N-J z!<@el)@JZVzc81Y+PrL+TzIkH&HFxu`c0dO;)*QE@xTR17UWqq0=9jR2_6*6S=p4p zW7>-}i#wA;5b*}1)>6}PZ{Cr>D;Q{McFhsq{d0py%s4C_vH5K{$)M+x@5Eu7dOmqJ z0qFVUs|Y~PCtn7@m$yGLPng22>EWpp){EU)k$NgZm=156H*aqM=TP`<_6TQM^1%bM zKC*+DwKy%iaavZBC*?WtBv10Zl&u#V^NT7S32P3o5&QCUUnS_aZZ*b820uT>_K|O( zMSB`jGv7aHH@=hz3o2lPRy>+04eS@jDj1z0vtXm-K(1Cp2U1qImUfa*9kCWQ%tPE} z1c!1g@JrQ@XMQS?lH=ALzg$iU;V%z|(hCp6ks%VW*Xe<*;7J&E(dR)V=(8}jkotUb zyV#(p3u1$+a$=K$B7|>JYRGmmJk^A5;LLMaKJ+}`7ej!S**@60p#an!6Hq;50q|FmzLk_yf?TT=({}-d<3fe@1++m&MUg3WKx5c!A;eL;X z!~I^UcGi!8_dKmSZu444ArgaQmN*VAJTI1%LEC}#3|AHZh;=-;5kU;om|(Hb2A&Op z8Z6JCx$#Hn1}+1{#p!Lnu&oGkX2I@K1_{ZEHQDG5M(k>NBYa;*R30vfG!blyc$pHl z3fnR$Wm_&q4wAdCb{%scRGPT6VYIJJ0R9g;M4PWppVC0R%&_nDeIb3(UU1oc=<)Are zqp-!ji-cIzRD|%&s0dAd0@LYbAL))?F9QjOSNszLGZF=iLILD!w1d+u<%UlQQtr^6 zL3t{q%V5vc#ZU(B(CR57T>2hzIjGujmMrsu#-Yrcw?*C6qvnBF_Gy95zvOy_K|L}v$GtMMKBJ%0KrFqLEYVo(IsPc1KH*RW+Kvr}7`+vqr1v?X6-J(Y#_6VfEY%bz4=^FXxt~J`*}GLAw-3 zHaKb~?dl?O+>b?O{8;375TsJsMdr^biqp9EyIoi>n74rt0voz9EN1M5utSqy9mHvI zHU+U&^-K3yDqW~h`xzm^W0oL})-Mhhv+WSyF2cCe`R@nkP%W=tIn$Em*m-@vu%i{z zOY5ak314lcHFJ^PSZa!jC38XLS7G_9V9($s1J;s|)Kn9tqu<)$fP=k*Wa-K%Ehw2O zjb@UWedY3044aSb_F+$z8r;J?Qp4;4=wCKOJP*X*v8*i1=h|JF!Bnehs}CMPgP=u4 zf?SWQt@3j$P~tPme|_UY>ZEY-Ck@0McWRfSe)N32ns)%AA;mn1X3=0s%$*a}#vN}D zb{fT%qkh8yxj4G6^k;DOE3*1coEfN7RZ~krq^5|j;s&zTXM#j3ie_ZPNd_$u{<+*) zBz$$Y_Iu9rTevZH*Ak3=$a2@&pzo07CVD|4w?LeTqrVgAWG6HZeY!$^U`&Zp@IgAL zeSrfA&I+~($gexCj&aqn{%Q^BBDp8w&z9bGJZt_$R zA|;JN(v?Thf1DH*xH=X&-l3Cu3wHFrc_vSSG5_%m^(PbeBT)-{ctF+Vki%|*`l~0S z^6zJmxF~Z1WCQ3(+G&uW%`xk{;s)(OFr-x+4<+P>ob!wl&7O*lMAV#|W1=r+J0J1T z`v$0#2<}jkqd$OzqM2^6CFj&;L{hBR#2fdxs7QTcBl6PO(RLJU8?R&H^^JIaix&|% z^*6cY^tn9evwfa|uavVFmWPD-Pk^UK{YemU3kS9ib2#u5p@S%@%s_JL4>cR@ZH*} zZ8VhR#uDIHzU~I^?Ymm$E4SRZ)LJH{7%I^VL8~OdmZnP9$Vu1`fe62}qZ3pv&&zKc1 zPTzr6SIO_$2Vz7{W-cj^r9XdCb%Brl?M3Pwcd-e+Krql&Tt|Iq4M2!)^P4#Y1v*C* zG22sEU2GSeUYyMG7+_P2YuEDgaa7~__J>v@C1jlzE6#ItmSeUGB#Q4L)9VLSSa_iU zXcFBTy$&Zas?5foq{>*EtnZCm_zO*x9zGwWN6nOi;{o|Xys5|_)eS)yQr7$sZ(GcS zAQAT>T0TobYx%-$lv{#8Oq(+V`6St6;@$7QaLwTkNRFiikj9W#)6|4FZ*P>$yfA79M%94dyEZDzs z7*HUWbguo0TX2-~HN&}%^UaXupJ=uA^MmMG$g&48QC3d4%nG(0D&9&+k3hbYK&G!f z3kAj}VAaNtP$RS8nHI%94+fy`^h4ibVMrSP2i9ZXZb$N?R_??(t+@VsGl00esFHlq7)_(0e9{ZO@#iD)LiMEJ?`3NX(Iz; zVI&;J)wp20&@AKJZk{n=3vIbzm=bHL2EqQ#O`d4U541TF%)k+xXBDK5yx4f7h z_{O_dKh6I=;DrvC|Eqxkq?BP3i&%Z8t?KdJ-hy4;348n+SwWC*2AqDcQlp3LfQtZM zlz`6$JVHcg)OH8f;gD&BDjI)J^S|Hozo+=$ll<=q{Dmd5X=vmgXf`-aLCAtbXa{ewk1lZi@!nLM?=7;N zB!@c?SerIcv^h@=p6p!wKE({B_8r0rBxx8H%%iV;+IAqhaQ7wnCA?xkMHsg=Kh)kz zBH9FE6Gu?D-|Z*6@I&^;B!7${6?I9cdK^CPO;wWSNBU%~@wuw>+P?msA+h3Q=aOvn zGY)+uSR)Qqx?|%)n!QNif?)9k(pmbURcX^ou>ug;MsC$_G^b|~Nx#H>tVN(7M}(X~ zc0kfGa$jIB<9M_2QHf<>F5r(J?xFrpcOs@z#59SRT*S;5F|UglD6wrfi0~in(cZK^PY&YBgQLY zUJ^005wk+XJS}48AtoSV9-n@C3m{i35kS6H z#DPrhViDoias{Aj;{;Hq4Hv*{%_e|(npptzwUcz_W77+@V**&D#RRZa>*N3*Qtbl) z(@1J90;U1f-V^ZC1g{bBYJ#5^Fo{>%(*h=mM|(uTYYDCvaD-sLfLjQjFW`29=Looi z;4%Ss608VVBe+n&T?C&mU@Q)U<`ghdwKhz^wEt*U0h2vnI|YGJWh|TEE&=19V$i-6 za4x|e0?sFRn}7=mjtJOI@LK{_34T$)WduJf;Q0iv67V8|YX!WN;H3htCU}8>>j|DG z;8g_A6!1KPRROOic&dP3BsgEdYY5H}Ffk7;Tfh;5vjp5iutC626a4K?J`U{!YXa^d z_!9wl65K9ejo?iJ?jm@tfO`mjMZjd-(^d=EO7PI|l1Yas((%Wdc0-jCqXaUb7*e>At1e*oCh~OT6BxFkoJ}lsB zf;$CVPw)os#H0h48S@ zp*Gna=#qn5A?(O`je3i#DLmV_ERA(2EU=UvryHNpt{WA$$b9_w)mS1>@RqVoqjtk& zhSODU@NDlJ= zZQHOv4b`TT#S$7nND&#$hEG35x?nSWM|7#ykGe&RxuqJ7R;bmY$&O!Fa8+aNPeF!0 zcDvzhT)$B9#|f2$hjf0;GW$?lgKbbP?}E0nHXjM)b<{vlUCe(OD_ul;ARMs_uA|ap zFyKML@yw^I4yo)YN~pQ-L@_ZO1#p;oU`cWd$Gs2?#eC>VFG~)^O$Y>ND7>!LC6klG zkfE+k4kaIrosPt4kckbKlWU(qj%HJ0M2aAg3PrMiP;x|?>|8YiHQ7D=8wa@@!$G$A zmQ0}>_D^M=MQ9+pQK+yTbo&TkKBhI3dPV_f+(t(~>MZXZ#ufMZZiigcg+oeLO%Y8( zz@qJHLp#FP_C-Vx0d*`ZwW?-}kS_!IhHtkg52bT|Acx}E3Lj&BaKQJC z_QArUjrtUY)#gOdb2?AJz}SXXxe-Nsg~FNO48w|BN7w~Gp0G-;O zq20idVt&F+WM0BegiJz#s z$5gZ*1vz}Ibe;kY4w=_+Eqv~6AP=bJ`;o^RI3$p<2oAWQh6Qi_XVf6{TGo_&KQBcN zZefDbvfxOOm{P9H$GWE}N7U08Lo8;Rb0UCM2*N*f!R%wZ{6l5tww9Kc znU8n)OuL}D@J-m|EpNJ-4YP9(D%Gl*rdzvZljP5m-jPk%@7|X!J_2 z?Lw+4NR=i%_$=Cw-0sS;IF<$vruzr@@}l0*P_GFbzQr5tyuure4G3Hz0_g~t{DUhh zDpsu`H#S&py?SflTb!Q#8TEtV{z5*S-CowzB#o;^(FRJ2|CBg10~0p`W`QWSsu>-4 zI*}PK4Nn)IoK=@re+we5t>BRFPo>n|> z;rR~FS9rd}vk}iHcy{60jAsp=e*MR=91YFrtq9HdzJ3M{@Sz#s#gF0dvCxbYh{Rz& zG~=7ljFSoEx1kw0(}!ksCvnFUh#ulu{H)+9*bU;OGvpxBd<-Pb$CwHwG+4`r;xnoG z@PCeVl<>{N<;B6!i3Ou@kJ=hIO2_8`6`s)G_;xQeB2t5)q9kNCmWJJF6`%vI6^T(I zJ0;RShAv3xMP7tnz5L_+^UwN3jswNW1yq-xuU+BT6r zMrr`fMbNh0fp68kD48Gi77RyXJPP)gLOp=7;D2@poXB?(wQK|p&k#adDncXU8dnhk z(yaZO=sTl{`(T&y!r&hmU7FXyM+R**B}e8WFNQA`&&3Lx24z+@+a=J8*&S zI6Md1@tzx{IyxC3?E<7Fy&SF%pPNc3)i!dhqXJm$HoD{Q$cBvxH){z&wxc&GChV9g zQb6&030k2$-lJ&3|3=`I6#guZe>RD)68Nbpd>Y3uOX9C5AY?g3x>``R6LsY$TXSPF z(S;(>P9)MDMg)*@4Bb5+=p}!mB^W9Cddej7;Sh2k1>p{1tL0g`Z^9OWLp;6_i9d+0 zqw3&VR<0IJt^w@-neNzyL_k#%iY`<~5hfcRHt(s_w9D~H7`z}XLqLJ5^B&xeqcic_2AkDeBKP1HHaY*nL*9-6P57ix4 zClXkpRTpWPZ3ED{BR_$`Et>6+2Dq^vNk~&m?uRNF$RB^1XcQl1q>sSBon~(0`&qQ? zMr!Y16(xxBB;+|YNtNPmdEq~Zo`_7LPtLBQ3k*{B}HCgr4Rz=#F~?T%ld5vzen1v!efBocC&nu}DFlnYe4 zxu4(eE`!jVu-mhJBrZ(z<$Vk;m^CykZ>%7nT60A(>IBam5-v$aG&;R-l7md)&!|A> zEfubFX>!^KsyQ(BF}@1p2Unp z8als=WTv4v-T(V{E=Osp@F`*_t zG2ck{rhOwzD|nmEkXLCweQah190{UMH6(ZXNWNuCMi<5QaDi9uLS#?i1I+cf*fF^G zKmdn7=|PYuq};$D$qt$zAvCDj<6|Uy7KNPE2fHLY%7Huzt^r4?CSP78Df(8BNE^?n zfc#71trtnn8Is+X(N7YtM*J!&Vl^QWGVy9euA#^XMUr$JK}qhJUXE~~+2#%7o2_a^veG!WLB_=oZ`fx=rmPHf#Uu^J zUP-uGbU%4sz?oqcR^^k2`NE@h3)#AF?WuZea{2MKrv_tb{nj5}dx$fq)?Z@n1?0YU z7mR`7(i+AI#284eJMf04rhf7_BwQ>%T7|LY&_P=J!T1~*&NPUHNoANQ zPR2)_2J`d9xcH-DZY?CmQ5P`1$Y`e_D+;w5@>!paoMaIBH$;(8;XuQCHN&ck0+@T%Xm)grO`iKjdaTAkAb174# z3-+GIm9$2lZXntoFM;HGA?!h?u$xWdw-OyQq4L0x(5J%i#W3~m*4db?Mrng$wFW!g zumuKF*|io}^2owPo1Qr1kR1w*!Meeftk`>~gZr*w+p*BD>pVU!+u(+Dh3ltnnvA)D zDQ+=jH1ZirY@oO`-{)7wFKIA2n>;i3<(Q_X1+F+QXIsI@q5mt&yAKYw4_u)2klPWv z9%2x7N9{Dqb2SGfHZ8k0a-S6J{5}NFt@PmZY$vYB)8(jOxz)g+2P5-k2y42(AK5yT zZHQsV;l4ge+qv-XN~(VI6?U|syFd?LW7OQ6K%52p<=}Rm^mwi@dt&hWf52CM5~BP@ zz)&^t%a*rwmt+V1H>2O14{&<6{E=g`db(vG3gqBvV_=B(7WyK)Hv1>&TcFj+iH{)i6&md+fs`fXd#*@jj=7?S6Dal=ip7VS7UM7Pg!aT{6opbH|!L{kW31f1>Mn7Mj35?6_H1^{05pg%QF-X=5!hGJ*;1erhkl46>WCY zG^y0wTbkUQ9N;W??PlaCDlWv!pSU@=wvi9&UdUu;BUhTxX$?U+DoO9J-7SV=!tfaM5${})$j_r=5y#i!oS1i z3|-!0qSyd-8RW$nWB=J??;F$p-?p+BwBo>}OMk+hx?NzfD6rYG3J{T;!uGR$3Tv$S zW}*M~1q$0LLvvTtb?3s{y*0?G!03| zQ}KuyR#nz)xvxDrKvjSSpa4RRs+vr%(Nz~VTW&-=of?`gGXM<&38DGie0nudB@MB4ZeJ9@SxFuBYal}L94%tV!M@m z+`7+0)D>7M{GfbZDIHGeOO0iKaDft@mN;5EG_uRX3FfR+8-i^*GX4@7Sraq~#uP%k z5*9%^v+>0Z;^v>;=j+*?=vVT3j}y*5K4@*r_tCY^Y|V#Cf=<{$@lNy_(2A$Pt>FBf+-tS&MdX>Vz|lEzb+rHXZQ@Mhe3?MIP}uDG~F`$L}uT5 z66*eipj1+zIkgMW8YSe^p1?bCK>iq(K(r?2r9?ykJE5AGNCv-XuZ0KzBd&rkZuQ-* z&GxLk%~nW0i?cmxU&`&LA^La-Gm6yV#Xf+;RTK5zy!J1gpCJ{!~r&s>d^bRVJi0C*9+yP!Vt)P5<|wjzk{ z76a{Nr*R&gUl5TRS}Fi3c;<+{=0LJECel2U44U@WmSNws7$fK~*Z zAuWxfqG{Ov$t;E70-0|-1-qM-oLpiagmI!g-EqvzdrIT9i0ViTXx@jUg~0dKXhbpK z)Oe8z31)lPX2ipr`aO&yWxarEC;Qj|Iqx%5hf=g4XP)%Pe?V3t$6$nR^Fz|YKzYI* zBW?*Vuwl}gKR_KIBBvNzR3vJox)PH(CsBSA+8o5jZj>I`2~bB>QUm&rJ@sA=#LJU3 zI8thm3L+K3-V97&1*lfRhO!w}+q7hgLhbDgh_;l!!W9kpaaqGt_m%%_ep7%6O3;4Y zKM7RiR3&dG47Yh(aOQ?4Kgm)u7_CAkph zKx!^}xN0}HOFjkCgKmg}vG)mIeJTxog8~?dcn?){{J-wuB~T5ai@{B4&=zF`q>9i8 zIk*|05^2T*%LJZ^5I&=aU`_97>MT4N|4%#n=vAV#-+^lWU1z(1>(|*oLx4(lb~1Ig z9eCcq`5-BolPo`4giEXOg9Ck2chQ+0%YrF}YmoSLbZEa43MKr^$%~k|N?c>|R2Sfy zqNh5qh0X(D9?M|hjIN7)4=Ds}V-|)VO2~rUyLupaCFe=Z;;Wt%6PbYa;nD+fh{Qyj zp!pSC`XdM|f}e15=;J3!9&v8)lLc3D&X{S!onFOtWX0QYL`o=~bs;D{wjCr-n;P#o zSdHvDAU${*^B;Q?7*1cjXb)?~4$Ujj9U~Hjk{H3Z#GXP*-LYPwLRnL+9>Km<7`qQa z+$_n1GePWda)-jsbQW)WVrO#uGvw-@oF&!1K(3kBB5ku_Gzd@o02j7G*)j4c&Fdfm zBTV};X{rxBPK))~oTssY!=s({@uWKf)Ykm0OR_mX13-3295sh&$53Koi@qE}e`a(1 zN`5GrqP=yLN^FC(LL=X^+q4}J*>OZHz=YzHjusRX#|Jp3(+S$2p{;%i>4W9DhG2O% zgpxB3hIB@}SS!bqHf9+7myJ`*8G-YKLgEhK+>FgJh;r2We8jKvEsUXv$%Zq79Upy% zkRd+yH1-vYtK!NMDW8Td0gUxH+JaQDWSOQVy#_Gc`Qq@8t-&n>%cRaB_1!86!uP_T zH4Z`e4z(Qn?&K+G7c4Z?G>F8adFIpI3e*vP1>fq**8Ro7;vjghF>ns(X*h0;XJXt& z@vD*Xtaaa^eR0dWZoJ6sHbka<$b4E2W|=@qkdbp+QXAN-pyZ&Fz7Qa&5H01d*7PYp zuJa*XjzfD$B-6geTWo!CSTUDg?6N(62rWMsIvw2atlmZ~@6+k*A`w2)t=Q4>0V*@w z0Z3Vd)bd>@=`vnYWAO8Yc4#XvNsKXl#p(t0DPiADep5y}ww6{Q z_A=Zs=y#)FqM;gc;=g_y2J=B*hT;08WEuGU%Pap!rTkF0L7yXo^Afz7u=?HxSA<-t z;|ouJ!-5s#M;(rrl7xt_yY1vxsbSQ-`3hnf0ZDf}4+tFO0%VAzJNQ%+wmZkzHjHrM z3;R%)k=m^KHmmh}!Pol;4u=@%AO4+v3t#nx3x~#it$N7_K9rX7AO+tlm_!`Pj4kS7 z@Envkk504miHaAIWU~~bhTmO7Q(%fDADQJ`wF2SRSG0x>0s#kiB$wV9fX$k&9~)w? z;*azWz9T*}CtveoEO<03{2BjtiNZpVJ`IYi?SYGAS8UmN^mACynnCz~A`-qHs?sgk z+Hz?XLrU5F6CyF;s5V3`uc54}ORFqa3Ktvwm$PRmB3>*CP*@wvKmqINgw0CD~;1)qCR>C05U9CzwNLb0#Wa&Sx7xMI%(BzYDL2$$KJ zO^u)tv{16Nk&tx|bD41=TzRJ*5r-sPHWr5m-En&{-)8qo4G=mpxT)W4 z%ck=C^aY92^l2;=ELW`pN+v-^u^O}(OYwHsn1TPqQk>iWG(Gw2mIROEI)l?Gox$ZG z%a7?BSi~5F&L9&}kc#LOJxCjnDqozQD`+pK)ARB~1OAS8LIyrB!q2NjEoGd^(a-V; z{+nRBy*Oj8p${pL=I*CBEZ>M`aRV=1)*I-qUAq<)2Qpl}fid0gdAPQ()gU=PDZwJH z`6;if2{(UtYV!#u`~QTgeD0vuxDSv}YXJW&dc{Bazmp%AKOYBfqBV0#yhXix_v|go zU@M$t{aNU4J9K%p47nY6;A@8WxrjWVyau_bL_(J%9)gAoah3For0JL)o75@L~!M{2QCVKG3N}{Z1b5^6o zWKX!wJ2nseAVzZu{r~}W@HlFL?S^4^g)9>qC}eq-B11MCg+i9$B66pQbc)Dx(Fb zXvxzfHOLt-y${6C%JuMlQ;r_Ahdi5@JfP;E`U>z+kH+M*nj`uZ5SrgZh3L$zb|qBW z5%L_yt1Db(^o0F6U)JbGu!X?6_y`zlDw{zS;L<3)1Ei||5U9d|- z>;;No9?gT}E=k-WPbaeseHYa&kLWE5i-$ZddgK{-!Uv{C1xKq1o8;&TOI{-mwx#7C zmoVS&H6`TvM3Md+m4bgji839Xo4w_`_jDd_uT!4T0wdv9WrSO1d|=U>um;1CX$QW6 zwCq^Cl6jDJTe9#73eRhlvBk2F@>)vEJMaP5-)nn54`D08d2D-mxNHQ zTHX#H9d97R9xNC&r3?LR0fTx({k{&nIZGXx*O9lCx2?Xji+} z_0jS%_@;(d%C`9O8sQ!OEBv}@v@=aR3F8;OUfV%+q?t}LTQ|(5EShIIhPSI{`LM)L zVx+}r&IBd8dZouM#@ObSMli6Q9w@13>Y_A7&y=#yurp#bamLhWMDZ18-s$fxaQf(3 z3;Hw2dp^&L!skmqjynL*5wi9@8vK~$%&0tJH(3or26(-h;mg}{-zON677tF57_;OI zv?LnSYf;joZ`pqnn4bAL{#LOPT%)W}5 z#drV0W_x1B8mrRK$#98&We7+yyE%}EoHV(VvftbyWol}n+@*Hy>GYPjo~?v2tJEew zt0RAORwqKY&MXDk_vH6!yfGmar^(0nVm45hn2zmyI`;lx zI=Tb(~>RfNDSafPzjntZE>Ag_Ddo^ zY5hIgI4oy0kwGWXMjhc~gU``S;FLp6rFQN)n4lbAUN@0Vn;d=s>Y}LkIKENQyA1Z) zy$O1GFhwus(46WowPonjl-1}#ng<-^E4k;k<5%q znnlfx@&pXhZaD-WRtT4SK2KD>M^sLuQ5#J8uxWOfGMzTqvwx39zdfB81;$o~)W z?R%i`XO`c*kz|hlbNIIYI_KMm@%o?0x96i>eSG_82>oB?+XvSC8@|02i2oknUh}|z zk8fw6VJ}{g(~D!yYU~pbw&%jkFNAHVx&tc;_Cq534gJ8A8Y=w@Wa+1T;aLYNLUSL3 zp9WA&fgi)%hZXh(Bun-U?q$JCXM}bK)RPHS^eb!VC>q;{gBtx3U3H;z$w-(s4eENs zB;oM^zlz2x3qHsdKPa!X;~ng^NRMSeI+SV;Var!oE8TAl0+iuWRy!pL96*zKOeg`= z{T7*o0dq}0Zo8p@595nmf&BPDlq}~RMd4H0{olmLRi7wYF;)(q99cE!ympUipIkqr z)U*pJL<^?0FaI=L^5Ki$`*W&KOp_j+iYlv5cpk{AK6INrWta4D9wPXsEMs11F-!BJ z{5KL~QxWJ_fBbB!$I0ul^{Xdtl1+Uz?e{V$AM3mL1Q@5-19kjkA+aMkwS`M|PPHx> z%H6_6!Kf?tAuvD8WapnD6lr4QJXL)nA3s`8W5x9pGHZ?fUX&;zFg_@HfQ-*k#$WnD zX;STd=m{SIsdg+t6y|?F)+O>!wMq}&g~%VxRDB}Pe{S`O3;aVVPq44iWHaVEm1fUl zr1FfFp$Hy9q|03#6m>yA$|;K{u{Kh6(S8PKRwmDxPuyyP9qVFf5a<< zq1k^&?59Wt;TL9TJ}>SDQ0l=r=&Wc(@m1jkuNtHcjh^s5+Lht+;nnng8P3-$Y@%)M zDSMaijgOGupMl7@ge=lye?)P8*u$}3iQ+}!I9omC3kfUdP#j`GiP?)suJm+IwJaMT zr$y^M-KBZE3tSFj(s9RW2w+58G# z!LQ*&@s(721>)|526pl_P{yJ-LKMyY4Q?TY=5FLE#vsK;w6a=WN9TMQM#JEinR4`d zsJH^p!Qvv-9>wBUpO)Vx;*vLj+E7iF8=kX|65qldva>2DvJ&etH~_2RSvy0Xy~m`% z9;mkQL^as7W<3S_X~?q+zSkL2Ln-`n=e`DQLuZ9NAsU+7P@xnY1lU^PneYXUWX1~F z)hY$=K&^mqu%AoJXZ`nRWrfGpC_P-t!yB&<;U!rpt_j_Vc_{~+L!A{K)0X2N*ctQ{ zfuTinn*xK1=57oOM4ww@IXqD$Fq|hUvGPO%i+*Mfn2XNxzXi67W5jFndJDR#gl2)w z?S5dvw6OUKHM|@%RB44S0S7*L0)C#cm$gd`=~BZW@NDTdL>raxrB($${{kJr(W(J5 zS9p6u7mHD&Zx~uCJjP#`6*l)_Vc-5b&6D?;0!|O)3j8v|tfxGAA9-Q&_LxqiYU#11 ze38y-fJFJ)+O!CIsF)&R!ZwnIxdN_54_u+t?G0RtQs0!>E{|z<^w2nu3D>&XqOoyk z`zZ9aIkQp8+yyT1TFCPzI@UlLS2Xj#cM<-++hDGau#*+XJEVqo)Y7Qb243@nqn;K8 zH_E$WRAlEkc~?AoaGa9aA@4e*Wa4)X=c2^Y*SvWj1={N1)ikStHxNH%Dm6qa-gyjxP=rl&)cE7uLBy7 zeCtAU-$sV!KqjmdbJx-Q#qAZciArAwE@J|Ty{)iW4GH*lLD8U@Xw?|xf4#z!xe1Ni zjPx6s=S`I2X$^Uz@nIG6@lQZR8%ISZG+PYS`ihXJnHERg*QEXSG)oP$HnP$vTfQ0O z9G}dR>zGe(d?Jhu4SUwo>fw4A-uJlFx7^2!ECJZnkM$TzH-O{Q19joNeBFhA33?^zY zXgY@2(ll*pnYR(uAaaBU$}_pL?D&GoZHV`?ml0 z{ruiuxbxiaea?B#InQ~{x#ynk`hCbXM4`GH16Epu)Z>P<%Dci6)f&(lc_J#&ie5R< zEo^qB9JWDf^|5o^<4#q+<*V$da1F)&Ys)kkLH5@SS7l)pn{Fp9HahnzJF>eV+8W+t z!c8lUh0sx{hLE-^lD@A?ftaiJPjQ2R-n_KOk*PRz_;USaV4=P~*NvY*pgP>dWcM>t zTHjq&Z~LnL^fJUb$HNb`EyBM_n|uu0Xl9Im*Rsv*=`wa*p}WV0*raiMb+q+JBIFwHeJ*XXmqfqlN4Y$T={)l`hi?c! z>WWJ1@JCF41EM!nJ@v(w=Qr&7a|QZ62KvC{gUxfWoy7TjHP2CKSfUX-=^C=3c4`E{B0M2x^pEQl;T8jtG2ilyQU`kmOv z_0#;VGpy~gXB+H`V$L>@N9+&K@fnKyg?=|3eK5ph%+~4F_KjGpLWc-3?Bc#YfiF|o z(=MIawOoTzWKPCl(7+K)>Tk-Vjg~L*nXp0SRb2}y*CAkGA$H|>Ks7$BpF@E~r)^JK zUY~#aPmxrN91WrOlA-?RQR39K-M!;6&GQr8@)K3wXzX)<-7LoVe?`nmuox80PZ}^{ zLgU4iPpJDg;MHiqx?_W5?wnVvwke6a2e6|uwD{((PfWUpQ4Qm((KM6g7kJ%CqYuqv zv78Zw>KXs%c)*hn^c*^)DChR9(d_zU`}lhoYg|wljrU?3=n&&|#mvEHu_nyMz~K2Z zMM=I-je+ig4r}a2n3xj%S@Z6wIPz*m2Zo%_O zUzwcbSdBjH2-Eq_Em5X(-6v8tiTHp>{?_sB6L&*17msZ? zh=BvjS=B*Uz(M$?qo2TmSxJrfWXKNmbZQ)^fS5(M%d9QrCv#9hHhR-cf&x;Yc1_ z#GpS`Z*`->HsL!tW5A~w3z&V2A#5xL_CG{}ZK#(=`d@0oe5(Zi zLC4=uytL{1fj0J1rtAETUkH?R5jQ_Pp zHhEaJp$=9}kwfm-6~{RG-sNZ{oUAkN8A^Bf$qgqXG#LNIE%EHY*NV4AD0dmC(()dF zXsn5WDU)^k4Vaa1A`13h-442 zc3t(lh+VI4S$vLc#;%}i`j`m=KnwbG8QsVsl&aJI>q$@^=9v6Jl&aJICdf+9J9d~J z%jCj|2aalWgFmrE^Fy*}en<|@4=JEdZZQvlJ}w=wt*ZB-$00fQ1q=(WFJf5gfHhV< zJ?FO|&&ja#{yR}sz_5-#Oor9FiB`q;N~_YVR+SXADtssrA78*+B+L*oho699C7~*T zH9hZNqYYZoRI(y3k|rEtwh6U%0@i~G7H_fPnWL zOq7^@SdXc?N39D(OUyI=BDAB(az^^=QB+_wy$>N_$9g(Q(WvDxgy@)Jp5ry0KdlxE zvKlHwdnP1V7koz3sLrDFsAU7+tD-7#J04$XoD4Y;sq}6~`ppQPuy&)&&cm z+V;(zryN7?r7ud?{=|OeR-={Uwq)OzG!N2H-n6@38PF9Opj!mnsRGYok z`g_CXcVbVH^T+Ou-FeFS7mmJTQE&7$7SEf46OQy??!$}ts8i*FBu9V1xAtC5a<~&I ze&$|mX@U=Q9d(i0k5K}I{UQ}r?oPz#OXREifiP5yJ-~`O_X8ED7c&qrE`^!A82-ao z+bFWuHz|o!z_6vKp6(g_U*H~Y88H{6>Uh#6)4A$?G}ey9`is$=tm?NpbcmMj(OCZ; zwD>Rs=_BIZsPZbD*v$W!`s6a)i%FxwR+lT5)Di9)d2g4@&5x2Xw}T$^7bFO;;TlZ7 z*UcOSK81;U*1?9Sz42 za;J*DaE)7-=N@~idgv6>?h$+D##k^;X4$<|yWnGtuYXh?PBW)>&xS=$p#j|Ucp|8S zvz7(NiT5lyN0vlk&wuh|t&W(2=XrSpK_d$ zf=tybwA}f!>qRF%G#evip}(O6IY3Q}GeW)Ul(X0uNC4jccfII%#j;z~GFIh7UvmEm zynC+2s$?ZbU_y^YWLNnjdRM4r0W&4<{yvw6 zs`i)QRienX zi|uppi>fmj6aEcwlZ1B+wb_zDucK1T{Tc0e-BoPI-%0M{ib(RinB!X@r9X1kS z*Qel}D(^GZ9p}0ycbxB>+y#F@_o(8lj>jLvl6}WmlkSLS!O;wzxx-XBPjS4HhR-8{ z;d~DfM>M^VIX_QhEFYGhhwnS1GfRbz$I(Tn?|oaXSLJm5G|Usk7F=kjVD;mXp9Nco zVc6OO4|?j)ra8Con5vJW@6GHQY0@qC;$tnPbf+O~@f;pMgdDuI}q;`q*PC$?B zFg)p^O;@4@yfUme`>=-HU=R#-;ajmCzF1U)qp@8F^(MwXgDN=!Rba(8P+_9`G8%Oy z9v{_Ub>eLs&eV#IIzr)U3o5y#5$N0NrYcQ~oypc})%NEqnmCE=8#{t8INdvt1?r5q zY19?9JL5eRbDSCHu;(Otp#0}hG|*K@-?_(g)N+nGvfo4Tje?u^OnWlp(0BNupT53{ zCq?vbo$kquDAYu;yO*PM;}zue?(4PwJMcDu1Y^DC?WlfEqI+)|H6}N$SDQxSE#%wS z0CVtL*=JavLeFY!&AtkslM*#y4lN|b8wn~yni3g_xrkV!y@;xi+vBLxLPLS8ye++3 zM7@P-%ShGM@4L>QSL;X=(h)|NGZ~fByc3rBc*HH$^u_`upRmls8x_8>Yw=;dbQ02% zj0w_IF`+I>pio64?>h(8G>uBO^be>#v8*5-3NxTT{DNA^TK$N+;Sfq&4jO})+(P9= zKWL2fWn_;Rc7&(RJXo8^p37i}H)@e7=IZF(tA2f0wL`VL6`i&x&DEv|Sl!bbCO>W7 zbL)B2p45q0cMG%pJ@w+Aw49@N+mn{h1%XaKPuZ|LBs=Xu_jA`S-eAPr()S3sl0< zc+B@he;FiSjkV*xE6OIJw;%$Y46W<2{Ec3n{RMc3q3Zl@fSx-^3S3V&?dS*gIw!%e zGlM;CgC}h5HO4n z)45l4J4^A1gR-~8LHaRtzv3pzq7jarS>T~7rMG(3d#D*vv10V;Gt8S>btoM}F# zU|R5;uBseYrr+@})N{J;(y-Ly>L?VJFx);8(#Uq;ghm2-ZX$oE1twvf;+b9BK6H+S zojFIr;Pj-ukJ#A))!8ZMDAn0^tuxjW7=Mxv_2Fph?SD0MPwM|rpfljL@z1M3XN zpUj%I5tiw_X;mk}(yBhBUah;(OXkEfr%z1NKc}^cmhg9Woxkfo45hq@d^syeojOs* z&>4Ufsz!mrb87oS3kIHMRd0LMRE^PoG4AB8eje2|M$Aw_Kf|L=mb1GpnAU(94)Ar? z)9P(grylXEw zN<&VsBYR%P<&`j(w{ZRXh6Tr*F{nV^qC8TEoJcMWY=^_LFgJ14n|%GU$W>8To;;87 zM^qQjl?{WWpTOB6q_cN6z{?xVu^B%>RR65r-EDcV+VbjdOAi+VQo={QlZCJi=UyG} zMKpR%fx)Q{P1P@9%JlA4?_m?(7Ai!$j#Afi^*RhwJ*<|?UhJKr7O85>hj@Uepg{Z4 zO2X*J-H(#VnZlnD#R!srj-K-KD5+2%K5+V24+_E4fwEzqgTDO9N8t>4H@QbG943sy zR%NSVP*YYdqbu`*)4K1{ms?GTd1UtK+oR#@!yY5CVfzzgNf=2bVK_=cj9LVXFRu3W2Hm6Y2t62fIq&v+X@|^?N7*mdWp+IGj%p{}dbK z1WLd$E&-!Z0=nom?gc6V$IQD&AYd*5rs;o4!;0dxst>|;eR9_^?Bo0xZQU^aFH`_b z;h$4YhVbrkky4>bl!R5HB&gNC>4-Y^Y7Xxd#lXDl1Q&xd^h!pxZwvGPOf~v<~^BzG3%E1 zsc+spdcH#0P#=8ZpNO|>^&OvjF7`~(Q!9DF+hp0k@++y{MvI>2=u>@<5q0Xc zz&Gu^Xk$7p5t=A{8MT#D)=+i! z;1p`vqC3$`&sExAbe+1x=rM>-a%x%h$0YiYSiB%=cr@J5GC+gRI?U|)b~uay?Kt$O z_gsgivB6=Gbo$7df9Gzrx(DAZz1YpQ7rSYpo9Czg2bxFcr}ksnH#IuxFs{NIw!vEc zCu`LB~)#z&^Sk? zSMRDs^6_Gc?-BTytX9`}uS%}YNbvvh+ZPd}e&$`3-t(WBY!(bb-K9z}UK_xu`W*#; zUJ-S+mH$aFFNmHx4bR_rF_yJ@m>VfmC1Ztd1nD4I`*djCmxUvgO~$*V91R6v|CSX}wC&2btc-w1Q~?)74CuFrCeG5>vw@A!jyIE7O~q zRxoujt!3(A+RpR@)7O}Oz%*jAkUx&;HB1*WUCMMlQwP&~nf{n*8`Bd^eM~=NI*Rp@ zz;rRw)l6%cwlnoIeTk``>0gtsNO!qTA%Je0s zKBgZqRXBgfFqPI3$$I?+pTDJJKhy6qwKGj%`d5Q+*Ul8fU#h>?CJK6nsh4RRQ`OPm z_~}fhHWjujvkKanA!wgn(7|5Ke1Gds!C$!S;_e3fBYf+R=4BB@16o;37o!kzq=>)d zQH_OJt%?~uGxNx)VTneKr`g zeGCKm=oJ`%e>ey~5;lBUK%>FDH8ij{IDPbpQ(6dV3#DEUee{uCv(w9Hab z=*TQ9&9jx4qXz@rGNlB+Mampyc8E(j#<8TR+*DLlnkSHomz3FTbpLvrV|8wk(I0`T&)9JzU$u6O2^wA?m`OW})n1sNoV?g!#U;mDihexRHHXGxK>ynwa71{$#~c5c{U zD?<*5gOr+HxV|j6Y|EMgTZxR=3Y)`ORsvU0cB-?i4C-PbrDe;U#p~5HlLYY7OE;39 z1N^j-4W(tpxukTNj;t-k>r0CY^U@1THbLn)kPfqLL$0&PVJ<2%7nUKDO3Mmufp}R; zoW)sN${n`i^il}7mCO7qEw<;D*|HpEg(Vwt58<1Up-?eG6j*qmSO`p66v|&!ZY$%k zh0|rZ#ln~nue5U5R$=}HjP%ruTzeqY0eV3`=5Dm5<*VsJd{!3bZAvY5mN>4PtGZiK zSY!*)$>J^6+>-nvHZ|zs68tqvma|03fD%{2*4Nnbm6ZifWeGMR&&qWWFF$t+wlymi z6mH7t2Hcg1D>XXgr%Yu4!msLwIFR8iW3)84L|I~6uVmzwDJFXv=oV!u!d~huQcTW` z$Sb?DJkOylE8VP^ZK6oR56Z+A@>ix_Kqma>6@WrUA(eT^Q1uEqh$-$nH#*BzE2jLn zBX5It1o@?e5Ju>23NL_7=i2Kbg=~o-BzsD`NhTa zsm2jUmf}RM1OKR_h^_>tNUp&z<={%C0C%7()J}zx)a zggmO>g7+YX<(Cb*E5nn%Ww=hnB6yGdFNJ)H_Yz2651Ii?^^ZxhtCTRsa4DygDCLC- zbR%dM{MkX5qn4(0ErT95gPL)la#qN9s!~ag2&W9bDIAe@+~#oepe=ET@C((j=#B_K zP^?s36yjgR#|b?MgAnm@AQr_)7d;!qA>vsYxF_N}*p-a`!22e|l8#KKbe(~}nb2uI zez%0ghwjkdHHtxXL+%WLJLFQhwklR-KH^x6-*WuP!-iZ*R8~R1;z)i*v?r`gvzZn! zy%qXQgjO=y{T*f!9&QO1r164ic&4pYl%aljCgLES0e={JTo)0#q0(nL?BGpLbyBK;c0xHBADwXmv z53N}P+?A=CDH{-ilpoB`i_0&7|6GK5DLGQZQeH6sNFM2!^k+cqO7UB&#$M=_@~Rwn z1fML9@{lZNV9tpUg#6jc+<-p5zP@ikC_;CnrJ1U}Nt1*qW-^wc;mYu?4TOg|vudsx z*w!4tWFKVblvc`4dH)rAp=VLPD%*hH5;fk1YS@L!9cpSsxWUk*ea=>b z_Ve}iMYePMe=)p)_9Qhc^Z&xwlWj;FyD?ODJfJf5d30f|64WPI)P63(?ae@3l!TzwLK6T zl7ZML*8}+$_#kU7Q?7))$DsX7Xd`}eAz?m36URd2SSUy21GQ`ns>DqQm1@rtzM z_?Lioo%kDg|KiB1=>O*5PUXVCfj)L9!9VdWlfVBPD&cM=_!ovg+^_Q|{Tu!-X8E8r zUzo2l{}TpT#)U5F&OgBdG&=%+@+-`LkIEb*dbcL{7pD1of71WO)AWzr)&5QUm*HHR z{=JkA%{6KW8ZJMOO9x$BKhuHnp-@3TleihaPUyuFMsvxM}G6@W9`2^{P+{UJMyHr3i$#ci#Quf4t}K`BU%vfBxXZ zzK=fs%U}QVlXLx_e)jnnUw(C7(S(IZ42g`=M#sbs9fnW+#f=y_YV?@P;>V5~KjHE# zCK|4sG&w{pt7{fB7)s(Ilj|_}*VN_soDGf5=z_@@3 z<4~JzYYI#9OK&Hfo?FiMGE41F>Xa4kXnbP%`dcv~5;AHa`~Bcgj^?O>Fgzs&T7-8+ z7Eb*aqQ6S^55_a5aXLB-jOAEk0^=cqtt2zXv=a3&GRERZ^{_Gy^fxk={f*g-Wos;l zu^j8fw+SmLu0vU#o$)Zn6^w^7u4JrZ>|!kYFKZaf{>xg%vj5V}SoU9f7>{CkZH#Hw z8XfJ7X(BltUdFP&vy-vx@9bhM`#ZZC%l=LuW7*&7XN>V)_2^?P`#<{`2l_w16#6o- zdoAND8S5F#{?B;ElbLT|JcV%r{#dsd$8ph&n0R6p;Q<(2&Y-H?VY+~HTIF)fbV>4qf z<0Xtc8DG!1i*Xv`ZpKR)`xxKA*w0w@_xCYg&isDHa(qC+(jqD^tC_E5Eb9e5 zXDmlx42)O!~96bcE(YRD;aAU*D#J|tmSc$ zSjKMV4`tlOco<_ZSkHJgV*}$c zjFTA0Gd40F%Q%zqIL0}Q$1}Dwp1`=0@#Tzb7+=BI&3Gc?HpT|VUdC54?qWQNv5)a& z#(j*ZFvbE?)!wEuMmti)S1~p)p2j$d@zsotjK9G+lks%MIgGDiY-gOv*u{7z<66eE z8G9JdWsKFGYW%Kc+{ySl#@&p+$=J_0nQ=ekd5pChA#Xn8c*YADCoujN<7CDujIE4~ zjI$Y=7#A>3Wn977%(#ZJg|VCQ62@(euV?IKoW{6|@lwV<#y2qTW1P+y&3sjV%NXk! zFK29EoXI$e@e0O9#;X};GG45X9=&v+=~1jgeSCo{%J zoYW(e@g~MOj5XXqvonrhT*)|!aSh{W#%{(jjN2FwW$a}`1&n=+HQd1KV;mtH zd_zQfqZsQMM>94sj$xd{cqn5d<8h2L882X5z*xf##tO#Kj9rXl7}qi$%Gkqr9OHJz z3mA7X)^LN;$2gjCALAI=;EWXM9miPDcmd-C#u|gj&t%5YjIE4g7-viWj0>dyDZ+n+ z^v~EO{WGqW{uz6u{{-Q`UHWI-Dg86s(j32RgW6R&og#2{ypP1#%CCN8SiD>#rU_3eT=2tU6lf#cfbr9eD;WQVv5RpB<66cqG4?QSWZcg9 z0OL-^Z!+#?{6ofm#y-aVjA_pcILiE%gMgN*%*GZ^bvl94ljYRi}|-Q z)-!)1<67qDO7|>(IAag<`7x{1Fki>~cIN+xaVO&&8P~FVJ>zcXuV7rs@kwOtXMP!D zH}hvP?q`05bkF?xjJ3l>{@yM9bNF$L^_<@+jN{q;ZpI0Wvlx3={%pp{%-_P;$o#2{ zt<2vj-7|j*<80<{U|hiXdyMVuemdg{<`*+|F|J~)aC#Oou4Vo`jQd#L0>&QZ@09MD zpTxMG`M+S?$@q50-He@#{ft*Jmi^8n822;($BeZ)kv}UL$20y3<2KH(k&F|VzlU)r z$M-tM$;{u*xSjovVr*spYQ|pXk7k_B{56aV7}qkcV0<5A7vqN+*E04nmi^{q7<-tX z&A5xhzl?D^^KW7-`$ZQr?qvQh#@&ot82cG-mi`$($k@l>jb*IW3;lnaaRTde661L0 z=Sx20BaD+7A7gA~+{QSYaXaGz#?LUWV0@CX948pZ*v0&t8OwJ2JB(|Yf0S_>R>U|hmjVR@G`u3-KxjJ?dima&WZTN%eQ-@v$*`Rf^L znSTXi5A$;vw=;jP#LRz)aTnt|8E3NlX^j2MFJ#=$xRkMWgvg(8#_^2bW}LvdhH*0E zI>uJUzha!txRr4M<0XtM7~2_()hG&PPKg?xX6Ml%*Ed)(UP?zEW?<1lv$6#hEi9Vx zM+eP;6I8g{fZ14d&A{{gjkPez#Nk<`4M2D08(X2f>$^+>V;T2)-9vw83 zk&X=x2_@HAG`=gnrbkO`yI%pjx9h=zwCYD!@IdgP4 zSuV}hrNhp0X#D^kG+SFx5r3L*M@Ml$FM?mp_cwC-NZ+Kfa)d`3p*gy;?j`?ZABnI5 z69F7#Cy7`^d%b|L3tAUrVJi`KLhEAIGN0@v5v!GM2wtYS(F zU5tN?bXcqL=9t3=GCl>SSQBErj=Pj;4wS&ouV zbD}A|GJa%ti9pgl*&ksUKG`9~N4h6_B>l5(zeUP0dVm7Ch<3sjJ zSjr>2rT9sCWWSVNGrK1{rgcrh{33lVR&HWG*)@eH^=nhpX9snJ#jd2wyTC6{=o> z_zqR?K}_W<)IF6mvMZ@qDsN;*GT*4&Q95M2i`8^y1ky=!u|w^G$|uE7>XFJRt@o04 zPUV%bEEiO63Cr-Q{8GLQ)&rI2Q2SZ0raKrfD(9i`r1Bn$soW35qI}47Q9TgKFIMwE zD4*(wP=5I!c~oCex~054HJ#Usb@a$%sz*ZeQPd|viK1R1ixZj?^$ST97IqubLz-F4 zIYYCmL-Vm%&8KAnJ&XD%O_A?oG^3vC8(CiHIYjxsnC*||pHpbEy-Lp`3Qgt}o=kyw3q6?v^_I|6usjMqr3T7hxvDpj&d_*>_y^M|581)m!1`U`UY0gl-fjrtll#n&dWiIq8hFkN`KFNc6Mt2pTnPT+LH;ub z@ox;+hlr1?HAx>NFDvle7T6kM2gF|%^4uq!8AyMyy)T~hWEXUZ=PIqH6NiXrF2W1N z>+y6B#rfP?m3pF;FroZHw1PtMt=t-x?l*C(SK=bH(n8$_SEh^jkgbODX?0a7zHJbn zo^qjldP;?2*-DY&ZwW~+J*`A-o)=P&i#y`C2z)7l-X{_fdnsSEpXJ*YwWrB$Xibqg zM18Uz5)$!b4ayPiY|2$}(EAvzl@f0o)b6JC$Hsu3M7uj5trT&HdXD6U;^2M&f=|Dp zd|H1u5R11B`JRvnJ&U&m(T=BeLE;eQEf-JsP`o}6U%{7eo3cFT1>!IG!So1R7>J+1 zw+8ZA;F3Y|?E$+KeEIey!=qJtq45jaxp03+zz#)uB5RZGN&mD`Iuz3?wSjmrf1v;T zLH@;_4kST@7tC*gHwN-g;DUhN2waTSyP@IJ+Q3jO-x{TSS~ES6KQMmwfZYoD)T#+} z?;OOZ)rpc%?Ic<;E-|%RNs2hcdjzdbmzdh)ve$s#uc^H*-;zZ?0_j`I6VJz>{YWh9 zA%W>v%BSaNQNSJrzZm649HJc?jGt&{2g{{+?+osjA>JQC`6QpptvE!xMD|M1dp@OK z>{UW8#CsC0p%aIAkCVL-)GtByC3{IkKM9q0nLg2OmAxmT|0EGDAK9-X-hVa*^d;U` zHU-LucrOUXU$)!j9m0vIJ*57``^~06Juco0Wp4=ei_m+c>?NUo2g=W2c@*z=vNweI z^xhytBTV%m{fa}pmxS^~c?^&0wNul;5+WE4ViTD(LsC$wh ztPjL{STH`KpFs9XQGX2CJFPzyhrskJ4%sf2HHO5p#7itor08dmy57IG7%R=~o=0UqbeliTNnJWMZb;gWu*Q%N`26NL_dz~eI!2FOE5o0zYVQ%6^H2Ou?L>t z;yqCOhUzEuerS3{zszRDLL8$1Bp4sj-lO_N)W|_BELLLaU*Lj3d<3TT-{KIsJWxLf z>G7X&SqtHxGJ;T7@@+DZmx?i23BU=}AdRGP0nvCTA@( zEhCz?jQZS&Qs4Tl$v3L^%dig@9W!R!Twa!UbG|LNd`n5*j6C_A;Tx(O`jPc@;Ko1e zB1w!Z3>LQ{%baz4$+k`2EqhaUO`SYx$6L8OG;p+J{>|9m%Pu2)^Ll4tQU1*0H_ARTN4gs}5^ixm3U{xA#$hqQ$hlF<$k{qOxe0^! z8f5P8aGqyb&*M5WUQyy77qa6*;v@Z(j>YG|aY{em!}V`)2K-EjQ6}W;lnHZ(D-+7% z`w*+H5njC-CdGdu29xGsLc%N#Lrweau*^8aFvW0uqGE7dp&0TnR}6C}CeXPv^C;XOh5Ms$f7A-SUBmj;U~$HBgW07}bXOH%2CJcoR^vZ;l7wRESAF1daQHmaJ^|Oci zWPYumiw~yZv`gKSP0S7p4jh$Cn| z;)yhlT`{^(y07|{qRdYTx*t0=Mj5j*P8l;-uZ$@h(Wmzf_YSqk<}CaUK6Q#OR<+4PP!%b8Ep76*zjd5 zM)t+|bX~)|u>l)SNLQ3YINxP?ny4@(O7nBoKgm$fP&+J(MT+?T@Gxcg?3g5Br*W`T zy`no4Yag39%ren20{VzUxO!z|>hSwx`n0~tt_W`!>kP?Igg+hp4Oeu(QvF>!(V>Sw z5#Nz>hL;WYmqh+J&4GBZeT}_BtLW~J?ThwBd572|a>6sik|_Vwu*g>Phrw2dD*F3} z+JoteLii|Wvt#W-_d{V{urri7vM=bqi*!$Qj2;icl{mxLZePbEpcwcY(vDR#36oh zvxoU&?J`~`gA_Z^`P6g;chgV0Qa%mvDd{aQ|Fe4 zPt_EJ>-&cLhIYkxwf3l-$V_3sN#kKlSj446y-T{1_87Gd_i;9`996G_>V-IphXZGR z6yg)9#z*?UVLRSwa6T^mtM;!$9t=l4Gz|HG{J0JJ~`7lsguSy<$HW^hFqlSxks?UNIs8`iGI}UZW9(A@3b@p)O^83Y;VC?uvWvC`j z3AI(2fgg-vzdeC=4uKx{>;`@f zrw?bBMWcKOik>NMa+Q?kWBVWhZYeI!cNS6G-Wak!^_WR;e-!sFCx7B-r~R_M5?x6D zy??sU)xY;o7kcCm{zAuQFlx>u9l8erg640do8|vrb$_5 zyZz$+vo7j;KoF3Ud7W@3c1|{~R`>swL6|IySDVTov~*kzU# z7Gv-6%^cn=Qo_fYloh$RtGjd?MZB`|O6|gh2|CQQ(En<&?}M=rdySWsKW6x{s{%tcUqr&Kp*i&5W zZ=QxJQ@4hvm78trof|jW$}-Dr<;Y9Lj(dS!#g|~;c4VRCttKh7gNCK7tQ75$_#sGI z2%f63l;j~6nWd^OmGiWdbO>If3Ehsqh@@qxb-K`=x(|FK-K7Ya^79cTv}9fi&py@X3FR0mRrwu{YC$&Drmalf zioGPyrfx`%{k8Svci@ihQ2*;{80vQGv|GBVT#Xg3lo`aalx!|6D=nb{CQ3y48nnbT z6xPL92O?HDic)j!lwYZ(Fy#t|@(A5aFD>2Vw96{OQsTe{;>zR1SzUa$6oS?5()+0UMQz8$-XiCl3xHYmE>pH3rkc@D7OsBDzc$L zth-PjO39FwwzA?v)EO{0{$4@lkd=Wi65LJKP>c8qK@}lHNuV8s)J!NQ$)Pp{ogJpM zibP^>`m151NYbDW6(~wmc)Bfj^96>WI8h!DN@0E~88UX4QCg{VnNl4dT=qo?e=ZvZ;OpK(+g1)sn>L7gE&g6*hsMB?-a= z$Y$aD%kbq+huw+I{84rV2X{@XuPl6pK~a7ho*vvgAG}(P`b`3gLEu{iZ;M)@q`b7q zMk)Af2!;wFWd`MXNZE-cOftBDL!HV8BCRkvlCws+OMDf9i`!BDrUH3dqugLwvCNV_ zXZDQzBH3kpVdL!IcmA#hX4k)&_|xf%^4vPZnGG-DlVmtTJ&8N#&sWBT-u>@i4-QAP zo`P}*;~+;|4dxHV|ET+a)c?O){^0lw#)HHEzlupOsUeBK`K0Kl&taO+w18<5Q#(@! z(+Z}QOkGTCn7WznXWGv6IMYt1&ob>|`V!M_rmr#eF@2Y*pXvKd`j?Mz)vA7t9dw2f&e(>|th|0MUd1IKBk-a}0MYh50nJy6bIPybVVO3&X) zQE{ispQ$b%gENdz1g~C4fX3s5c82zeII7DGVwsbdRS5(6j*cKIxzCU(49UIF&J8 zN>x8A_1C4S6yr4DwBwwB6CD?7{3#t2pGuq*=N(M%2BoxA;UxY} zoFwN5IIqU}5aT*fN=GA33a;-iS= zYFX|-N@pO6bjtR*e{y3K#yG2;6>?*6Uu$%Vgfe*S#g#EPRY8cR?3 z?(3;Mb^YNVdQ4C3+O%rgygldazO9R&c>Q~CeEN&ed$+gVm|FKAo8Ni%tSH=nX* zWG{ZV<%jbYT-*MuKWAmM{Bhl)r`9c~e(3(S=hrp&)fv1io9_E&?h9X5udVK$x^DNU zuWoGpQU712Jz3wm?)A!&^ix0oiQ(R`6**<&w!l+vY}yz~0;*YAI-<%1Ms^P`1Dhlc#_oA>ml z%vtor;yeEM`v;!xjp1Njdw$%sr7u z?%y@~b92g+l%}3}P1F8#m**QP+xFMJ`$YcMC0(zt`c~eZkMZa6g;(x=A^Gm>f6}ged3M2Tu59i2U;5vQyO^RQ3gKhnnRo_1p`M|cgcN5=u`1G01h}WCD z)gD^1_0XeWq^J)n^`e|rGL~-ic(!lFSuskZz>RVqXC&=F|3k(^PW z^KnvG>7Z}(bsy*gY$T$_8T3J%6i=eR$4P$sKzB{V_el{47pMm(h5HETTa%zW+o3YM<%c`RijPP#UL8u^;&lQ@$g#|t_? zNn9@k{T*L>LHlu1+KJNqE4n5cHwSa%;CBLO4oAA_urL1oRlu2wev*$iH@Ex>@yy;87GD10o}b2y2JH- zpi36v+x3uX1-&l?wuft?^B2R?;btM|j8u$1;yM}h7dR;|+@MErRzT-o(9dyF9KHZe zF^g+E=$lJmbMWf}rNzqRhUhY!6#q<6JKxt^6=faH2jIR2^hKPM7cYUnk%n&*kQ~r+ zI7v=F=&Yqe&RozeoPM}j33?k&a^nDP!AWxbpyM;}{KB;nG#_U&uI->MoJL&Nfc^ld z8P{&mI-FKqH-au)Cc+|Ggp=eGeF3K$PtYOD#dQVfM>x~rMw^LsM>xq%C1}EpRE9Mw zeFN82C-^{ry+T|+0=g`V^#i(gCE^PAH-mQKB>N|NG+W$14%&uS)~#?ubji(#AFi#S zN7kX9!L=8Z=B72`n&?e9DgHNuK8cg!)&=@m4s?j?FF<$Xiu*f3KjiD7>ru{dl6#`@ zc|s1+YK&L@75DE0eF`VZe+l&J4dVJ5&_{7nIcf*}6W@Oy^v;c_ub_uM&{f5-Ra|F- zZpTS-DnZ}mYai$}B_a+)n{bj29|8SYDQp|p4}zNQSRaCGqSZJb#I+mr1Dsx5_kli8 z2A$%XC_YQCyoT!{&L0fj=y&Tsb(9(NQ7I3ZqF6xu}kVag0 zf^NTGTvvj=^)sXq_umE8{#?i*dJj%2`!3MrhcRaw*FgO8J+(y(PxStPN+XT6oZ|DZSu36~B2wF)e+_*raTEzVcpx@dH+kkr`=wY1n{Cxs+ z_&&q~_me;!`%z|bO*G|z(2o&x*g>op#C<*JNt~Iu?gVW(ggOY=E7 zaG6$3bv8QXI&3sMs(P@r3-6u-(!|9qR z&3~qAqBQrJu8Gq8X1XRybD8OyD9y>GYoavYn68P^oME~qO7nl|n&?Y>jokeA@lVkJ zYyom`Rt^-0Jj9Kpi`(+X{%N)Nlcz*z$CPi{M@3_65FC_TWsaiQoc1TW?^o5xvhA8(G~*)l$0-;<}53j zU!GTBE6y!XEH2C|D=jbG;7H6XEuNoSUOZ#-tZ4?!Q7hbFD|f684Gp3UhJ}tYXSw=0 zCYCno??{_7N%aSx<+eO$S)pSKW85jT-R49nwtUPJ+>FU68*SwQW+>ZI0k1UkDc!c& zR%9rm-$m1M%hO6Wmu|9^O*1$PO?i2kUAAc2hTNiZ+cd+>fSiRhFCEIlnFHdqaAqKJ z@V;=S)EmHs*>T|=FX|86b=B9@*Veo1+v~mco%Kl#$qn)Q4EqxHCGB(VtKH|>*S@cF zU-v%$zW#mM{qg$~_9ySR?$6#|u)kuzYk%#2&;IuPo%_4@`}Zqds{JUnhdhVc4|N{u zKIA{tkNQaQp?-uBY2ESe1b4FA>dtl-xGUT)cdgswZg+ROyWM_wzgt@uUzbpqTxYGz zt}CdksB_iT)_LmM>pJVY>-=^7b=vy)`h@!AdTV`leL;Oiy$iASAl9Ar-RSS`uh%xj zHzXkT)`skcf`*C)S3_-sr=h)}v!T1e-_YNnZH#YBXiRRjHfA>#G*&da8fzOpjqQz{ zjopp@#{NcaQ+!iGQ*x8FDZ8nlsiMi%RNLffYH#Xn>TdEk^*3po0FTRL01Tl_8kEm}{! zC&82Kv3jyS1)d6z%Tw#|c-lRko^Frd)9=yljo+KFH+iphZ}#4Ty%l?1du#W4_O|cs z+}pj^zqfy{wl%&rp*6YH+M3;3&|1;zYOQVcw6?c)wsyDrTl-tJ`{I#n$@{GPviBA2 ztM~_VuYbSxK>UG(1IY)h2eJyYnI z-yx+BbvxA)ZoS*!PI4RFneH67-CgOfal74ZZm+w`?Q{3Jl{$T$p)RS;SeIFsQ)jQM ztgESW*R|Do>$>WEb$xY8y}sU1pHy$G&#cd>x7Sy~e%kEUwvP_(x7iJG$b_` z8!{Vm8te^~4K)q!hPDQ8Lsx^Zp|3${)HfO$lNybUnTM6PP4tavbm<& z-Q3pfZSHFJHTN|uE&3KiOHzxmC9@@`#okicQq$sYX>0MebhY?e`dSo^-ed42d5oS+ zPmag#sr1x%+@3a%*VE)WTGO`+&D>bODzN`{hz_X^zVLOJrGB=w;zDGgd^F&=tMfF_fnODnXQ z4Sg0sqZQDp3tFv(UOmukJ9OI#?RG=IerUKKI@UtV@v5Gap=m30oegalK;IS6xC=V3 zh1NaLdpk7W3Eg)?`+n%ZA32~!9>gOT5|9tc$O$X*A{)6;fc&UHj<}E~-6)gsD396D zzX$qnM-C+IZ-d2pRh#XG)%sz#{i@|6fkut8kkX0z#D^NC4|R%CuZ1k2Q1X%E|4$zOA1toufB*mh literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/win32-x64-node-0.11/deasync.node b/task/node_modules/deasync/bin/win32-x64-node-0.11/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..faa7b2def33c4fef0dc37fec8e3c19160b8a6d37 GIT binary patch literal 107008 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 z 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 BmgfKf literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/win32-x64-node-10/deasync.node b/task/node_modules/deasync/bin/win32-x64-node-10/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..7df9ae05f25fc6369e0ef4f27e0be9579598775f GIT binary patch literal 110592 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 literal 0 HcmV?d00001 diff --git a/task/node_modules/deasync/bin/win32-x64-node-11/deasync.node b/task/node_modules/deasync/bin/win32-x64-node-11/deasync.node new file mode 100644 index 0000000000000000000000000000000000000000..fd9bab83abc30ab04856f331ae2582478532e46a GIT binary patch literal 110592 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
0wy%WvoR2GrjE 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

fkPhq`+y~_h+^D<|RTLn?mRa@=abS0V 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 z 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