From 49101a0e864033cf30273c7b30283a9f5fb8b05e Mon Sep 17 00:00:00 2001 From: Stainless Bot <107565488+stainless-bot@users.noreply.github.com> Date: Wed, 20 Sep 2023 18:06:57 -0400 Subject: [PATCH] feat(client): support importing node or web shims manually (#325) --- .prettierignore | 3 + README.md | 4 + build | 15 +- ecosystem-tests/bun/openai.test.ts | 34 + ecosystem-tests/bun/tsconfig.json | 3 +- ecosystem-tests/cli.ts | 78 +- .../cloudflare-worker/package.json | 2 +- .../src/uploadWebApiTestCases.ts | 34 + .../cloudflare-worker/src/worker.ts | 5 + .../cloudflare-worker/tests/test.js | 2 +- .../cloudflare-worker/tsconfig.json | 1 + ecosystem-tests/deno/main_test.ts | 34 + .../jest.config.cjs | 0 .../moduleResolution/node/type-tests.ts | 14 + .../moduleResolution/nodenext/type-tests.ts | 5 + .../node-ts-cjs-auto/package-lock.json | 3868 +++++++++++++++ .../package.json | 9 +- .../sample1.mp3 | Bin .../node-ts-cjs-auto/tests/shims.ts | 7 + .../tests/test.ts | 0 .../node-ts-cjs-auto/tsconfig.json | 54 + .../node-ts-cjs-auto/tsconfig.nodenext.json | 54 + .../jest.config.cjs | 0 .../package-lock.json | 721 ++- ecosystem-tests/node-ts-cjs-web/package.json | 28 + .../sample1.mp3 | Bin .../node-ts-cjs-web/tests/shims.ts | 11 + .../tests/test-jsdom-unpolyfilled.ts | 11 + .../node-ts-cjs-web/tests/test-jsdom.ts | 166 + .../tests/test-node.ts} | 65 +- .../tsconfig.json | 2 +- .../tsconfig.nodenext.json | 2 +- ecosystem-tests/node-ts-cjs/package-lock.json | 632 ++- ecosystem-tests/node-ts-cjs/package.json | 2 + .../node-ts-cjs/tests/late-shim-errors.ts | 8 + .../node-ts-cjs/tests/multiple-shim-errors.ts | 8 + ecosystem-tests/node-ts-cjs/tests/shims.ts | 12 + .../tests/test-jsdom-compat-error.ts | 11 + .../node-ts-cjs/tests/test-jsdom.ts | 146 + .../node-ts-cjs/tests/test-node.ts | 194 + ecosystem-tests/node-ts-cjs/tsconfig.json | 3 +- .../node-ts-cjs/tsconfig.nodenext.json | 3 +- .../node-ts-esm-auto/esnext-type-tests.ts | 5 + .../jest.config.cjs | 0 .../package-lock.json | 0 ecosystem-tests/node-ts-esm-auto/package.json | 23 + .../sample1.mp3 | Bin .../node-ts-esm-auto/tests/shims.ts | 5 + .../node-ts-esm-auto/tests/test.ts | 196 + .../node-ts-esm-auto/tsconfig.json | 54 + .../node-ts-esm-web/jest.config.cjs | 23 + .../package-lock.json | 355 +- .../package.json | 2 +- ecosystem-tests/node-ts-esm-web/sample1.mp3 | Bin 0 -> 121671 bytes .../node-ts-esm-web/tests/shims.ts | 12 + .../tests/test.ts | 66 +- .../tsconfig.json | 2 +- .../tsconfig.noderesolution.json | 2 +- ecosystem-tests/node-ts-esm/package.json | 2 +- ecosystem-tests/node-ts-esm/tests/shims.ts | 7 + .../node-ts-esm/tests/test-esnext.ts | 68 + ecosystem-tests/node-ts-esm/tests/test.ts | 2 + ecosystem-tests/node-ts-esm/tsconfig.json | 2 +- .../node-ts-esm/tsconfig.noderesolution.json | 3 +- .../node-ts4.5-jest27/jest.config.cjs | 9 + .../node-ts4.5-jest27/package-lock.json | 4395 +++++++++++++++++ .../package.json | 7 +- ecosystem-tests/node-ts4.5-jest27/sample1.mp3 | Bin 0 -> 121671 bytes .../tests/test.ts | 21 + .../tsconfig.json | 2 +- .../ts-browser-webpack/package.json | 2 +- .../ts-browser-webpack/src/index.ts | 35 + .../vercel-edge/src/uploadWebApiTestCases.ts | 63 +- jest.config.js | 2 +- package.json | 94 +- release-please-config.json | 4 +- scripts/postprocess-files.cjs | 160 + scripts/remove-triple-slash-references.js | 11 - scripts/replace-self-referencing-imports.js | 24 - scripts/replace-shim-guards.js | 14 - scripts/resolve-full-paths.js | 16 - src/_shims/MultipartBody.ts | 9 + src/_shims/README.md | 46 + src/_shims/ReadableStream.d.ts | 38 - src/_shims/ReadableStream.mjs | 7 - src/_shims/agent-node.ts | 22 - src/_shims/agent.ts | 12 - .../runtime-bun.ts} | 3 +- .../runtime-deno.ts} | 4 +- src/_shims/auto/runtime-node.ts | 4 + src/_shims/auto/runtime.ts | 4 + src/_shims/auto/types-deno.ts | 4 + src/_shims/auto/types-node.ts | 4 + src/_shims/auto/types.d.ts | 99 + src/_shims/auto/types.js | 3 + src/_shims/auto/types.mjs | 3 + src/_shims/bun-runtime.ts | 14 + src/_shims/fetch-deno.ts | 27 - src/_shims/fetch-node.d.ts | 64 - src/_shims/fetch-node.js | 12 - src/_shims/fetch-node.mjs | 14 - src/_shims/fetch.d.ts | 60 - src/_shims/fetch.js | 13 - src/_shims/fetch.mjs | 15 - src/_shims/fileFromPath-node.ts | 29 - src/_shims/fileFromPath.ts | 29 - src/_shims/form-data-deno.ts | 19 - src/_shims/form-data-node.d.ts | 45 - src/_shims/form-data-node.js | 11 - src/_shims/form-data-node.mjs | 9 - src/_shims/form-data.d.ts | 43 - src/_shims/form-data.js | 17 - src/_shims/form-data.mjs | 20 - src/_shims/getMultipartRequestOptions-node.ts | 25 - src/_shims/getMultipartRequestOptions.ts | 14 - src/_shims/index-deno.ts | 110 + src/_shims/index.d.ts | 79 + src/_shims/index.js | 13 + src/_shims/index.mjs | 7 + src/_shims/manual-types.d.ts | 12 + src/_shims/manual-types.js | 3 + src/_shims/manual-types.mjs | 3 + src/_shims/node-readable-node.ts | 10 - src/_shims/node-readable.ts | 30 - src/_shims/node-runtime.ts | 79 + src/_shims/node-types.d.ts | 42 + src/_shims/node-types.js | 3 + src/_shims/node-types.mjs | 3 + src/_shims/registry.ts | 62 + src/_shims/web-runtime.ts | 91 + src/_shims/web-types.d.ts | 82 + src/_shims/web-types.js | 3 + src/_shims/web-types.mjs | 3 + src/core.ts | 41 +- src/index.ts | 2 +- src/shims/node.ts | 50 + src/shims/web.ts | 50 + src/streaming.ts | 2 +- src/uploads.ts | 26 +- tests/form.test.ts | 2 +- tests/index.test.ts | 2 +- tests/responses.test.ts | 2 +- tests/uploads.test.ts | 2 +- tsconfig.build.json | 20 +- tsconfig.deno.json | 4 +- tsconfig.json | 6 +- yarn.lock | 322 +- 147 files changed, 12522 insertions(+), 1325 deletions(-) rename ecosystem-tests/{node-ts-cjs-dom => node-ts-cjs-auto}/jest.config.cjs (100%) create mode 100644 ecosystem-tests/node-ts-cjs-auto/moduleResolution/node/type-tests.ts create mode 100644 ecosystem-tests/node-ts-cjs-auto/moduleResolution/nodenext/type-tests.ts create mode 100644 ecosystem-tests/node-ts-cjs-auto/package-lock.json rename ecosystem-tests/{node-ts-cjs-dom => node-ts-cjs-auto}/package.json (74%) rename ecosystem-tests/{node-ts-cjs-dom => node-ts-cjs-auto}/sample1.mp3 (100%) create mode 100644 ecosystem-tests/node-ts-cjs-auto/tests/shims.ts rename ecosystem-tests/{node-ts-cjs-ts4.5 => node-ts-cjs-auto}/tests/test.ts (100%) create mode 100644 ecosystem-tests/node-ts-cjs-auto/tsconfig.json create mode 100644 ecosystem-tests/node-ts-cjs-auto/tsconfig.nodenext.json rename ecosystem-tests/{node-ts-cjs-ts4.5 => node-ts-cjs-web}/jest.config.cjs (100%) rename ecosystem-tests/{node-ts-cjs-ts4.5 => node-ts-cjs-web}/package-lock.json (85%) create mode 100644 ecosystem-tests/node-ts-cjs-web/package.json rename ecosystem-tests/{node-ts-cjs-ts4.5 => node-ts-cjs-web}/sample1.mp3 (100%) create mode 100644 ecosystem-tests/node-ts-cjs-web/tests/shims.ts create mode 100644 ecosystem-tests/node-ts-cjs-web/tests/test-jsdom-unpolyfilled.ts create mode 100644 ecosystem-tests/node-ts-cjs-web/tests/test-jsdom.ts rename ecosystem-tests/{node-ts-cjs-dom/tests/test.ts => node-ts-cjs-web/tests/test-node.ts} (78%) rename ecosystem-tests/{node-ts-cjs-dom => node-ts-cjs-web}/tsconfig.json (97%) rename ecosystem-tests/{node-ts-cjs-dom => node-ts-cjs-web}/tsconfig.nodenext.json (97%) create mode 100644 ecosystem-tests/node-ts-cjs/tests/late-shim-errors.ts create mode 100644 ecosystem-tests/node-ts-cjs/tests/multiple-shim-errors.ts create mode 100644 ecosystem-tests/node-ts-cjs/tests/shims.ts create mode 100644 ecosystem-tests/node-ts-cjs/tests/test-jsdom-compat-error.ts create mode 100644 ecosystem-tests/node-ts-cjs/tests/test-jsdom.ts create mode 100644 ecosystem-tests/node-ts-cjs/tests/test-node.ts create mode 100644 ecosystem-tests/node-ts-esm-auto/esnext-type-tests.ts rename ecosystem-tests/{node-ts-esm-dom => node-ts-esm-auto}/jest.config.cjs (100%) rename ecosystem-tests/{node-ts-esm-dom => node-ts-esm-auto}/package-lock.json (100%) create mode 100644 ecosystem-tests/node-ts-esm-auto/package.json rename ecosystem-tests/{node-ts-esm-dom => node-ts-esm-auto}/sample1.mp3 (100%) create mode 100644 ecosystem-tests/node-ts-esm-auto/tests/shims.ts create mode 100644 ecosystem-tests/node-ts-esm-auto/tests/test.ts create mode 100644 ecosystem-tests/node-ts-esm-auto/tsconfig.json create mode 100644 ecosystem-tests/node-ts-esm-web/jest.config.cjs rename ecosystem-tests/{node-ts-cjs-dom => node-ts-esm-web}/package-lock.json (94%) rename ecosystem-tests/{node-ts-esm-dom => node-ts-esm-web}/package.json (94%) create mode 100644 ecosystem-tests/node-ts-esm-web/sample1.mp3 create mode 100644 ecosystem-tests/node-ts-esm-web/tests/shims.ts rename ecosystem-tests/{node-ts-esm-dom => node-ts-esm-web}/tests/test.ts (77%) rename ecosystem-tests/{node-ts-esm-dom => node-ts-esm-web}/tsconfig.json (97%) rename ecosystem-tests/{node-ts-esm-dom => node-ts-esm-web}/tsconfig.noderesolution.json (97%) create mode 100644 ecosystem-tests/node-ts-esm/tests/shims.ts create mode 100644 ecosystem-tests/node-ts-esm/tests/test-esnext.ts create mode 100644 ecosystem-tests/node-ts4.5-jest27/jest.config.cjs create mode 100644 ecosystem-tests/node-ts4.5-jest27/package-lock.json rename ecosystem-tests/{node-ts-cjs-ts4.5 => node-ts4.5-jest27}/package.json (79%) create mode 100644 ecosystem-tests/node-ts4.5-jest27/sample1.mp3 rename ecosystem-tests/{node-ts-cjs => node-ts4.5-jest27}/tests/test.ts (88%) rename ecosystem-tests/{node-ts-cjs-ts4.5 => node-ts4.5-jest27}/tsconfig.json (97%) create mode 100644 scripts/postprocess-files.cjs delete mode 100644 scripts/remove-triple-slash-references.js delete mode 100644 scripts/replace-self-referencing-imports.js delete mode 100644 scripts/replace-shim-guards.js delete mode 100644 scripts/resolve-full-paths.js create mode 100644 src/_shims/MultipartBody.ts create mode 100644 src/_shims/README.md delete mode 100644 src/_shims/ReadableStream.d.ts delete mode 100644 src/_shims/ReadableStream.mjs delete mode 100644 src/_shims/agent-node.ts delete mode 100644 src/_shims/agent.ts rename src/_shims/{ReadableStream.js => auto/runtime-bun.ts} (67%) rename src/_shims/{ReadableStream-node.ts => auto/runtime-deno.ts} (50%) create mode 100644 src/_shims/auto/runtime-node.ts create mode 100644 src/_shims/auto/runtime.ts create mode 100644 src/_shims/auto/types-deno.ts create mode 100644 src/_shims/auto/types-node.ts create mode 100644 src/_shims/auto/types.d.ts create mode 100644 src/_shims/auto/types.js create mode 100644 src/_shims/auto/types.mjs create mode 100644 src/_shims/bun-runtime.ts delete mode 100644 src/_shims/fetch-deno.ts delete mode 100644 src/_shims/fetch-node.d.ts delete mode 100644 src/_shims/fetch-node.js delete mode 100644 src/_shims/fetch-node.mjs delete mode 100644 src/_shims/fetch.d.ts delete mode 100644 src/_shims/fetch.js delete mode 100644 src/_shims/fetch.mjs delete mode 100644 src/_shims/fileFromPath-node.ts delete mode 100644 src/_shims/fileFromPath.ts delete mode 100644 src/_shims/form-data-deno.ts delete mode 100644 src/_shims/form-data-node.d.ts delete mode 100644 src/_shims/form-data-node.js delete mode 100644 src/_shims/form-data-node.mjs delete mode 100644 src/_shims/form-data.d.ts delete mode 100644 src/_shims/form-data.js delete mode 100644 src/_shims/form-data.mjs delete mode 100644 src/_shims/getMultipartRequestOptions-node.ts delete mode 100644 src/_shims/getMultipartRequestOptions.ts create mode 100644 src/_shims/index-deno.ts create mode 100644 src/_shims/index.d.ts create mode 100644 src/_shims/index.js create mode 100644 src/_shims/index.mjs create mode 100644 src/_shims/manual-types.d.ts create mode 100644 src/_shims/manual-types.js create mode 100644 src/_shims/manual-types.mjs delete mode 100644 src/_shims/node-readable-node.ts delete mode 100644 src/_shims/node-readable.ts create mode 100644 src/_shims/node-runtime.ts create mode 100644 src/_shims/node-types.d.ts create mode 100644 src/_shims/node-types.js create mode 100644 src/_shims/node-types.mjs create mode 100644 src/_shims/registry.ts create mode 100644 src/_shims/web-runtime.ts create mode 100644 src/_shims/web-types.d.ts create mode 100644 src/_shims/web-types.js create mode 100644 src/_shims/web-types.mjs create mode 100644 src/shims/node.ts create mode 100644 src/shims/web.ts diff --git a/.prettierignore b/.prettierignore index 804a75c60..fc6160fb1 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,3 +2,6 @@ CHANGELOG.md /ecosystem-tests /node_modules /deno + +# don't format tsc output, will break source maps +/dist diff --git a/README.md b/README.md index 7172ff706..2b5f53335 100644 --- a/README.md +++ b/README.md @@ -318,5 +318,9 @@ The following runtimes are supported: - Bun 1.0 or later. - Cloudflare Workers. - Vercel Edge Runtime. +- Jest 28 or greater with the `"node"` environment (`"jsdom"` is not supported at this time). +- Nitro v2.6 or greater. + +Note that React Native is not supported at this time. If you are interested in other runtime environments, please open or upvote an issue on GitHub. diff --git a/build b/build index 785c3c755..85d5b4bc8 100755 --- a/build +++ b/build @@ -12,7 +12,7 @@ rm -rf dist; mkdir dist # Copy src to dist/src and build from dist/src into dist, so that # the source map for index.js.map will refer to ./src/index.ts etc cp -rp src README.md dist -rm dist/src/_shims/*-deno.* +rm dist/src/_shims/*-deno.ts dist/src/_shims/auto/*-deno.ts for file in LICENSE CHANGELOG.md; do if [ -e "${file}" ]; then cp "${file}" dist; fi done @@ -27,8 +27,8 @@ node scripts/make-dist-package-json.cjs > dist/package.json # build to .js/.mjs/.d.ts files npm exec tsc-multi # copy over handwritten .js/.mjs/.d.ts files -cp src/_shims/*.{d.ts,js,mjs} dist/_shims -npm exec tsc-alias -- -p tsconfig.build.json +cp src/_shims/*.{d.ts,js,mjs,md} dist/_shims +cp src/_shims/auto/*.{d.ts,js,mjs} dist/_shims/auto # we need to add exports = module.exports = OpenAI Node to index.js; # No way to get that from index.ts because it would cause compile errors # when building .mjs @@ -40,14 +40,7 @@ node scripts/fix-index-exports.cjs cp dist/index.d.ts dist/index.d.mts cp tsconfig.dist-src.json dist/src/tsconfig.json -# strip out lib="dom" and types="node" references; these are needed at build time, -# but would pollute the user's TS environment -find dist -type f -exec node scripts/remove-triple-slash-references.js {} + -# strip out `unknown extends RequestInit ? never :` from dist/src/_shims; -# these cause problems when viewing the .ts source files in go to definition -find dist/src/_shims -type f -exec node scripts/replace-shim-guards.js {} + - -npm exec prettier -- --loglevel=warn --write . +node scripts/postprocess-files.cjs # make sure that nothing crashes when we require the output CJS or # import the output ESM diff --git a/ecosystem-tests/bun/openai.test.ts b/ecosystem-tests/bun/openai.test.ts index f6642c7cf..6eb1ca947 100644 --- a/ecosystem-tests/bun/openai.test.ts +++ b/ecosystem-tests/bun/openai.test.ts @@ -2,6 +2,7 @@ import OpenAI, { toFile } from 'openai'; import fs from 'fs'; import { distance } from 'fastest-levenshtein'; import { test, expect } from 'bun:test'; +import { ChatCompletion } from 'openai/resources/chat/completions'; const url = 'https://audio-samples.github.io/samples/mp3/blizzard_biased/sample-1.mp3'; const filename = 'sample-1.mp3'; @@ -42,6 +43,39 @@ test(`basic request works`, async function () { expectSimilar(completion.choices[0]?.message?.content, 'This is a test', 10); }); +test(`raw response`, async function () { + const response = await client.chat.completions + .create({ + model: 'gpt-4', + messages: [{ role: 'user', content: 'Say this is a test' }], + }) + .asResponse(); + + // test that we can use web Response API + const { body } = response; + if (!body) throw new Error('expected response.body to be defined'); + + const reader = body.getReader(); + const chunks: Uint8Array[] = []; + let result; + do { + result = await reader.read(); + if (!result.done) chunks.push(result.value); + } while (!result.done); + + reader.releaseLock(); + + let offset = 0; + const merged = new Uint8Array(chunks.reduce((total, chunk) => total + chunk.length, 0)); + for (const chunk of chunks) { + merged.set(chunk, offset); + offset += chunk.length; + } + + const json: ChatCompletion = JSON.parse(new TextDecoder().decode(merged)); + expectSimilar(json.choices[0]?.message.content || '', 'This is a test', 10); +}); + test(`streaming works`, async function () { const stream = await client.chat.completions.create({ model: 'gpt-4', diff --git a/ecosystem-tests/bun/tsconfig.json b/ecosystem-tests/bun/tsconfig.json index 29f8aa003..69a17ce99 100644 --- a/ecosystem-tests/bun/tsconfig.json +++ b/ecosystem-tests/bun/tsconfig.json @@ -1,4 +1,5 @@ { + "include": ["*.ts"], "compilerOptions": { "lib": ["ESNext"], "module": "esnext", @@ -8,7 +9,7 @@ "allowImportingTsExtensions": true, "strict": true, "downlevelIteration": true, - "skipLibCheck": true, + "skipLibCheck": false, "jsx": "preserve", "allowSyntheticDefaultImports": true, "forceConsistentCasingInFileNames": true, diff --git a/ecosystem-tests/cli.ts b/ecosystem-tests/cli.ts index 6d4095f1c..00ea96bfd 100644 --- a/ecosystem-tests/cli.ts +++ b/ecosystem-tests/cli.ts @@ -7,7 +7,20 @@ import path from 'path'; const TAR_NAME = 'openai.tgz'; const PACK_FILE = `.pack/${TAR_NAME}`; +async function defaultNodeRunner() { + await installPackage(); + await run('npm', ['run', 'tsc']); + if (state.live) await run('npm', ['test']); +} + const projects = { + 'node-ts-cjs': defaultNodeRunner, + 'node-ts-cjs-web': defaultNodeRunner, + 'node-ts-cjs-auto': defaultNodeRunner, + 'node-ts4.5-jest27': defaultNodeRunner, + 'node-ts-esm': defaultNodeRunner, + 'node-ts-esm-web': defaultNodeRunner, + 'node-ts-esm-auto': defaultNodeRunner, 'ts-browser-webpack': async () => { await installPackage(); @@ -45,36 +58,6 @@ const projects = { await run('npm', ['run', 'deploy']); } }, - 'node-ts-cjs': async () => { - await installPackage(); - - await run('npm', ['run', 'tsc']); - - if (state.live) { - await run('npm', ['test']); - } - }, - 'node-ts-cjs-ts4.5': async () => { - await installPackage(); - await run('npm', ['run', 'tsc']); - }, - 'node-ts-cjs-dom': async () => { - await installPackage(); - await run('npm', ['run', 'tsc']); - }, - 'node-ts-esm': async () => { - await installPackage(); - - await run('npm', ['run', 'tsc']); - - if (state.live) { - await run('npm', ['run', 'test']); - } - }, - 'node-ts-esm-dom': async () => { - await installPackage(); - await run('npm', ['run', 'tsc']); - }, bun: async () => { if (state.fromNpm) { await run('bun', ['install', '-D', state.fromNpm]); @@ -116,6 +99,7 @@ const projects = { }; const projectNames = Object.keys(projects) as Array; +const projectNamesSet = new Set(projectNames); function parseArgs() { return yargs(process.argv.slice(2)) @@ -189,10 +173,13 @@ async function main() { await buildPackage(); } + const positionalArgs = args._.filter(Boolean); + // For some reason `yargs` doesn't pick up the positional args correctly const projectsToRun = ( args.projects?.length ? args.projects - : args._.length ? args._ + : positionalArgs.length ? + positionalArgs.filter((n) => typeof n === 'string' && (projectNamesSet as Set).has(n)) : projectNames) as typeof projectNames; console.error(`running projects: ${projectsToRun}`); @@ -234,10 +221,11 @@ async function main() { const project = queue.shift(); if (!project) break; - let stdout, stderr; + // preserve interleaved ordering of writes to stdout/stderr + const chunks: { dest: 'stdout' | 'stderr'; data: string | Buffer }[] = []; try { runningProjects.add(project); - const result = await execa( + const child = execa( 'yarn', [ 'tsn', @@ -252,16 +240,19 @@ async function main() { ], { stdio: 'pipe', encoding: 'utf8', maxBuffer: 100 * 1024 * 1024 }, ); - ({ stdout, stderr } = result); + child.stdout?.on('data', (data) => chunks.push({ dest: 'stdout', data })); + child.stderr?.on('data', (data) => chunks.push({ dest: 'stderr', data })); + await child; } catch (error) { - ({ stdout, stderr } = error as any); failed.push(project); } finally { runningProjects.delete(project); } - if (stdout) process.stdout.write(stdout); - if (stderr) process.stderr.write(stderr); + for (const { dest, data } of chunks) { + if (dest === 'stdout') process.stdout.write(data); + else process.stderr.write(data); + } } }), ); @@ -274,18 +265,21 @@ async function main() { await withChdir(path.join(rootDir, 'ecosystem-tests', project), async () => { console.error('\n'); - console.error(banner(project)); + console.error(banner(`▶️ ${project}`)); console.error('\n'); try { await withRetry(fn, project, state.retry); - console.error(`✅ - Successfully ran ${project}`); + console.error('\n'); + console.error(banner(`✅ ${project}`)); } catch (err) { if (err && (err as any).shortMessage) { - console.error('❌', (err as any).shortMessage); + console.error((err as any).shortMessage); } else { - console.error('❌', err); + console.error(err); } + console.error('\n'); + console.error(banner(`❌ ${project}`)); failed.push(project); } console.error('\n'); @@ -331,8 +325,6 @@ async function buildPackage() { return; } - await run('yarn', ['build']); - if (!(await pathExists('.pack'))) { await fs.mkdir('.pack'); } diff --git a/ecosystem-tests/cloudflare-worker/package.json b/ecosystem-tests/cloudflare-worker/package.json index d85b4b36d..463de4045 100644 --- a/ecosystem-tests/cloudflare-worker/package.json +++ b/ecosystem-tests/cloudflare-worker/package.json @@ -8,7 +8,7 @@ "deploy": "wrangler publish", "start": "wrangler dev", "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js", - "test:ci": "WAIT_ON_INTERVAL=10000 start-server-and-test start http://localhost:8787 test" + "test:ci": "start-server-and-test start http://localhost:8787 test" }, "devDependencies": { "@cloudflare/workers-types": "^4.20230419.0", diff --git a/ecosystem-tests/cloudflare-worker/src/uploadWebApiTestCases.ts b/ecosystem-tests/cloudflare-worker/src/uploadWebApiTestCases.ts index f915a6794..f7651a992 100644 --- a/ecosystem-tests/cloudflare-worker/src/uploadWebApiTestCases.ts +++ b/ecosystem-tests/cloudflare-worker/src/uploadWebApiTestCases.ts @@ -1,5 +1,6 @@ import OpenAI, { toFile } from 'openai'; import { TranscriptionCreateParams } from 'openai/resources/audio/transcriptions'; +import { ChatCompletion } from 'openai/resources/chat/completions'; /** * Tests uploads using various Web API data objects. @@ -45,6 +46,39 @@ export function uploadWebApiTestCases({ await client.audio.transcriptions.create({ file: 'test', model: 'whisper-1' }); } + it(`raw response`, async function () { + const response = await client.chat.completions + .create({ + model: 'gpt-4', + messages: [{ role: 'user', content: 'Say this is a test' }], + }) + .asResponse(); + + // test that we can use web Response API + const { body } = response; + if (!body) throw new Error('expected response.body to be defined'); + + const reader = body.getReader(); + const chunks: Uint8Array[] = []; + let result; + do { + result = await reader.read(); + if (!result.done) chunks.push(result.value); + } while (!result.done); + + reader.releaseLock(); + + let offset = 0; + const merged = new Uint8Array(chunks.reduce((total, chunk) => total + chunk.length, 0)); + for (const chunk of chunks) { + merged.set(chunk, offset); + offset += chunk.length; + } + + const json: ChatCompletion = JSON.parse(new TextDecoder().decode(merged)); + expectSimilar(json.choices[0]?.message.content || '', 'This is a test', 10); + }); + it(`streaming works`, async function () { const stream = await client.chat.completions.create({ model: 'gpt-4', diff --git a/ecosystem-tests/cloudflare-worker/src/worker.ts b/ecosystem-tests/cloudflare-worker/src/worker.ts index 9e6b935bd..ce2012f57 100644 --- a/ecosystem-tests/cloudflare-worker/src/worker.ts +++ b/ecosystem-tests/cloudflare-worker/src/worker.ts @@ -33,6 +33,11 @@ type Test = { description: string; handler: () => Promise }; export default { async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise { + const url = new URL(request.url); + // start-server-and-test polls / to see if the server is up and running + if (url.pathname === '/') return new Response(); + // then the test code requests /test + if (url.pathname !== '/test') return new Response(null, { status: 404 }); try { console.error('importing openai'); const { default: OpenAI } = await import('openai'); diff --git a/ecosystem-tests/cloudflare-worker/tests/test.js b/ecosystem-tests/cloudflare-worker/tests/test.js index 0fc5044a6..3a1ca3ea1 100644 --- a/ecosystem-tests/cloudflare-worker/tests/test.js +++ b/ecosystem-tests/cloudflare-worker/tests/test.js @@ -3,7 +3,7 @@ import fetch from 'node-fetch'; it( 'works', async () => { - expect(await (await fetch('http://localhost:8787')).text()).toEqual('Passed!'); + expect(await (await fetch('http://localhost:8787/test')).text()).toEqual('Passed!'); }, 3 * 60000 ); diff --git a/ecosystem-tests/cloudflare-worker/tsconfig.json b/ecosystem-tests/cloudflare-worker/tsconfig.json index 72dc410d8..cde90e627 100644 --- a/ecosystem-tests/cloudflare-worker/tsconfig.json +++ b/ecosystem-tests/cloudflare-worker/tsconfig.json @@ -1,4 +1,5 @@ { + "include": ["src/*.ts"], "compilerOptions": { /* Visit https://aka.ms/tsconfig.json to read more about this file */ diff --git a/ecosystem-tests/deno/main_test.ts b/ecosystem-tests/deno/main_test.ts index 4bed6a076..988b03d84 100644 --- a/ecosystem-tests/deno/main_test.ts +++ b/ecosystem-tests/deno/main_test.ts @@ -1,6 +1,7 @@ import { assertEquals, AssertionError } from 'https://deno.land/std@0.192.0/testing/asserts.ts'; import OpenAI, { toFile } from 'npm:openai@3.3.0'; import { distance } from 'https://deno.land/x/fastest_levenshtein/mod.ts'; +import { ChatCompletion } from 'npm:openai@3.3.0/resources/chat/completions'; const url = 'https://audio-samples.github.io/samples/mp3/blizzard_biased/sample-1.mp3'; const filename = 'sample-1.mp3'; @@ -36,6 +37,39 @@ function assertSimilar(received: string, expected: string, maxDistance: number) throw new AssertionError(message); } +Deno.test(async function rawResponse() { + const response = await client.chat.completions + .create({ + model: 'gpt-4', + messages: [{ role: 'user', content: 'Say this is a test' }], + }) + .asResponse(); + + // test that we can use web Response API + const { body } = response; + if (!body) throw new Error('expected response.body to be defined'); + + const reader = body.getReader(); + const chunks: Uint8Array[] = []; + let result; + do { + result = await reader.read(); + if (!result.done) chunks.push(result.value); + } while (!result.done); + + reader.releaseLock(); + + let offset = 0; + const merged = new Uint8Array(chunks.reduce((total, chunk) => total + chunk.length, 0)); + for (const chunk of chunks) { + merged.set(chunk, offset); + offset += chunk.length; + } + + const json: ChatCompletion = JSON.parse(new TextDecoder().decode(merged)); + assertSimilar(json.choices[0]?.message.content || '', 'This is a test', 10); +}); + Deno.test(async function streamingWorks() { const stream = await client.chat.completions.create({ model: 'gpt-4', diff --git a/ecosystem-tests/node-ts-cjs-dom/jest.config.cjs b/ecosystem-tests/node-ts-cjs-auto/jest.config.cjs similarity index 100% rename from ecosystem-tests/node-ts-cjs-dom/jest.config.cjs rename to ecosystem-tests/node-ts-cjs-auto/jest.config.cjs diff --git a/ecosystem-tests/node-ts-cjs-auto/moduleResolution/node/type-tests.ts b/ecosystem-tests/node-ts-cjs-auto/moduleResolution/node/type-tests.ts new file mode 100644 index 000000000..a3c4f383b --- /dev/null +++ b/ecosystem-tests/node-ts-cjs-auto/moduleResolution/node/type-tests.ts @@ -0,0 +1,14 @@ +import OpenAI from 'openai'; + +const client = new OpenAI(); + +async function typeTests() { + const response = await client.audio.transcriptions + .create({ + file: 'test' as any, + model: 'whisper-1', + }) + .asResponse(); + // @ts-expect-error this doesn't work with "moduleResolution": "node" + response.body; +} diff --git a/ecosystem-tests/node-ts-cjs-auto/moduleResolution/nodenext/type-tests.ts b/ecosystem-tests/node-ts-cjs-auto/moduleResolution/nodenext/type-tests.ts new file mode 100644 index 000000000..c47ddc2a5 --- /dev/null +++ b/ecosystem-tests/node-ts-cjs-auto/moduleResolution/nodenext/type-tests.ts @@ -0,0 +1,5 @@ +import * as shims from 'openai/_shims/index'; + +function typeTests(x: shims.Request) { + const url: string = x.url; +} diff --git a/ecosystem-tests/node-ts-cjs-auto/package-lock.json b/ecosystem-tests/node-ts-cjs-auto/package-lock.json new file mode 100644 index 000000000..56cf77290 --- /dev/null +++ b/ecosystem-tests/node-ts-cjs-auto/package-lock.json @@ -0,0 +1,3868 @@ +{ + "name": "node-ts-cjs-auto", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "node-ts-cjs-auto", + "version": "0.0.1", + "dependencies": { + "formdata-node": "^4.4.1", + "node-fetch": "^2.6.1", + "tsconfig-paths": "^4.0.0" + }, + "devDependencies": { + "@types/node": "^20.4.2", + "@types/node-fetch": "^2.6.1", + "@types/ws": "^8.5.4", + "fastest-levenshtein": "^1.0.16", + "jest": "^28.1.3", + "ts-jest": "^28.0.8", + "typescript": "4.7.4" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", + "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", + "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz", + "integrity": "sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", + "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.20.tgz", + "integrity": "sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.19", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.19", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", + "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.19", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/core": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-28.1.3.tgz", + "integrity": "sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==", + "dev": true, + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/reporters": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^28.1.3", + "jest-config": "^28.1.3", + "jest-haste-map": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.3", + "jest-resolve-dependencies": "^28.1.3", + "jest-runner": "^28.1.3", + "jest-runtime": "^28.1.3", + "jest-snapshot": "^28.1.3", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", + "jest-watcher": "^28.1.3", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz", + "integrity": "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "jest-mock": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz", + "integrity": "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==", + "dev": true, + "dependencies": { + "expect": "^28.1.3", + "jest-snapshot": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", + "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", + "dev": true, + "dependencies": { + "jest-get-type": "^28.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz", + "integrity": "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "@sinonjs/fake-timers": "^9.1.2", + "@types/node": "*", + "jest-message-util": "^28.1.3", + "jest-mock": "^28.1.3", + "jest-util": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", + "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", + "dev": true, + "dependencies": { + "@jest/environment": "^28.1.3", + "@jest/expect": "^28.1.3", + "@jest/types": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.3.tgz", + "integrity": "sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "@jridgewell/trace-mapping": "^0.3.13", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "jest-worker": "^28.1.3", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "28.1.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", + "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.13", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "dev": true, + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz", + "integrity": "sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^28.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", + "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^28.1.3", + "@jridgewell/trace-mapping": "^0.3.13", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "jest-regex-util": "^28.0.2", + "jest-util": "^28.1.3", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz", + "integrity": "sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.5", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.5.tgz", + "integrity": "sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.2.tgz", + "integrity": "sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.2.tgz", + "integrity": "sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/node": { + "version": "20.5.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", + "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==", + "dev": true + }, + "node_modules/@types/node-fetch": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", + "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/ws": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/babel-jest": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz", + "integrity": "sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==", + "dev": true, + "dependencies": { + "@jest/transform": "^28.1.3", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^28.1.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz", + "integrity": "sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz", + "integrity": "sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^28.1.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "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/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001538", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", + "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", + "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.525", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.525.tgz", + "integrity": "sha512-GIZ620hDK4YmIqAWkscG4W6RwY6gOx1y5J6f4JUQwctiJrqH2oxZYU4mXHi35oV32tr630UcepBzSBGJ/WYcZA==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", + "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" + } + }, + "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==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "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/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz", + "integrity": "sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==", + "dev": true, + "dependencies": { + "@jest/core": "^28.1.3", + "@jest/types": "^28.1.3", + "import-local": "^3.0.2", + "jest-cli": "^28.1.3" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz", + "integrity": "sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-circus": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz", + "integrity": "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==", + "dev": true, + "dependencies": { + "@jest/environment": "^28.1.3", + "@jest/expect": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^28.1.3", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-runtime": "^28.1.3", + "jest-snapshot": "^28.1.3", + "jest-util": "^28.1.3", + "p-limit": "^3.1.0", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-cli": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz", + "integrity": "sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==", + "dev": true, + "dependencies": { + "@jest/core": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^28.1.3", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz", + "integrity": "sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^28.1.3", + "@jest/types": "^28.1.3", + "babel-jest": "^28.1.3", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^28.1.3", + "jest-environment-node": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.3", + "jest-runner": "^28.1.3", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", + "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^28.1.1", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz", + "integrity": "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-each": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz", + "integrity": "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "chalk": "^4.0.0", + "jest-get-type": "^28.0.2", + "jest-util": "^28.1.3", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz", + "integrity": "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==", + "dev": true, + "dependencies": { + "@jest/environment": "^28.1.3", + "@jest/fake-timers": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "jest-mock": "^28.1.3", + "jest-util": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", + "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", + "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^28.0.2", + "jest-util": "^28.1.3", + "jest-worker": "^28.1.3", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz", + "integrity": "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==", + "dev": true, + "dependencies": { + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", + "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^28.1.3", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-mock": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz", + "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", + "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz", + "integrity": "sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^28.0.2", + "jest-snapshot": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-runner": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz", + "integrity": "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==", + "dev": true, + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/environment": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "graceful-fs": "^4.2.9", + "jest-docblock": "^28.1.1", + "jest-environment-node": "^28.1.3", + "jest-haste-map": "^28.1.3", + "jest-leak-detector": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-resolve": "^28.1.3", + "jest-runtime": "^28.1.3", + "jest-util": "^28.1.3", + "jest-watcher": "^28.1.3", + "jest-worker": "^28.1.3", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", + "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", + "dev": true, + "dependencies": { + "@jest/environment": "^28.1.3", + "@jest/fake-timers": "^28.1.3", + "@jest/globals": "^28.1.3", + "@jest/source-map": "^28.1.2", + "@jest/test-result": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-mock": "^28.1.3", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.3", + "jest-snapshot": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", + "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^28.1.3", + "graceful-fs": "^4.2.9", + "jest-diff": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-haste-map": "^28.1.3", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "natural-compare": "^1.4.0", + "pretty-format": "^28.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-validate": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", + "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^28.0.2", + "leven": "^3.1.0", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "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==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, + "dependencies": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "dev": true, + "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/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-jest": { + "version": "28.0.8", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.8.tgz", + "integrity": "sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^28.0.0", + "json5": "^2.2.1", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^28.0.0", + "babel-jest": "^28.0.0", + "jest": "^28.0.0", + "typescript": ">=4.3" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "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==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/ecosystem-tests/node-ts-cjs-dom/package.json b/ecosystem-tests/node-ts-cjs-auto/package.json similarity index 74% rename from ecosystem-tests/node-ts-cjs-dom/package.json rename to ecosystem-tests/node-ts-cjs-auto/package.json index 57f239c60..17e4ae9e6 100644 --- a/ecosystem-tests/node-ts-cjs-dom/package.json +++ b/ecosystem-tests/node-ts-cjs-auto/package.json @@ -1,5 +1,5 @@ { - "name": "node-ts-cjs-dom", + "name": "node-ts-cjs-auto", "version": "0.0.1", "main": "index.js", "private": true, @@ -13,11 +13,12 @@ "tsconfig-paths": "^4.0.0" }, "devDependencies": { - "@types/node": "^17.0.9", + "@types/node": "^20.4.2", "@types/node-fetch": "^2.6.1", + "@types/ws": "^8.5.4", "fastest-levenshtein": "^1.0.16", - "jest": "^29.5.0", - "ts-jest": "^29.1.0", + "jest": "^28.1.3", + "ts-jest": "^28.0.8", "typescript": "4.7.4" } } diff --git a/ecosystem-tests/node-ts-cjs-dom/sample1.mp3 b/ecosystem-tests/node-ts-cjs-auto/sample1.mp3 similarity index 100% rename from ecosystem-tests/node-ts-cjs-dom/sample1.mp3 rename to ecosystem-tests/node-ts-cjs-auto/sample1.mp3 diff --git a/ecosystem-tests/node-ts-cjs-auto/tests/shims.ts b/ecosystem-tests/node-ts-cjs-auto/tests/shims.ts new file mode 100644 index 000000000..d34211578 --- /dev/null +++ b/ecosystem-tests/node-ts-cjs-auto/tests/shims.ts @@ -0,0 +1,7 @@ +import * as shims from 'openai/_shims/index'; +import * as fd from 'formdata-node'; + +test('openai/shims/node', () => { + expect(shims.kind).toEqual('node'); + expect(shims.File).toBe(fd.File); +}); diff --git a/ecosystem-tests/node-ts-cjs-ts4.5/tests/test.ts b/ecosystem-tests/node-ts-cjs-auto/tests/test.ts similarity index 100% rename from ecosystem-tests/node-ts-cjs-ts4.5/tests/test.ts rename to ecosystem-tests/node-ts-cjs-auto/tests/test.ts diff --git a/ecosystem-tests/node-ts-cjs-auto/tsconfig.json b/ecosystem-tests/node-ts-cjs-auto/tsconfig.json new file mode 100644 index 000000000..bb679e8fb --- /dev/null +++ b/ecosystem-tests/node-ts-cjs-auto/tsconfig.json @@ -0,0 +1,54 @@ +{ + "include": ["tests/*", "moduleResolution/node/*"], + + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + /* Projects */ + "incremental": true, + + /* Language and Environment */ + "target": "ES2015", + "lib": ["ES2015"], + "jsx": "react", + + /* Modules */ + "module": "commonjs", + "rootDir": "./", + "moduleResolution": "node", + "baseUrl": "./", + "paths": { + "~/*": ["*"] + }, + "resolveJsonModule": true, + "composite": true, + + /* Emit */ + "outDir": "node_modules", + "noEmit": true, + + /* Interop Constraints */ + "isolatedModules": true, + "allowSyntheticDefaultImports": true, + /* "esModuleInterop": true, */ + "forceConsistentCasingInFileNames": true, + "allowJs": true, + "checkJs": true, + + /* Experimental Features */ + "experimentalDecorators": true, + + /* Type Checking */ + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "strictBindCallApply": true, + "strictPropertyInitialization": true, + "noImplicitThis": true, + "alwaysStrict": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "skipLibCheck": false + } +} diff --git a/ecosystem-tests/node-ts-cjs-auto/tsconfig.nodenext.json b/ecosystem-tests/node-ts-cjs-auto/tsconfig.nodenext.json new file mode 100644 index 000000000..ed9ff4fc7 --- /dev/null +++ b/ecosystem-tests/node-ts-cjs-auto/tsconfig.nodenext.json @@ -0,0 +1,54 @@ +{ + "include": ["tests/*", "moduleResolution/nodenext/*"], + + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + /* Projects */ + "incremental": true, + + /* Language and Environment */ + "target": "ES2015", + "lib": ["ES2015"], + "jsx": "react", + + /* Modules */ + "module": "commonjs", + "rootDir": "./", + "moduleResolution": "NodeNext", + "baseUrl": "./", + "paths": { + "~/*": ["*"] + }, + "resolveJsonModule": true, + "composite": true, + + /* Emit */ + "outDir": "node_modules", + "noEmit": true, + + /* Interop Constraints */ + "isolatedModules": true, + "allowSyntheticDefaultImports": true, + /* "esModuleInterop": true, */ + "forceConsistentCasingInFileNames": true, + "allowJs": true, + "checkJs": true, + + /* Experimental Features */ + "experimentalDecorators": true, + + /* Type Checking */ + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "strictBindCallApply": true, + "strictPropertyInitialization": true, + "noImplicitThis": true, + "alwaysStrict": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "skipLibCheck": false + } +} diff --git a/ecosystem-tests/node-ts-cjs-ts4.5/jest.config.cjs b/ecosystem-tests/node-ts-cjs-web/jest.config.cjs similarity index 100% rename from ecosystem-tests/node-ts-cjs-ts4.5/jest.config.cjs rename to ecosystem-tests/node-ts-cjs-web/jest.config.cjs diff --git a/ecosystem-tests/node-ts-cjs-ts4.5/package-lock.json b/ecosystem-tests/node-ts-cjs-web/package-lock.json similarity index 85% rename from ecosystem-tests/node-ts-cjs-ts4.5/package-lock.json rename to ecosystem-tests/node-ts-cjs-web/package-lock.json index 55e77bfd9..29122bccf 100644 --- a/ecosystem-tests/node-ts-cjs-ts4.5/package-lock.json +++ b/ecosystem-tests/node-ts-cjs-web/package-lock.json @@ -1,11 +1,11 @@ { - "name": "node-ts-cjs", + "name": "node-ts-cjs-web", "version": "0.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "node-ts-cjs", + "name": "node-ts-cjs-web", "version": "0.0.1", "dependencies": { "formdata-node": "^4.4.1", @@ -13,13 +13,17 @@ "tsconfig-paths": "^4.0.0" }, "devDependencies": { - "@types/node": "^20.4.2", + "@types/node": "^17.0.9", "@types/node-fetch": "^2.6.1", - "@types/ws": "^8.5.4", "fastest-levenshtein": "^1.0.16", + "formdata-polyfill": "^4.0.10", "jest": "^29.5.0", + "jest-environment-jsdom": "^29.7.0", + "text-encoding-polyfill": "^0.6.7", "ts-jest": "^29.1.0", - "typescript": "4.5.4" + "typescript": "4.7.4", + "web-streams-polyfill": "^3.2.1", + "whatwg-fetch": "^3.6.19" } }, "node_modules/@ampproject/remapping": { @@ -753,15 +757,15 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.6.4", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -793,17 +797,17 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -1038,6 +1042,15 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, "node_modules/@types/babel__core": { "version": "7.20.1", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", @@ -1112,10 +1125,21 @@ "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/jsdom": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", + "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, "node_modules/@types/node": { - "version": "20.5.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", - "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==", + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", "dev": true }, "node_modules/@types/node-fetch": { @@ -1134,14 +1158,11 @@ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, - "node_modules/@types/ws": { - "version": "8.5.5", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", - "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } + "node_modules/@types/tough-cookie": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.3.tgz", + "integrity": "sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg==", + "dev": true }, "node_modules/@types/yargs": { "version": "17.0.24", @@ -1158,6 +1179,55 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dev": true, + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.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==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -1589,6 +1659,78 @@ "node": ">= 8" } }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1606,6 +1748,12 @@ } } }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, "node_modules/dedent": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", @@ -1656,6 +1804,27 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dev": true, + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/electron-to-chromium": { "version": "1.4.506", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.506.tgz", @@ -1680,6 +1849,18 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -1707,6 +1888,27 @@ "node": ">=8" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -1720,6 +1922,24 @@ "node": ">=4" } }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -1792,6 +2012,29 @@ "bser": "2.1.1" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -1843,6 +2086,26 @@ "node": ">= 12.20" } }, + "node_modules/formdata-node/node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1964,12 +2227,51 @@ "node": ">=8" } }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "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==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -1979,6 +2281,18 @@ "node": ">=10.17.0" } }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -2068,6 +2382,12 @@ "node": ">=0.12.0" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -2378,6 +2698,33 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-environment-jsdom": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", + "jsdom": "^20.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, "node_modules/jest-environment-node": { "version": "29.6.4", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", @@ -2458,9 +2805,9 @@ } }, "node_modules/jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -2469,7 +2816,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -2478,14 +2825,14 @@ } }, "node_modules/jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.3" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2680,9 +3027,9 @@ "dev": true }, "node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -2793,6 +3140,99 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/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==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -3087,6 +3527,12 @@ "node": ">=8" } }, + "node_modules/nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "dev": true + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -3180,6 +3626,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -3253,9 +3711,9 @@ } }, "node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -3291,6 +3749,21 @@ "node": ">= 6" } }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/pure-rand": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", @@ -3307,6 +3780,12 @@ } ] }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, "node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -3322,6 +3801,12 @@ "node": ">=0.10.0" } }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, "node_modules/resolve": { "version": "1.22.4", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", @@ -3369,6 +3854,24 @@ "node": ">=10" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -3550,6 +4053,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -3564,6 +4073,12 @@ "node": ">=8" } }, + "node_modules/text-encoding-polyfill": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/text-encoding-polyfill/-/text-encoding-polyfill-0.6.7.tgz", + "integrity": "sha512-/DZ1XJqhbqRkCop6s9ZFu8JrFRwmVuHg4quIRm+ziFkR3N3ec6ck6yBvJ1GYeEQZhLVwRW0rZE+C3SSJpy0RTg==", + "dev": true + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -3591,6 +4106,21 @@ "node": ">=8.0" } }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -3715,9 +4245,9 @@ } }, "node_modules/typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -3727,6 +4257,15 @@ "node": ">=4.2.0" } }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", @@ -3757,6 +4296,16 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/v8-to-istanbul": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", @@ -3777,6 +4326,18 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -3787,11 +4348,12 @@ } }, "node_modules/web-streams-polyfill": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", - "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "dev": true, "engines": { - "node": ">= 14" + "node": ">= 8" } }, "node_modules/webidl-conversions": { @@ -3799,6 +4361,33 @@ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.19", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", + "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==", + "dev": true + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -3859,6 +4448,42 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/ws": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz", + "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/ecosystem-tests/node-ts-cjs-web/package.json b/ecosystem-tests/node-ts-cjs-web/package.json new file mode 100644 index 000000000..8a50fcb43 --- /dev/null +++ b/ecosystem-tests/node-ts-cjs-web/package.json @@ -0,0 +1,28 @@ +{ + "name": "node-ts-cjs-web", + "version": "0.0.1", + "main": "index.js", + "private": true, + "scripts": { + "tsc": "tsc && tsc -p tsconfig.nodenext.json", + "test": "jest" + }, + "dependencies": { + "formdata-node": "^4.4.1", + "node-fetch": "^2.6.1", + "tsconfig-paths": "^4.0.0" + }, + "devDependencies": { + "@types/node": "^17.0.9", + "@types/node-fetch": "^2.6.1", + "fastest-levenshtein": "^1.0.16", + "formdata-polyfill": "^4.0.10", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.7.0", + "text-encoding-polyfill": "^0.6.7", + "ts-jest": "^29.1.0", + "typescript": "4.7.4", + "web-streams-polyfill": "^3.2.1", + "whatwg-fetch": "^3.6.19" + } +} diff --git a/ecosystem-tests/node-ts-cjs-ts4.5/sample1.mp3 b/ecosystem-tests/node-ts-cjs-web/sample1.mp3 similarity index 100% rename from ecosystem-tests/node-ts-cjs-ts4.5/sample1.mp3 rename to ecosystem-tests/node-ts-cjs-web/sample1.mp3 diff --git a/ecosystem-tests/node-ts-cjs-web/tests/shims.ts b/ecosystem-tests/node-ts-cjs-web/tests/shims.ts new file mode 100644 index 000000000..07279b9eb --- /dev/null +++ b/ecosystem-tests/node-ts-cjs-web/tests/shims.ts @@ -0,0 +1,11 @@ +import 'openai/shims/web'; +import * as shims from 'openai/_shims/index'; + +function typeTests(x: shims.Request) { + const url: string = x.url; +} + +test('openai/shims/node', () => { + expect(shims.kind).toEqual('web'); + expect(shims.File).toBe(File); +}); diff --git a/ecosystem-tests/node-ts-cjs-web/tests/test-jsdom-unpolyfilled.ts b/ecosystem-tests/node-ts-cjs-web/tests/test-jsdom-unpolyfilled.ts new file mode 100644 index 000000000..e536f3047 --- /dev/null +++ b/ecosystem-tests/node-ts-cjs-web/tests/test-jsdom-unpolyfilled.ts @@ -0,0 +1,11 @@ +/** + * @jest-environment jsdom + */ + +export {}; + +test('openai/shims/web throws if globals are missing', async () => { + await expect(() => import('openai/shims/web')).rejects.toThrow( + `this environment is missing the following Web Fetch API type: fetch is not defined. You may need to use polyfills`, + ); +}); diff --git a/ecosystem-tests/node-ts-cjs-web/tests/test-jsdom.ts b/ecosystem-tests/node-ts-cjs-web/tests/test-jsdom.ts new file mode 100644 index 000000000..3abc9e6e4 --- /dev/null +++ b/ecosystem-tests/node-ts-cjs-web/tests/test-jsdom.ts @@ -0,0 +1,166 @@ +/** + * @jest-environment jsdom + */ +import 'whatwg-fetch'; +import 'openai/shims/web'; +import OpenAI, { toFile } from 'openai'; +import { distance } from 'fastest-levenshtein'; +import { ChatCompletion } from 'openai/resources/chat/completions'; +// @ts-ignore +import { TextEncoder } from 'text-encoding-polyfill'; + +const url = 'https://audio-samples.github.io/samples/mp3/blizzard_biased/sample-1.mp3'; +const filename = 'sample-1.mp3'; + +const correctAnswer = + 'It was anxious to find him no one that expectation of a man who were giving his father enjoyment. But he was avoided in sight in the minister to which indeed,'; +const model = 'whisper-1'; + +const client = new OpenAI({ apiKey: process.env['OPENAI_API_KEY'], dangerouslyAllowBrowser: true }); + +async function typeTests() { + // @ts-expect-error this should error if the `Uploadable` type was resolved correctly + await client.audio.transcriptions.create({ file: { foo: true }, model: 'whisper-1' }); + // @ts-expect-error this should error if the `Uploadable` type was resolved correctly + await client.audio.transcriptions.create({ file: null, model: 'whisper-1' }); + // @ts-expect-error this should error if the `Uploadable` type was resolved correctly + await client.audio.transcriptions.create({ file: 'test', model: 'whisper-1' }); +} + +declare global { + namespace jest { + interface Matchers { + toBeSimilarTo(comparedTo: string, expectedDistance: number): R; + } + } +} +expect.extend({ + toBeSimilarTo(received, comparedTo: string, expectedDistance: number) { + const message = () => + [ + `Received: ${JSON.stringify(received)}`, + `Expected: ${JSON.stringify(comparedTo)}`, + `Expected distance: ${expectedDistance}`, + `Received distance: ${actualDistance}`, + ].join('\n'); + + const actualDistance = distance(received, comparedTo); + if (actualDistance < expectedDistance) { + return { + message, + pass: true, + }; + } + + return { + message, + pass: false, + }; + }, +}); + +test(`basic request works`, async function () { + const completion = await client.chat.completions.create({ + model: 'gpt-4', + messages: [{ role: 'user', content: 'Say this is a test' }], + }); + expect(completion.choices[0]?.message?.content).toBeSimilarTo('This is a test', 10); +}); + +// response bodies aren't working with the chosen polyfills +it.skip(`raw response`, async function () { + const response = await client.chat.completions + .create({ + model: 'gpt-4', + messages: [{ role: 'user', content: 'Say this is a test' }], + }) + .asResponse(); + + // test that we can use web Response API + const { body } = response; + if (!body) throw new Error('expected response.body to be defined'); + + const reader = body.getReader(); + const chunks: Uint8Array[] = []; + let result; + do { + result = await reader.read(); + if (!result.done) chunks.push(result.value); + } while (!result.done); + + reader.releaseLock(); + + let offset = 0; + const merged = new Uint8Array(chunks.reduce((total, chunk) => total + chunk.length, 0)); + for (const chunk of chunks) { + merged.set(chunk, offset); + offset += chunk.length; + } + + const json: ChatCompletion = JSON.parse(new TextDecoder().decode(merged)); + expect(json.choices[0]?.message.content || '').toBeSimilarTo('This is a test', 10); +}); + +// response bodies aren't working with the chosen polyfills +it.skip(`streaming works`, async function () { + const stream = await client.chat.completions.create({ + model: 'gpt-4', + messages: [{ role: 'user', content: 'Say this is a test' }], + stream: true, + }); + const chunks = []; + for await (const part of stream) { + chunks.push(part); + } + expect(chunks.map((c) => c.choices[0]?.delta.content || '').join('')).toBeSimilarTo('This is a test', 10); +}); + +// file uploads aren't working with the chosen polyfills +it.skip('handles builtinFile', async function () { + const file = await fetch(url) + .then((x) => x.arrayBuffer()) + .then((x) => new File([x], filename)); + + const result = await client.audio.transcriptions.create({ file, model }); + expect(result.text).toBeSimilarTo(correctAnswer, 12); +}); + +it.skip('handles Response', async function () { + const file = await fetch(url); + + const result = await client.audio.transcriptions.create({ file, model }); + expect(result.text).toBeSimilarTo(correctAnswer, 12); +}); + +const fineTune = `{"prompt": "", "completion": ""}`; + +describe.skip('toFile', () => { + it('handles builtin Blob', async function () { + const result = await client.files.create({ + file: await toFile(new Blob([new TextEncoder().encode(fineTune)]), 'finetune.jsonl'), + purpose: 'fine-tune', + }); + expect(result.status).toEqual('uploaded'); + }); + it('handles Uint8Array', async function () { + const result = await client.files.create({ + file: await toFile(new TextEncoder().encode(fineTune), 'finetune.jsonl'), + purpose: 'fine-tune', + }); + expect(result.status).toEqual('uploaded'); + }); + it('handles ArrayBuffer', async function () { + const result = await client.files.create({ + file: await toFile(new TextEncoder().encode(fineTune).buffer, 'finetune.jsonl'), + purpose: 'fine-tune', + }); + expect(result.status).toEqual('uploaded'); + }); + it('handles DataView', async function () { + const result = await client.files.create({ + file: await toFile(new DataView(new TextEncoder().encode(fineTune).buffer), 'finetune.jsonl'), + purpose: 'fine-tune', + }); + expect(result.status).toEqual('uploaded'); + }); +}); diff --git a/ecosystem-tests/node-ts-cjs-dom/tests/test.ts b/ecosystem-tests/node-ts-cjs-web/tests/test-node.ts similarity index 78% rename from ecosystem-tests/node-ts-cjs-dom/tests/test.ts rename to ecosystem-tests/node-ts-cjs-web/tests/test-node.ts index 7afbaa545..9d1abf435 100644 --- a/ecosystem-tests/node-ts-cjs-dom/tests/test.ts +++ b/ecosystem-tests/node-ts-cjs-web/tests/test-node.ts @@ -1,9 +1,7 @@ +import 'openai/shims/web'; import OpenAI, { toFile } from 'openai'; -import { TranscriptionCreateParams } from 'openai/resources/audio/transcriptions'; -import fetch from 'node-fetch'; -import { File as FormDataFile, Blob as FormDataBlob } from 'formdata-node'; -import * as fs from 'fs'; import { distance } from 'fastest-levenshtein'; +import { ChatCompletion } from 'openai/resources/chat/completions'; const url = 'https://audio-samples.github.io/samples/mp3/blizzard_biased/sample-1.mp3'; const filename = 'sample-1.mp3'; @@ -55,6 +53,39 @@ expect.extend({ }, }); +it(`raw response`, async function () { + const response = await client.chat.completions + .create({ + model: 'gpt-4', + messages: [{ role: 'user', content: 'Say this is a test' }], + }) + .asResponse(); + + // test that we can use web Response API + const { body } = response; + if (!body) throw new Error('expected response.body to be defined'); + + const reader = body.getReader(); + const chunks: Uint8Array[] = []; + let result; + do { + result = await reader.read(); + if (!result.done) chunks.push(result.value); + } while (!result.done); + + reader.releaseLock(); + + let offset = 0; + const merged = new Uint8Array(chunks.reduce((total, chunk) => total + chunk.length, 0)); + for (const chunk of chunks) { + merged.set(chunk, offset); + offset += chunk.length; + } + + const json: ChatCompletion = JSON.parse(new TextDecoder().decode(merged)); + expect(json.choices[0]?.message.content || '').toBeSimilarTo('This is a test', 10); +}); + it(`streaming works`, async function () { const stream = await client.chat.completions.create({ model: 'gpt-4', @@ -68,17 +99,6 @@ it(`streaming works`, async function () { expect(chunks.map((c) => c.choices[0]?.delta.content || '').join('')).toBeSimilarTo('This is a test', 10); }); -it('handles formdata-node File', async function () { - const file = await fetch(url) - .then((x) => x.arrayBuffer()) - .then((x) => new FormDataFile([x], filename)); - - const params: TranscriptionCreateParams = { file, model }; - - const result = await client.audio.transcriptions.create(params); - expect(result.text).toEqual(correctAnswer); -}); - if (typeof File !== 'undefined') { it('handles builtinFile', async function () { const file = await fetch(url) @@ -97,24 +117,9 @@ it('handles Response', async function () { expect(result.text).toBeSimilarTo(correctAnswer, 12); }); -it('handles fs.ReadStream', async function () { - const result = await client.audio.transcriptions.create({ - file: fs.createReadStream('sample1.mp3'), - model, - }); - expect(result.text).toBeSimilarTo(correctAnswer, 12); -}); - const fineTune = `{"prompt": "", "completion": ""}`; describe('toFile', () => { - it('handles form-data Blob', async function () { - const result = await client.files.create({ - file: await toFile(new FormDataBlob([new TextEncoder().encode(fineTune)]), 'finetune.jsonl'), - purpose: 'fine-tune', - }); - expect(result.status).toEqual('uploaded'); - }); if (typeof Blob !== 'undefined') { it('handles builtin Blob', async function () { const result = await client.files.create({ diff --git a/ecosystem-tests/node-ts-cjs-dom/tsconfig.json b/ecosystem-tests/node-ts-cjs-web/tsconfig.json similarity index 97% rename from ecosystem-tests/node-ts-cjs-dom/tsconfig.json rename to ecosystem-tests/node-ts-cjs-web/tsconfig.json index 48cf9dadf..7f3d49978 100644 --- a/ecosystem-tests/node-ts-cjs-dom/tsconfig.json +++ b/ecosystem-tests/node-ts-cjs-web/tsconfig.json @@ -1,5 +1,5 @@ { - "exclude": ["node_modules"], + "include": ["tests/*.ts"], "compilerOptions": { /* Visit https://aka.ms/tsconfig.json to read more about this file */ diff --git a/ecosystem-tests/node-ts-cjs-dom/tsconfig.nodenext.json b/ecosystem-tests/node-ts-cjs-web/tsconfig.nodenext.json similarity index 97% rename from ecosystem-tests/node-ts-cjs-dom/tsconfig.nodenext.json rename to ecosystem-tests/node-ts-cjs-web/tsconfig.nodenext.json index d658ee142..4c4cfd451 100644 --- a/ecosystem-tests/node-ts-cjs-dom/tsconfig.nodenext.json +++ b/ecosystem-tests/node-ts-cjs-web/tsconfig.nodenext.json @@ -1,5 +1,5 @@ { - "exclude": ["node_modules"], + "include": ["tests/*.ts"], "compilerOptions": { /* Visit https://aka.ms/tsconfig.json to read more about this file */ diff --git a/ecosystem-tests/node-ts-cjs/package-lock.json b/ecosystem-tests/node-ts-cjs/package-lock.json index 37c945a2b..3742eaa82 100644 --- a/ecosystem-tests/node-ts-cjs/package-lock.json +++ b/ecosystem-tests/node-ts-cjs/package-lock.json @@ -18,6 +18,8 @@ "@types/ws": "^8.5.4", "fastest-levenshtein": "^1.0.16", "jest": "^29.5.0", + "jest-environment-jsdom": "^29.7.0", + "text-encoding-polyfill": "^0.6.7", "ts-jest": "^29.1.0", "typescript": "4.7.4" } @@ -753,15 +755,15 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.6.4", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -793,17 +795,17 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -1038,6 +1040,15 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, "node_modules/@types/babel__core": { "version": "7.20.1", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", @@ -1112,6 +1123,17 @@ "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/jsdom": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", + "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, "node_modules/@types/node": { "version": "20.5.7", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", @@ -1134,6 +1156,12 @@ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, + "node_modules/@types/tough-cookie": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.3.tgz", + "integrity": "sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg==", + "dev": true + }, "node_modules/@types/ws": { "version": "8.5.5", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", @@ -1158,6 +1186,55 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dev": true, + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.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==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -1589,6 +1666,78 @@ "node": ">= 8" } }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1606,6 +1755,12 @@ } } }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, "node_modules/dedent": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", @@ -1656,6 +1811,27 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dev": true, + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/electron-to-chromium": { "version": "1.4.506", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.506.tgz", @@ -1680,6 +1856,18 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -1707,6 +1895,27 @@ "node": ">=8" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -1720,6 +1929,24 @@ "node": ">=4" } }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -1964,12 +2191,51 @@ "node": ">=8" } }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "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==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -1979,6 +2245,18 @@ "node": ">=10.17.0" } }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -2068,6 +2346,12 @@ "node": ">=0.12.0" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -2378,6 +2662,33 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-environment-jsdom": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", + "jsdom": "^20.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, "node_modules/jest-environment-node": { "version": "29.6.4", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", @@ -2458,9 +2769,9 @@ } }, "node_modules/jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -2469,7 +2780,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -2478,14 +2789,14 @@ } }, "node_modules/jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.3" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2680,9 +2991,9 @@ "dev": true }, "node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -2793,6 +3104,99 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/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==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -3087,6 +3491,12 @@ "node": ">=8" } }, + "node_modules/nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "dev": true + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -3180,6 +3590,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -3253,9 +3675,9 @@ } }, "node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -3291,6 +3713,21 @@ "node": ">= 6" } }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/pure-rand": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", @@ -3307,6 +3744,12 @@ } ] }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, "node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -3322,6 +3765,12 @@ "node": ">=0.10.0" } }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, "node_modules/resolve": { "version": "1.22.4", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", @@ -3369,6 +3818,24 @@ "node": ">=10" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -3550,6 +4017,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -3564,6 +4037,12 @@ "node": ">=8" } }, + "node_modules/text-encoding-polyfill": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/text-encoding-polyfill/-/text-encoding-polyfill-0.6.7.tgz", + "integrity": "sha512-/DZ1XJqhbqRkCop6s9ZFu8JrFRwmVuHg4quIRm+ziFkR3N3ec6ck6yBvJ1GYeEQZhLVwRW0rZE+C3SSJpy0RTg==", + "dev": true + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -3591,6 +4070,21 @@ "node": ">=8.0" } }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -3727,6 +4221,15 @@ "node": ">=4.2.0" } }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", @@ -3757,6 +4260,16 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/v8-to-istanbul": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", @@ -3777,6 +4290,18 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -3799,6 +4324,27 @@ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -3859,6 +4405,42 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/ws": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz", + "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/ecosystem-tests/node-ts-cjs/package.json b/ecosystem-tests/node-ts-cjs/package.json index 449e040e0..76f866b0b 100644 --- a/ecosystem-tests/node-ts-cjs/package.json +++ b/ecosystem-tests/node-ts-cjs/package.json @@ -18,6 +18,8 @@ "@types/ws": "^8.5.4", "fastest-levenshtein": "^1.0.16", "jest": "^29.5.0", + "jest-environment-jsdom": "^29.7.0", + "text-encoding-polyfill": "^0.6.7", "ts-jest": "^29.1.0", "typescript": "4.7.4" } diff --git a/ecosystem-tests/node-ts-cjs/tests/late-shim-errors.ts b/ecosystem-tests/node-ts-cjs/tests/late-shim-errors.ts new file mode 100644 index 000000000..6b9c4d95c --- /dev/null +++ b/ecosystem-tests/node-ts-cjs/tests/late-shim-errors.ts @@ -0,0 +1,8 @@ +export {}; + +test('throws if shims are imported after openai', async () => { + await import('openai'); + await expect(() => import('openai/shims/web')).rejects.toThrow( + `you must \`import 'openai/shims/web'\` before importing anything else from openai`, + ); +}); diff --git a/ecosystem-tests/node-ts-cjs/tests/multiple-shim-errors.ts b/ecosystem-tests/node-ts-cjs/tests/multiple-shim-errors.ts new file mode 100644 index 000000000..92261fd58 --- /dev/null +++ b/ecosystem-tests/node-ts-cjs/tests/multiple-shim-errors.ts @@ -0,0 +1,8 @@ +export {}; + +test('throws if multiple shims are imported', async () => { + await import('openai/shims/node'); + await expect(() => import('openai/shims/web')).rejects.toThrow( + `can't \`import 'openai/shims/web'\` after \`import 'openai/shims/node'\``, + ); +}); diff --git a/ecosystem-tests/node-ts-cjs/tests/shims.ts b/ecosystem-tests/node-ts-cjs/tests/shims.ts new file mode 100644 index 000000000..d0b04bac5 --- /dev/null +++ b/ecosystem-tests/node-ts-cjs/tests/shims.ts @@ -0,0 +1,12 @@ +import 'openai/shims/node'; +import * as shims from 'openai/_shims/index'; +import * as fd from 'formdata-node'; + +function typeTests(x: shims.Request) { + const url: string = x.url; +} + +test('openai/shims/node', () => { + expect(shims.kind).toEqual('node'); + expect(shims.File).toBe(fd.File); +}); diff --git a/ecosystem-tests/node-ts-cjs/tests/test-jsdom-compat-error.ts b/ecosystem-tests/node-ts-cjs/tests/test-jsdom-compat-error.ts new file mode 100644 index 000000000..066fc3dc2 --- /dev/null +++ b/ecosystem-tests/node-ts-cjs/tests/test-jsdom-compat-error.ts @@ -0,0 +1,11 @@ +/** + * @jest-environment jsdom + */ + +export {}; + +it(`throws when fetch API types are missing`, async () => { + await expect(() => import('openai')).rejects.toThrow( + 'this environment is missing the following Web Fetch API type', + ); +}); diff --git a/ecosystem-tests/node-ts-cjs/tests/test-jsdom.ts b/ecosystem-tests/node-ts-cjs/tests/test-jsdom.ts new file mode 100644 index 000000000..1f5d75f28 --- /dev/null +++ b/ecosystem-tests/node-ts-cjs/tests/test-jsdom.ts @@ -0,0 +1,146 @@ +/** + * @jest-environment jsdom + */ +import 'openai/shims/node'; +import OpenAI, { toFile } from 'openai'; +import fetch from 'node-fetch'; +import { distance } from 'fastest-levenshtein'; +// @ts-ignore +import { TextEncoder } from 'text-encoding-polyfill'; + +const url = 'https://audio-samples.github.io/samples/mp3/blizzard_biased/sample-1.mp3'; +const filename = 'sample-1.mp3'; + +const correctAnswer = + 'It was anxious to find him no one that expectation of a man who were giving his father enjoyment. But he was avoided in sight in the minister to which indeed,'; +const model = 'whisper-1'; + +const client = new OpenAI({ apiKey: process.env['OPENAI_API_KEY'], dangerouslyAllowBrowser: true }); + +async function typeTests() { + // @ts-expect-error this should error if the `Uploadable` type was resolved correctly + await client.audio.transcriptions.create({ file: { foo: true }, model: 'whisper-1' }); + // @ts-expect-error this should error if the `Uploadable` type was resolved correctly + await client.audio.transcriptions.create({ file: null, model: 'whisper-1' }); + // @ts-expect-error this should error if the `Uploadable` type was resolved correctly + await client.audio.transcriptions.create({ file: 'test', model: 'whisper-1' }); +} + +declare global { + namespace jest { + interface Matchers { + toBeSimilarTo(comparedTo: string, expectedDistance: number): R; + } + } +} +expect.extend({ + toBeSimilarTo(received, comparedTo: string, expectedDistance: number) { + const message = () => + [ + `Received: ${JSON.stringify(received)}`, + `Expected: ${JSON.stringify(comparedTo)}`, + `Expected distance: ${expectedDistance}`, + `Received distance: ${actualDistance}`, + ].join('\n'); + + const actualDistance = distance(received, comparedTo); + if (actualDistance < expectedDistance) { + return { + message, + pass: true, + }; + } + + return { + message, + pass: false, + }; + }, +}); + +test(`basic request works`, async function () { + const completion = await client.chat.completions.create({ + model: 'gpt-4', + messages: [{ role: 'user', content: 'Say this is a test' }], + }); + expect(completion.choices[0]?.message?.content).toBeSimilarTo('This is a test', 10); +}); + +it(`streaming works`, async function () { + const stream = await client.chat.completions.create({ + model: 'gpt-4', + messages: [{ role: 'user', content: 'Say this is a test' }], + stream: true, + }); + const chunks = []; + for await (const part of stream) { + chunks.push(part); + } + expect(chunks.map((c) => c.choices[0]?.delta.content || '').join('')).toBeSimilarTo('This is a test', 10); +}); + +it.skip('handles builtinFile', async function () { + const file = await fetch(url) + .then((x) => x.arrayBuffer()) + // @ts-ignore avoid DOM lib for testing purposes + .then((x) => new File([x], filename)); + + const result = await client.audio.transcriptions.create({ file, model }); + expect(result.text).toBeSimilarTo(correctAnswer, 12); +}); + +it.skip('handles Response', async function () { + const file = await fetch(url); + + const result = await client.audio.transcriptions.create({ file, model }); + expect(result.text).toBeSimilarTo(correctAnswer, 12); +}); + +const fineTune = `{"prompt": "", "completion": ""}`; + +describe.skip('toFile', () => { + it('handles builtin Blob', async function () { + const result = await client.files.create({ + file: await toFile( + // @ts-ignore avoid DOM lib for testing purposes + new Blob([new TextEncoder().encode(fineTune)]), + 'finetune.jsonl', + ), + purpose: 'fine-tune', + }); + expect(result.status).toEqual('uploaded'); + }); + it('handles Uint8Array', async function () { + const result = await client.files.create({ + file: await toFile( + // @ts-ignore avoid DOM lib for testing purposes + new TextEncoder().encode(fineTune), + 'finetune.jsonl', + ), + purpose: 'fine-tune', + }); + expect(result.status).toEqual('uploaded'); + }); + it('handles ArrayBuffer', async function () { + const result = await client.files.create({ + file: await toFile( + // @ts-ignore avoid DOM lib for testing purposes + new TextEncoder().encode(fineTune).buffer, + 'finetune.jsonl', + ), + purpose: 'fine-tune', + }); + expect(result.status).toEqual('uploaded'); + }); + it('handles DataView', async function () { + const result = await client.files.create({ + file: await toFile( + // @ts-ignore avoid DOM lib for testing purposes + new DataView(new TextEncoder().encode(fineTune).buffer), + 'finetune.jsonl', + ), + purpose: 'fine-tune', + }); + expect(result.status).toEqual('uploaded'); + }); +}); diff --git a/ecosystem-tests/node-ts-cjs/tests/test-node.ts b/ecosystem-tests/node-ts-cjs/tests/test-node.ts new file mode 100644 index 000000000..14db8938b --- /dev/null +++ b/ecosystem-tests/node-ts-cjs/tests/test-node.ts @@ -0,0 +1,194 @@ +import 'openai/shims/node'; +import OpenAI, { toFile } from 'openai'; +import { TranscriptionCreateParams } from 'openai/resources/audio/transcriptions'; +import fetch from 'node-fetch'; +import { File as FormDataFile, Blob as FormDataBlob } from 'formdata-node'; +import * as fs from 'fs'; +import { distance } from 'fastest-levenshtein'; +import { ChatCompletion } from 'openai/resources/chat/completions'; + +const url = 'https://audio-samples.github.io/samples/mp3/blizzard_biased/sample-1.mp3'; +const filename = 'sample-1.mp3'; + +const correctAnswer = + 'It was anxious to find him no one that expectation of a man who were giving his father enjoyment. But he was avoided in sight in the minister to which indeed,'; +const model = 'whisper-1'; + +const client = new OpenAI(); + +async function typeTests() { + // @ts-expect-error this should error if the `Uploadable` type was resolved correctly + await client.audio.transcriptions.create({ file: { foo: true }, model: 'whisper-1' }); + // @ts-expect-error this should error if the `Uploadable` type was resolved correctly + await client.audio.transcriptions.create({ file: null, model: 'whisper-1' }); + // @ts-expect-error this should error if the `Uploadable` type was resolved correctly + await client.audio.transcriptions.create({ file: 'test', model: 'whisper-1' }); +} + +declare global { + namespace jest { + interface Matchers { + toBeSimilarTo(comparedTo: string, expectedDistance: number): R; + } + } +} +expect.extend({ + toBeSimilarTo(received, comparedTo: string, expectedDistance: number) { + const message = () => + [ + `Received: ${JSON.stringify(received)}`, + `Expected: ${JSON.stringify(comparedTo)}`, + `Expected distance: ${expectedDistance}`, + `Received distance: ${actualDistance}`, + ].join('\n'); + + const actualDistance = distance(received, comparedTo); + if (actualDistance < expectedDistance) { + return { + message, + pass: true, + }; + } + + return { + message, + pass: false, + }; + }, +}); + +it(`raw response`, async function () { + const response = await client.chat.completions + .create({ + model: 'gpt-4', + messages: [{ role: 'user', content: 'Say this is a test' }], + }) + .asResponse(); + + // test that we can use node-fetch Response API + const chunks: string[] = []; + response.body.on('data', (chunk) => chunks.push(chunk)); + await new Promise((resolve, reject) => { + response.body.once('end', resolve); + response.body.once('error', reject); + }); + const json: ChatCompletion = JSON.parse(chunks.join('')); + expect(json.choices[0]?.message.content || '').toBeSimilarTo('This is a test', 10); +}); + +it(`streaming works`, async function () { + const stream = await client.chat.completions.create({ + model: 'gpt-4', + messages: [{ role: 'user', content: 'Say this is a test' }], + stream: true, + }); + const chunks = []; + for await (const part of stream) { + chunks.push(part); + } + expect(chunks.map((c) => c.choices[0]?.delta.content || '').join('')).toBeSimilarTo('This is a test', 10); +}); + +it('handles formdata-node File', async function () { + const file = await fetch(url) + .then((x) => x.arrayBuffer()) + .then((x) => new FormDataFile([x], filename)); + + const params: TranscriptionCreateParams = { file, model }; + + const result = await client.audio.transcriptions.create(params); + expect(result.text).toBeSimilarTo(correctAnswer, 12); +}); + +// @ts-ignore avoid DOM lib for testing purposes +if (typeof File !== 'undefined') { + it('handles builtinFile', async function () { + const file = await fetch(url) + .then((x) => x.arrayBuffer()) + // @ts-ignore avoid DOM lib for testing purposes + .then((x) => new File([x], filename)); + + const result = await client.audio.transcriptions.create({ file, model }); + expect(result.text).toBeSimilarTo(correctAnswer, 12); + }); +} + +it('handles Response', async function () { + const file = await fetch(url); + + const result = await client.audio.transcriptions.create({ file, model }); + expect(result.text).toBeSimilarTo(correctAnswer, 12); +}); + +it('handles fs.ReadStream', async function () { + const result = await client.audio.transcriptions.create({ + file: fs.createReadStream('sample1.mp3'), + model, + }); + expect(result.text).toBeSimilarTo(correctAnswer, 12); +}); + +const fineTune = `{"prompt": "", "completion": ""}`; + +describe('toFile', () => { + it('handles form-data Blob', async function () { + const result = await client.files.create({ + file: await toFile( + new FormDataBlob([ + // @ts-ignore avoid DOM lib for testing purposes + new TextEncoder().encode(fineTune), + ]), + 'finetune.jsonl', + ), + purpose: 'fine-tune', + }); + expect(result.status).toEqual('uploaded'); + }); + // @ts-ignore avoid DOM lib for testing purposes + if (typeof Blob !== 'undefined') { + it('handles builtin Blob', async function () { + const result = await client.files.create({ + file: await toFile( + // @ts-ignore avoid DOM lib for testing purposes + new Blob([new TextEncoder().encode(fineTune)]), + 'finetune.jsonl', + ), + purpose: 'fine-tune', + }); + expect(result.status).toEqual('uploaded'); + }); + } + it('handles Uint8Array', async function () { + const result = await client.files.create({ + file: await toFile( + // @ts-ignore avoid DOM lib for testing purposes + new TextEncoder().encode(fineTune), + 'finetune.jsonl', + ), + purpose: 'fine-tune', + }); + expect(result.status).toEqual('uploaded'); + }); + it('handles ArrayBuffer', async function () { + const result = await client.files.create({ + file: await toFile( + // @ts-ignore avoid DOM lib for testing purposes + new TextEncoder().encode(fineTune).buffer, + 'finetune.jsonl', + ), + purpose: 'fine-tune', + }); + expect(result.status).toEqual('uploaded'); + }); + it('handles DataView', async function () { + const result = await client.files.create({ + file: await toFile( + // @ts-ignore avoid DOM lib for testing purposes + new DataView(new TextEncoder().encode(fineTune).buffer), + 'finetune.jsonl', + ), + purpose: 'fine-tune', + }); + expect(result.status).toEqual('uploaded'); + }); +}); diff --git a/ecosystem-tests/node-ts-cjs/tsconfig.json b/ecosystem-tests/node-ts-cjs/tsconfig.json index 9fcbc2e6c..d1ad90efd 100644 --- a/ecosystem-tests/node-ts-cjs/tsconfig.json +++ b/ecosystem-tests/node-ts-cjs/tsconfig.json @@ -1,5 +1,6 @@ { - "exclude": ["node_modules"], + "include": ["tests/*.ts"], + "exclude": ["tests/*-shim-errors.ts"], "compilerOptions": { /* Visit https://aka.ms/tsconfig.json to read more about this file */ diff --git a/ecosystem-tests/node-ts-cjs/tsconfig.nodenext.json b/ecosystem-tests/node-ts-cjs/tsconfig.nodenext.json index 073cb35d3..0efe77b4e 100644 --- a/ecosystem-tests/node-ts-cjs/tsconfig.nodenext.json +++ b/ecosystem-tests/node-ts-cjs/tsconfig.nodenext.json @@ -1,5 +1,6 @@ { - "exclude": ["node_modules"], + "include": ["tests/*.ts"], + "exclude": ["tests/*-shim-errors.ts"], "compilerOptions": { /* Visit https://aka.ms/tsconfig.json to read more about this file */ diff --git a/ecosystem-tests/node-ts-esm-auto/esnext-type-tests.ts b/ecosystem-tests/node-ts-esm-auto/esnext-type-tests.ts new file mode 100644 index 000000000..c47ddc2a5 --- /dev/null +++ b/ecosystem-tests/node-ts-esm-auto/esnext-type-tests.ts @@ -0,0 +1,5 @@ +import * as shims from 'openai/_shims/index'; + +function typeTests(x: shims.Request) { + const url: string = x.url; +} diff --git a/ecosystem-tests/node-ts-esm-dom/jest.config.cjs b/ecosystem-tests/node-ts-esm-auto/jest.config.cjs similarity index 100% rename from ecosystem-tests/node-ts-esm-dom/jest.config.cjs rename to ecosystem-tests/node-ts-esm-auto/jest.config.cjs diff --git a/ecosystem-tests/node-ts-esm-dom/package-lock.json b/ecosystem-tests/node-ts-esm-auto/package-lock.json similarity index 100% rename from ecosystem-tests/node-ts-esm-dom/package-lock.json rename to ecosystem-tests/node-ts-esm-auto/package-lock.json diff --git a/ecosystem-tests/node-ts-esm-auto/package.json b/ecosystem-tests/node-ts-esm-auto/package.json new file mode 100644 index 000000000..7c227166c --- /dev/null +++ b/ecosystem-tests/node-ts-esm-auto/package.json @@ -0,0 +1,23 @@ +{ + "name": "node-ts-esm-auto", + "version": "0.0.1", + "main": "index.js", + "type": "module", + "private": true, + "scripts": { + "tsc": "tsc", + "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js" + }, + "dependencies": { + "formdata-node": "^5.0.1", + "node-fetch": "^3.0.0" + }, + "devDependencies": { + "@types/node": "^20.3.1", + "fastest-levenshtein": "^1.0.16", + "jest": "^29.5.0", + "ts-jest": "^29.1.0", + "ts-node": "^10.9.1", + "typescript": "4.7.4" + } +} diff --git a/ecosystem-tests/node-ts-esm-dom/sample1.mp3 b/ecosystem-tests/node-ts-esm-auto/sample1.mp3 similarity index 100% rename from ecosystem-tests/node-ts-esm-dom/sample1.mp3 rename to ecosystem-tests/node-ts-esm-auto/sample1.mp3 diff --git a/ecosystem-tests/node-ts-esm-auto/tests/shims.ts b/ecosystem-tests/node-ts-esm-auto/tests/shims.ts new file mode 100644 index 000000000..aed8e6497 --- /dev/null +++ b/ecosystem-tests/node-ts-esm-auto/tests/shims.ts @@ -0,0 +1,5 @@ +import * as shims from 'openai/_shims/index'; + +test('openai/shims/node', () => { + expect(shims.kind).toEqual('node'); +}); diff --git a/ecosystem-tests/node-ts-esm-auto/tests/test.ts b/ecosystem-tests/node-ts-esm-auto/tests/test.ts new file mode 100644 index 000000000..d8ecba1ef --- /dev/null +++ b/ecosystem-tests/node-ts-esm-auto/tests/test.ts @@ -0,0 +1,196 @@ +import 'openai/shims/node'; +import OpenAI, { toFile } from 'openai'; +import { TranscriptionCreateParams } from 'openai/resources/audio/transcriptions'; +import fetch from 'node-fetch'; +import { File as FormDataFile, Blob as FormDataBlob } from 'formdata-node'; +import * as fs from 'fs'; +import { distance } from 'fastest-levenshtein'; +import { ChatCompletion } from 'openai/resources/chat/completions'; + +const url = 'https://audio-samples.github.io/samples/mp3/blizzard_biased/sample-1.mp3'; +const filename = 'sample-1.mp3'; + +const correctAnswer = + 'It was anxious to find him no one that expectation of a man who were giving his father enjoyment. But he was avoided in sight in the minister to which indeed,'; +const model = 'whisper-1'; + +const client = new OpenAI(); + +async function typeTests() { + // @ts-expect-error this should error if the `Uploadable` type was resolved correctly + await client.audio.transcriptions.create({ file: { foo: true }, model: 'whisper-1' }); + // @ts-expect-error this should error if the `Uploadable` type was resolved correctly + await client.audio.transcriptions.create({ file: null, model: 'whisper-1' }); + // @ts-expect-error this should error if the `Uploadable` type was resolved correctly + await client.audio.transcriptions.create({ file: 'test', model: 'whisper-1' }); +} + +declare global { + namespace jest { + interface Matchers { + toBeSimilarTo(comparedTo: string, expectedDistance: number): R; + } + } +} +expect.extend({ + toBeSimilarTo(received, comparedTo: string, expectedDistance: number) { + const message = () => + [ + `Received: ${JSON.stringify(received)}`, + `Expected: ${JSON.stringify(comparedTo)}`, + `Expected distance: ${expectedDistance}`, + `Received distance: ${actualDistance}`, + ].join('\n'); + + const actualDistance = distance(received, comparedTo); + if (actualDistance < expectedDistance) { + return { + message, + pass: true, + }; + } + + return { + message, + pass: false, + }; + }, +}); + +it(`raw response`, async function () { + const response = await client.chat.completions + .create({ + model: 'gpt-4', + messages: [{ role: 'user', content: 'Say this is a test' }], + }) + .asResponse(); + + // test that we can use node-fetch Response API + const chunks: string[] = []; + const { body } = response; + if (!body) throw new Error(`expected response.body to be defined`); + body.on('data', (chunk) => chunks.push(chunk)); + await new Promise((resolve, reject) => { + body.once('end', resolve); + body.once('error', reject); + }); + const json: ChatCompletion = JSON.parse(chunks.join('')); + expect(json.choices[0]?.message.content || '').toBeSimilarTo('This is a test', 10); +}); + +it(`streaming works`, async function () { + const stream = await client.chat.completions.create({ + model: 'gpt-4', + messages: [{ role: 'user', content: 'Say this is a test' }], + stream: true, + }); + const chunks = []; + for await (const part of stream) { + chunks.push(part); + } + expect(chunks.map((c) => c.choices[0]?.delta.content || '').join('')).toBeSimilarTo('This is a test', 10); +}); + +it('handles formdata-node File', async function () { + const file = await fetch(url) + .then((x) => x.arrayBuffer()) + .then((x) => new FormDataFile([x], filename)); + + const params: TranscriptionCreateParams = { file, model }; + + const result = await client.audio.transcriptions.create(params); + expect(result.text).toBeSimilarTo(correctAnswer, 12); +}); + +// @ts-ignore avoid DOM lib for testing purposes +if (typeof File !== 'undefined') { + it('handles builtinFile', async function () { + const file = await fetch(url) + .then((x) => x.arrayBuffer()) + // @ts-ignore avoid DOM lib for testing purposes + .then((x) => new File([x], filename)); + + const result = await client.audio.transcriptions.create({ file, model }); + expect(result.text).toBeSimilarTo(correctAnswer, 12); + }); +} + +it('handles Response', async function () { + const file = await fetch(url); + + const result = await client.audio.transcriptions.create({ file, model }); + expect(result.text).toBeSimilarTo(correctAnswer, 12); +}); + +it('handles fs.ReadStream', async function () { + const result = await client.audio.transcriptions.create({ + file: fs.createReadStream('sample1.mp3'), + model, + }); + expect(result.text).toBeSimilarTo(correctAnswer, 12); +}); + +const fineTune = `{"prompt": "", "completion": ""}`; + +describe('toFile', () => { + it('handles form-data Blob', async function () { + const result = await client.files.create({ + file: await toFile( + new FormDataBlob([ + // @ts-ignore avoid DOM lib for testing purposes + new TextEncoder().encode(fineTune), + ]), + 'finetune.jsonl', + ), + purpose: 'fine-tune', + }); + expect(result.status).toEqual('uploaded'); + }); + // @ts-ignore avoid DOM lib for testing purposes + if (typeof Blob !== 'undefined') { + it('handles builtin Blob', async function () { + const result = await client.files.create({ + file: await toFile( + // @ts-ignore avoid DOM lib for testing purposes + new Blob([new TextEncoder().encode(fineTune)]), + 'finetune.jsonl', + ), + purpose: 'fine-tune', + }); + expect(result.status).toEqual('uploaded'); + }); + } + it('handles Uint8Array', async function () { + const result = await client.files.create({ + file: await toFile( + // @ts-ignore avoid DOM lib for testing purposes + new TextEncoder().encode(fineTune), + 'finetune.jsonl', + ), + purpose: 'fine-tune', + }); + expect(result.status).toEqual('uploaded'); + }); + it('handles ArrayBuffer', async function () { + const result = await client.files.create({ + file: await toFile( + // @ts-ignore avoid DOM lib for testing purposes + new TextEncoder().encode(fineTune).buffer, + 'finetune.jsonl', + ), + purpose: 'fine-tune', + }); + expect(result.status).toEqual('uploaded'); + }); + it('handles DataView', async function () { + const result = await client.files.create({ + file: await toFile( + // @ts-ignore avoid DOM lib for testing purposes + new DataView(new TextEncoder().encode(fineTune).buffer), + 'finetune.jsonl', + ), + purpose: 'fine-tune', + }); + expect(result.status).toEqual('uploaded'); + }); +}); diff --git a/ecosystem-tests/node-ts-esm-auto/tsconfig.json b/ecosystem-tests/node-ts-esm-auto/tsconfig.json new file mode 100644 index 000000000..7e7c45459 --- /dev/null +++ b/ecosystem-tests/node-ts-esm-auto/tsconfig.json @@ -0,0 +1,54 @@ +{ + "include": ["tests/*.ts", "*.ts"], + + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + /* Projects */ + "incremental": true, + + /* Language and Environment */ + "target": "ES2022", + "lib": ["ES2022"], + "jsx": "react", + + /* Modules */ + "module": "ESNext", + "rootDir": "./", + "moduleResolution": "NodeNext", + "baseUrl": "./", + "paths": { + "~/*": ["*"] + }, + "resolveJsonModule": true, + "composite": true, + + /* Emit */ + "outDir": "node_modules", + "noEmit": true, + + /* Interop Constraints */ + "isolatedModules": true, + "allowSyntheticDefaultImports": true, + /* "esModuleInterop": true, */ + "forceConsistentCasingInFileNames": true, + "allowJs": true, + "checkJs": true, + + /* Experimental Features */ + "experimentalDecorators": true, + + /* Type Checking */ + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "strictBindCallApply": true, + "strictPropertyInitialization": true, + "noImplicitThis": true, + "alwaysStrict": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "skipLibCheck": true + } +} diff --git a/ecosystem-tests/node-ts-esm-web/jest.config.cjs b/ecosystem-tests/node-ts-esm-web/jest.config.cjs new file mode 100644 index 000000000..31e0a832f --- /dev/null +++ b/ecosystem-tests/node-ts-esm-web/jest.config.cjs @@ -0,0 +1,23 @@ +/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ +module.exports = { + extensionsToTreatAsEsm: ['.ts'], + moduleNameMapper: { + '^(\\.{1,2}/.*)\\.js$': '$1', + }, + transform: { + // '^.+\\.[tj]sx?$' to process js/ts with `ts-jest` + // '^.+\\.m?[tj]sx?$' to process js/ts/mjs/mts with `ts-jest` + '^.+\\.tsx?$': [ + 'ts-jest', + { + useESM: true, + diagnostics: false, + }, + ], + }, + testEnvironment: 'node', + testMatch: ['/tests/*.ts'], + watchPathIgnorePatterns: ['/node_modules/'], + verbose: false, + testTimeout: 60000, +}; diff --git a/ecosystem-tests/node-ts-cjs-dom/package-lock.json b/ecosystem-tests/node-ts-esm-web/package-lock.json similarity index 94% rename from ecosystem-tests/node-ts-cjs-dom/package-lock.json rename to ecosystem-tests/node-ts-esm-web/package-lock.json index e53aa7a4f..dfafbf8c2 100644 --- a/ecosystem-tests/node-ts-cjs-dom/package-lock.json +++ b/ecosystem-tests/node-ts-esm-web/package-lock.json @@ -1,23 +1,22 @@ { - "name": "node-ts-cjs-dom", + "name": "node-esm", "version": "0.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "node-ts-cjs-dom", + "name": "node-esm", "version": "0.0.1", "dependencies": { - "formdata-node": "^4.4.1", - "node-fetch": "^2.6.1", - "tsconfig-paths": "^4.0.0" + "formdata-node": "^5.0.1", + "node-fetch": "^3.0.0" }, "devDependencies": { - "@types/node": "^17.0.9", - "@types/node-fetch": "^2.6.1", + "@types/node": "^20.3.1", "fastest-levenshtein": "^1.0.16", "jest": "^29.5.0", "ts-jest": "^29.1.0", + "ts-node": "^10.9.1", "typescript": "4.7.4" } }, @@ -662,6 +661,28 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1037,6 +1058,30 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, "node_modules/@types/babel__core": { "version": "7.20.1", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", @@ -1112,21 +1157,11 @@ } }, "node_modules/@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "version": "20.5.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", + "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==", "dev": true }, - "node_modules/@types/node-fetch": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", - "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "form-data": "^3.0.0" - } - }, "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -1148,6 +1183,27 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -1200,6 +1256,12 @@ "node": ">= 8" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -1209,12 +1271,6 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, "node_modules/babel-jest": { "version": "29.6.4", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", @@ -1541,18 +1597,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "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==", - "dev": true, - "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", @@ -1565,6 +1609,12 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1579,6 +1629,14 @@ "node": ">= 8" } }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "engines": { + "node": ">= 12" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1619,15 +1677,6 @@ "node": ">=0.10.0" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -1637,6 +1686,15 @@ "node": ">=8" } }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", @@ -1782,6 +1840,36 @@ "bser": "2.1.1" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/fetch-blob/node_modules/web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "engines": { + "node": ">= 8" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -1807,30 +1895,27 @@ "node": ">=8" } }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, + "node_modules/formdata-node": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-5.0.1.tgz", + "integrity": "sha512-8xnIjMYGKPj+rY2BTbAmpqVpi8der/2FT4d9f7J32FlsCpO5EzZPq3C/N56zdv8KweHzVF6TGijsS1JT6r1H2g==", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" }, "engines": { - "node": ">= 6" + "node": ">= 14.17" } }, - "node_modules/formdata-node": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", - "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", "dependencies": { - "node-domexception": "1.0.0", - "web-streams-polyfill": "4.0.0-beta.3" + "fetch-blob": "^3.1.2" }, "engines": { - "node": ">= 12.20" + "node": ">=12.20.0" } }, "node_modules/fs.realpath": { @@ -2805,6 +2890,7 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, "bin": { "json5": "lib/cli.js" }, @@ -2945,27 +3031,6 @@ "node": ">=8.6" } }, - "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==", - "dev": true, - "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==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -2987,14 +3052,6 @@ "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -3026,22 +3083,20 @@ } }, "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "dependencies": { - "whatwg-url": "^5.0.0" + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" }, "engines": { - "node": "4.x || >=6.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" } }, "node_modules/node-int64": { @@ -3581,11 +3636,6 @@ "node": ">=8.0" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, "node_modules/ts-jest": { "version": "29.1.1", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", @@ -3662,25 +3712,47 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "engines": { - "node": ">=4" + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, "node_modules/type-detect": { @@ -3747,6 +3819,12 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "node_modules/v8-to-istanbul": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", @@ -3784,20 +3862,6 @@ "node": ">= 14" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3891,6 +3955,15 @@ "node": ">=12" } }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/ecosystem-tests/node-ts-esm-dom/package.json b/ecosystem-tests/node-ts-esm-web/package.json similarity index 94% rename from ecosystem-tests/node-ts-esm-dom/package.json rename to ecosystem-tests/node-ts-esm-web/package.json index 5f6b5f658..97a2309f8 100644 --- a/ecosystem-tests/node-ts-esm-dom/package.json +++ b/ecosystem-tests/node-ts-esm-web/package.json @@ -1,5 +1,5 @@ { - "name": "node-esm", + "name": "node-ts-esm-web", "version": "0.0.1", "main": "index.js", "type": "module", diff --git a/ecosystem-tests/node-ts-esm-web/sample1.mp3 b/ecosystem-tests/node-ts-esm-web/sample1.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..1e787cd7cf33203d99fa50b39b232b318d287541 GIT binary patch literal 121671 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

u-pOVR)XKV)b$Ua4l=gJ1IK*8lYC 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 b+aryhC { + expect(shims.kind).toEqual('web'); + expect(shims.File).toEqual(File); +}); diff --git a/ecosystem-tests/node-ts-esm-dom/tests/test.ts b/ecosystem-tests/node-ts-esm-web/tests/test.ts similarity index 77% rename from ecosystem-tests/node-ts-esm-dom/tests/test.ts rename to ecosystem-tests/node-ts-esm-web/tests/test.ts index 42890a58c..7b9b6b6d9 100644 --- a/ecosystem-tests/node-ts-esm-dom/tests/test.ts +++ b/ecosystem-tests/node-ts-esm-web/tests/test.ts @@ -1,9 +1,8 @@ +// shouldn't need extension, but Jest's ESM module resolution is broken +import 'openai/shims/web.mjs'; import OpenAI, { toFile } from 'openai'; -import { TranscriptionCreateParams } from 'openai/resources/audio/transcriptions'; -import fetch from 'node-fetch'; -import { File as FormDataFile, Blob as FormDataBlob } from 'formdata-node'; -import * as fs from 'fs'; import { distance } from 'fastest-levenshtein'; +import { ChatCompletion } from 'openai/resources/chat/completions'; const url = 'https://audio-samples.github.io/samples/mp3/blizzard_biased/sample-1.mp3'; const filename = 'sample-1.mp3'; @@ -55,6 +54,39 @@ expect.extend({ }, }); +it(`raw response`, async function () { + const response = await client.chat.completions + .create({ + model: 'gpt-4', + messages: [{ role: 'user', content: 'Say this is a test' }], + }) + .asResponse(); + + // test that we can use web Response API + const { body } = response; + if (!body) throw new Error('expected response.body to be defined'); + + const reader = body.getReader(); + const chunks: Uint8Array[] = []; + let result; + do { + result = await reader.read(); + if (!result.done) chunks.push(result.value); + } while (!result.done); + + reader.releaseLock(); + + let offset = 0; + const merged = new Uint8Array(chunks.reduce((total, chunk) => total + chunk.length, 0)); + for (const chunk of chunks) { + merged.set(chunk, offset); + offset += chunk.length; + } + + const json: ChatCompletion = JSON.parse(new TextDecoder().decode(merged)); + expect(json.choices[0]?.message.content || '').toBeSimilarTo('This is a test', 10); +}); + it(`streaming works`, async function () { const stream = await client.chat.completions.create({ model: 'gpt-4', @@ -68,17 +100,6 @@ it(`streaming works`, async function () { expect(chunks.map((c) => c.choices[0]?.delta.content || '').join('')).toBeSimilarTo('This is a test', 10); }); -it('handles formdata-node File', async function () { - const file = await fetch(url) - .then((x) => x.arrayBuffer()) - .then((x) => new FormDataFile([x], filename)); - - const params: TranscriptionCreateParams = { file, model }; - - const result = await client.audio.transcriptions.create(params); - expect(result.text).toBeSimilarTo(correctAnswer, 12); -}); - if (typeof File !== 'undefined') { it('handles builtinFile', async function () { const file = await fetch(url) @@ -97,24 +118,9 @@ it('handles Response', async function () { expect(result.text).toBeSimilarTo(correctAnswer, 12); }); -it('handles fs.ReadStream', async function () { - const result = await client.audio.transcriptions.create({ - file: fs.createReadStream('sample1.mp3'), - model, - }); - expect(result.text).toBeSimilarTo(correctAnswer, 12); -}); - const fineTune = `{"prompt": "", "completion": ""}`; describe('toFile', () => { - it('handles form-data Blob', async function () { - const result = await client.files.create({ - file: await toFile(new FormDataBlob([new TextEncoder().encode(fineTune)]), 'finetune.jsonl'), - purpose: 'fine-tune', - }); - expect(result.status).toEqual('uploaded'); - }); if (typeof Blob !== 'undefined') { it('handles builtin Blob', async function () { const result = await client.files.create({ diff --git a/ecosystem-tests/node-ts-esm-dom/tsconfig.json b/ecosystem-tests/node-ts-esm-web/tsconfig.json similarity index 97% rename from ecosystem-tests/node-ts-esm-dom/tsconfig.json rename to ecosystem-tests/node-ts-esm-web/tsconfig.json index 0d45c35f3..81f9c1186 100644 --- a/ecosystem-tests/node-ts-esm-dom/tsconfig.json +++ b/ecosystem-tests/node-ts-esm-web/tsconfig.json @@ -1,5 +1,5 @@ { - "exclude": ["node_modules"], + "include": ["tests/*.ts"], "compilerOptions": { /* Visit https://aka.ms/tsconfig.json to read more about this file */ diff --git a/ecosystem-tests/node-ts-esm-dom/tsconfig.noderesolution.json b/ecosystem-tests/node-ts-esm-web/tsconfig.noderesolution.json similarity index 97% rename from ecosystem-tests/node-ts-esm-dom/tsconfig.noderesolution.json rename to ecosystem-tests/node-ts-esm-web/tsconfig.noderesolution.json index 09e7243b1..96e61ca7d 100644 --- a/ecosystem-tests/node-ts-esm-dom/tsconfig.noderesolution.json +++ b/ecosystem-tests/node-ts-esm-web/tsconfig.noderesolution.json @@ -1,5 +1,5 @@ { - "exclude": ["node_modules"], + "include": ["tests/*.ts"], "compilerOptions": { /* Visit https://aka.ms/tsconfig.json to read more about this file */ diff --git a/ecosystem-tests/node-ts-esm/package.json b/ecosystem-tests/node-ts-esm/package.json index 5f6b5f658..a4f42790f 100644 --- a/ecosystem-tests/node-ts-esm/package.json +++ b/ecosystem-tests/node-ts-esm/package.json @@ -1,5 +1,5 @@ { - "name": "node-esm", + "name": "node-ts-esm", "version": "0.0.1", "main": "index.js", "type": "module", diff --git a/ecosystem-tests/node-ts-esm/tests/shims.ts b/ecosystem-tests/node-ts-esm/tests/shims.ts new file mode 100644 index 000000000..a7a22ddb4 --- /dev/null +++ b/ecosystem-tests/node-ts-esm/tests/shims.ts @@ -0,0 +1,7 @@ +// shouldn't need extension, but Jest's ESM module resolution is broken +import 'openai/shims/node.mjs'; +import * as shims from 'openai/_shims/index'; + +test('openai/shims/node', () => { + expect(shims.kind).toEqual('node'); +}); diff --git a/ecosystem-tests/node-ts-esm/tests/test-esnext.ts b/ecosystem-tests/node-ts-esm/tests/test-esnext.ts new file mode 100644 index 000000000..7fafdae10 --- /dev/null +++ b/ecosystem-tests/node-ts-esm/tests/test-esnext.ts @@ -0,0 +1,68 @@ +// shouldn't need extension, but Jest's ESM module resolution is broken +// however, using .mjs doesn't set the right typings with "moduleResolution": "node"...argh +import 'openai/shims/node.mjs'; +import OpenAI from 'openai'; +import { distance } from 'fastest-levenshtein'; +import { ChatCompletion } from 'openai/resources/chat/completions'; +import * as shims from 'openai/_shims/index'; + +// The tests in this file don't typecheck with "moduleResolution": "node" + +function typeTests(x: shims.Request) { + const url: string = x.url; +} + +const client = new OpenAI(); + +declare global { + namespace jest { + interface Matchers { + toBeSimilarTo(comparedTo: string, expectedDistance: number): R; + } + } +} +expect.extend({ + toBeSimilarTo(received, comparedTo: string, expectedDistance: number) { + const message = () => + [ + `Received: ${JSON.stringify(received)}`, + `Expected: ${JSON.stringify(comparedTo)}`, + `Expected distance: ${expectedDistance}`, + `Received distance: ${actualDistance}`, + ].join('\n'); + + const actualDistance = distance(received, comparedTo); + if (actualDistance < expectedDistance) { + return { + message, + pass: true, + }; + } + + return { + message, + pass: false, + }; + }, +}); + +it(`raw response`, async function () { + const response = await client.chat.completions + .create({ + model: 'gpt-4', + messages: [{ role: 'user', content: 'Say this is a test' }], + }) + .asResponse(); + + // test that we can use node-fetch Response API + const chunks: string[] = []; + const { body } = response; + if (!body) throw new Error(`expected response.body to be defined`); + body.on('data', (chunk) => chunks.push(chunk)); + await new Promise((resolve, reject) => { + body.once('end', resolve); + body.once('error', reject); + }); + const json: ChatCompletion = JSON.parse(chunks.join('')); + expect(json.choices[0]?.message.content || '').toBeSimilarTo('This is a test', 10); +}); diff --git a/ecosystem-tests/node-ts-esm/tests/test.ts b/ecosystem-tests/node-ts-esm/tests/test.ts index ea6d0a76b..c62012114 100644 --- a/ecosystem-tests/node-ts-esm/tests/test.ts +++ b/ecosystem-tests/node-ts-esm/tests/test.ts @@ -1,3 +1,5 @@ +// shouldn't need extension, but Jest's ESM module resolution is broken +import 'openai/shims/node.mjs'; import OpenAI, { toFile } from 'openai'; import { TranscriptionCreateParams } from 'openai/resources/audio/transcriptions'; import fetch from 'node-fetch'; diff --git a/ecosystem-tests/node-ts-esm/tsconfig.json b/ecosystem-tests/node-ts-esm/tsconfig.json index de2268490..c4a5f80c5 100644 --- a/ecosystem-tests/node-ts-esm/tsconfig.json +++ b/ecosystem-tests/node-ts-esm/tsconfig.json @@ -1,5 +1,5 @@ { - "exclude": ["node_modules"], + "include": ["tests/*.ts"], "compilerOptions": { /* Visit https://aka.ms/tsconfig.json to read more about this file */ diff --git a/ecosystem-tests/node-ts-esm/tsconfig.noderesolution.json b/ecosystem-tests/node-ts-esm/tsconfig.noderesolution.json index b14dc7f61..0a7d2b35a 100644 --- a/ecosystem-tests/node-ts-esm/tsconfig.noderesolution.json +++ b/ecosystem-tests/node-ts-esm/tsconfig.noderesolution.json @@ -1,5 +1,6 @@ { - "exclude": ["node_modules"], + "include": ["tests/*.ts"], + "exclude": ["tests/*-esnext.ts"], "compilerOptions": { /* Visit https://aka.ms/tsconfig.json to read more about this file */ diff --git a/ecosystem-tests/node-ts4.5-jest27/jest.config.cjs b/ecosystem-tests/node-ts4.5-jest27/jest.config.cjs new file mode 100644 index 000000000..b08ea4311 --- /dev/null +++ b/ecosystem-tests/node-ts4.5-jest27/jest.config.cjs @@ -0,0 +1,9 @@ +/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + testMatch: ['/tests/*.ts'], + watchPathIgnorePatterns: ['/node_modules/'], + verbose: false, + testTimeout: 60000, +}; diff --git a/ecosystem-tests/node-ts4.5-jest27/package-lock.json b/ecosystem-tests/node-ts4.5-jest27/package-lock.json new file mode 100644 index 000000000..dbec66d6d --- /dev/null +++ b/ecosystem-tests/node-ts4.5-jest27/package-lock.json @@ -0,0 +1,4395 @@ +{ + "name": "node-ts-cjs", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "node-ts-cjs", + "version": "0.0.1", + "dependencies": { + "formdata-node": "^4.4.1", + "node-fetch": "^2.6.1", + "tsconfig-paths": "^4.0.0" + }, + "devDependencies": { + "@types/jest": "27.4.1", + "@types/node": "^20.4.2", + "@types/node-fetch": "^2.6.1", + "@types/ws": "^8.5.4", + "fastest-levenshtein": "^1.0.16", + "jest": "27.5.1", + "ts-jest": "27.1.4", + "typescript": "4.5.4" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.17.tgz", + "integrity": "sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.17", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.17", + "@babel/types": "^7.22.17", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", + "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", + "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", + "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", + "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", + "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", + "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.17", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", + "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.15", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "dev": true, + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/source-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dev": true, + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "dev": true, + "dependencies": { + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "27.4.1", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.1.tgz", + "integrity": "sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw==", + "dev": true, + "dependencies": { + "jest-matcher-utils": "^27.0.0", + "pretty-format": "^27.0.0" + } + }, + "node_modules/@types/node": { + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==", + "dev": true + }, + "node_modules/@types/node-fetch": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.5.tgz", + "integrity": "sha512-OZsUlr2nxvkqUFLSaY2ZbA+P1q22q+KrlxWOn/38RX+u5kTkYL2mTujEpzUhGkS+K/QCYp9oagfXG39XOzyySg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/ws": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.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==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "dev": true, + "dependencies": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "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/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.520", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.520.tgz", + "integrity": "sha512-Frfus2VpYADsrh1lB3v/ft/WVFlVzOIm+Q0p7U7VqHI6qr7NWHYKe+Wif3W50n7JAFoBsWVsoU0+qDks6WQ60g==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" + } + }, + "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==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "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/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "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==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "dev": true, + "dependencies": { + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "dev": true, + "dependencies": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "dev": true, + "dependencies": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "dev": true, + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "dev": true, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "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==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, + "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/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/throat": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", + "dev": true + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-jest": { + "version": "27.1.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.4.tgz", + "integrity": "sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^27.0.0", + "json5": "2.x", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@types/jest": "^27.0.0", + "babel-jest": ">=27.0.0 <28", + "jest": "^27.0.0", + "typescript": ">=3.8 <5.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@types/jest": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", + "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "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==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + } + } +} diff --git a/ecosystem-tests/node-ts-cjs-ts4.5/package.json b/ecosystem-tests/node-ts4.5-jest27/package.json similarity index 79% rename from ecosystem-tests/node-ts-cjs-ts4.5/package.json rename to ecosystem-tests/node-ts4.5-jest27/package.json index e79a1ba62..cf126a1dc 100644 --- a/ecosystem-tests/node-ts-cjs-ts4.5/package.json +++ b/ecosystem-tests/node-ts4.5-jest27/package.json @@ -1,5 +1,5 @@ { - "name": "node-ts-cjs", + "name": "node-ts4.5-jest27", "version": "0.0.1", "main": "index.js", "private": true, @@ -15,10 +15,11 @@ "devDependencies": { "@types/node": "^20.4.2", "@types/node-fetch": "^2.6.1", + "@types/jest": "27.4.1", "@types/ws": "^8.5.4", "fastest-levenshtein": "^1.0.16", - "jest": "^29.5.0", - "ts-jest": "^29.1.0", + "jest": "27.5.1", + "ts-jest": "27.1.4", "typescript": "4.5.4" } } diff --git a/ecosystem-tests/node-ts4.5-jest27/sample1.mp3 b/ecosystem-tests/node-ts4.5-jest27/sample1.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..1e787cd7cf33203d99fa50b39b232b318d287541 GIT binary patch literal 121671 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

u-pOVR)XKV)b$Ua4l=gJ1IK*8lYC z&#s5xCOfsBpf6^yN6!mS+%4@(5@YO~g2FIbs-a7-Z{yH9j@$90CG1EmNe-GhObV6* zaYx_#oljPUua@{^fe^#$6i`D!>{JETEh&D>QV#^!YnA|~huO_N^Po$q=J#TG_|&p_ zqyqVPvk$($y%&^xc30?zO^w2a!+oEK0$vPYkmE@m<1q-S(D%1H0^S4-Orw4mA-rt_ z6K3{4b{~R38W>TRFEv4_?uFG4a2ON^Lrd2n8?VaHoCZd`oYR+_*wAoIkD1DGWiPxa zmA(C$oiX@wQeI2>kUyDnngat#wVYG=7+d+yk;VUC+oPq6bIzvOPfhRoc8;u){I2~g z>W4>_wH&imm8z({ZSw!_TeB3Wj)<)Z!A&#G_@9i2nLhs?Ro2<3E3{GGELgnU;a|x8 zF`cRPt$be$6B73L*S-?e! zjm|qgB@me*Isp7am2W0Lz)5TsOAiI{7CHV?e0bqZdpQ>(-izh|p}|b(V5IUT8AS)M z+>Oj^=IYONQz@RJ%)x%>fEv0w^pFyX3?bni0-k^p_@#MWjgSqqBfl~4W{Jodvk1l? z0{GYAYPw(U&#%v3;8oGf&;Fcm@PeBFm-o6OJHhx#p5;6sR5`L?C^W881SOcGDT4lbe&$;rj#-kdcoLy9^32{tkNc)ly?vQK9#VMRO zhHh=Q{4A$l=k+!79^wlNGT|TT*!r}IY7ptRVq0~E%}<|+-ztCpY_-4L_nJAGiT_)X z{IGN3yOR0-E^P8Wv*6&9;lA}joC!Ohy5nXe8%=*p)NwhZEfeil@g#!S-hr-M{pT=B zqHn$_jd#S(XqQ2&#k{sKV^PnIcjRZ1R8AGrg{&;kB$k8u7=3j#tNHK?p;@Z2!p#e* zLYr_RLO|W=Du~C0o&JN?Bg5A?Kudhd-1I|8IX=1}L~#-6v1P z4&#!y$ONrX>@1;rnlSqWwl%3QETHQH0ODYxp5qfm<)KZU7W;gl+IQM{q6RaLgrg~m zTmcp`If0Q`0XyuMm?CZ6OMUyG+wZ0u-9$26>p(5*xU?=BG)s0}D^5UsE%*z$Ih(3Q z65#zmuo2EW_usF~wOXpH)u2Yix?_parRF?O^!*2+tRWkHYGmw0oL6abxk-i!8+b+P zlbROE&&cD~t3Q8=0^dD8nzO8qoID7*l*#dLo(j8vm%6j_8gWh$CUNDaNPSPk^N;Ue zjeY&b86cD}eo|;9>*jvm##cLHbNM5y#It6b=c7Z47jxjBNrnsTjAVd@8eJOQ_5Oq^ zo9$#Umv~V%M;$N$OPPdeF%{Xsl9{CT%?>6 z_{T?j+EdCn1d72aO*^OBQP|o2bx_h2@hLe9)u)xBC(iRdd9kZoPV}v4=**aNl}Y+f z&4WL2SEvRkZf1xXP>Br5laZAP33$vuJ?@`{@pcA09LhY=87eoRMuR$Le%U zP5!!^zub{dx2aRN3@vY#QH8iss~=ljG)}V~aK?mver|Mo<+SH=Pt_Yoz9Y8Qr}B+l z?~=QlWLwk&oY%UZ`=FLT9jiY%+7I~6BRyFtzQbc@G2 zrnD%2PFN^6CQ`QFkV%ullkQSMUIGZWUXTer2Ox0>76}8^i9zg^{hc^_cYF_ZQd{ps zE5i9JwYyaBZ%tgf{w`Uaa_6fOPPolD*fql7xLz?28aJk|J2oF|sb<4jq~!$xFiKlh zpv6a+ib1*~0?f=M0aSqU{_Hm;{p2>1UIGj0hl84N2J;d!a+V!UHDl&xw@piBm*S!a zYGGaGlURB1OG@VF6~*vODflBg*2jcUkSv9V$t|1_Cx_Wn8)wl?6s&1L{C&eUk3ERZ?l}WYh4|i=-pmr?75`P!$aT+Z>!B3@fCMx9@Y;o z!6V_LPUp-baKu66$dH^z|I~aTTV(dfq*_fUdH{?uuN=ILefj0i2JfhY|IyZl-Gtic z%Wey?2yy8wwmcK@Y;BDI_ODuCy_r+?OQb6g6xmIn{});38P(JmwEHB45JJEJ0YWuY zDFH*3rUnSTg&wN(4$?$K)P!E8_aa@o^d@4c(xnRuDpi^V1?+O+|E~4kb=N%~&iAv| z@9e#2=9ziUiiX+GlL9hNJKsyky_WYGCvT)|={eoOf7tN*^X9a`xA0FEe(m45V9M%M zc*9>yo9nN$L~%s$qj^ET0CGG4XXN~e89EL4h`qQ0P$>g|zG1AS?eOV9fJhD#I~L50 z&0sT!viyiHiHuaGF)nvl2E|D`j3g?2T|z$vID~8Q{!`K2gkjLyH}m!zV;u;tg0#7S zYTrySStSn?eZ`}~-ZqW2agJO7QJKMe^Hb5^68O_}E4`O!4rDPu8qPD;O##s7-Rg0}lO(`Bi$! zSz-Xcjm(R3x)iB(nhHjK@lxCH@CI|`RTE1VGi};&vDzfNN;>!43xQ$=G|!wnh?3)3 z%Gkg^$M1YoL~E|k2nx;Sn&8ac$A9$LSTNyp$Md*j-sP~Ll3n~p2_7aw^DGwsI!^t& zYxC5zp%l^OE8caiE6MvL^<;#*u_xy?!7R5Zy=Xh%2x%FXjS2l_7a$RfehSo<~ zt5OkFV+C;=(TOqo==S$$II3b#wVpV4)yZ9SuUaQZ;1_^i zF6o4d-l`%E#sPByQ~^VaGg&aZkua?R+Qf&IjN55^>a49Gf=pm&OYV%j{gJDQ7uRc>uQ>{d0Jzb2iZgs7OFQH4) zvW9)sEYHij<+r-u6jJB%KQkv{b5@JOGy2o# zMF;|{NEnYhEHx0PvUT09243u$!6ciAp&4}-xQv8Vd~{;9r|8kBI9`Yrm!x)TPh>Vr zK+vHeO`ov%K>M)Of892>uMYHT0qsJ7+7G3qSROlMG~ACaX1i(nxjpVCPo9PgK{)rI z?*7NgcCmb>t6SJLt((hlSDifBTAnxO?n{(>UOo87b>-Xk#qzMz@0@qCB(6yonh>rZ zetdH8!?o7I*Q?*_ygvOL7WsQ@vzIY^rDxx2waLbDx&E2gjs0(-51xKD4yN4icZv_~ z0SyZSK%k|dVV4}31vu~V@Tq{37v4S>W9;1EED4U$zFv1Afsw9w#e9FuDCa7>K`Tma)N z+~)$c7&qhNe`1*nb5hA^sTjON|K7>gzCVRQepINEOCaIKr2I%WW;vZn5j;Ycjfa;} z_qaxMIJFkcuCYc3pCeaiZ^~o~ESv_6w{p&ETc2KD(NIPNO(tXeRbC_k)j+s7axzGU zB-JQyJxk9s!TgtQe6X2I@zW6-TjrbMHsSK3Mj!+xhaoUwu-yO-QJNB`K+D~#$6o9R zLQjry7ac$}T$6e_T(ErD#I^TU-JFik%dhDLE!Q6r|2+F_5}Y@-=2IT`!~64~0+av6 zNG*->xcke2FmKb#u;EZvjMU5);=!w_`YES3SDF`+9_;_V`M%TlDpOW~n4}V4dDg4P z*%QVVB^{w~4-1Y>7R&9pr3CzY`N&X7U52R>Y!E_X0Dw&~4Y~2@X>~7zWo`Uh@{g2@oK2S7aJt*>_VScS9*+Dcz%+6? zotn|U%O;1q*KxsrqF@Vs{$C+wt4mZ`vSx1dD zQ7+4G$Z1F=s;hr?0#1KR2^ zCL80gUpzWZva=~|aV@G)Zb+-w=H}V@X`a0CNa*H=yWg#Yy-r;{KE8hZ)X*@nyS#k- z!oXFB(BY5&SR?{gR~qKlewaS4H@Q$Sb$sczZjr*qvj-AysK;EI^tQ!Xm<1jlS#q4s z_`ukf(MBdm-@xwN(Vu~KRH|6eA$U)=%QRS#w6N+;>{1o?T{pK zYz;)fdK&3656j5tK1a?#bzmwCu${y;mB1v4#~Eg?RM=1{b3)4cP~B%O4A>E4kA)1W zIbjj1cdrDhz*D^8gk!S=dnZ{M5YFVJZW}q`0J(`uMEBh>o0Q4yDrJTg)qQ;8&hec; zL2x;Kxj3qcEsNQFPIjvPUD%^)b*tMoH{}PK!t-W~UwM6&nLqy3IRAMD98g{Q{PgtQ zC*H_%doQ{O82FYrr_&8Z4u2@ZQ@MYtQ$F@f`Qj!w?{2d#oxA=HIf}2@g-QOo_=n%p z<~U%yV&nG`({EL`!5sN4nBQqB51(}= zT!2D++k$Qiu;;yw=23CT1E&r^qD4D}&Ac_KAc&hZBDCB8N*$u(Mm)pSGxeOES-qzC zXG?_;UM#Z~)Ge}%=Lf6b_3_!Wl`~$|+QJG7jE0P@Y;q%ojnQ2gIqLf>GzzOvmN{)R zmTE8gJ9f@rNCTinaLNQ)rW*7mFuo4+?f<5Fe0ziIX@GB2&R#MRw9raZ=p^W}|q#{u&-!e$QDs~Xrb z>$|AS66*f8qG0E8i1F21KLV?@g@!5YIV2tcJV#i{o}f^P-$|>Ve-9uXrtz|7NJ*lP zx);ncL}}az1MUAxG=-{*7pkv{7n4h>y**{>DwYi@RvKTvamwo`&=I@6f5W@+*w(a# z>g`x7!yjA&Qf}w5S~hR@fz_XS#MkYTAoG*cO|SOe+ee!0WA8RB-vXDnB%M=J0iXq! zBBa;8>*VLN&pJb{K(>xGE^95l_53T3ek^qSy>9bYq`5xxb}ZBuYmZBG2y9(?_4(lI zKL5VZw0B}cmQ+gJw>gb@am@{kd0$1@MrYywP0|6#XQGz$SZiN(oHFfi_8^96Ab|2m z9)}HDllMlmUYPH@9Xm3>q1LDc&3r9Lr`!1F>l?UK7|7I8Og@o<`@VZ0#FV8jSowga zBFm)DDL&??6g%mnq?t5cT}6|1zp1kqr)iPl5k?vdEH$pGYL^iE%crrCyU;)V!M0Co z_4Tt1L0!+f$J&l8IfPNn4cEFG8;qa-$aS_KW?Xh&$-ebbv@p*{jPOzYw?u%Oo~Wnb zMA;9-T4}wSv6skj1Km2h^?UC4p znyWrn&ym|v$1`|Je6l;vtS#s@>(UPEl760#Nz+WC?rM)4vM^Gp%{6_QH#g=LI{5h4 z!roTcfWSRZ8^k{YA6>39)(9%x3sX8-4Ou2gQ)M+tEs!05Q|51c__D^v zw)-Ig8dES?ni*?s)nK21Fc5fC^golSe5Y28z|1JEs z+jQ}K;ZF4vS?xh5MZH52%$H|F(!E|*)A~Gs>k!Wh;IFA%oc)q`Se7oj-Lz_WW)OY# zW?izYg~{zZ#HIQ$ZtI{a@%J_NBLM?Y8X!JB`E61^4gyR>@Uy^j^ngZ{wakiY?(+?{ zJdYfnn6z$P_CVHVvy~r;)VudGqtZ}mw4>Hiv_>&<}NZPDzTAmTSQX^zzxRjjfd6$R}hMfurncg!bw^%{N#j%S6xXCgPW z&wYe1wg{&@<@AC*b5s($0F;XIR;NkIDlNDmlK$4_Q;$>aWObc3o%Ow<5#Zy&*S~K& zdVf0WVm)_gDPRpctLp!WzasnNciWE$VXrKqU#Fd3+>cMLj5oeHWVoKP*^s9qmb8aH zP#0(lrCkmyl~j^NJzbq!SnRs774T~TN|;K+I+24M*;T#E+;mhUs+woH++}){-==%UDdUmsPtmmj`g5a6)GI`?Jpt^Cz1ZvY9K!zm|Bqph+v)YwJ-4e>{*&lbeev+L2qgah_?~8(Go0DM}sr zq;-t;T zX_*PXNoX;ImH&F}k9f|&SO1s8jJiNigcq`UyJ61j;euef|F6(9s*F8p>0z*m| zlBJ%FVat!!{8{>UM{gTm(79!c)Mnt8zp7+)ePiq!e1b8IAMgGEa>{$nvW zd)%cMs%G3z;xCn3{#@Odt4MIfjs#$KXuHn%r1bQu)bREz(|a$?Y1Ab)JyH#_CROhD z@u>!xi5fPq0TxLugcOp>jx4}9)n0460$%L~9fd*4{lleF8H?%g8TCMjMOj*X_ezq~UBNPW3P z(2UL)^Zz!v z-+1cn<8EF$Rog7eIM!^pOY3oV=hyuFB-=1!_{mParIE;IbnE@!Pqv#zyla!%q=q<5 zg2o7K3Vp!Ab>nZ~ih#bKqj3@mOAE8{{ErE`1|7B9m+2DqUtAimV@h;l!}B<{soIEo zt7VV4+{D>vTx^_r-CJwdX>+yw`I zq2L9MvLMzyH{&vsW*ZIf3=q1W#h@}#8flxyn};<|rQ;ljrE^h-t)7!% zzh)hui^@52KXr~+qe!mo(>@MGxSP7%F*cpE{nD?DzIesFbxTG3 ze)xF{sw&GU8t^4KS~|DKX~AA{8oEW97~~D@OT|mWrTPrk-UG_ZY*APTdsP~<+l6M! zcPV>H0Sd1cp7b&|&O_J63!tII+0`v=^aG)H>X*Hk7PguW?uTuzQz26@@mtZfn=;{j zTe$Zjp`bCrWBzF<4{uPZj_5OM*TMM1_KI)D9&vH+!z~5sRrE~!bXXoU(e-Zv=Rba} zI(U|&#wY@=1lKdUPI_K(DZD|p6Vf}aoLkmqW7~Zt1XEt`i~~f zuPI)cA#5TE?N7!d_f>ADeKo)ImfAzF5L^R4eUce4NThT1)`555(i^C_>#P5}1!yop zIH0C^6>z@G{X8qNM&ZUK3AW2ib4Oby(vLYff*h)I>cPr?m0lht3n%>gp*FR^Lwr%S zB^CE$N{+kQTUuTJYpwrIXqqfXN9Z$49}q1QlLNW3Rut>kv#iT+Q;=vU<3e`Gt<=*X zO6L&Z_Kl1YL&I4y9K7vLCIJD$pg_)%Xk{qWJyxZ;*cY7ZAUGv)Cf@f*V}X$(QB8mh zp=n@~kgWYwhE%Oy0du?QJOjMQNuPay9IZ{R5`BQ;9kOTn17Gp57IO=*dt4GAu{B5C zB*ei2%cGTGMLCQnCbB{?`W&kLbZIS1m?#+*cTPQHM!=d~#S#L1<>D=LCgUVDVUQ-q zk5Fs^8B9FW{jL2Fvm-`b82dn@Yw#i{29(CWlw)sw#h`e7`0>VCg!mKF@Tav@Z)|>M zIkw&We2(0qR$v;Lw4Kv~D{=b%ooRvI)%emQ-_O`@pZt-H5p4k%F(`lLi1n1MgKDUBU6 z7?w-CW`z@mQ;JO_V@JtwT#pmkNgz#!wl;|+5pOQJc7)}cjsyE0*Ork$#1Zzhq zpqYd`CV$!H@YWLKs}HGX_av{sd)OC+)dPFS?l553>KqC8=yt$@ow-dcvaZ8Go1c3lkq2@i&v zS5bSOo{E|=3EU-GYmb1wYh7F&Fl>vTbMj6~kj>6qvU!;BO@bMOQ)h&fC5PFehTfYo-~HGCxorsFSQ6AxcRd=HUkdzKEC14z=yqdKkydTM?+vjpj=Zff!6Q%7wvkyLGp5 zxPNc9%Qq}MFB*0C;_j{6|IYk#WVvIGkB6~6oV5yhB#svU_)$yZrVZaYa)(A@?LlYA z`7y++gM&shE_o^bx2$&6fAb`S7WRxIqSB>Q(i;EqJBW*(-T8^&xIV)UCY}*`rbG!Vh zqt>Xf`?HFdYKup^l;+hwud5AHo4Y+eazk$QorY%i_d}hA=Kh;5x2#n=8v@$SjvN4}-VfD5rAuEbDusJ`s_bP#zdRix=F zE{!e+T~lI+@=E}>>sa;tV}Y@%?|e$475+oKu7tO`Ye+Zjwp8%Qcr~YHr06@+=&eJo z?)S4s$fqaYyV@^q2Z`;&W$Fu_;O{@ka=f!QbiT{2s@gz;gx;c7bsH-@YPg$J`cK>) zQl9*->V3v!P;lJ2d0}x#k!x$s_rqC{;OB!IUuO&d-oFLl%R5YumI|A4R;Yw`HnTBu z;Z#{#%4p-cbozfK=|2!ZCVL$y5Lv#O7t4xewDB3~I|{s>(B0~(NPYvkFX-3aQ?w7S zq$_z+7Ny8M&5HE{FnuGlDvZ$yv z$4v%ZcMN_R32!uwXgutvs!^+gnTVI^BX;x~@rBqWUP1dfoYV{>#1$LA!E%9*7&$~B zr8+Q}O=EO%o?gmxwk(M)<9Y_dHpZgxuVy5yV+@@iuXqs+M1TYL)U_OX8#`oHJq;9e zPfSF?YQtkBHPJwutciC8Vg5*s_o~HF$p3b^Q`c5jOZ=h~CX!mdSd}_aWsIo-;++Dl zWTNjeL`zc*)>_6QViC}-UI{e9<%?Adt!fiVEk{k#^scK000>Np)DxC(@3c{!dpx3Y zfO3{iY!iN!*56sv@YrzNP<#8B_?Bk1T*sl?B~mZ=XR8b5bqi%|rMLHq^vT~IMw;kQ z!djQ#pTb79hNoE{^?YnBGu4{gL!RBZgH&EwX0~~-D_r>9fffOqV>By9r|V0~dQf?* z2;YQJb9&zy?T%AGrKoXArhjuWfm=WT@}F!f3Mumv5#Yjj{qa4$wm%%IJE_;x;zkcj zq5<0qjMz??*Gsk;Pa!PmBV&i11%ij$cReHDeXdvoC#BOf)4Sr%I zb;0w`%q~~x32zyv85XnqO)J)xiN-x5Jm<)zUY+Z|hkrv~O(V?)x*5v@4ll0iu_LV| zi(eu-YxuNejaFpD3=tdV#Ar3f6CO+8wJ=PTEO!Ns4M)AR%AX4a8F9;^GIVryMIQ@i zrqwL>fB5jhW;1)E*F^Wpi~GNh|K4;pd6d{nX6{Xk_~g8-O^<9G*xu>RFDNzRmpR!B9cUXcCX)r++ZEtv+Jlv<6_9FA?t{B+T6 zrr_7{x!}~qj0f~040P>8nD$%#;=Qw3F2#dGdabN?G`8(}WbM>Khr}j&!avQFTEQ{8 z46@SNUP;^B(m4yg`|b)!RE!S#?aBiWJPz~jynB7kALQ1U@lov_te>e|At3_zuh!M9 z_Vq)rwKwW)^VzZON$qdw6>FxC>#kb&NT;U$k)GVnh|3T7wKJWJl2t#`&Zl}=Epj`@{u~}_O>m7~_GC;X{1_s>W)q_hsE4s| zSbnEZd$XC~3tzEpck;LLuiZB@owcq-ik=@2y~<+$A~A1`pBXplc=jEn(#9HuODPIc zO~yOMip>hO#XmK}Ef&rfHT#Zu?Uw7b2v;W$85q9m9*tQ#p(s~xDlu#-Y}s9aPlVs;>b zK`?f@9H&4`FP$(as!uM5)v-s1QdK(pq5PB!;?R1EoBo%so$SrkKX6)1kF;E((d)^g zixuHlg{TfnG zn}3K1kFJd5Q$YhLPz6nTkD;Rem9Kx2t4TQ8_Dnc_U}uV}bz#zoj*c6;bfw5Xp#pXpRq&N@t1P3ya*=mx&Ji!mN z^bc3@v$-!NjAvq?0r8_^Hzd`Yc*QU2vC&QK&vz0(|Bzuvh=fGa=E`|mlM~gdqX(0) ztQ|lWwLF_>lq4BqitsE$en+1PG1w`pkvuHDrzrH)p87j$07Z<7gKYIP2~jeNijM}M z9WEUzEF{8c>y#_TsUb38Bb%4?(q)5by8xK`m>>fcA`3UK_<*0;C;^%E1t%mQESNUf zM9#Sg*!c04IU?}zSV8<3>-dM8eMpoi)2v0pns{j}v2U%h25Etk2s+?M$AphV~H6JOS=p<{a|Q@eD>HUMAR z$hN37UNE)gxExT7ZoD9TX#&Q@lqo!}&FG8-swZSdk)mgyT+FV-uH~4}3 zSKXIi6w|)Iq%>V(Qr&!zM7femr#cpxs2Wsrg>IiN9q7g`7n5IUA~Q^mwW%Xcs0KYq zKRTq5khxAHIUC*l-zC`CnKj6CyJ!gvD5x=K2+S7s?z;47DviwUPfz~aq4`eUzxU!e z58U+M6UIt9rB|rCi10;9^Xq z@ocIHp!^fP?K#Zd)ltLKdENQM7`uH-Xp8VVnmVqMn+$wd$p%G1bzCcr5>?CljHVf* zDbZlCB()QE4KqF<^Te_FB*l8?Ak{iMXz*DSYrLRmrVGEx(HOzqdYs#i-TtPk_0<|K z4{{H~b(S_j;}#N}J$cmpCfMXsfJaRwJazE){Ln)9#r}O!Q7hqJ{mskq8m;@%C4>nh z3@{ZsOLswy#Z@OtUD)54&u8R?;FkEPP8+-@EWkXvK92EPKjo}XC`#{_mrL)B)6+A( z&)*-fhOD|u)Yy6d+vSF?f*DBQZKh{k&FY_w_q;7xV6mxLz9M7(mG4A%#V!h3tz=yp zp)u8F^btdf8pO4i={j9YA8Jw|A!u@7fIB3VYK{g&$qTj7oIo&R1W_SJ7SfdFCCXtQ zUM0)~2UD~tBrZ4(Btrp!>E`pIX^Us^a0Urp`(P@)TIabSY>LI~3PF@lfaBDJI+~t< z52254EDHwew$(JNkcRPqWlqtccvy|xQwb}O+T@hZOd>+Ic(!>?j9v&HWBLAz#~@Ob zIxcN~mMS*M(kVbq=609f`zIV;sqO(HCw!mkG)4&HkPeq9nABSb zRp+}}Vq+bznmI9|t@0L#<;IE1aQtG-Je7~t>{$*|3F+!HspkpS@v{3p{Cv1-p~KIz zjGvvsRJ(HE9J#;7n+$l+$=lV|Z_y3|zR@28^(8pz=Z!_^Bxrs_R_o@{qRZO!xson^ zO3Xw2#_?b8W5l#v*Wl2<`Y`Qbd`v>Omg8=rd^=^0& zY#6W1$@0J?ZAF#|B`2WL^#+4b`l9!~ikdI!f&FHZ6+qVs%(_X<%UBR3z_?zeQhFFa zHIslo3#D7=Ssq@e?ZpyIK z5X5w?Z#H^4>Gp41Y03)C#ON0(1pY8NZHCToud|O(tYobs;I4i2{<-25iHBF@qQbP@qLRYi%9T;> zs%M$y00rq%h1!3UH3IYD%pCnqP_zTd)Tv*}t7=`I2|zZsC-#%RP|n`y6eOzv;~+Lt zLBu=89-jJ(pfTo!=q0uQc{AvrV&gGTqFf{?a*zt(As{0XPyC{xHPhc7rYc)&&3dnt;P1@w|X97t$$wRG$h9 z`6{+u&yia=^LO+!KkJNpAg0*l`uN6EY5m&UM^bmc{O0bs;ahR@OVHcyui;Po`sWi$ z#U4#itM~j8$ushDzbV)Ct>wf$FCkmizQn0BWSm;V>FERAx16iLaKS1f02DoVP@r$* z>S0X;BdPC)jTN>$47;4jp=vx01}7#|_R~Pb0Fh{ih_b%?vC)imD6U~A2OU?zl}psQ zDO2nqlFfoDHr{d8kPCs(6G8t_gr7`gsCBr!41&iESIm@gQwkAy`97pLk0UqYVLoXz z{wpUXm)ZYOYA$NGfQec~hdIYol^GpA?CuZ;aiO5TI`T!cBT6XiD)IX4%wQsS(6BBo z*gJ}oZ%a<^&qlHQpq%8a2+06Ytt*Ga-${)`tWd+Q02;CVI112TxBTg7krcWL)m5yb zMq)lkZq4beI1Tu8G=1c5X$qsY+b*t*hrG%TLmsp!C}Etl9xa)k&0Q9<2x5T8r6?vz zy6YGpD!S0Es#)GGc$NJzc>9Z%sCL`wuZnu~m`P1j@3haKoOqp;IBCF5se4{hKUivC zli$2BaQRi}S5>EYe2Xh`O1HwxE)Sk!+;Q}>W#^UP&GP2LmAO^Bp6(m$)!O=!^kZM1 z(ho4z9OhgLmDUzbnNb&zS@^V?t$S(vlCaXAk}3Q% zWH=Ts|C$k~f=Z1LgwFuU&=nVRXmP&3P?XV7q%(k47YW7zm;kM+==!TEGAt>!K}gew zap%b0*Og%iIm<3_`QhzZHne=*YpnQ6d8aineuy9IgD)8fASoEi93DcoQ>nK+7Xjm$O#yZh>N96hSCz)%o*>l|EU`8A^V)$#DQ)hX zbL8${m0=2lY|xh@Z|RCMfX;^045-MfUeg&fYrIL!xa(ADc^&X=_S!*p#(aQE3(B-{(Ke<1McBnRfX8eSUg+S^o8;b>8h;oSm9w~uu{+dTj_ELa;_Y@{FqHCNkaL~`f1I{urS zo&124lo-UBu~M4o+`nG`OeO5)bH5JoPl?%Fkm<)GhhJ%<>Vg=BM1#Mbg9?s>t?9F# zkR;_ML~7N?%>cerOx6SO8*n>aDdp zfr{gnlzkVqsUk`;#Lq`iQdr1iB#F6K5$2*ipVpzxYj3Nk5XV9l@P&XQmp0KXO~tMX zb4jy>7;)=AK6-yeE>I~FFjiQ#AOQWQ>!VLe_{AT<8Xgov1^ysb z?#R_7H2jH3s7&6f_ZU)!EEnu4!Z%TBn_tws&t#S}8kYWBr=+vRI{(q>>DPeHbL5(p z=3z*$q+#>JttwmuwRK-n-FNP0?WSJiTV)wzPKF*AuVZ~m|xwW8mI z_g6NGF0#cGt#uVF_@-RKvqYmpzhD_jC$lX=kqh!Ra`t{ifegH_nF=anP$)t!EoxI- z&HZJ!e3!z46qEPm7f}ap*o>iDXlH%hSH}2V6$Y6AOn1i6Utb;Nu8BB}NHOu6yR7+& zS=^NwHA;5eH4*(vk_RSSn$@rCJ#-N!Il8pF^uXzR)ODU%HaR57SoGO?vM&QvwfW2| z^X{e;hQDu)E}@PHtSegj2Gv}7V!4^Quk&M(k(>+ zZWJx#BMMropts!aV>ui-n|clk+t;TA>XxT@c|?I&SDL_chAqz(7Sm%@_30j-BllUG z3vyO{;K?m;HjoipUK7RC<#C4njdoMIY(j~Bp;U0UX?r<_JIU|?`}m^9f#<{b#t`v@ zceAg)h7U>OAM=6WxST>Q`A>$<-~aOj^dZV8(9^VQlLu_Snr}{Y~@ZzxOWnM?8`18JkfR0crokPHlbOIH9aKZ`6^|8LMT2|DSocG1r_~Q;QAg zr|qI*pXQhTa10!IyVsTx8+qkZkn;5E)@P5-L3Ss-yQl)zLZ8)@yBYLHDR{f!pOIo+ zKU~o}U9GuN7UCPX`EGuzTWhRC2q&Q)RHT3H~*TSqPuQ7b3GvD;#TV3LlJQ#Bs1QGexNh=#iY% z&mzT!r8+8f%m*Gw(YQWzk|iXJ{0LMeTLJW5Dv*Bc0gMZxxSq2h)6PuHC7&)@*(8-26CT z#COKWD!JP-{{Kk`pXG!(azVbApnTRJX{0;vY`O$&jeKhBsyU>H-OC71{316hGtDw05wGya=MvVrGfwIvNKD}(vnmae%0 zI|L!6qA@Qm1v=O^?`rOIi|&@S+;f%4)thhe`t$mgD@@W;-LoYVE@31%Qvf5!K2U-OcWLXwaFVAMWa=P8_8txOFb=UW5jl!2`@ChBD+V6 z>6@Zf_$)Y@L$KeTdc$ONf{&|e+J-3_HzeBp(n(~No}IyIFd|$%$Xu8FL8X#f7fZf? zaY14IlZs^O-qcDu55}^mfaY~dL7M|~bWz~=E7cR^rlw(_LqUL-QF4V`g+8ZrTnKb} znaa|&)$cZ*iE~ZEMuq6a@T?tMk{B+)iG=_MEp|o@U9?2`FnIfsY`VAy<1|2Tyb3_= zVT@n!+@H5UWPcI(C0XMig!eYg5T}K7h#V1s#=+8a4%(Ts}dMT|d(NR8AkJ$+l*dDJzLdYbgi=V_ND@cCGpYhGbDE|Edvy>|6ZCTNup zr#U~;ErdvRbxIXthd}}gx4ZDsWx(w)R)}PwkU+t3FJPNeU+JFadMS3BBXXNHY8yaR z$rCL^7hXwAu2X0Yct!RB4Cs6hc^*gnr}2R|&YJWq`tK;4;xWw9b;+rE)+c<0($?fSHE;HPLrxV6!(egZ=3xGvsn@+|DRop z(83ShaLw{PlIilW6XsTifJw%pZT8PGFN33dqh3wK40DjzOx1yFfS_hZb>(|jpG=on z6J(Bu6#I~XZrZ;Zf$1o1Gu0>o2@g7%&I(#)OaAiCX)~k|U-RUe8z%QrP=XJgm@KqK z)Wh_eHA_k#a(dv!Tg<|rOp_a98yqKNB557J8kOk#BLNJ%Pxn6cxH1a=6tXVk92tP< zQ=4Ng6Mx#TX?wao=51x@Urul9aClZRL@DfWD7ZeqTq!^;9>m4r<=;Hn{bX#ENy83> zz@XjXW*NowGxr@9-)|0D=KXu%IJrE3zs!&eei6w4i%%2agh|ZCWG;m)Iqw*f{KFl?55sMq)3=3Q0CXpG|65#Y-|G*d?y*WuDX`CmPOA? z-2$N2!zjoAXpsP5Al=0YVFOlhj{G$NqU1=V7GWF+k}PIveiuujypO=R4FHe>-d-88 zjMVaLI1b*Y-XlFD4b^X|@0pgAhymUMe_QV_C(DdYH4;k3k2mVDs(u zH>HmYEOf0c1t*vWM7pRWQWSht?(~RI`^;P;o|CS>)*c z_Yjnw2aSd@(kkK-T9RzSOUJ{Djg(fnik&f`<;7|+3&&q6j|kvbmNVxt*-g}+(^B?>_5Al9wtfj`e@_Fq8iZw!%&m?sg@%m}cKMF=oNW3Vq zXqEl+DqS#gEbEP<*{J->Y~u|LE$gsF@jkY3*bH4m-1cFW7mr7jS>wns%U%FK5&frh8s~#EH>U-}_e?R(D!4_OOJ7$ON ze&GCkvTXxtE#Q?^Wdgb5#XYG~kPF5wMbhttCn` zON_TOWAZK7ACoJJzob@JM(?wd(C}dfy^rz)?i($cV_;k5jreQSXctp4Tf@%x!=qv! zGpJ~=09j25%L?t?T&EJFsZ4m8zQN0Cc*&q<-e|g%xMe%&EVA?*zyzrG(_?8&z)Y1J z@7wb88Aw7@Yj?P$xH1_k4pmZQx$G`RwlJj<>k0`x9wPm13|(v&#cvbC=giUL($>=A z94vO;@px^H0muB_<5gFvv|?=K1-rkT57{o?A;-JeY)|cNAcUpTbGrY&Ia*DY{w{Z8 z%5n4@xiz&Q)*#lm#Q6tS&u0&GFYC2EwWz%{>5`2}8lG2P-@?zAC19~RFO4LA)&8ja z)YJSf?dkFzr!#X9ygfkUR~}TEI|7?cf2A@H9-+?wuSuYLd(423Bvqat_;c6G8bq?M6&9FwnG@8DZ8` z-;+*r?LG1u=Sl$O?6R} zNeB=^fP@l44^=t|O+eI8r39n}0Ra=5bm;=3(rf4)LFv8srqa7gZ-UZAK|v5ZI`NxX zGqcvr{quh0*E`wwynF81XK&S$vbbykLJI=dYt=udjb%DIJV~3^-9q|jlu@RzC;jY+(Q$fSj2nYQ3?eau z7QwDLsFuPhWI+Oo$aCg@j$GDqjIN*Byh8BTJdXjR>xO8i8?_Hq$IxFD%?#+!N9^aUs#tA^FWs@-{Q*24%J7NUs8)6(3o z7G6mN=4_T?vx41vaA0yVEFx^`kz`(BZRSu6#@KbJ+WCsLg4<24LJv!;h;o%=nK7t! z3OUV`rKBLHxLzZ+G0WVt0#nPwFNX$>CDGHeNwXjouPa$ubVrq`lXCeR)qtTz%>dL~ z?Ald1!!~}*PG6Va1?CN_=gg3J)0(Y+ko$=zBXt08EPh*Iu2k7`J~bKB)M9ARZh~<= zYUnu&+MhT$%Ko)ZsJf89GR)R~@PNejSwJ{l@^r3Vr3pWh{`7)4b!-cgd!&*}?>8+t z=>v1rHVzDm7zd~6w>mTbVvjo~&P(nYb>-h)f9fEesVzw7W0@%7ZPeTKlKRERs}#kR1>sSl_H+esT8g# zD;|D3TvSO3^DT^@$y!qBfEYeC1fwDkYexVK-SWJP8Rg%ut#hjb0#0$afsuK)qd4Wr zI2}xh6iexM(cVz;3p2a&3CqwVS-Y%=xGcsHzsBf9yPVt#=pYJ+y=Zg!S~!GQ2@*-C zp%c>PmldjD-x=qA8XcxnnNqm3`VVra&hkj>k(b`q?}G-zVa7hxlXw!uRW($zLvsS4 zJ~*qsKw-h*r1^)uz>6tvLK9OO(Yc6xR5);0_j0Aopa6jR&KoI&e_u_yEk7)0!?_fM z(#O!;i|DRl~|3jUC6L%Sr`yoraGj0cg5sMpyy<@U!Tf5kq!3M`3+!Qc@qf zNavO5)JJeHka3Og_5yYW=u>gi%thjI!yr?wf<$pes_DWL@{4gNVbfz+bFJF1^tqSM zy)sW))BQ`r$e6}1U>vgX>7Ys3m`duan(6162Hy zz@!kJ&!*-m(qZP~JppKI#fj@b$UQWcL^=ara#*9i8wQRbdY4KD*b6{lT}S=K((Jjb zc9oKwWme%WQTlW;*gKEq@0U7P7SEaaOSss`6AT^gGHZN&4YLWg9b)ubgE#b#2Xp;s zhCH6@54Wg^Tg_HFTe~c7y%{YVpJ=m_?=nK4+NM(~e^+r14T>=K832%Zn=+MPLr0G^9V?on&dx-W9w*S-^GnWwFdO)u!?#@)e$E|1&E zVFkn4X_Tpx84;p`xX?~&<+RM7pwI<5%TPQpY=r-EZdKRaDY%&rPxVogO6bhwA1g2B zP4)0>yqLcmtZc_*xS*>kt9t)*vyB!{3Bd2(@r@V1yym*Y?INZ z!aB7A8IiIa4yu@CoIUN7EO;i*c+iBS`M!B8vf1EovU0~g_b&%LsS@>eY5LmO%aWU4 z(mckt5wp3S6XgI z>}8B^lleS*-T9QTNK$&$ShXgm ze#$d=dZR7);O*a9N;87euUfy} zzy9-cll(GPx)vI9L{I`k_fY#r##yxG+GkGZcwQs}j3ssIi#Hj@Fa-ybSs7khJ|N@4 zxPHugaYrfCZHrJP>J~Y~h&_G3R^-jT(C-6qey-PI3DO`}RW?}v1)*wW6YQ5<4tauB zYQtJNjn{!@_|_K-?bhAuSNieOmQRN#o;rMd$&?eaK053=!KY=azw^Ms43I(tMg%9= z0nv7$6%+o_nbg)bo1d&3xk0ZrtvNX)yKmfIEg5+X%ynyCMH_)|Dbh3=Dbsqp@j1oU zgz(Y~n))ik20}Ja#0&X&Q(&R80BCV0SLlQmJ>VC|>8N@$ zw2Y|HkEZ&fGR@7ZGc5`+>YIt|W(! zNVVyY91LHy)M+a22XmG-u(4i(o;E*gEDz~BesAwpSmEBcDa^#Ga=AZHhTiSmp1jV( zC|k`F@ub!2$->GgMdYA(=tyS>sRN>T0;w!0_sm(m^f_wWW@*v6SF>bkev4pJ!#z3u z>B^^-D0#;m<_^E{BgTeOPOlb$0xiZS*P8$P7;L$?^#j)etTluP69lGF`8tvUoOJBe z&BcEFX<}(>9;BVuo-U0;%Rea-ND%d3l3;g97qBQtJ;#7Wi}MD815)EKf`;2Eq6%X~ zj%4JiiWG2Wh*;Tid96?(As5{m=3J#@@rXX?V#k|rvsc=A?{bXZ#`AaMg?h;)1*w;#k=?5jJ3P5W!^-)T;9oB=zed{&1~m;;grpSL5P$t~z1M2GnM7z z18Un>#)aRAch0rWtzth*nasFaSo@uQw6q+>_T>b)q`glRxIAepp;=Kcb~*8Z`g-+; z!Ts5}mH!UG`hG}!DTPQ9=6c($f&u6C`TaR!5wzH8ZK|qOJ+xcHlq_!D?~gCiObxC~ zTPe75%C7mL?2;!21vo|nz`!5TN+(>Jk5HoAcnH9(4w0(J!ncZoZMe&gZBW# zW+KUW1CYZyvw@xDFG-m5v9A2kHL?}=#88-E=$0Hq1jVcf=#mWL*w-yo=5poeG0S0fZD&6M=s0 zP!Lu>q7T)mHHKhQ*os#z%ojs{3&zOc(JkPyg*w>@DqtBYMczI<8R~H81$OU7&QD3R z=E$k}&=a|(dcAW8Amb6zXF5=LZBlR+`)2@*H;u|jnOi_~kn_cI_feu&5rYr6_nzZ_ z!)_1f7CNT3KmN3P~qcbMd2eLMZn$#Hd0UgVuU}|J0KOLZ&fLcgG zV;dZaPEfc$$2HYXUCW7Zi_JJJOng+nd&wt8G{-mF{AatPmB~TBe8Zo|fluYaRDW3m zIsQSe_$teQpU@ujI*%+bW={9nR!KJ#gRd7ZPBS*Ok-9LQv8`$50p*I|--^0paGLAn zy6tl9SM_bzdk=Tj5=oiZg-1;>r|qA3bOrO=ng?n<+AHR5%XE0%T!caAEKk1PH>&>M z$&k{T`2R07K=Tby4; zHq|6rIDKSOWNl5Jvx?qIKGn<6zz>_Wa)i`q4cOzSL^;(@vd_;Xri0Fo{vTNk)PgtU_}-nF@`2041Ygv@KHYQl7YbUJ~H2kk!& zPyc)Cy*zDt$e18_0DE%h;cxls#aW5Oe_5{aqTruc^YPRwCTAX|@(dNkV^mshR8qNU zp6Ja~<0aSSR#qM|0yM?DG9YM{?s`$5AWo`TrO=;9YDvy&)plO$_NZ_tQaEwClB82g za-O$yAv?u>ch*1j!p>n5CngU#g|4(*7xJt>g~#nX=)eRDNh| ztc3uBA{%RbDuPpbie7*+bJ0kTkggfGw5)xTVd7@uk?|MH(toHBF|Nd;^s#3Ov?GN)^dN>gn7DR0!zFW6VVBIAn_IdZp}DuE~+(!lfV&VHbQ_0GsOa>^K-6?jS3+fmNDY#}Nu=l) z(Ee4=AO7$Z61NAOqT)sUALQJABUJ$}Pa~Uw^79;Duvzj@OgNUtoEFlDdBOUWXl#rc zKmqu>5Sn$c?ok@;V}L3Cv(YhJz@2}yK98Ku&yW8+3Xo5dqtT9JzjhHQMX#erhaK+3 z#T5!x1G$ytQIh?4=tC><0twDm!wkGU{459{JvLl201ic@)c@FpU5_>fXb8W>U5cz_ z`lWA?)`^wjU%U%^YPbt}XK|J{*!YRi`K$G3+VTToT_>*FC_SEW@bAG?6<`i^g(HC} zy*&BJl^$Q&&R?Dn&2_LsiO|=rU)yVL)HZH5jwA}Yaa&iIGA-1VJvEDYTzf4TJi%0a zVoGM4PG<7@?T}+d2L}Pt)$D-+MMeo{rd;s?O|>Gym0eL{J`9-8V0R-SjJ%c{d6^jj z(~Y-6=PMJBi&);6|ASnJ#TTT%`vW=hXRu{|8l01f)vOCVED5O9S%rYa1zOq%CIbYa z^TvumxaQuL?U@n>b1gon`f7P_W;rNMk~xpRCjhBV@x>!gPXI$9>HtQ@`P`vPH4_ph&2&NET2&k`#J_FgS@)r_xvJFC6FxY0$z7 zY7uH&c0zoteJ)~3e??S_zG?I_?`oPC58YdFhze>@w4KZnXsqFUG&c8E0cKOz)3>Ql zV(J+U-^nGv&|LD(IqH+q$QHQ&Mo9qGyrIMMUG{BaTpEb9GSf6NkEM%5nHZg%nlLmq^h(@r=mpQ}KLh$s? zMdh@CuLKotDwB&GbB99PB8~VRS-5+&7Kra-=Mvt;=pYE@c8&EXpHv6u?y@QzdA_gA z_$1yHP>?0kvRu3po%xHyE5EGOHq+CBCT|1jud(^xkB*I6C|BYiLfOuPx3$M%= zLReCzV^9}_-VdKi#O+jR*w?SP-9Sxd+Aq!I+KnUYjI1(V5f0)d_N+Iv^<6In+_sBf zXZv;VX`vT?hb`jw>HQB3S6_DAq4xYRY%vZYqIdorK$C3Zp1ytf#-sG_9UJSX&l_&7 z_B$UH5GJ!MbXBx{ZUu7jG7;qiad+(z6Cxj$i>`ALJE$|(Ok@knOA($4G~n2H9abxc znf7k0R>jq;HR8B;{~%|5mE|O?(22vJ%wtG@;PSXZq`lu3nYEDXo8Nb9obb*{7Ss>l&YQOa)_yd?8Mb|M?TJ7aW!{YLdNB8^b4PfjEXT&| z)fe%w^8r(-x?R%pm>xNr#=MW7<{El=g>*Wq`$B&>LvVYUEoZt;LxS#xyY3i|O|*nN z!6aiMK*(ExR{<)L>AGHWndZp6!SM3cx0t|EU03_ttSF9ZNfKIF-+`4dXM?q(w|)FP zX_wG2J)e2qe!?xQ%(#l6Q2ja2)wLB-o!`7JL1yObqgG?RnJd%X`MR;Y zR@5VJM2ql`t@eI2C1$4DmWCwY7raW%du`U^##2c~4Vm~mmkpFVnKOi@EFd$_`taFt zxyzMqSLv!0FWCDFsST@I>Tq0=KHQxy;@681V=~HM>3TxqQEu5lx1aKC#C~#LA+pEpRZ&4%)b`d#Dmi95d53q* zG;sUfF)U6iAv~1}j3ZLc%v!~1hxovBy-Ydk8Q4V&vP*VP{iPyQ@Z*(EUfzJm?2M2Vkcw66eax@@0xTa2(+ zdj3pF|DPrMEVai%;FI1^!53fdue;YiF?jy%rM;@Fs(@Ht4 zBwD)!)R-Ku7_&AIsge$L&Xw@JS#wT^jdIrc?EB^$8 z6*CPtmhYk4*ZfqSmHzG3J&KzW8nB4^&6~Wc!ix&2ba2HBb*q*lSVS5>U8s;#MK&w3 zCRyzQ96xV-e_E2ZEMB?hAEfss?xxBto%M7blwfvAD0`ZKVFIy0Fq@bKS}LI(P6Yuy zDj792CYrGX47`rL1)}2m?18xj5v18D!Ip6QGB@^M;y^9j%RI#KQPpVj{wZrHKxm~6 zDH(pT%B5&OJA-1LYjeuz>~3`hwT zn}RAFmqUs!A%(TMJ13SD-%+WdeqMkXm!~OqPAgvtFn`}aoLA_K4O|W-pToQ=jWPz+ z6H_f97$0eY7%j88s|Z<5ig<;9I5i5S*$*h8^cP7afiT<#8&sW&ni?LLJ?4yo@e(z` zLxO5ftU}f^{~-6tQxz!>_}ZRd6cqplX;j}vhH}zm>wC9J{>pg9y6N8*nQZN$41f){ z``b7Sxdf!AMm7c@=iiQ|e#?8f1&{gkkcU#(?WRFIQCYXbaviUo2`mER~1b{7SV!`k{m&(v4Bk(35G!2LVNVLOi zGB-U}nrp~lR4C|Ljlfkj2FjSGYehq=F)XGh`=UWaJahker&W0W)thnYO1ra;sKX!G zvWq;w&g{;7N{XHvqB{X_fD@okkLU&7Vl74+>(x#?mOVUt52aSfaId2g(A3JH9^&!@hO zpmvt}2RV|Z5Tj-2H$Sm{DK=1BZ(VnDBIufsgPsX60mROky3t>RjHu&GFL{ZtMI4G& zIxamQiB$`QaZfLz6~feMsoFS%X-FYYUVRfo2-HXM#v1n%(w?3mU^K8rMslrJN!IvR%3)ZGKaNj&YzH*%9OPl z$|6fC9}0)W_@H*B=Nt;abgVZS5SmGCMyYr9L}DS9F(}{f@_=o0!Q& zfbH4xcS!)C2;`iSO%?xmu4bQucIXbbsF;!tIs(h)92~w`+N^M)`;%1lp`j)>#!^02 zbE)9F=@W0V5sI2_iHAjUo5)-|EvcNOFyOZlX$Y0TCQ;v zx2XP^-OV>QYP{JRN{Ae$60Xl)%+9WRO9{r`(?sP9jtDPdwb45&&91L~svn@gFj|=jOXD3i&C|8ZRU?v6QCuT9b31fgwB#E{Mx}oIfX<vq$R0m7-<~HtR}z z;ag*eKL#C(ee&+vCSM8WW#eQg&~GQ)v2?KPK#f51zM%wud1eae9Z! zFpZ;P11T?VrZ%2VI)mU75b@lz`CGtUoibDNEBB~dYImg}UcBMJ`61(R@={D`zY-^z zTHUN~ttN4Bl)EoP4zGag?1x_<3sG73qXBvVojx%2lmgCQGq);K6q=(Pse zjuggzmex0Kfmm~naD>DSI{w@Hm8Icmysdvzp)^f~Y%^dJo@r%h^CiTw`Sy36OTvMr zM1j!4@xo<_Gw#r1=QyJ5eHFp5P(bKN3U`)z%v2oFxPtB~LSa3*(~sT$&f1&jPyYSe zfB*h)xThcA?JWpt z=zoXcJ)L|c9`H47Et6i$&k8xC41{yQq+<<<@(%eX#7l+MxI=a#IWmZI$3535wq!xw zy4WG*N_=Y7YqdI4{hNGE3_ItX@j8AyP@r*i#u4gnC<()tLqoL^J;TZUFm5vp)0?9f zS{05SLEQ{JsrP|FfYt-Gv}{^+)WCcgWNN3Kh9=C6s0SQ=a$^tFr%0Ry8LG~>Q-zAX z4TF#A7#Tu~*b_{WlAQQr5Ic)e+7na0v~2m$Vx6JBicZeuAa|_{cF2B)f~VsnYJ$mZ zgx<{CkrggOabDjHNY!7;5K1DBPQq6Baem{gkpE>TMR~lR8~`d9FY0E1d0#{%vwQX}2;6B)FUk!sKp6$r2B_f>Xlg1d#S?5TJr&T4q9wv$FSG}iYk_G1(T^}xH0cbO zKx#lN4tN;0>XGneUMa*$8&ijj`8v$>IY!w3 zn}lJrmH7Sc_awJ;K)r)C z*{qku!DpUBwaNs^sm|C9|9`tG-!iI<7 z6k-5?<^D)G4Ae*c!_XdNq+P;xJa~EEW38pu@rV7z`rBGo_E$$91{wKY`BbjFRN7W8 zu6hT5+A`N}N01zBSO6z}jp6_P%GSJKlHscxLuIuKD4xH+Qnxle8|q$K_0X@Jd5vA2~z zVv6JY*1^ZW(l(Ptsrh8>t$xHYQiC!io{DA}LDVgtt~Ldg?#wyeNGBM7yX-2HF?T&< zH?EUm_5P^$fgV3J%)0hV9$w)%u7RF9z)~#{x|HH&B)stET!`ZE5tjg=W~Om@p+z+L z?FY)L`oifbMpKzt1{^nz2;)y~Df25C2WP$lV;L|*J05U+3f(ws*qy5%TP=IH|ETgf z)Y|>1k*hop4;M`sv;Faf(=fX;5cI=Y6PMYPy8uGqB8t7q;Hq#^T>PPN7+@vSI4->3 zI701n{J{5F2x(%=smn^9IfHgYmRiTv9)e*+voCuoyCV9`NaHE^Lh55flh>89xfhH2 zSw2I-=+FTcW8+!rUC<3CN!1DZug}eOBY2C3H?+;JGjjj?uzFf%FuM;@j7Ctvq(U7t zV0xPB+HfMSblp*REMElOpD6z_;b*4%cer<9?*^h&Gd7wTVr(i7q2QvDtQNtlB8h`| zA#P6*2aJt6K7R8mr4PtM_!uPNtWF$NbFM(&b~t zu4O*XEKo1BP}Hr=C=06e12lS75!%l@H4x(jC&(mU;C2H{%{%*V%Hd^YkVeMwIuDO( z+3};)^(K*+LJytBuE`v;B+4kmYOs}?4f*3+vdP@5rR)Gy$4wI`N7a6vy!tw8cR=tX zdcXP8fKQI*XR9|mcVFu4A_cO_vO4U(2s|ifKfLXF#D=EA72R>3t;?xl!C*PDK{F=d~LMH3&o^{T^QR?fvR)_x}r*&nnoHDF$a-O-I^>Wk_ zZ`?w6XY+R&y&02TF1304Tlypk*s z2j})@@aaPow-jlUt`AZo2eRe-tD-QAGf`^yR-(-%w{eIe9)L^nVAYU1^U}rR=cl8GiU2qD_b&x>{;c?@OL_6 z*DF^LNuM(MI+yrb2eA{A-9@*b45ak8GbVquKYeW~E4+ZF(tg{bBtQ zN<(8Meh`BPRzT2_01;WlW40*S$5C=4a&Bk`kEnmv^urIjdn0}Pw(vCmK`G|%U}F4L z?wr(1Qj3#K9o-^-o;Q`ZpHL=#WeD%xr%1Sj*i9%vxG>(xyU?+p9S*Y48HA6eyaH2M zP@Aw!2QmwqYER0=zQy>@2oq16YLi+nCV@9bU z{$~2Kna(03Aw@1x2M@Itbu1@KFbr*6j&f|xYxoC`_rp_-UoPmD%d1CiA2zbKaCZqz zyDT7A()K^nJ@c0kek2edG1-4&s`|^tkcr{`&Fl%9<1*e+sKl+ltc zTBu_rjmLQ3 zsp2UFxheKKK@JCgCSw)f54B-2Gn&hkiFPW%>gML0WtU$gZAIJp(6$Tw8W1pLwg{G0 zCoL{!(pRWO0>b1WdJ5cev8BJ=u2SBf61btO>CF`DGm}4mzkgKfAITMjv#_#RWTeV! zc$rUYnIjz+VvfU$sLczTD0%?|P0g6fdbO^L{&eG|tY_#}hKB4_H&^JrOn{oVSpVw_ zQ}#J2%nl05?*c2}rs2sWKK7j6o_1(iK2(Y*5iS-9EZb!UU>$uUhCkCSJ!Z1Q*ia4p zX%B*V{7%)edFKgvuyO$OJf065ag{uu4O?`l!i`iRw`J`Q_^)KU?n%?B(OSS7rN6&` zU|M0I5{RF^a=(%TXRenvCtV>7p_6KI8(|B>&_Iw-Gu~TeC$CI)kFq70Go{|mbhhyC z_y`YGDM`>75mU|(%@<)J=*{b}O6uQvT@v(h`rKO=2@`41yFy3Ug|i6VOb>G?1Kc~ue~;O zGzG=o=b5WQrPuZZ3}=SW9+6(|EZ5sVjJ|ke(ZW{G+9G3OLqGu{iArXS%FO&!EI=>T z{!WLjW}QeL1k7nURhuSKpDZduOPz82IT9DCt=Kh9g~+oyn$P`nJ;!mz(NICNqc9pR z(!o|hl3WGdO)1)YeBHJ2#k^Jf(FM6GR#z9vr^~UiKGoSmngG`(qxX@#PFtLX;bc6~ zHy6DShK)+>*2s4kZ4Gfb7Pp^9ZHSC*U>;#%wyon4m+Upt-~ZH(F)$aM>mJJnOt=b( z0Oa7sBVByELi_-CX=%HxK%V#Z*4w7_tR6=Tkcj@mx0))Z6(s_#leMjY6?U1@p>_#N1j)%QE8(3h5*-__Z~XulK#(? zI2O_cQoT~KDc{^Zd{nJ_i1r@IJgLTVJl0RfwN)3+cLD1o8(qcPikXpn{DaT6fI5hwIFNW zktb5ilPqID=g6-LTQ6?kk+y&M8_ocrc&i9fgQp08vAV2aJ<%AtSFxtPxw{sFosZJqcxR#jP=n9udnVnay1#ml z%DwSYd>_X_UdQzM0bb#bw@EiAH*FC|BrePg0BNU?Cek8src7pwLC;oMv|kAeO~=BO zc1JX|6-0uGp;M^|ev-tE_uzcptF%?LVkuWJW^ynYr(w)2UpwTb9jyHp&%Fv>9b`O+ zJW>#~E3oO29zGK_xfB?;lm1)wkW_wl&_s2NskJ;1#Xl#g%+^&- zu_)(!tsSvA6|M#B!R&N1cVB<1Rc62~_{h?{G{fgBP(>fcn{0B+F8X)-?=G$-Gyi* zXl>_TmiwX;g7ngUW4l)0%l@i~u3O=c&o_mqo*&rW-#y;eY6GA7!smcntJ)de1@C@xxy|keC$0qN`VRcYAQ!_`daNez zS;ErT!qLs`p)~PQ#L0*W4rfIwTdX9v8K4jcerKiLl|hIF;O`VoX)}a1zX)T1O{$qq zzm6YaJB{oqz4K90YrHU^`s(zT?ph~;bZ(t%gP?iM^LFfjf}7VAVLaueRx7loFss8SGeEjhNDeJ@3n{}au-*pr%?*}T2HtR>D;)_i+ zuL(_qPbaeD0Ax6X3baNoXRvQE2avx|qO3(TNM$79%VNxD%JLhYPSZyh0X~)&q}!k~ z1z_ozb`HDb;V=sVJQN!GORLT%v~L^&a0eS&+a_>d}Rcr&~FcO@tfwvUE@@(S%2 zfIEcKFBjm@`o`{HHo5-jFrZdS41x+r5=||13gM?Q9dLLPq2)(qsyKkI9(XsJxq%7} zA=B8$OMVeZ0C7HpjMdN#o^kwQ5!6NMzTZE{ z{dL_zq9&hA1KLG{CL%r!dSIV1Uj#EzQ9*9gMGxm%8C~-D-bf?TXyZgqTxs3!>?q*A zkOlm53#L4N6W>2}Jw`0{S&F07-GWb1Dn}*A=B)V3AZh=vvsS?oO%{=a4+gjCFeMpN zpOd8m_!uV~y9CWJPY5Wza3M{l-m({htOqxwUbI|I`lV}WFv1(nVUp2W>5<;dHv3k3 z@yC+m_#~@NsZw*6bQ%L8`x#w8$+T5>QG(2{jw4L=0&LcpY|lo%cY&IHhB zuc<%_O9ykArXlXzk^t^@I3ov)N|oA}`i-0_INAYCw&1uM3(yyBG8c=9iyeZ6qEVbQ z3~V%=2R2Z85NOI>NStvwVJO!*Vp;mvEs`Ps6Fvr^T%De2Q9#{Gc&xBHvW-PRrtcr* zLTwVhnyD2m12G|!>UcODmW5=LrxFZfG0^~sz@Rr-AON}at;!Ja}+wM(6VMH_j4uuo)0kbW<_!G6k+s(Uj3~sv0gq2BE$AA zt3;1q0c-bsetz*-*o?M-<_i0Y^f+#2X}`_WyAX~Zm+vpeyuA7fxzPYQrZsU zz#Jjg96wx6^XDhv*qkgFm`St04=st-@VvR0Pfy)7*rG5QQL!ntd`{@7ZateAG zj7AsM`+&T;zs9D_)=OkN@0UGe*nY~SRfM&?pEKv>Y*33idZ8h0YUrIe*SUEeI}%wp zmz;Oxw=O6`GvP*J6y^>sm&9DKFg8iSf_i*hhNgps?%zY*W;=$0&uua z=YF+xs#e1vkI-1IU3X&Yc-UApoDLMNv!RX_kU)pF52*QkNdlPenqHX%+`+Lr|Ci-1 z>T5Df3hbfQ81#WaFs61UhQF;qe=T>3hCaH|YWwB7Ifq5nEtmEWZ`ehbK$Xcv$<&A8 z8(JL!s`df{U{sf0YT+04OlbF9$$9-U0@Ws@4+8TrcAy-F+H;Qa}T z&^`Uj6#?<8;4A)mKTp~h1#0r6j;pr6L-kRs4RLAp3NM0L5`OpzTQ%CY3qpXo@YI%+ zr0$&Wr1a>VGMt;;O-}aAYf^fQS)b>yvo1SVor#83dmuuJlWjRIs z5R!xV##XX0glA07i6hB_ao}KxLJ%Fo>|UhBoQcJuHa)0Clj+1h>9Uq5#4X3k&g}?& zyOi){xXW5&Ac$1vf~z; zbjjjLADftUlhW^%FrceM8?)L8YpLr+0^-$jyw-rfPJ`NGa@Ek~+~)U? zB$@mV9*?R%KAu=q^a+XCg-1_4($twh=e|`xed~j3F$X)HoncJX>v;ss5fo+dS+=ox zsstef0f;CuNV?&U41wchl0M@nwcYjB^Q@31aRyp!rDsUb?8%=pcG|H+CEl!X3gx6CS3thp6=5#gJ<;LNb>tJ#2VbfVtPMJ8q zv>^vLV%4p1uEF8(V@LbAY#q*$#g49p|2?v6#okRwinVKN>k&O{` zz}6HxySu-f3mzCBUYm{~X+6q8$unPUilVtG_NCEz>Sp7{Sh!~N4LbL<*p`%i6Im^9 z$hAm*gSLyBi;NM}^QOCR5m`N9Q|x%O|6XVA8inl!&n%tcl91E>+95zBu>XUco0=Jg zNHWP%`jh94Bj6VF5>h67$Yf-HkRm~gxx_aF^zo^bQ`JEACejn$5EV-eE6m zr1AysJ{EUNFVQI){K?~elV6b!P1wTp_zDY|ExZ#mq^Ok}8gr=huDaNyYsPX(H}-P>)K)pTTE?q zx!M;v?NOk&dGN?t$E?(@=vWZJU0VEB`ALFgyG1#kE$brtd4{a!bAoG-J)_&fcyPra zCbl&u{=hIvr3RCuflj`fEIX=~+u2$hsLfg&>|LQ{&b{3huoBrhS6zLkm-@84Zm;}J zo0eI2E9t^u_u(c_@ipbqTNo-C1f^p5^}{^ z%c1tKCF@rWn-rgFhEqj-1IaC#J6zhrblr}4VG$?DJBI2LRoeB^$*0SJ4PVpvGRe)Fp5a4{8Wl^rJ^JPs>!Uz zUuLJr5-qVAKD9Ets%M)ZVy6rBRok`e)(y{yk7?Esa4d;!|Gnc7?nk01k`xb(Tv=mO z!@XuG^ANvqVLDKGSV55HvY|59XXdxxRp#%#_fRzPyvNsMDSGk_`sGVUcdhAQRzTk2 z!u6}{Zum`w|6PFnKjIn$0_ZJZyn`p5#!w9$2T1s=H)8|X>Qj$Kjq^qYvFLx}<@L7B z{y6&}&n*mcBR?MKc3p&%b@T&wsY&WkkaGutM%eWGmQ5m#Ge6k;*6|y0s)hI6a3YAdnSlD4tLUPZM-t9>mA zlAxAqht4~LL2Waywz^Df+N1N~d^*4L<$QfUU-$Jq&;7ga|CJGUrn`%i<&CMB-3prw zx2v^+(J^$%Hw}pgnMYN+5p#&rULV)%l)@<1L-(&jG20NI*o~b!5-uruF($q;ZJ|u& z0byar!)r11Wt8ppNkUIa@DG=Jjot$v5GZE%YXUd}2n=(UR;Nz=L&|QdH!HfF(4k#= z-``LbstUrox0Gxb$(`0uXav-saY$Z5NhGSr;w%F@(r%XmfSfFFa=sXo8t#IL~^ zqVjyK3%aCim&Ev?9D5cVdKKhx7-s2Yh1x5wHkULfwmBb}-zpeKks;L6=M_2t!@MqO zmgKP6t!w;^$F@7!vt0u_+M=-MuXCQX5S7~HLFj;N%j3pQ#9oZMjTRi?Jw)1PxIS{X zwuIfni4y=L+sEwfBFPjP={9;{aG6N;7wczu#&YK8fOr1q^3je+&k5o0(d_Q!ik`X_;U*;~p$J^bya6miU6) z^vc=x%Gz*sS>7f6O%b~-d2S;N^?&K@hXkdn-HthZl+)7aS?rRUKcb;5DQWDFXNuE1 zTH;et_Qjlx#kt(YE^qDQhl$swPAL6Uvf`s6B(oR~Y-q+OA2*-gd8sMsF;jfKzj?N% zD-8a3Y7H;$u~vh5Hb?HSmuDwrM~bZ+R3qXh$S0qqW#Ieo_o2;8dv}Nt$4P(1tz^!@ zT=W3y%a2M`;8hHOE+~3EP(N?AG$P8wwR!8G7e`)anA714fsOsCQUurKeDg zTI!fC$C@}Vu6E~GPYCe|M#ok}D!4Nc85c3&(hne~PRHaw3pkbI}+~HAushBsMJ=`B+ z$smsiV$G?tMm({?q+jxv^qJabgKFFEOc$cBt1kban8NQ^4KPARywD zjDeH2_Q^T=^lREFh= zTZ;{aqF$_a#=q%yU<4VN$0x~SY}XYO^D zIVyQW6tC-UU;c`H))5`)GMMa%>6XZq9J_f_-eSY*sDaqtF!$!#KAt12fBIY~!!u8+ zgAUMh!YFY8A-Gq%_fB|(qgNNDrK_fdCG9^X_XYdnV4C_RVIRwiCRQ0V5jXSvnUH>9 z31#N{3&qbAQfvEBvZbLxhS)!q z-YdVs^8m0qptrJ@atSmD7{m`RFj^dSV~4Vq4pMG?+VS_JFbmdfoQ2E>-cCR> z>eE_(Pe{`BV{Ik>y6QY#kq>$xD=P&y(ms!RM6NzATM4YE9EyMIWL?j$g20xZK-Zx8 zRjvxn6z*3?CUw_69CvF};S0}=N%5ozE3D~v|5(oxEg`J7e=3fT+qSq;ff~{1`M_@o zRevB`GO2PSkcopdW}g5B3lk=5!3*ig_$Ho-{ia&TM}s!g;l>-}0blzpZ4`3N5z~_k zzEdG~o%5$Ic;QW(Vns~9u*c`3_iTP#5C8GrQ$Zla3yBbuvy$TN*V%%vI{al5_QIDn z(Q7@zx?NwVzN^)po>tja#<}xQ`nS@7_&%_b1iAU=&gRQ`P{>$~ye?FKqI#1>BoPq3SB)Lj{dQm=zTW2KTM)(?D z*Ef5YcKTP7S(7#AHdEv{o0wWTtD#mlLAyD$WnJqA=I0%S#>P9WQ%mXO)0zJI#fF)K zL^_R}#*g`0#9Lwg<#0z!gOwuVtP$B*hW8B@8c9zu z@J+sG(Uai~VbyX}7t@jhLjOU1eGk|N8wQIP5{|ZP5d1TLMLp3v1MAI6IwNX*ySaz_ zJ0<(RgN2WFW@VMZaTVV}{&HN<++h4)3q#X1p~hrsQg)s^CaSRfZa`Egspi8>`(o{7 zbiGUUV)z>=oql*hT~#tWML|=SMfy!m8rSn)*|Wb%o}k9cGd=6!HUTkN&_u3E7tk6c znq^SZKxEY5v}a#S%xMXhO;1WScd39T-J}6WpK`YoDF?U-1cggMP-PWPU31f`V)cWYq*OB3S3M zSS;XU;}N1waN3QBQ^36YL&kicm8A;r8or^40!`w^AdttE0X8=WrACsDkkQdC?HszS zheg{y(sMl2`hcliEFqeMsW;UT?=Fz)$ASBcYtrAGO}vgm^!n-+F@8#lENp>~+K? z%_w^Ee`^XJ_Px=AN1kt!xtopO>3vy$wf<9)N)DuQpz!*YX^-^!jk=kO#=$a#2XLI` zpB2jKHVq(lW#h9MKcv7VY$C6EUL6EYw1qxr4;9 zBcNqALxyn3HE&ZzJc-&jE?F!2uiMZ;XOD;ztQBejcr`^;Kan&hxsOy{+0%@PbpH$x zpsKyyOq~dxx5I3Wez@EP>@Q$@eenY1jB|y{sN*xHR!lO&`}2~V*`zYOZ-y< zJHd6Ha8>sbI&+tG?o`9`Lz>2WNdfl2dueaim5qV%h0G@3z|!rDyO<&vQxNorF}d3$keC#5XtjQMnLXVy{;Z|N5L#Pf zlc1iK3I$XDfOOvAXzZl6zh05MHX$ZuAr1WNM*$KrL;gb#7D%q zHLk6(#0)g@;K$14Q^WVcG7{^NyLLLrSpVp7_HOqyMlg2NScx=&*J!`GDmaXaIW`o9 zRRi@Go1F5uQDi{9HlmcGx1h!!`s!40i<0DBucAi5ze$hH>f_yUq_Tg!%Ew2{Uw$=?mhZCUV zsEhOw%~`)o^0;p~uKCVt=I}DLSjB4FA~d`rfnrw0p{c}L3h5J666d;3V}X(({gUJz z-_#>UsFOb=hj3ZdWXQh^&XqPdsYcdGgYoVXc5MHbmqGI01^ifjF(x!1Lnk(==co^*v@VdL5{+1Ww zn;EE{#!IfPfho#+d&>)zt4$RcMGT>Gf1~-;+itJ#h>SpEz^?tDMStqvq^QxURBuee b+aryhC chunks.push(chunk)); + await new Promise((resolve, reject) => { + response.body.once('end', resolve); + response.body.once('error', reject); + }); + const json: ChatCompletion = JSON.parse(chunks.join('')); + expect(json.choices[0]?.message.content || '').toBeSimilarTo('This is a test', 10); +}); + it(`streaming works`, async function () { const stream = await client.chat.completions.create({ model: 'gpt-4', diff --git a/ecosystem-tests/node-ts-cjs-ts4.5/tsconfig.json b/ecosystem-tests/node-ts4.5-jest27/tsconfig.json similarity index 97% rename from ecosystem-tests/node-ts-cjs-ts4.5/tsconfig.json rename to ecosystem-tests/node-ts4.5-jest27/tsconfig.json index 9fcbc2e6c..2ada1bcad 100644 --- a/ecosystem-tests/node-ts-cjs-ts4.5/tsconfig.json +++ b/ecosystem-tests/node-ts4.5-jest27/tsconfig.json @@ -1,5 +1,5 @@ { - "exclude": ["node_modules"], + "include": ["tests/*.ts"], "compilerOptions": { /* Visit https://aka.ms/tsconfig.json to read more about this file */ diff --git a/ecosystem-tests/ts-browser-webpack/package.json b/ecosystem-tests/ts-browser-webpack/package.json index 02f8a6414..ac251790f 100644 --- a/ecosystem-tests/ts-browser-webpack/package.json +++ b/ecosystem-tests/ts-browser-webpack/package.json @@ -8,7 +8,7 @@ "serve": "webpack-cli serve", "build": "webpack", "test": "ts-node src/test.ts", - "test:ci": "WAIT_ON_INTERVAL=10000 start-server-and-test serve http://localhost:8080 test" + "test:ci": "start-server-and-test serve http://localhost:8080 test" }, "devDependencies": { "babel-core": "^6.26.3", diff --git a/ecosystem-tests/ts-browser-webpack/src/index.ts b/ecosystem-tests/ts-browser-webpack/src/index.ts index 415a27c82..a5e9101e3 100644 --- a/ecosystem-tests/ts-browser-webpack/src/index.ts +++ b/ecosystem-tests/ts-browser-webpack/src/index.ts @@ -1,5 +1,7 @@ +import 'openai/shims/web'; import OpenAI, { toFile } from 'openai'; import { distance } from 'fastest-levenshtein'; +import { ChatCompletion } from 'openai/resources/chat/completions'; type TestCase = { path: string[]; @@ -104,6 +106,39 @@ async function typeTests() { await client.audio.transcriptions.create({ file: 'test', model: 'whisper-1' }); } +it(`raw response`, async function () { + const response = await client.chat.completions + .create({ + model: 'gpt-4', + messages: [{ role: 'user', content: 'Say this is a test' }], + }) + .asResponse(); + + // test that we can use web Response API + const { body } = response; + if (!body) throw new Error('expected response.body to be defined'); + + const reader = body.getReader(); + const chunks: Uint8Array[] = []; + let result; + do { + result = await reader.read(); + if (!result.done) chunks.push(result.value); + } while (!result.done); + + reader.releaseLock(); + + let offset = 0; + const merged = new Uint8Array(chunks.reduce((total, chunk) => total + chunk.length, 0)); + for (const chunk of chunks) { + merged.set(chunk, offset); + offset += chunk.length; + } + + const json: ChatCompletion = JSON.parse(new TextDecoder().decode(merged)); + expect(json.choices[0]?.message.content || '').toBeSimilarTo('This is a test', 10); +}); + it(`streaming works`, async function () { const stream = await client.chat.completions.create({ model: 'gpt-4', diff --git a/ecosystem-tests/vercel-edge/src/uploadWebApiTestCases.ts b/ecosystem-tests/vercel-edge/src/uploadWebApiTestCases.ts index 72f5b615f..865aa86a5 100644 --- a/ecosystem-tests/vercel-edge/src/uploadWebApiTestCases.ts +++ b/ecosystem-tests/vercel-edge/src/uploadWebApiTestCases.ts @@ -1,5 +1,7 @@ import OpenAI, { toFile } from 'openai'; import { TranscriptionCreateParams } from 'openai/resources/audio/transcriptions'; +import { ChatCompletion } from 'openai/resources/chat/completions'; +import * as nf from 'node-fetch'; /** * Tests uploads using various Web API data objects. @@ -47,6 +49,65 @@ export function uploadWebApiTestCases({ await client.audio.transcriptions.create({ file: 'test', model: 'whisper-1' }); } + if (runtime === 'node') { + it(`raw response`, async function () { + const response = await client.chat.completions + .create({ + model: 'gpt-4', + messages: [{ role: 'user', content: 'Say this is a test' }], + }) + .asResponse(); + + // test that we can use node-fetch Response API + const chunks: string[] = []; + // we can't have both node and web response types in one project, + // but the tests will work at runtime because they will be in different + // enrivonments. So cast to any here + const { body } = response as any as nf.Response; + if (!body) throw new Error(`expected response.body to be defined`); + body.on('data', (chunk) => chunks.push(chunk)); + await new Promise((resolve, reject) => { + body.once('end', resolve); + body.once('error', reject); + }); + const json: ChatCompletion = JSON.parse(chunks.join('')); + expectSimilar(json.choices[0]?.message.content || '', 'This is a test', 10); + }); + } else { + it(`raw response`, async function () { + const response = await client.chat.completions + .create({ + model: 'gpt-4', + messages: [{ role: 'user', content: 'Say this is a test' }], + }) + .asResponse(); + + // test that we can use web Response API + const { body } = response; + if (!body) throw new Error('expected response.body to be defined'); + + const reader = body.getReader(); + const chunks: Uint8Array[] = []; + let result; + do { + result = await reader.read(); + if (!result.done) chunks.push(result.value); + } while (!result.done); + + reader.releaseLock(); + + let offset = 0; + const merged = new Uint8Array(chunks.reduce((total, chunk) => total + chunk.length, 0)); + for (const chunk of chunks) { + merged.set(chunk, offset); + offset += chunk.length; + } + + const json: ChatCompletion = JSON.parse(new TextDecoder().decode(merged)); + expectSimilar(json.choices[0]?.message.content || '', 'This is a test', 10); + }); + } + it(`streaming works`, async function () { const stream = await client.chat.completions.create({ model: 'gpt-4', @@ -83,7 +144,7 @@ export function uploadWebApiTestCases({ const fineTune = `{"prompt": "", "completion": ""}`; it('toFile handles string', async () => { - // @ts-expect-error we don't type support for `string` to avoid a footgun with passing the file path + // @ts-ignore this only doesn't error in vercel build... const file = await toFile(fineTune, 'finetune.jsonl'); const result = await client.files.create({ file, purpose: 'fine-tune' }); expectEqual(result.status, 'uploaded'); diff --git a/jest.config.js b/jest.config.js index 2f22a3d51..f304b9822 100644 --- a/jest.config.js +++ b/jest.config.js @@ -4,7 +4,7 @@ module.exports = { testEnvironment: 'node', moduleNameMapper: { '^openai$': '/src/index.ts', - '^openai/_shims/(.*)$': '/src/_shims/$1-node', + '^openai/_shims/auto/(.*)$': '/src/_shims/auto/$1-node', '^openai/(.*)$': '/src/$1', }, modulePathIgnorePatterns: ['/ecosystem-tests/', '/dist/', '/deno_tests/'], diff --git a/package.json b/package.json index 540b936a3..36bd588ac 100644 --- a/package.json +++ b/package.json @@ -9,76 +9,49 @@ "repository": "github:openai/openai-node", "license": "Apache-2.0", "private": false, + "sideEffects": [ + "./_shims/index.js", + "./_shims/index.mjs", + "./shims/node.js", + "./shims/node.mjs", + "./shims/web.js", + "./shims/web.mjs" + ], "exports": { - "./_shims/node-readable": { + "./_shims/auto/*": { "deno": { - "types": "./dist/_shims/node-readable.d.ts", - "require": "./dist/_shims/node-readable.js", - "default": "./dist/_shims/node-readable.mjs" + "types": "./dist/_shims/auto/*.d.ts", + "require": "./dist/_shims/auto/*.js", + "default": "./dist/_shims/auto/*.mjs" }, "bun": { - "types": "./dist/_shims/node-readable-node.d.ts", - "require": "./dist/_shims/node-readable-node.js", - "default": "./dist/_shims/node-readable-node.mjs" + "types": "./dist/_shims/auto/*.d.ts", + "require": "./dist/_shims/auto/*-bun.js", + "default": "./dist/_shims/auto/*-bun.mjs" }, "browser": { - "types": "./dist/_shims/node-readable.d.ts", - "require": "./dist/_shims/node-readable.js", - "default": "./dist/_shims/node-readable.mjs" + "types": "./dist/_shims/auto/*.d.ts", + "require": "./dist/_shims/auto/*.js", + "default": "./dist/_shims/auto/*.mjs" }, "worker": { - "types": "./dist/_shims/node-readable.d.ts", - "require": "./dist/_shims/node-readable.js", - "default": "./dist/_shims/node-readable.mjs" + "types": "./dist/_shims/auto/*.d.ts", + "require": "./dist/_shims/auto/*.js", + "default": "./dist/_shims/auto/*.mjs" }, "workerd": { - "types": "./dist/_shims/node-readable.d.ts", - "require": "./dist/_shims/node-readable.js", - "default": "./dist/_shims/node-readable.mjs" + "types": "./dist/_shims/auto/*.d.ts", + "require": "./dist/_shims/auto/*.js", + "default": "./dist/_shims/auto/*.mjs" }, "node": { - "types": "./dist/_shims/node-readable-node.d.ts", - "require": "./dist/_shims/node-readable-node.js", - "default": "./dist/_shims/node-readable-node.mjs" + "types": "./dist/_shims/auto/*-node.d.ts", + "require": "./dist/_shims/auto/*-node.js", + "default": "./dist/_shims/auto/*-node.mjs" }, - "types": "./dist/_shims/node-readable.d.ts", - "require": "./dist/_shims/node-readable.js", - "default": "./dist/_shims/node-readable.mjs" - }, - "./_shims/*": { - "deno": { - "types": "./dist/_shims/*.d.ts", - "require": "./dist/_shims/*.js", - "default": "./dist/_shims/*.mjs" - }, - "bun": { - "types": "./dist/_shims/*.d.ts", - "require": "./dist/_shims/*.js", - "default": "./dist/_shims/*.mjs" - }, - "browser": { - "types": "./dist/_shims/*.d.ts", - "require": "./dist/_shims/*.js", - "default": "./dist/_shims/*.mjs" - }, - "worker": { - "types": "./dist/_shims/*.d.ts", - "require": "./dist/_shims/*.js", - "default": "./dist/_shims/*.mjs" - }, - "workerd": { - "types": "./dist/_shims/*.d.ts", - "require": "./dist/_shims/*.js", - "default": "./dist/_shims/*.mjs" - }, - "node": { - "types": "./dist/_shims/*-node.d.ts", - "require": "./dist/_shims/*-node.js", - "default": "./dist/_shims/*-node.mjs" - }, - "types": "./dist/_shims/*.d.ts", - "require": "./dist/_shims/*.js", - "default": "./dist/_shims/*.mjs" + "types": "./dist/_shims/auto/*.d.ts", + "require": "./dist/_shims/auto/*.js", + "default": "./dist/_shims/auto/*.mjs" }, ".": { "require": { @@ -123,9 +96,9 @@ }, "devDependencies": { "@types/jest": "^29.4.0", - "@typescript-eslint/eslint-plugin": "^5.33.0", - "@typescript-eslint/parser": "^5.33.0", - "eslint": "^8.22.0", + "@typescript-eslint/eslint-plugin": "^6.7.0", + "@typescript-eslint/parser": "^6.7.0", + "eslint": "^8.49.0", "eslint-plugin-prettier": "^4.0.0", "eslint-plugin-unused-imports": "^2.0.0", "jest": "^29.4.0", @@ -134,7 +107,6 @@ "ts-jest": "^29.1.0", "ts-morph": "^19.0.0", "ts-node": "^10.5.0", - "tsc-alias": "^1.8.6", "tsc-multi": "^1.1.0", "tsconfig-paths": "^4.0.0", "typescript": "^4.8.2" diff --git a/release-please-config.json b/release-please-config.json index a497a8890..e5d1018e1 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -58,5 +58,7 @@ } ], "release-type": "node", - "extra-files": ["src/version.ts"] + "extra-files": [ + "src/version.ts" + ] } diff --git a/scripts/postprocess-files.cjs b/scripts/postprocess-files.cjs new file mode 100644 index 000000000..5379f9fa2 --- /dev/null +++ b/scripts/postprocess-files.cjs @@ -0,0 +1,160 @@ +const fs = require('fs'); +const path = require('path'); +const { parse } = require('@typescript-eslint/parser'); + +const distDir = path.resolve(__dirname, '..', 'dist'); +const distSrcDir = path.join(distDir, 'src'); + +/** + * Quick and dirty AST traversal + */ +function traverse(node, visitor) { + if (!node || typeof node.type !== 'string') return; + visitor.node?.(node); + visitor[node.type]?.(node); + for (const key in node) { + const value = node[key]; + if (Array.isArray(value)) { + for (const elem of value) traverse(elem, visitor); + } else if (value instanceof Object) { + traverse(value, visitor); + } + } +} + +/** + * Helper method for replacing arbitrary ranges of text in input code. + * + * The `replacer` is a function that will be called with a mini-api. For example: + * + * replaceRanges('foobar', ({ replace }) => replace([0, 3], 'baz')) // 'bazbar' + * + * The replaced ranges must not be overlapping. + */ +function replaceRanges(code, replacer) { + const replacements = []; + replacer({ replace: (range, replacement) => replacements.push({ range, replacement }) }); + + if (!replacements.length) return code; + replacements.sort((a, b) => a.range[0] - b.range[0]); + const overlapIndex = replacements.findIndex( + (r, index) => index > 0 && replacements[index - 1].range[1] > r.range[0], + ); + if (overlapIndex >= 0) { + throw new Error( + `replacements overlap: ${JSON.stringify(replacements[overlapIndex - 1])} and ${JSON.stringify( + replacements[overlapIndex], + )}`, + ); + } + + const parts = []; + let end = 0; + for (const { + range: [from, to], + replacement, + } of replacements) { + if (from > end) parts.push(code.substring(end, from)); + parts.push(replacement); + end = to; + } + if (end < code.length) parts.push(code.substring(end)); + return parts.join(''); +} + +/** + * Like calling .map(), where the iteratee is called on the path in every import or export from statement. + * @returns the transformed code + */ +function mapModulePaths(code, iteratee) { + const ast = parse(code, { range: true }); + return replaceRanges(code, ({ replace }) => + traverse(ast, { + node(node) { + switch (node.type) { + case 'ImportDeclaration': + case 'ExportNamedDeclaration': + case 'ExportAllDeclaration': + case 'ImportExpression': + if (node.source) { + const { range, value } = node.source; + const transformed = iteratee(value); + if (transformed !== value) { + replace(range, JSON.stringify(transformed)); + } + } + } + }, + }), + ); +} + +async function* walk(dir) { + for await (const d of await fs.promises.opendir(dir)) { + const entry = path.join(dir, d.name); + if (d.isDirectory()) yield* walk(entry); + else if (d.isFile()) yield entry; + } +} + +async function postprocess() { + for await (const file of walk(path.resolve(__dirname, '..', 'dist'))) { + if (!/\.([cm]?js|(\.d)?[cm]?ts)$/.test(file)) continue; + + const code = await fs.promises.readFile(file, 'utf8'); + + let transformed = mapModulePaths(code, (importPath) => { + if (file.startsWith(distSrcDir)) { + if (importPath.startsWith('openai/')) { + // convert self-references in dist/src to relative paths + let relativePath = path.relative( + path.dirname(file), + path.join(distSrcDir, importPath.substring('openai/'.length)), + ); + if (!relativePath.startsWith('.')) relativePath = `./${relativePath}`; + return relativePath; + } + return importPath; + } + if (importPath.startsWith('.')) { + // add explicit file extensions to relative imports + const { dir, name } = path.parse(importPath); + const ext = /\.mjs$/.test(file) ? '.mjs' : '.js'; + return `${dir}/${name}${ext}`; + } + return importPath; + }); + + if (file.startsWith(distSrcDir) && !file.endsWith('_shims/index.d.ts')) { + // strip out `unknown extends Foo ? never :` shim guards in dist/src + // to prevent errors from appearing in Go To Source + transformed = transformed.replace( + new RegExp('unknown extends (typeof )?\\S+ \\? \\S+ :\\s*'.replace(/\s+/, '\\s+'), 'gm'), + // replace with same number of characters to avoid breaking source maps + (match) => ' '.repeat(match.length), + ); + } + + if (file.endsWith('.d.ts')) { + // work around bad tsc behavior + // if we have `import { type Readable } from 'openai/_shims/index'`, + // tsc sometimes replaces `Readable` with `import("stream").Readable` inline + // in the output .d.ts + transformed = transformed.replace(/import\("stream"\).Readable/g, 'Readable'); + } + + // strip out lib="dom" and types="node" references; these are needed at build time, + // but would pollute the user's TS environment + transformed = transformed.replace( + /^ *\/\/\/ * ' '.repeat(match.length - 1) + '\n', + ); + + if (transformed !== code) { + await fs.promises.writeFile(file, transformed, 'utf8'); + console.error(`wrote ${path.relative(process.cwd(), file)}`); + } + } +} +postprocess(); diff --git a/scripts/remove-triple-slash-references.js b/scripts/remove-triple-slash-references.js deleted file mode 100644 index d47d45b73..000000000 --- a/scripts/remove-triple-slash-references.js +++ /dev/null @@ -1,11 +0,0 @@ -// strip out lib="dom" and types="node" references; these are needed at build time, -// but would pollute the user's TS environment -const fs = require('fs'); -for (const file of process.argv.slice(2)) { - const before = fs.readFileSync(file, 'utf8'); - const after = before.replace(/^ *\/\/\/ * { - if (!importPath.startsWith('openai/')) return match; - if (!file.startsWith(distSrcDir)) return match; - let relativePath = path.relative( - path.dirname(file), - path.join(distSrcDir, importPath.substring('openai/'.length)), - ); - if (!relativePath.startsWith('.')) relativePath = `./${relativePath}`; - return JSON.stringify(relativePath); - }); -} -exports.default = replaceSelfReferencingImports; diff --git a/scripts/replace-shim-guards.js b/scripts/replace-shim-guards.js deleted file mode 100644 index 17bd9fb5f..000000000 --- a/scripts/replace-shim-guards.js +++ /dev/null @@ -1,14 +0,0 @@ -// strip out `unknown extends RequestInit ? never :` from dist/src/_shims; -// these cause problems when viewing the .ts source files in go to definition -const fs = require('fs'); -for (const file of process.argv.slice(2)) { - const before = fs.readFileSync(file, 'utf8'); - const after = before.replace( - new RegExp('unknown extends (typeof )?\\S+ \\? \\S+ :\\s*'.replace(/\s+/, '\\s+'), 'gm'), - '', - ); - if (after !== before) { - fs.writeFileSync(file, after, 'utf8'); - console.error('wrote', file); - } -} diff --git a/scripts/resolve-full-paths.js b/scripts/resolve-full-paths.js deleted file mode 100644 index f8f979ad7..000000000 --- a/scripts/resolve-full-paths.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); - -const path = require('path'); - -// tsc-alias --resolveFullPaths is buggy, it replaces 'formdata-node' -// with 'formdata-node.js' because we have a file with that name -function resolveFullPaths({ orig, file, config }) { - return orig.replace(/['"]([^"'\r\n]+)['"]/, (match, importPath) => { - if (!importPath.startsWith('.')) return match; - const { dir, name } = path.parse(importPath); - const ext = /\.mjs$/.test(file) ? '.mjs' : '.js'; - return JSON.stringify(`${dir}/${name}${ext}`); - }); -} -exports.default = resolveFullPaths; diff --git a/src/_shims/MultipartBody.ts b/src/_shims/MultipartBody.ts new file mode 100644 index 000000000..af3b11188 --- /dev/null +++ b/src/_shims/MultipartBody.ts @@ -0,0 +1,9 @@ +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ +export class MultipartBody { + constructor(public body: any) {} + get [Symbol.toStringTag](): string { + return 'MultipartBody'; + } +} diff --git a/src/_shims/README.md b/src/_shims/README.md new file mode 100644 index 000000000..b3a349b41 --- /dev/null +++ b/src/_shims/README.md @@ -0,0 +1,46 @@ +# 👋 Wondering what everything in here does? + +`openai` supports a wide variety of runtime environments like Node.js, Deno, Bun, browsers, and various +edge runtimes, as well as both CommonJS (CJS) and EcmaScript Modules (ESM). + +To do this, `openai` provides shims for either using `node-fetch` when in Node (because `fetch` is still experimental there) or the global `fetch` API built into the environment when not in Node. + +It uses [conditional exports](https://nodejs.org/api/packages.html#conditional-exports) to +automatically select the correct shims for each environment. However, conditional exports are a fairly new +feature and not supported everywhere. For instance, the TypeScript `"moduleResolution": "node"` + +setting doesn't consult the `exports` map, compared to `"moduleResolution": "nodeNext"`, which does. +Unfortunately that's still the default setting, and it can result in errors like +getting the wrong raw `Response` type from `.asResponse()`, for example. + +The user can work around these issues by manually importing one of: + +- `import 'openai/shims/node'` +- `import 'openai/shims/web'` + +All of the code here in `_shims` handles selecting the automatic default shims or manual overrides. + +### How it works - Runtime + +Runtime shims get installed by calling `setShims` exported by `openai/_shims/registry`. + +Manually importing `openai/shims/node` or `openai/shims/web`, calls `setShims` with the respective runtime shims. + +All client code imports shims from `openai/_shims/index`, which: + +- checks if shims have been set manually +- if not, calls `setShims` with the shims from `openai/_shims/auto/runtime` +- re-exports the installed shims from `openai/_shims/registry`. + +`openai/_shims/auto/runtime` exports web runtime shims. +If the `node` export condition is set, the export map replaces it with `openai/_shims/auto/runtime-node`. + +### How it works - Type time + +All client code imports shim types from `openai/_shims/index`, which selects the manual types from `openai/_shims/manual-types` if they have been declared, otherwise it exports the auto types from `openai/_shims/auto/types`. + +`openai/_shims/manual-types` exports an empty namespace. +Manually importing `openai/shims/node` or `openai/shims/web` merges declarations into this empty namespace, so they get picked up by `openai/_shims/index`. + +`openai/_shims/auto/types` exports web type definitions. +If the `node` export condition is set, the export map replaces it with `openai/_shims/auto/types-node`, though TS only picks this up if `"moduleResolution": "nodenext"` or `"moduleResolution": "bundler"`. diff --git a/src/_shims/ReadableStream.d.ts b/src/_shims/ReadableStream.d.ts deleted file mode 100644 index b21d01ce2..000000000 --- a/src/_shims/ReadableStream.d.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Disclaimer: modules in _shims aren't intended to be imported by SDK users. - */ - -/** - * >>> Confused? <<< - * - * If you're getting errors from these types, try adding "lib": ["DOM"] - * to your tsconfig.json, or otherwise configure the appropriate builtin - * `ReadableStream` type for your environment. - */ - -// @ts-ignore -type _ReadableStream = unknown extends ReadableStream ? never : ReadableStream; -declare const _ReadableStream: { - prototype: _ReadableStream; - new ( - underlyingSource: _UnderlyingByteSource, - strategy?: { highWaterMark?: number }, - ): _ReadableStream; - new ( - underlyingSource: _UnderlyingDefaultSource, - strategy?: _QueuingStrategy, - ): _ReadableStream; - new (underlyingSource?: _UnderlyingSource, strategy?: _QueuingStrategy): _ReadableStream; -}; - -// @ts-ignore -type _UnderlyingSource = unknown extends UnderlyingSource ? never : UnderlyingSource; -// @ts-ignore -type _UnderlyingByteSource = unknown extends UnderlyingByteSource ? never : UnderlyingByteSource; -type _UnderlyingDefaultSource = - // @ts-ignore - unknown extends UnderlyingDefaultSource ? never : UnderlyingDefaultSource; -// @ts-ignore -type _QueuingStrategy = unknown extends QueuingStrategy ? never : QueuingStrategy; - -export { _ReadableStream as ReadableStream }; diff --git a/src/_shims/ReadableStream.mjs b/src/_shims/ReadableStream.mjs deleted file mode 100644 index a484d65a7..000000000 --- a/src/_shims/ReadableStream.mjs +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Disclaimer: modules in _shims aren't intended to be imported by SDK users. - */ - -const _ReadableStream = ReadableStream; - -export { _ReadableStream as ReadableStream }; diff --git a/src/_shims/agent-node.ts b/src/_shims/agent-node.ts deleted file mode 100644 index 31f4d7c5f..000000000 --- a/src/_shims/agent-node.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Disclaimer: modules in _shims aren't intended to be imported by SDK users. - */ - -import KeepAliveAgent from 'agentkeepalive'; -import type { Agent } from 'node:http'; -import { AbortController as AbortControllerPolyfill } from 'abort-controller'; - -export type { Agent }; - -const defaultHttpAgent: Agent = new KeepAliveAgent({ keepAlive: true, timeout: 5 * 60 * 1000 }); -const defaultHttpsAgent: Agent = new KeepAliveAgent.HttpsAgent({ keepAlive: true, timeout: 5 * 60 * 1000 }); - -// Polyfill global object if needed. -if (typeof AbortController === 'undefined') { - AbortController = AbortControllerPolyfill as any as typeof AbortController; -} - -export const getDefaultAgent = (url: string): Agent | undefined => { - if (defaultHttpsAgent && url.startsWith('https')) return defaultHttpsAgent; - return defaultHttpAgent; -}; diff --git a/src/_shims/agent.ts b/src/_shims/agent.ts deleted file mode 100644 index 24e5bf7ca..000000000 --- a/src/_shims/agent.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Disclaimer: modules in _shims aren't intended to be imported by SDK users. - * - * This is a stub for non-node environments. - * In node environments, it gets replaced agent-node.ts by the package export map - */ - -export type Agent = any; - -export const getDefaultAgent = (url: string): any => { - return undefined; -}; diff --git a/src/_shims/ReadableStream.js b/src/_shims/auto/runtime-bun.ts similarity index 67% rename from src/_shims/ReadableStream.js rename to src/_shims/auto/runtime-bun.ts index 7c0dff176..e053254b3 100644 --- a/src/_shims/ReadableStream.js +++ b/src/_shims/auto/runtime-bun.ts @@ -1,5 +1,4 @@ /** * Disclaimer: modules in _shims aren't intended to be imported by SDK users. */ - -exports.ReadableStream = ReadableStream; +export * from '../bun-runtime'; diff --git a/src/_shims/ReadableStream-node.ts b/src/_shims/auto/runtime-deno.ts similarity index 50% rename from src/_shims/ReadableStream-node.ts rename to src/_shims/auto/runtime-deno.ts index adc525861..62b7a39ee 100644 --- a/src/_shims/ReadableStream-node.ts +++ b/src/_shims/auto/runtime-deno.ts @@ -1,6 +1,4 @@ /** * Disclaimer: modules in _shims aren't intended to be imported by SDK users. */ -import { ReadableStream } from 'web-streams-polyfill'; - -export { ReadableStream }; +export * from '../web-runtime'; diff --git a/src/_shims/auto/runtime-node.ts b/src/_shims/auto/runtime-node.ts new file mode 100644 index 000000000..0ae2216fe --- /dev/null +++ b/src/_shims/auto/runtime-node.ts @@ -0,0 +1,4 @@ +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ +export * from '../node-runtime'; diff --git a/src/_shims/auto/runtime.ts b/src/_shims/auto/runtime.ts new file mode 100644 index 000000000..62b7a39ee --- /dev/null +++ b/src/_shims/auto/runtime.ts @@ -0,0 +1,4 @@ +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ +export * from '../web-runtime'; diff --git a/src/_shims/auto/types-deno.ts b/src/_shims/auto/types-deno.ts new file mode 100644 index 000000000..226fb15a0 --- /dev/null +++ b/src/_shims/auto/types-deno.ts @@ -0,0 +1,4 @@ +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ +export * from '../web-types'; diff --git a/src/_shims/auto/types-node.ts b/src/_shims/auto/types-node.ts new file mode 100644 index 000000000..2625a8b70 --- /dev/null +++ b/src/_shims/auto/types-node.ts @@ -0,0 +1,4 @@ +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ +export * from '../node-types'; diff --git a/src/_shims/auto/types.d.ts b/src/_shims/auto/types.d.ts new file mode 100644 index 000000000..9c1cc2550 --- /dev/null +++ b/src/_shims/auto/types.d.ts @@ -0,0 +1,99 @@ +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ +export type Agent = any; + +// @ts-ignore +declare const _fetch: unknown extends typeof fetch ? never : typeof fetch; +export { _fetch as fetch }; + +// @ts-ignore +type _Request = unknown extends Request ? never : Request; +export { _Request as Request }; + +// @ts-ignore +type _RequestInfo = unknown extends RequestInfo ? never : RequestInfo; +export { type _RequestInfo as RequestInfo }; + +// @ts-ignore +type _RequestInit = unknown extends RequestInit ? never : RequestInit; +export { type _RequestInit as RequestInit }; + +// @ts-ignore +type _Response = unknown extends Response ? never : Response; +export { _Response as Response }; + +// @ts-ignore +type _ResponseInit = unknown extends ResponseInit ? never : ResponseInit; +export { type _ResponseInit as ResponseInit }; + +// @ts-ignore +type _ResponseType = unknown extends ResponseType ? never : ResponseType; +export { type _ResponseType as ResponseType }; + +// @ts-ignore +type _BodyInit = unknown extends BodyInit ? never : BodyInit; +export { type _BodyInit as BodyInit }; + +// @ts-ignore +type _Headers = unknown extends Headers ? never : Headers; +export { _Headers as Headers }; + +// @ts-ignore +type _HeadersInit = unknown extends HeadersInit ? never : HeadersInit; +export { type _HeadersInit as HeadersInit }; + +type EndingType = 'native' | 'transparent'; + +export interface BlobPropertyBag { + endings?: EndingType; + type?: string; +} + +export interface FilePropertyBag extends BlobPropertyBag { + lastModified?: number; +} + +export type FileFromPathOptions = Omit; + +// @ts-ignore +type _FormData = unknown extends FormData ? never : FormData; +// @ts-ignore +declare const _FormData: unknown extends typeof FormData ? never : typeof FormData; +export { _FormData as FormData }; + +// @ts-ignore +type _File = unknown extends File ? never : File; +// @ts-ignore +declare const _File: unknown extends typeof File ? never : typeof File; +export { _File as File }; + +// @ts-ignore +type _Blob = unknown extends Blob ? never : Blob; +// @ts-ignore +declare const _Blob: unknown extends typeof Blob ? never : typeof Blob; +export { _Blob as Blob }; + +export declare class Readable { + readable: boolean; + readonly readableEnded: boolean; + readonly readableFlowing: boolean | null; + readonly readableHighWaterMark: number; + readonly readableLength: number; + readonly readableObjectMode: boolean; + destroyed: boolean; + read(size?: number): any; + pause(): this; + resume(): this; + isPaused(): boolean; + destroy(error?: Error): this; + [Symbol.asyncIterator](): AsyncIterableIterator; +} + +export declare class FsReadStream extends Readable { + path: {}; // node type is string | Buffer +} + +// @ts-ignore +type _ReadableStream = unknown extends ReadableStream ? never : ReadableStream; +export { type _ReadableStream as ReadableStream }; diff --git a/src/_shims/auto/types.js b/src/_shims/auto/types.js new file mode 100644 index 000000000..ddbdb799c --- /dev/null +++ b/src/_shims/auto/types.js @@ -0,0 +1,3 @@ +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ diff --git a/src/_shims/auto/types.mjs b/src/_shims/auto/types.mjs new file mode 100644 index 000000000..ddbdb799c --- /dev/null +++ b/src/_shims/auto/types.mjs @@ -0,0 +1,3 @@ +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ diff --git a/src/_shims/bun-runtime.ts b/src/_shims/bun-runtime.ts new file mode 100644 index 000000000..8d5aaab0c --- /dev/null +++ b/src/_shims/bun-runtime.ts @@ -0,0 +1,14 @@ +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ +import { type Shims } from './registry'; +import { getRuntime as getWebRuntime } from './web-runtime'; +import { ReadStream as FsReadStream } from 'node:fs'; + +export function getRuntime(): Shims { + const runtime = getWebRuntime(); + function isFsReadStream(value: any): value is FsReadStream { + return value instanceof FsReadStream; + } + return { ...runtime, isFsReadStream }; +} diff --git a/src/_shims/fetch-deno.ts b/src/_shims/fetch-deno.ts deleted file mode 100644 index c7ef4ffc7..000000000 --- a/src/_shims/fetch-deno.ts +++ /dev/null @@ -1,27 +0,0 @@ -const _fetch = fetch; -type _fetch = typeof fetch; -const _Request = Request; -type _Request = Request; -type _RequestInfo = RequestInfo; -type _RequestInit = RequestInit; -const _Response = Response; -type _Response = Response; -type _ResponseInit = ResponseInit; -type _BodyInit = BodyInit; -const _Headers = Headers; -type _Headers = Headers; -type _HeadersInit = HeadersInit; - -export const isPolyfilled = false; - -export { - _fetch as fetch, - _Request as Request, - type _RequestInfo as RequestInfo, - type _RequestInit as RequestInit, - _Response as Response, - type _ResponseInit as ResponseInit, - type _BodyInit as BodyInit, - _Headers as Headers, - type _HeadersInit as HeadersInit, -}; diff --git a/src/_shims/fetch-node.d.ts b/src/_shims/fetch-node.d.ts deleted file mode 100644 index 006f00da4..000000000 --- a/src/_shims/fetch-node.d.ts +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Disclaimer: modules in _shims aren't intended to be imported by SDK users. - */ - -import * as nf from 'node-fetch'; - -// Use builtin web types if present; else node-fetch types - -/** - * >>> Confused? <<< - * - * If you're getting errors from these types, try adding "lib": ["DOM"] - * to your tsconfig.json, or otherwise configure the appropriate builtin - * `fetch` types for your environment. - */ - -// @ts-ignore -type _fetch = unknown extends typeof fetch ? typeof nf.default : typeof fetch; -// @ts-ignore -type _Request = unknown extends Request ? nf.Request : Request; -// @ts-ignore -type _RequestInfo = unknown extends RequestInfo ? nf.RequestInfo : RequestInfo; -// @ts-ignore -type _RequestInit = unknown extends RequestInit ? nf.RequestInit : RequestInit; -// @ts-ignore -type _Response = unknown extends Response ? nf.Response : Response; -// @ts-ignore -type _ResponseInit = unknown extends ResponseInit ? nf.ResponseInit : ResponseInit; -type _ResponseType = - // @ts-ignore - unknown extends ResponseType ? 'basic' | 'cors' | 'default' | 'error' | 'opaque' | 'opaqueredirect' - : // @ts-ignore - ResponseType; -// @ts-ignore -type _BodyInit = unknown extends BodyInit ? nf.BodyInit : BodyInit; -// @ts-ignore -type _Headers = unknown extends Headers ? nf.Headers : Headers; -// @ts-ignore -type _HeadersInit = unknown extends HeadersInit ? nf.HeadersInit : HeadersInit; - -declare const _fetch: _fetch; -declare const _Request: { - prototype: _Request; - new (input: _RequestInfo | URL, init?: _RequestInit): _Request; -}; -declare const _Response: { - prototype: _Response; - new (body?: _BodyInit | null, init?: _ResponseInit): _Response; -}; -declare const _Headers: { - prototype: _Headers; - new (init?: _HeadersInit): _Headers; -}; - -export const isPolyfilled = false; - -export { _fetch as fetch, _Request as Request, _Response as Response, _Headers as Headers }; -export type { - _RequestInit as RequestInit, - _RequestInfo as RequestInfo, - _ResponseType as ResponseType, - _BodyInit as BodyInit, - _HeadersInit as HeadersInit, -}; diff --git a/src/_shims/fetch-node.js b/src/_shims/fetch-node.js deleted file mode 100644 index 15f8f8abf..000000000 --- a/src/_shims/fetch-node.js +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Disclaimer: modules in _shims aren't intended to be imported by SDK users. - */ - -const nf = require('node-fetch'); - -exports.fetch = nf.default; -exports.Request = nf.Request; -exports.Response = nf.Response; -exports.Headers = nf.Headers; - -exports.isPolyfilled = true; diff --git a/src/_shims/fetch-node.mjs b/src/_shims/fetch-node.mjs deleted file mode 100644 index d8543dcac..000000000 --- a/src/_shims/fetch-node.mjs +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Disclaimer: modules in _shims aren't intended to be imported by SDK users. - */ - -import * as nf from 'node-fetch'; - -const _fetch = nf.default; -const _Request = nf.Request; -const _Response = nf.Response; -const _Headers = nf.Headers; - -export { _fetch as fetch, _Request as Request, _Response as Response, _Headers as Headers }; - -export const isPolyfilled = true; diff --git a/src/_shims/fetch.d.ts b/src/_shims/fetch.d.ts deleted file mode 100644 index 772a6d987..000000000 --- a/src/_shims/fetch.d.ts +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Disclaimer: modules in _shims aren't intended to be imported by SDK users. - */ - -// Use builtin web types if present; else never (user should -// add appropriate lib or types to tsconfig) - -/** - * >>> Confused? <<< - * - * If you're getting errors from these types, try adding "lib": ["DOM"] - * to your tsconfig.json, or otherwise configure the appropriate builtin - * `fetch` types for your environment. - */ - -// @ts-ignore -type _fetch = unknown extends typeof fetch ? never : typeof fetch; -// @ts-ignore -type _Request = unknown extends Request ? never : Request; -// @ts-ignore -type _RequestInfo = unknown extends RequestInfo ? never : RequestInfo; -// @ts-ignore -type _RequestInit = unknown extends RequestInit ? never : RequestInit; -// @ts-ignore -type _Response = unknown extends Response ? never : Response; -// @ts-ignore -type _ResponseInit = unknown extends ResponseInit ? never : ResponseInit; -// @ts-ignore -type _ResponseType = unknown extends ResponseType ? never : ResponseType; -// @ts-ignore -type _BodyInit = unknown extends BodyInit ? never : BodyInit; -// @ts-ignore -type _Headers = unknown extends Headers ? never : Headers; -// @ts-ignore -type _HeadersInit = unknown extends HeadersInit ? never : HeadersInit; - -declare const _fetch: _fetch; -declare const _Request: { - prototype: _Request; - new (input: _RequestInfo | URL, init?: _RequestInit): _Request; -}; -declare const _Response: { - prototype: _Response; - new (body?: _BodyInit | null, init?: _ResponseInit): _Response; -}; -declare const _Headers: { - prototype: _Headers; - new (init?: _HeadersInit): _Headers; -}; - -export const isPolyfilled = false; - -export { _fetch as fetch, _Request as Request, _Response as Response, _Headers as Headers }; -export type { - _RequestInit as RequestInit, - _RequestInfo as RequestInfo, - _ResponseType as ResponseType, - _BodyInit as BodyInit, - _HeadersInit as HeadersInit, -}; diff --git a/src/_shims/fetch.js b/src/_shims/fetch.js deleted file mode 100644 index 3c3821fdd..000000000 --- a/src/_shims/fetch.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Disclaimer: modules in _shims aren't intended to be imported by SDK users. - */ - -// If we accidentally call fetch with the wrong this binding, -// in the browser it would throw: -// TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation -exports.fetch = fetch.bind(undefined); -exports.Request = Request; -exports.Response = Response; -exports.Headers = Headers; - -exports.isPolyfilled = false; diff --git a/src/_shims/fetch.mjs b/src/_shims/fetch.mjs deleted file mode 100644 index 6d539fbab..000000000 --- a/src/_shims/fetch.mjs +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Disclaimer: modules in _shims aren't intended to be imported by SDK users. - */ - -// If we accidentally call fetch with the wrong this binding, -// in the browser it would throw: -// TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation -const _fetch = fetch.bind(undefined); -const _Request = Request; -const _Response = Response; -const _Headers = Headers; - -export const isPolyfilled = false; - -export { _fetch as fetch, _Request as Request, _Response as Response, _Headers as Headers }; diff --git a/src/_shims/fileFromPath-node.ts b/src/_shims/fileFromPath-node.ts deleted file mode 100644 index 065fd7ecb..000000000 --- a/src/_shims/fileFromPath-node.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Disclaimer: modules in _shims aren't intended to be imported by SDK users. - */ - -import { fileFromPath as _fileFromPath } from 'formdata-node/file-from-path'; -import type { File, FilePropertyBag } from './form-data-node'; - -export type FileFromPathOptions = Omit; - -let warned = false; - -/** - * @deprecated use fs.createReadStream('./my/file.txt') instead - */ -export async function fileFromPath(path: string): Promise; -export async function fileFromPath(path: string, filename?: string): Promise; -export async function fileFromPath(path: string, options?: FileFromPathOptions): Promise; -export async function fileFromPath( - path: string, - filename?: string, - options?: FileFromPathOptions, -): Promise; -export async function fileFromPath(path: string, ...args: any[]): Promise { - if (!warned) { - console.warn(`fileFromPath is deprecated; use fs.createReadStream(${JSON.stringify(path)}) instead`); - warned = true; - } - return await _fileFromPath(path, ...args); -} diff --git a/src/_shims/fileFromPath.ts b/src/_shims/fileFromPath.ts deleted file mode 100644 index 4e7c4c001..000000000 --- a/src/_shims/fileFromPath.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Disclaimer: modules in _shims aren't intended to be imported by SDK users. - * - * This is a stub that gets replaced by fileFromPath-node.js for node environments - * in the package export map - */ - -import type { FilePropertyBag, File } from './form-data'; - -export type FileFromPathOptions = Omit; - -/** - * This is a stub for non-node environments that just throws an error. - * In node environments, this module will be replaced by util/node/fileFromPath by the - * package import map. - */ -export async function fileFromPath(path: string): Promise; -export async function fileFromPath(path: string, filename?: string): Promise; -export async function fileFromPath(path: string, options?: FileFromPathOptions): Promise; -export async function fileFromPath( - path: string, - filename?: string, - options?: FileFromPathOptions, -): Promise; -export async function fileFromPath(): Promise { - throw new Error( - 'The `fileFromPath` function is only supported in Node. See the README for more details: https://www.github.com/openai/openai-node#file-uploads', - ); -} diff --git a/src/_shims/form-data-deno.ts b/src/_shims/form-data-deno.ts deleted file mode 100644 index ec0349eba..000000000 --- a/src/_shims/form-data-deno.ts +++ /dev/null @@ -1,19 +0,0 @@ -type _BlobPropertyBag = BlobPropertyBag; -type _FilePropertyBag = FilePropertyBag; - -const _FormData = FormData; -type _FormData = FormData; -const _File = File; -type _File = File; -const _Blob = Blob; -type _Blob = Blob; - -export const isPolyfilled = false; - -export { - _FormData as FormData, - _File as File, - _Blob as Blob, - type _BlobPropertyBag as BlobPropertyBag, - type _FilePropertyBag as FilePropertyBag, -}; diff --git a/src/_shims/form-data-node.d.ts b/src/_shims/form-data-node.d.ts deleted file mode 100644 index 30eceea80..000000000 --- a/src/_shims/form-data-node.d.ts +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Disclaimer: modules in _shims aren't intended to be imported by SDK users. - */ - -import * as fd from 'formdata-node'; - -import type { BlobPart } from '../uploads'; - -type EndingType = 'native' | 'transparent'; - -export interface BlobPropertyBag { - endings?: EndingType; - /** MIME type, e.g., "text/plain" */ - type?: string; -} - -export interface FilePropertyBag extends BlobPropertyBag { - lastModified?: number; -} - -// Use builtin web types if present; else formdata-node types - -// @ts-ignore -type _FormData = unknown extends FormData ? fd.FormData : FormData; -// @ts-ignore -type _File = unknown extends File ? fd.File : File; -// @ts-ignore -type _Blob = unknown extends Blob ? fd.Blob : Blob; - -declare const _FormData: { - new (form?: any): _FormData; - prototype: _FormData; -}; -declare const _File: { - new (fileBits: BlobPart[], fileName: string, options?: FilePropertyBag | undefined): _File; - prototype: _File; -}; -declare const _Blob: { - new (blobParts?: BlobPart[] | undefined, options?: BlobPropertyBag | undefined): _Blob; - prototype: _Blob; -}; - -export const isPolyfilled = false; - -export { _FormData as FormData, _File as File, _Blob as Blob }; diff --git a/src/_shims/form-data-node.js b/src/_shims/form-data-node.js deleted file mode 100644 index 892aba543..000000000 --- a/src/_shims/form-data-node.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Disclaimer: modules in _shims aren't intended to be imported by SDK users. - */ - -const fd = require('formdata-node'); - -exports.FormData = fd.FormData; -exports.File = fd.File; -exports.Blob = fd.Blob; - -exports.isPolyfilled = true; diff --git a/src/_shims/form-data-node.mjs b/src/_shims/form-data-node.mjs deleted file mode 100644 index b35ac4dac..000000000 --- a/src/_shims/form-data-node.mjs +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Disclaimer: modules in _shims aren't intended to be imported by SDK users. - */ - -import { FormData, File, Blob } from 'formdata-node'; - -export { FormData, File, Blob }; - -export const isPolyfilled = true; diff --git a/src/_shims/form-data.d.ts b/src/_shims/form-data.d.ts deleted file mode 100644 index 0fb24cc44..000000000 --- a/src/_shims/form-data.d.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Disclaimer: modules in _shims aren't intended to be imported by SDK users. - */ - -import type { BlobPart } from '../uploads'; - -type EndingType = 'native' | 'transparent'; - -export interface BlobPropertyBag { - endings?: EndingType; - type?: string; -} - -export interface FilePropertyBag extends BlobPropertyBag { - lastModified?: number; -} - -// Use builtin web types if present; else never (user should -// add appropriate lib or types to tsconfig) - -// @ts-ignore -type _FormData = unknown extends FormData ? never : FormData; -// @ts-ignore -type _File = unknown extends File ? never : File; -// @ts-ignore -type _Blob = unknown extends Blob ? never : Blob; - -declare const _FormData: { - new (form?: any): _FormData; - prototype: _FormData; -}; -declare const _File: { - new (fileBits: BlobPart[], fileName: string, options?: FilePropertyBag | undefined): _File; - prototype: _File; -}; -declare const _Blob: { - new (blobParts?: BlobPart[] | undefined, options?: BlobPropertyBag | undefined): _Blob; - prototype: _Blob; -}; - -export const isPolyfilled = false; - -export { _FormData as FormData, _File as File, _Blob as Blob }; diff --git a/src/_shims/form-data.js b/src/_shims/form-data.js deleted file mode 100644 index 8cbe41c4c..000000000 --- a/src/_shims/form-data.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Disclaimer: modules in _shims aren't intended to be imported by SDK users. - */ - -exports.FormData = FormData; -exports.Blob = Blob; -exports.File = - typeof File !== 'undefined' ? File : ( - // Bun doesn't implement File yet, so just make a shim that throws a helpful error message - class File extends Blob { - constructor() { - throw new Error(`file uploads aren't supported in this environment yet as 'File' is not defined`); - } - } - ); - -exports.isPolyfilled = false; diff --git a/src/_shims/form-data.mjs b/src/_shims/form-data.mjs deleted file mode 100644 index 3ee740bdf..000000000 --- a/src/_shims/form-data.mjs +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Disclaimer: modules in _shims aren't intended to be imported by SDK users. - */ - -const _FormData = FormData; -const _Blob = Blob; - -const _File = - typeof File !== 'undefined' ? File : ( - // Bun doesn't implement File yet, so just make a shim that throws a helpful error message - class File extends Blob { - constructor() { - throw new Error(`file uploads aren't supported in this environment yet as 'File' is not defined`); - } - } - ); - -export { _FormData as FormData, _File as File, _Blob as Blob }; - -export const isPolyfilled = false; diff --git a/src/_shims/getMultipartRequestOptions-node.ts b/src/_shims/getMultipartRequestOptions-node.ts deleted file mode 100644 index ac13a0756..000000000 --- a/src/_shims/getMultipartRequestOptions-node.ts +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Disclaimer: modules in _shims aren't intended to be imported by SDK users. - */ - -import { FormData } from './form-data-node'; -import type { RequestOptions } from '../core'; -import { Readable } from 'node:stream'; -import { FormDataEncoder } from 'form-data-encoder'; -import { MultipartBody } from '../uploads'; - -export async function getMultipartRequestOptions>( - form: FormData, - opts: RequestOptions, -): Promise> { - const encoder = new FormDataEncoder(form); - const readable = Readable.from(encoder); - const body = new MultipartBody(readable); - const headers = { - ...opts.headers, - ...encoder.headers, - 'Content-Length': encoder.contentLength, - }; - - return { ...opts, body: body as any, headers }; -} diff --git a/src/_shims/getMultipartRequestOptions.ts b/src/_shims/getMultipartRequestOptions.ts deleted file mode 100644 index f74227d0b..000000000 --- a/src/_shims/getMultipartRequestOptions.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Disclaimer: modules in _shims aren't intended to be imported by SDK users. - */ - -import { FormData } from './form-data'; -import type { RequestOptions } from '../core'; -import { MultipartBody } from '../uploads'; - -export async function getMultipartRequestOptions>( - form: FormData, - opts: RequestOptions, -): Promise> { - return { ...opts, body: new MultipartBody(form) as any }; -} diff --git a/src/_shims/index-deno.ts b/src/_shims/index-deno.ts new file mode 100644 index 000000000..b838e5f22 --- /dev/null +++ b/src/_shims/index-deno.ts @@ -0,0 +1,110 @@ +import { MultipartBody } from './MultipartBody'; +import { type RequestOptions } from '../core'; + +export const kind: string = 'web'; + +export type Agent = any; + +const _fetch = fetch; +type _fetch = typeof fetch; +export { _fetch as fetch }; + +const _Request = Request; +type _Request = Request; +export { _Request as Request }; + +type _RequestInfo = RequestInfo; +export { type _RequestInfo as RequestInfo }; + +type _RequestInit = RequestInit; +export { type _RequestInit as RequestInit }; + +const _Response = Response; +type _Response = Response; +export { _Response as Response }; + +type _ResponseInit = ResponseInit; +export { type _ResponseInit as ResponseInit }; + +type _ResponseType = ResponseType; +export { type _ResponseType as ResponseType }; + +type _BodyInit = BodyInit; +export { type _BodyInit as BodyInit }; + +const _Headers = Headers; +type _Headers = Headers; +export { _Headers as Headers }; + +type _HeadersInit = HeadersInit; +export { type _HeadersInit as HeadersInit }; + +type EndingType = 'native' | 'transparent'; + +export interface BlobPropertyBag { + endings?: EndingType; + type?: string; +} + +export interface FilePropertyBag extends BlobPropertyBag { + lastModified?: number; +} + +export type FileFromPathOptions = Omit; + +const _FormData = FormData; +type _FormData = FormData; +export { _FormData as FormData }; + +const _File = File; +type _File = File; +export { _File as File }; + +const _Blob = Blob; +type _Blob = Blob; +export { _Blob as Blob }; + +export async function getMultipartRequestOptions>( + form: FormData, + opts: RequestOptions, +): Promise> { + return { + ...opts, + body: new MultipartBody(form) as any, + }; +} + +export function getDefaultAgent(url: string) { + return undefined; +} +export function fileFromPath() { + throw new Error( + 'The `fileFromPath` function is only supported in Node. See the README for more details: https://www.github.com/openai/openai-node#file-uploads', + ); +} + +export const isFsReadStream = (value: any) => false; + +export declare class Readable { + readable: boolean; + readonly readableEnded: boolean; + readonly readableFlowing: boolean | null; + readonly readableHighWaterMark: number; + readonly readableLength: number; + readonly readableObjectMode: boolean; + destroyed: boolean; + read(size?: number): any; + pause(): this; + resume(): this; + isPaused(): boolean; + destroy(error?: Error): this; + [Symbol.asyncIterator](): AsyncIterableIterator; +} + +export declare class FsReadStream extends Readable { + path: {}; // node type is string | Buffer +} + +const _ReadableStream = ReadableStream; +type _ReadableStream = ReadableStream; +export { _ReadableStream as ReadableStream }; diff --git a/src/_shims/index.d.ts b/src/_shims/index.d.ts new file mode 100644 index 000000000..044f2cfcf --- /dev/null +++ b/src/_shims/index.d.ts @@ -0,0 +1,79 @@ +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ +import { manual } from './manual-types'; +import * as auto from 'openai/_shims/auto/types'; +import { type RequestOptions } from '../core'; + +type SelectType = unknown extends Manual ? Auto : Manual; + +export const kind: string; + +// @ts-ignore +export type Agent = SelectType; + +// @ts-ignore +export const fetch: SelectType; + +// @ts-ignore +export type Request = SelectType; +// @ts-ignore +export type RequestInfo = SelectType; +// @ts-ignore +export type RequestInit = SelectType; + +// @ts-ignore +export type Response = SelectType; +// @ts-ignore +export type ResponseInit = SelectType; +// @ts-ignore +export type ResponseType = SelectType; +// @ts-ignore +export type BodyInit = SelectType; +// @ts-ignore +export type Headers = SelectType; +// @ts-ignore +export const Headers: SelectType; +// @ts-ignore +export type HeadersInit = SelectType; + +// @ts-ignore +export type BlobPropertyBag = SelectType; +// @ts-ignore +export type FilePropertyBag = SelectType; +// @ts-ignore +export type FileFromPathOptions = SelectType; +// @ts-ignore +export type FormData = SelectType; +// @ts-ignore +export const FormData: SelectType; +// @ts-ignore +export type File = SelectType; +// @ts-ignore +export const File: SelectType; +// @ts-ignore +export type Blob = SelectType; +// @ts-ignore +export const Blob: SelectType; + +// @ts-ignore +export type Readable = SelectType; +// @ts-ignore +export type FsReadStream = SelectType; +// @ts-ignore +export type ReadableStream = SelectType; + +export function getMultipartRequestOptions>( + form: FormData, + opts: RequestOptions, +): Promise>; + +export function getDefaultAgent(url: string): any; + +// @ts-ignore +export type FileFromPathOptions = SelectType; + +export function fileFromPath(path: string, options?: FileFromPathOptions): Promise; +export function fileFromPath(path: string, filename?: string, options?: FileFromPathOptions): Promise; + +export function isFsReadStream(value: any): value is FsReadStream; diff --git a/src/_shims/index.js b/src/_shims/index.js new file mode 100644 index 000000000..b5fc8229e --- /dev/null +++ b/src/_shims/index.js @@ -0,0 +1,13 @@ +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ +const shims = require('./registry'); +const auto = require('openai/_shims/auto/runtime'); +if (!shims.kind) shims.setShims(auto.getRuntime(), { auto: true }); +for (const property of Object.keys(shims)) { + Object.defineProperty(exports, property, { + get() { + return shims[property]; + }, + }); +} diff --git a/src/_shims/index.mjs b/src/_shims/index.mjs new file mode 100644 index 000000000..81665e610 --- /dev/null +++ b/src/_shims/index.mjs @@ -0,0 +1,7 @@ +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ +import * as shims from './registry.mjs'; +import * as auto from 'openai/_shims/auto/runtime'; +if (!shims.kind) shims.setShims(auto.getRuntime(), { auto: true }); +export * from './registry.mjs'; diff --git a/src/_shims/manual-types.d.ts b/src/_shims/manual-types.d.ts new file mode 100644 index 000000000..3d00fc243 --- /dev/null +++ b/src/_shims/manual-types.d.ts @@ -0,0 +1,12 @@ +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ +/** + * Types will get added to this namespace when you import one of the following: + * + * import 'openai/shims/node' + * import 'openai/shims/web' + * + * Importing more than one will cause type and runtime errors. + */ +export namespace manual {} diff --git a/src/_shims/manual-types.js b/src/_shims/manual-types.js new file mode 100644 index 000000000..ddbdb799c --- /dev/null +++ b/src/_shims/manual-types.js @@ -0,0 +1,3 @@ +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ diff --git a/src/_shims/manual-types.mjs b/src/_shims/manual-types.mjs new file mode 100644 index 000000000..ddbdb799c --- /dev/null +++ b/src/_shims/manual-types.mjs @@ -0,0 +1,3 @@ +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ diff --git a/src/_shims/node-readable-node.ts b/src/_shims/node-readable-node.ts deleted file mode 100644 index 0355aa1e1..000000000 --- a/src/_shims/node-readable-node.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Disclaimer: modules in _shims aren't intended to be imported by SDK users. - */ -export type { Readable } from 'node:stream'; -import { ReadStream as FsReadStream } from 'node:fs'; -export type { FsReadStream }; - -export function isFsReadStream(value: any): value is FsReadStream { - return value instanceof FsReadStream; -} diff --git a/src/_shims/node-readable.ts b/src/_shims/node-readable.ts deleted file mode 100644 index fc3f2f554..000000000 --- a/src/_shims/node-readable.ts +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Disclaimer: modules in _shims aren't intended to be imported by SDK users. - */ - -// shim these Node types to avoid importing @types/node and polluting the user's -// type environment in non-node projects - -export declare class Readable { - readable: boolean; - readonly readableEnded: boolean; - readonly readableFlowing: boolean | null; - readonly readableHighWaterMark: number; - readonly readableLength: number; - readonly readableObjectMode: boolean; - destroyed: boolean; - read(size?: number): any; - pause(): this; - resume(): this; - isPaused(): boolean; - destroy(error?: Error): this; - [Symbol.asyncIterator](): AsyncIterableIterator; -} - -export declare class FsReadStream extends Readable { - path: {}; // node type is string | Buffer -} - -export function isFsReadStream(value: any): value is FsReadStream { - return false; -} diff --git a/src/_shims/node-runtime.ts b/src/_shims/node-runtime.ts new file mode 100644 index 000000000..2e5ab5631 --- /dev/null +++ b/src/_shims/node-runtime.ts @@ -0,0 +1,79 @@ +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ +import * as nf from 'node-fetch'; +import * as fd from 'formdata-node'; +import { type File, type FilePropertyBag } from 'formdata-node'; +import KeepAliveAgent from 'agentkeepalive'; +import { AbortController as AbortControllerPolyfill } from 'abort-controller'; +import { ReadStream as FsReadStream } from 'node:fs'; +import { type Agent } from 'node:http'; +import { FormDataEncoder } from 'form-data-encoder'; +import { Readable } from 'node:stream'; +import { type RequestOptions } from '../core'; +import { MultipartBody } from './MultipartBody'; +import { type Shims } from './registry'; + +type FileFromPathOptions = Omit; + +let fileFromPathWarned = false; + +/** + * @deprecated use fs.createReadStream('./my/file.txt') instead + */ +async function fileFromPath(path: string): Promise; +async function fileFromPath(path: string, filename?: string): Promise; +async function fileFromPath(path: string, options?: FileFromPathOptions): Promise; +async function fileFromPath(path: string, filename?: string, options?: FileFromPathOptions): Promise; +async function fileFromPath(path: string, ...args: any[]): Promise { + // this import fails in environments that don't handle export maps correctly, like old versions of Jest + const { fileFromPath: _fileFromPath } = await import('formdata-node/file-from-path'); + + if (!fileFromPathWarned) { + console.warn(`fileFromPath is deprecated; use fs.createReadStream(${JSON.stringify(path)}) instead`); + fileFromPathWarned = true; + } + // @ts-ignore + return await _fileFromPath(path, ...args); +} + +const defaultHttpAgent: Agent = new KeepAliveAgent({ keepAlive: true, timeout: 5 * 60 * 1000 }); +const defaultHttpsAgent: Agent = new KeepAliveAgent.HttpsAgent({ keepAlive: true, timeout: 5 * 60 * 1000 }); + +async function getMultipartRequestOptions>( + form: fd.FormData, + opts: RequestOptions, +): Promise> { + const encoder = new FormDataEncoder(form); + const readable = Readable.from(encoder); + const body = new MultipartBody(readable); + const headers = { + ...opts.headers, + ...encoder.headers, + 'Content-Length': encoder.contentLength, + }; + + return { ...opts, body: body as any, headers }; +} + +export function getRuntime(): Shims { + // Polyfill global object if needed. + if (typeof AbortController === 'undefined') { + // @ts-ignore + AbortController = AbortControllerPolyfill; + } + return { + kind: 'node', + fetch: nf.default, + Request: nf.Request, + Response: nf.Response, + Headers: nf.Headers, + FormData: fd.FormData, + Blob: fd.Blob, + File: fd.File, + getMultipartRequestOptions, + getDefaultAgent: (url: string): Agent => (url.startsWith('https') ? defaultHttpsAgent : defaultHttpAgent), + fileFromPath, + isFsReadStream: (value: any): value is FsReadStream => value instanceof FsReadStream, + }; +} diff --git a/src/_shims/node-types.d.ts b/src/_shims/node-types.d.ts new file mode 100644 index 000000000..28fe60499 --- /dev/null +++ b/src/_shims/node-types.d.ts @@ -0,0 +1,42 @@ +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ +import * as nf from 'node-fetch'; +import * as fd from 'formdata-node'; + +export { type Agent } from 'node:http'; +export { type Readable } from 'node:stream'; +export { type ReadStream as FsReadStream } from 'node:fs'; +export { type ReadableStream } from 'web-streams-polyfill'; + +export const fetch: typeof nf.default; + +export type Request = nf.Request; +export type RequestInfo = nf.RequestInfo; +export type RequestInit = nf.RequestInit; + +export type Response = nf.Response; +export type ResponseInit = nf.ResponseInit; +export type ResponseType = nf.ResponseType; +export type BodyInit = nf.BodyInit; +export type Headers = nf.Headers; +export type HeadersInit = nf.HeadersInit; + +type EndingType = 'native' | 'transparent'; +export interface BlobPropertyBag { + endings?: EndingType; + type?: string; +} + +export interface FilePropertyBag extends BlobPropertyBag { + lastModified?: number; +} + +export type FileFromPathOptions = Omit; + +export type FormData = fd.FormData; +export const FormData: typeof fd.FormData; +export type File = fd.File; +export const File: typeof fd.File; +export type Blob = fd.Blob; +export const Blob: typeof fd.Blob; diff --git a/src/_shims/node-types.js b/src/_shims/node-types.js new file mode 100644 index 000000000..ddbdb799c --- /dev/null +++ b/src/_shims/node-types.js @@ -0,0 +1,3 @@ +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ diff --git a/src/_shims/node-types.mjs b/src/_shims/node-types.mjs new file mode 100644 index 000000000..ddbdb799c --- /dev/null +++ b/src/_shims/node-types.mjs @@ -0,0 +1,3 @@ +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ diff --git a/src/_shims/registry.ts b/src/_shims/registry.ts new file mode 100644 index 000000000..0e0706877 --- /dev/null +++ b/src/_shims/registry.ts @@ -0,0 +1,62 @@ +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ +import { type RequestOptions } from '../core'; + +export interface Shims { + kind: string; + fetch: any; + Request: any; + Response: any; + Headers: any; + FormData: any; + Blob: any; + File: any; + getMultipartRequestOptions: >( + form: Shims['FormData'], + opts: RequestOptions, + ) => Promise>; + getDefaultAgent: (url: string) => any; + fileFromPath: + | ((path: string, filename?: string, options?: {}) => Promise) + | ((path: string, options?: {}) => Promise); + isFsReadStream: (value: any) => boolean; +} + +export let auto = false; +export let kind: Shims['kind'] | undefined = undefined; +export let fetch: Shims['fetch'] | undefined = undefined; +export let Request: Shims['Request'] | undefined = undefined; +export let Response: Shims['Response'] | undefined = undefined; +export let Headers: Shims['Headers'] | undefined = undefined; +export let FormData: Shims['FormData'] | undefined = undefined; +export let Blob: Shims['Blob'] | undefined = undefined; +export let File: Shims['File'] | undefined = undefined; +export let getMultipartRequestOptions: Shims['getMultipartRequestOptions'] | undefined = undefined; +export let getDefaultAgent: Shims['getDefaultAgent'] | undefined = undefined; +export let fileFromPath: Shims['fileFromPath'] | undefined = undefined; +export let isFsReadStream: Shims['isFsReadStream'] | undefined = undefined; + +export function setShims(shims: Shims, options: { auto: boolean } = { auto: false }) { + if (auto) { + throw new Error( + `you must \`import 'openai/shims/${shims.kind}'\` before importing anything else from openai`, + ); + } + if (kind) { + throw new Error(`can't \`import 'openai/shims/${shims.kind}'\` after \`import 'openai/shims/${kind}'\``); + } + auto = options.auto; + kind = shims.kind; + fetch = shims.fetch; + Request = shims.Request; + Response = shims.Response; + Headers = shims.Headers; + FormData = shims.FormData; + Blob = shims.Blob; + File = shims.File; + getMultipartRequestOptions = shims.getMultipartRequestOptions; + getDefaultAgent = shims.getDefaultAgent; + fileFromPath = shims.fileFromPath; + isFsReadStream = shims.isFsReadStream; +} diff --git a/src/_shims/web-runtime.ts b/src/_shims/web-runtime.ts new file mode 100644 index 000000000..12d73e965 --- /dev/null +++ b/src/_shims/web-runtime.ts @@ -0,0 +1,91 @@ +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ +import { MultipartBody } from './MultipartBody'; +import { type RequestOptions } from '../core'; +import { type Shims } from './registry'; + +export function getRuntime({ manuallyImported }: { manuallyImported?: boolean } = {}): Shims { + const recommendation = + manuallyImported ? + `You may need to use polyfills` + : `Add one of these imports before your first \`import … from 'openai'\`: +- \`import 'openai/shims/node'\` (if you're running on Node) +- \`import 'openai/shims/web'\` (otherwise) +`; + + let _fetch, _Request, _Response, _Headers; + try { + // @ts-ignore + _fetch = fetch; + // @ts-ignore + _Request = Request; + // @ts-ignore + _Response = Response; + // @ts-ignore + _Headers = Headers; + } catch (error) { + throw new Error( + `this environment is missing the following Web Fetch API type: ${ + (error as any).message + }. ${recommendation}`, + ); + } + + return { + kind: 'web', + fetch: _fetch, + Request: _Request, + Response: _Response, + Headers: _Headers, + FormData: + // @ts-ignore + typeof FormData !== 'undefined' ? FormData : ( + class FormData { + // @ts-ignore + constructor() { + throw new Error( + `file uploads aren't supported in this environment yet as 'FormData' is undefined. ${recommendation}`, + ); + } + } + ), + Blob: + typeof Blob !== 'undefined' ? Blob : ( + class Blob { + constructor() { + throw new Error( + `file uploads aren't supported in this environment yet as 'Blob' is undefined. ${recommendation}`, + ); + } + } + ), + File: + // @ts-ignore + typeof File !== 'undefined' ? File : ( + class File { + // @ts-ignore + constructor() { + throw new Error( + `file uploads aren't supported in this environment yet as 'File' is undefined. ${recommendation}`, + ); + } + } + ), + getMultipartRequestOptions: async >( + // @ts-ignore + form: FormData, + opts: RequestOptions, + ): Promise> => ({ + ...opts, + body: new MultipartBody(form) as any, + }), + getDefaultAgent: (url: string) => undefined, + fileFromPath: () => { + throw new Error( + 'The `fileFromPath` function is only supported in Node. See the README for more details: https://www.github.com/openai/openai-node#file-uploads', + ); + }, + isFsReadStream: (value: any) => false, + }; +} diff --git a/src/_shims/web-types.d.ts b/src/_shims/web-types.d.ts new file mode 100644 index 000000000..ec96cd817 --- /dev/null +++ b/src/_shims/web-types.d.ts @@ -0,0 +1,82 @@ +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ +export type Agent = any; + +declare const _fetch: typeof fetch; +export { _fetch as fetch }; + +type _Request = Request; +export { _Request as Request }; + +type _RequestInfo = RequestInfo; +export { type _RequestInfo as RequestInfo }; + +type _RequestInit = RequestInit; +export { type _RequestInit as RequestInit }; + +type _Response = Response; +export { _Response as Response }; + +type _ResponseInit = ResponseInit; +export { type _ResponseInit as ResponseInit }; + +type _ResponseType = ResponseType; +export { type _ResponseType as ResponseType }; + +type _BodyInit = BodyInit; +export { type _BodyInit as BodyInit }; + +type _Headers = Headers; +export { _Headers as Headers }; + +type _HeadersInit = HeadersInit; +export { type _HeadersInit as HeadersInit }; + +type EndingType = 'native' | 'transparent'; + +export interface BlobPropertyBag { + endings?: EndingType; + type?: string; +} + +export interface FilePropertyBag extends BlobPropertyBag { + lastModified?: number; +} + +export type FileFromPathOptions = Omit; + +type _FormData = FormData; +declare const _FormData: typeof FormData; +export { _FormData as FormData }; + +type _File = File; +declare const _File: typeof File; +export { _File as File }; + +type _Blob = Blob; +declare const _Blob: typeof Blob; +export { _Blob as Blob }; + +export declare class Readable { + readable: boolean; + readonly readableEnded: boolean; + readonly readableFlowing: boolean | null; + readonly readableHighWaterMark: number; + readonly readableLength: number; + readonly readableObjectMode: boolean; + destroyed: boolean; + read(size?: number): any; + pause(): this; + resume(): this; + isPaused(): boolean; + destroy(error?: Error): this; + [Symbol.asyncIterator](): AsyncIterableIterator; +} + +export declare class FsReadStream extends Readable { + path: {}; // node type is string | Buffer +} + +type _ReadableStream = ReadableStream; +export { type _ReadableStream as ReadableStream }; diff --git a/src/_shims/web-types.js b/src/_shims/web-types.js new file mode 100644 index 000000000..ddbdb799c --- /dev/null +++ b/src/_shims/web-types.js @@ -0,0 +1,3 @@ +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ diff --git a/src/_shims/web-types.mjs b/src/_shims/web-types.mjs new file mode 100644 index 000000000..ddbdb799c --- /dev/null +++ b/src/_shims/web-types.mjs @@ -0,0 +1,3 @@ +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ diff --git a/src/core.ts b/src/core.ts index 3a473ca61..a151d9d1a 100644 --- a/src/core.ts +++ b/src/core.ts @@ -1,16 +1,17 @@ import { VERSION } from './version'; import { Stream } from './streaming'; import { APIError, APIConnectionError, APIConnectionTimeoutError, APIUserAbortError } from './error'; -import type { Readable } from 'openai/_shims/node-readable'; -import { getDefaultAgent, type Agent } from 'openai/_shims/agent'; import { + kind as shimsKind, + type Readable, + getDefaultAgent, + type Agent, fetch, - isPolyfilled as fetchIsPolyfilled, type RequestInfo, type RequestInit, type Response, type HeadersInit, -} from 'openai/_shims/fetch'; +} from './_shims/index'; export { type Response }; import { isMultipartBody } from './uploads'; export { @@ -84,6 +85,12 @@ export class APIPromise extends Promise { * * If you want to parse the response body but still get the `Response` * instance, you can use {@link withResponse()}. + * + * 👋 Getting the wrong TypeScript type for `Response`? + * Try setting `"moduleResolution": "NodeNext"` if you can, + * or add one of these imports before your first `import … from 'openai'`: + * - `import 'openai/shims/node'` (if you're running on Node) + * - `import 'openai/shims/web'` (otherwise) */ asResponse(): Promise { return this.responsePromise.then((p) => p.response); @@ -93,6 +100,13 @@ export class APIPromise extends Promise { * * If you just want to get the raw `Response` instance without parsing it, * you can use {@link asResponse()}. + * + * + * 👋 Getting the wrong TypeScript type for `Response`? + * Try setting `"moduleResolution": "NodeNext"` if you can, + * or add one of these imports before your first `import … from 'openai'`: + * - `import 'openai/shims/node'` (if you're running on Node) + * - `import 'openai/shims/web'` (otherwise) */ async withResponse(): Promise<{ data: T; response: Response }> { const [data, response] = await Promise.all([this.parse(), this.asResponse()]); @@ -277,7 +291,7 @@ export abstract class APIClient { ...headers, }; // let builtin fetch set the Content-Type for multipart bodies - if (isMultipartBody(options.body) && !fetchIsPolyfilled) { + if (isMultipartBody(options.body) && shimsKind !== 'node') { delete reqHeaders['Content-Type']; } @@ -444,11 +458,14 @@ export abstract class APIClient { const timeout = setTimeout(() => controller.abort(), ms); - return this.getRequestClient() - .fetch(url, { signal: controller.signal as any, ...options }) - .finally(() => { - clearTimeout(timeout); - }); + return ( + this.getRequestClient() + // use undefined this binding; fetch errors if bound to something else in browser/cloudflare + .fetch.call(undefined, url, { signal: controller.signal as any, ...options }) + .finally(() => { + clearTimeout(timeout); + }) + ); } protected getRequestClient(): RequestClient { @@ -592,7 +609,7 @@ export abstract class AbstractPage implements AsyncIterable { } else if ('url' in nextInfo) { const params = [...Object.entries(nextOptions.query || {}), ...nextInfo.url.searchParams.entries()]; for (const [key, value] of params) { - nextInfo.url.searchParams.set(key, value); + nextInfo.url.searchParams.set(key, value as any); } nextOptions.query = undefined; nextOptions.path = nextInfo.url.toString(); @@ -718,7 +735,7 @@ const requestOptionsKeys: KeysEnum = { idempotencyKey: true, }; -export const isRequestOptions = (obj: unknown): obj is RequestOptions => { +export const isRequestOptions = (obj: unknown): obj is RequestOptions | Readable> => { return ( typeof obj === 'object' && obj !== null && diff --git a/src/index.ts b/src/index.ts index 16e4adbb3..2ecbb6546 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,7 +4,7 @@ import * as Core from './core'; import * as Pagination from './pagination'; import * as API from './resources/index'; import * as Errors from './error'; -import type { Agent } from 'openai/_shims/agent'; +import { type Agent } from './_shims/index'; import * as Uploads from './uploads'; export interface ClientOptions { diff --git a/src/shims/node.ts b/src/shims/node.ts new file mode 100644 index 000000000..9273d4eae --- /dev/null +++ b/src/shims/node.ts @@ -0,0 +1,50 @@ +// @ts-ignore +import * as types from '../_shims/node-types'; +import { setShims } from '../_shims/registry'; +import { getRuntime } from '../_shims/node-runtime'; +setShims(getRuntime()); + +declare module '../_shims/manual-types' { + export namespace manual { + // @ts-ignore + export type Agent = types.Agent; + // @ts-ignore + export import fetch = types.fetch; + // @ts-ignore + export type Request = types.Request; + // @ts-ignore + export type RequestInfo = types.RequestInfo; + // @ts-ignore + export type RequestInit = types.RequestInit; + // @ts-ignore + export type Response = types.Response; + // @ts-ignore + export type ResponseInit = types.ResponseInit; + // @ts-ignore + export type ResponseType = types.ResponseType; + // @ts-ignore + export type BodyInit = types.BodyInit; + // @ts-ignore + export type Headers = types.Headers; + // @ts-ignore + export type HeadersInit = types.HeadersInit; + // @ts-ignore + export type BlobPropertyBag = types.BlobPropertyBag; + // @ts-ignore + export type FilePropertyBag = types.FilePropertyBag; + // @ts-ignore + export type FileFromPathOptions = types.FileFromPathOptions; + // @ts-ignore + export import FormData = types.FormData; + // @ts-ignore + export import File = types.File; + // @ts-ignore + export import Blob = types.Blob; + // @ts-ignore + export type Readable = types.Readable; + // @ts-ignore + export type FsReadStream = types.FsReadStream; + // @ts-ignore + export type ReadableStream = types.ReadableStream; + } +} diff --git a/src/shims/web.ts b/src/shims/web.ts new file mode 100644 index 000000000..9970f1db8 --- /dev/null +++ b/src/shims/web.ts @@ -0,0 +1,50 @@ +// @ts-ignore +import * as types from '../_shims/web-types'; +import { setShims } from '../_shims/registry'; +import { getRuntime } from '../_shims/web-runtime'; +setShims(getRuntime({ manuallyImported: true })); + +declare module '../_shims/manual-types' { + export namespace manual { + // @ts-ignore + export type Agent = types.Agent; + // @ts-ignore + export import fetch = types.fetch; + // @ts-ignore + export type Request = types.Request; + // @ts-ignore + export type RequestInfo = types.RequestInfo; + // @ts-ignore + export type RequestInit = types.RequestInit; + // @ts-ignore + export type Response = types.Response; + // @ts-ignore + export type ResponseInit = types.ResponseInit; + // @ts-ignore + export type ResponseType = types.ResponseType; + // @ts-ignore + export type BodyInit = types.BodyInit; + // @ts-ignore + export type Headers = types.Headers; + // @ts-ignore + export type HeadersInit = types.HeadersInit; + // @ts-ignore + export type BlobPropertyBag = types.BlobPropertyBag; + // @ts-ignore + export type FilePropertyBag = types.FilePropertyBag; + // @ts-ignore + export type FileFromPathOptions = types.FileFromPathOptions; + // @ts-ignore + export import FormData = types.FormData; + // @ts-ignore + export import File = types.File; + // @ts-ignore + export import Blob = types.Blob; + // @ts-ignore + export type Readable = types.Readable; + // @ts-ignore + export type FsReadStream = types.FsReadStream; + // @ts-ignore + export type ReadableStream = types.ReadableStream; + } +} diff --git a/src/streaming.ts b/src/streaming.ts index 230234546..21dedbb0f 100644 --- a/src/streaming.ts +++ b/src/streaming.ts @@ -1,4 +1,4 @@ -import type { Response } from 'openai/_shims/fetch'; +import { type Response } from './_shims/index'; type Bytes = string | ArrayBuffer | Uint8Array | Buffer | null | undefined; diff --git a/src/uploads.ts b/src/uploads.ts index e02ecb8a1..301d770e3 100644 --- a/src/uploads.ts +++ b/src/uploads.ts @@ -1,12 +1,15 @@ import { type RequestOptions } from './core'; -import { type Readable } from 'openai/_shims/node-readable'; -import { type BodyInit } from 'openai/_shims/fetch'; -import { FormData, File, type Blob, type FilePropertyBag } from 'openai/_shims/form-data'; -import { getMultipartRequestOptions } from 'openai/_shims/getMultipartRequestOptions'; -import { fileFromPath } from 'openai/_shims/fileFromPath'; -import { type FsReadStream, isFsReadStream } from 'openai/_shims/node-readable'; - -export { fileFromPath }; +import { + FormData, + File, + type Blob, + type FilePropertyBag, + getMultipartRequestOptions, + type FsReadStream, + isFsReadStream, +} from './_shims/index'; +import { MultipartBody } from './_shims/MultipartBody'; +export { fileFromPath } from './_shims/index'; type BlobLikePart = string | ArrayBuffer | ArrayBufferView | BlobLike | Uint8Array | DataView; export type BlobPart = string | ArrayBuffer | ArrayBufferView | Blob | Uint8Array | DataView; @@ -175,13 +178,6 @@ const getStringFromMaybeBuffer = (x: string | Buffer | unknown): string | undefi const isAsyncIterableIterator = (value: any): value is AsyncIterableIterator => value != null && typeof value === 'object' && typeof value[Symbol.asyncIterator] === 'function'; -export class MultipartBody { - constructor(public body: Readable | BodyInit) {} - get [Symbol.toStringTag](): string { - return 'MultipartBody'; - } -} - export const isMultipartBody = (body: any): body is MultipartBody => body && typeof body === 'object' && body.body && body[Symbol.toStringTag] === 'MultipartBody'; diff --git a/tests/form.test.ts b/tests/form.test.ts index 88dfaac77..3a143852c 100644 --- a/tests/form.test.ts +++ b/tests/form.test.ts @@ -1,5 +1,5 @@ import { multipartFormRequestOptions, createForm } from 'openai/core'; -import { Blob } from 'openai/_shims/form-data'; +import { Blob } from 'openai/_shims/index'; import { toFile } from 'openai'; describe('form data validation', () => { diff --git a/tests/index.test.ts b/tests/index.test.ts index de1befa1e..93f44fe9e 100644 --- a/tests/index.test.ts +++ b/tests/index.test.ts @@ -3,7 +3,7 @@ import OpenAI from 'openai'; import { APIUserAbortError } from 'openai'; import { Headers } from 'openai/core'; -import { Response, fetch as defaultFetch, type RequestInit, type RequestInfo } from 'openai/_shims/fetch'; +import defaultFetch, { Response, type RequestInit, type RequestInfo } from 'node-fetch'; describe('instantiate client', () => { const env = process.env; diff --git a/tests/responses.test.ts b/tests/responses.test.ts index 2901d3c43..ef6ba27bf 100644 --- a/tests/responses.test.ts +++ b/tests/responses.test.ts @@ -1,5 +1,5 @@ import { createResponseHeaders } from 'openai/core'; -import { Headers } from 'openai/_shims/fetch'; +import { Headers } from 'openai/_shims/index'; describe('response parsing', () => { // TODO: test unicode characters diff --git a/tests/uploads.test.ts b/tests/uploads.test.ts index 76fa6573c..b40856e29 100644 --- a/tests/uploads.test.ts +++ b/tests/uploads.test.ts @@ -1,6 +1,6 @@ import fs from 'fs'; import { toFile, type ResponseLike } from 'openai/uploads'; -import { File } from 'openai/_shims/form-data'; +import { File } from 'openai/_shims/index'; class MyClass { name: string = 'foo'; diff --git a/tsconfig.build.json b/tsconfig.build.json index 320dc5c1d..6adad0d06 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -1,13 +1,12 @@ { "extends": "./tsconfig.json", "include": ["dist/src"], - "exclude": ["dist/src/_shims/*.deno.ts"], + "exclude": ["dist/src/_shims/*-deno.ts"], "compilerOptions": { "rootDir": "./dist/src", "paths": { - "openai/_shims/*": ["dist/src/_shims/*-node"], - "openai": ["dist/src/index.ts"], "openai/*": ["dist/src/*"], + "openai": ["dist/src/index.ts"], "digest-fetch": ["./typings/digest-fetch"] }, "noEmit": false, @@ -16,20 +15,5 @@ "outDir": "dist", "pretty": true, "sourceMap": true - }, - "tsc-alias": { - "fileExtensions": { - "inputGlob": "{mjs,cjs,js,jsx,mts,cts,ts,tsx}" - }, - "replacers": { - "replace-self-referencing-imports": { - "enabled": true, - "file": "./scripts/replace-self-referencing-imports.js" - }, - "resolve-full-paths": { - "enabled": true, - "file": "./scripts/resolve-full-paths.js" - } - } } } diff --git a/tsconfig.deno.json b/tsconfig.deno.json index 1fa5cf8ae..5d6467665 100644 --- a/tsconfig.deno.json +++ b/tsconfig.deno.json @@ -6,9 +6,9 @@ "rootDir": "./deno", "lib": ["es2020", "DOM"], "paths": { - "openai/_shims/*": ["deno/_shims/*"], - "openai": ["deno/index.ts"], + "openai/_shims/auto/*": ["deno/_shims/auto/*-deno"], "openai/*": ["deno/*"], + "openai": ["deno/index.ts"], "digest-fetch": ["./typings/digest-fetch"] }, "noEmit": true, diff --git a/tsconfig.json b/tsconfig.json index 1edbcb2e2..801835f0c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "include": ["src", "tests", "examples"], - "exclude": ["src/_shims/*.deno.ts"], + "exclude": ["src/_shims/**/*-deno.ts"], "compilerOptions": { "target": "es2019", "lib": ["es2020"], @@ -9,9 +9,9 @@ "esModuleInterop": true, "baseUrl": "./", "paths": { - "openai/_shims/*": ["src/_shims/*-node"], - "openai": ["src/index.ts"], + "openai/_shims/auto/*": ["src/_shims/auto/*-node"], "openai/*": ["src/*"], + "openai": ["src/index.ts"], "digest-fetch": ["./typings/digest-fetch"] }, "noEmit": true, diff --git a/yarn.lock b/yarn.lock index dba8c9628..d7a57abaa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -348,22 +348,27 @@ dependencies: "@cspotcode/source-map-consumer" "0.8.0" -"@eslint-community/eslint-utils@^4.2.0": +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": +"@eslint-community/regexpp@^4.5.1": + version "4.8.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.1.tgz#8c4bb756cc2aa7eaf13cfa5e69c83afb3260c20c" + integrity sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ== + +"@eslint-community/regexpp@^4.6.1": version "4.6.2" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.6.2.tgz#1816b5f6948029c5eaacb0703b850ee0cb37d8f8" integrity sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw== -"@eslint/eslintrc@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.1.tgz#18d635e24ad35f7276e8a49d135c7d3ca6a46f93" - integrity sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA== +"@eslint/eslintrc@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" + integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -375,10 +380,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@^8.46.0": - version "8.46.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.46.0.tgz#3f7802972e8b6fe3f88ed1aabc74ec596c456db6" - integrity sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA== +"@eslint/js@8.49.0": + version "8.49.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.49.0.tgz#86f79756004a97fa4df866835093f1df3d03c333" + integrity sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w== "@glimmer/env@0.1.7": version "0.1.7" @@ -416,10 +421,10 @@ resolved "https://registry.yarnpkg.com/@handlebars/parser/-/parser-2.0.0.tgz#5e8b7298f31ff8f7b260e6b7363c7e9ceed7d9c5" integrity sha512-EP9uEDZv/L5Qh9IWuMUGJRfwhXJ4h1dqKTT4/3+tY0eu7sPis7xh23j61SYUnNF4vqCQvvUXpDo9Bh/+q1zASA== -"@humanwhocodes/config-array@^0.11.10": - version "0.11.10" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" - integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== +"@humanwhocodes/config-array@^0.11.11": + version "0.11.11" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844" + integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" @@ -839,10 +844,10 @@ expect "^29.0.0" pretty-format "^29.0.0" -"@types/json-schema@^7.0.9": - version "7.0.12" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" - integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== +"@types/json-schema@^7.0.12": + version "7.0.13" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.13.tgz#02c24f4363176d2d18fc8b70b9f3c54aba178a85" + integrity sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ== "@types/node-fetch@^2.6.4": version "2.6.4" @@ -872,10 +877,10 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.0.tgz#efcbd41937f9ae7434c714ab698604822d890759" integrity sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw== -"@types/semver@^7.3.12": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" - integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== +"@types/semver@^7.5.0": + version "7.5.2" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.2.tgz#31f6eec1ed7ec23f4f05608d3a2d381df041f564" + integrity sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw== "@types/stack-utils@^2.0.0": version "2.0.1" @@ -899,59 +904,61 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^5.33.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" - integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== +"@typescript-eslint/eslint-plugin@^6.7.0": + version "6.7.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz#f18cc75c9cceac8080a9dc2e7d166008c5207b9f" + integrity sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q== dependencies: - "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/type-utils" "5.62.0" - "@typescript-eslint/utils" "5.62.0" + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.7.2" + "@typescript-eslint/type-utils" "6.7.2" + "@typescript-eslint/utils" "6.7.2" + "@typescript-eslint/visitor-keys" "6.7.2" debug "^4.3.4" graphemer "^1.4.0" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/parser@^5.33.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" - integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== - dependencies: - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/parser@^6.7.0": + version "6.7.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.7.2.tgz#e0ae93771441b9518e67d0660c79e3a105497af4" + integrity sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw== + dependencies: + "@typescript-eslint/scope-manager" "6.7.2" + "@typescript-eslint/types" "6.7.2" + "@typescript-eslint/typescript-estree" "6.7.2" + "@typescript-eslint/visitor-keys" "6.7.2" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" - integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== +"@typescript-eslint/scope-manager@6.7.2": + version "6.7.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz#cf59a2095d2f894770c94be489648ad1c78dc689" + integrity sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw== dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" + "@typescript-eslint/types" "6.7.2" + "@typescript-eslint/visitor-keys" "6.7.2" -"@typescript-eslint/type-utils@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" - integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== +"@typescript-eslint/type-utils@6.7.2": + version "6.7.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz#ed921c9db87d72fa2939fee242d700561454f367" + integrity sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ== dependencies: - "@typescript-eslint/typescript-estree" "5.62.0" - "@typescript-eslint/utils" "5.62.0" + "@typescript-eslint/typescript-estree" "6.7.2" + "@typescript-eslint/utils" "6.7.2" debug "^4.3.4" - tsutils "^3.21.0" + ts-api-utils "^1.0.1" "@typescript-eslint/types@5.45.0": version "5.45.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.45.0.tgz#794760b9037ee4154c09549ef5a96599621109c5" integrity sha512-QQij+u/vgskA66azc9dCmx+rev79PzX8uDHpsqSjEFtfF2gBUTRCpvYMh2gw2ghkJabNkPlSUCimsyBEQZd1DA== -"@typescript-eslint/types@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" - integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== +"@typescript-eslint/types@6.7.2": + version "6.7.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.7.2.tgz#75a615a6dbeca09cafd102fe7f465da1d8a3c066" + integrity sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg== "@typescript-eslint/typescript-estree@5.45.0": version "5.45.0" @@ -966,32 +973,31 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" - integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== +"@typescript-eslint/typescript-estree@6.7.2": + version "6.7.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz#ce5883c23b581a5caf878af641e49dd0349238c7" + integrity sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ== dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" + "@typescript-eslint/types" "6.7.2" + "@typescript-eslint/visitor-keys" "6.7.2" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/utils@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" - integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - eslint-scope "^5.1.1" - semver "^7.3.7" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/utils@6.7.2": + version "6.7.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.7.2.tgz#b9ef0da6f04932167a9222cb4ac59cb187165ebf" + integrity sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.7.2" + "@typescript-eslint/types" "6.7.2" + "@typescript-eslint/typescript-estree" "6.7.2" + semver "^7.5.4" "@typescript-eslint/visitor-keys@5.45.0": version "5.45.0" @@ -1001,13 +1007,13 @@ "@typescript-eslint/types" "5.45.0" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" - integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== +"@typescript-eslint/visitor-keys@6.7.2": + version "6.7.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz#4cb2bd786f1f459731b0ad1584c9f73e1c7a4d5c" + integrity sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ== dependencies: - "@typescript-eslint/types" "5.62.0" - eslint-visitor-keys "^3.3.0" + "@typescript-eslint/types" "6.7.2" + eslint-visitor-keys "^3.4.1" abort-controller@^3.0.0: version "3.0.0" @@ -1132,14 +1138,6 @@ anymatch@^3.0.3: normalize-path "^3.0.0" picomatch "^2.0.4" -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -1242,11 +1240,6 @@ base-64@^0.1.0: resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -1262,7 +1255,7 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.2, braces@~3.0.2: +braces@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -1371,21 +1364,6 @@ charenc@0.0.2: resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== -chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - ci-info@3.3.0, ci-info@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" @@ -1488,11 +1466,6 @@ commander@^2.19.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^9.0.0: - version "9.5.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" - integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== - commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -1729,14 +1702,6 @@ eslint-rule-composer@^0.3.0: resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9" integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - eslint-scope@^7.2.2: version "7.2.2" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" @@ -1745,21 +1710,26 @@ eslint-scope@^7.2.2: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.2: +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: version "3.4.2" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz#8c2095440eca8c933bedcadf16fefa44dbe9ba5f" integrity sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw== -eslint@^8.22.0: - version "8.46.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.46.0.tgz#a06a0ff6974e53e643acc42d1dcf2e7f797b3552" - integrity sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg== +eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.49.0: + version "8.49.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.49.0.tgz#09d80a89bdb4edee2efcf6964623af1054bf6d42" + integrity sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.1" - "@eslint/js" "^8.46.0" - "@humanwhocodes/config-array" "^0.11.10" + "@eslint/eslintrc" "^2.1.2" + "@eslint/js" "8.49.0" + "@humanwhocodes/config-array" "^0.11.11" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" ajv "^6.12.4" @@ -1769,7 +1739,7 @@ eslint@^8.22.0: doctrine "^3.0.0" escape-string-regexp "^4.0.0" eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.2" + eslint-visitor-keys "^3.4.3" espree "^9.6.1" esquery "^1.4.2" esutils "^2.0.2" @@ -1830,11 +1800,6 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" @@ -2036,7 +2001,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.3.2, fsevents@~2.3.2: +fsevents@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -2071,7 +2036,7 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -2121,7 +2086,7 @@ globals@^13.19.0: dependencies: type-fest "^0.20.2" -globby@^11.0.4, globby@^11.1.0: +globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -2207,7 +2172,7 @@ ignore@5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== -ignore@^5.2.0: +ignore@^5.2.0, ignore@^5.2.4: version "5.2.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== @@ -2274,13 +2239,6 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - is-buffer@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" @@ -2330,7 +2288,7 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -3046,21 +3004,11 @@ ms@^2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -mylas@^2.1.9: - version "2.1.13" - resolved "https://registry.yarnpkg.com/mylas/-/mylas-2.1.13.tgz#1e23b37d58fdcc76e15d8a5ed23f9ae9fc0cbdf4" - integrity sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg== - n-readlines@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/n-readlines/-/n-readlines-1.0.1.tgz#bbb7364d38bc31a170a199f986fcacfa76b95f6e" integrity sha512-z4SyAIVgMy7CkgsoNw7YVz40v0g4+WWvvqy8+ZdHrCtgevcEO758WQyrYcw3XPxcLxF+//RszTz/rO48nzD0wQ== -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -3088,7 +3036,7 @@ node-releases@^2.0.3: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.4.tgz#f38252370c43854dc48aa431c766c6c398f40476" integrity sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ== -normalize-path@^3.0.0, normalize-path@~3.0.0: +normalize-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== @@ -3260,7 +3208,7 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -3284,13 +3232,6 @@ please-upgrade-node@3.2.0: dependencies: semver-compare "^1.0.0" -plimit-lit@^1.2.6: - version "1.5.0" - resolved "https://registry.yarnpkg.com/plimit-lit/-/plimit-lit-1.5.0.tgz#f66df8a7041de1e965c4f1c0697ab486968a92a5" - integrity sha512-Eb/MqCb1Iv/ok4m1FqIXqvUKPISufcjZ605hl3KM/n8GaX8zfhtgdLwZU3vKjuHGh2O9Rjog/bHTq8ofIShdng== - dependencies: - queue-lit "^1.5.0" - postcss-less@3.1.4: version "3.1.4" resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-3.1.4.tgz#369f58642b5928ef898ffbc1a6e93c958304c5ad" @@ -3455,11 +3396,6 @@ pure-rand@^6.0.0: resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== -queue-lit@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/queue-lit/-/queue-lit-1.5.0.tgz#8197fdafda1edd615c8a0fc14c48353626e5160a" - integrity sha512-IslToJ4eiCEE9xwMzq3viOO5nH8sUWUCwoElrhNMozzr9IIt2qqvB4I+uHu/zJTQVqc9R5DFwok4ijNK1pU3fA== - queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -3479,13 +3415,6 @@ readable-stream@^3.4.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - regexp-util@1.2.2, regexp-util@^1.2.0, regexp-util@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/regexp-util/-/regexp-util-1.2.2.tgz#5cf599134921eb0d776e41d41e9c0da33f0fa2fc" @@ -3631,7 +3560,7 @@ semver@^6.0.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.7: +semver@^7.3.7, semver@^7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -3861,6 +3790,11 @@ trough@^1.0.0: resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== +ts-api-utils@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" + integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== + ts-jest@^29.1.0: version "29.1.0" resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.0.tgz#4a9db4104a49b76d2b368ea775b6c9535c603891" @@ -3902,18 +3836,6 @@ ts-node@^10.5.0: v8-compile-cache-lib "^3.0.0" yn "3.1.1" -tsc-alias@^1.8.6: - version "1.8.6" - resolved "https://registry.yarnpkg.com/tsc-alias/-/tsc-alias-1.8.6.tgz#28300ed398e90b1c600548ed956f58dfbecc1589" - integrity sha512-vq+i6VpE83IeMsSJVcFN03ZBofADhr8/gIJXjxpbnTRfN/MFXy0+SBaKG2o7p95QqXBGkeG98HYz3IkOOveFbg== - dependencies: - chokidar "^3.5.3" - commander "^9.0.0" - globby "^11.0.4" - mylas "^2.1.9" - normalize-path "^3.0.0" - plimit-lit "^1.2.6" - tsc-multi@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/tsc-multi/-/tsc-multi-1.1.0.tgz#0e2b03c0ed0ac58ecb556f11709441102d202680"